src/lte/model/lte-rlc-am.cc
author mmiozzo
Mon, 23 Apr 2012 13:16:03 +0200
changeset 8726 f6f0e2531457
parent 8667 5fcab10ff001
parent 8714 398bbcbb3f42
child 8818 cc5ab4942423
permissions -rw-r--r--
merge with ns-3-lena-pem changeset 8419:e8df5f68c35e (MIMO model)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     2
/*
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     3
 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     4
 *
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
6848d8dfe6db Add AM 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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     8
 *
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    12
 * GNU General Public License for more details.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    13
 *
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    17
 *
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    18
 * Author: Manuel Requena <manuel.requena@cttc.es>
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    19
 */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    20
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    21
#include "ns3/simulator.h"
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    22
#include "ns3/log.h"
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    23
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    24
#include "ns3/lte-rlc-am-header.h"
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    25
#include "ns3/lte-rlc-am.h"
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    26
#include "ns3/lte-rlc-sdu-status-tag.h"
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    27
#include "ns3/lte-rlc-tag.h"
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    28
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    29
NS_LOG_COMPONENT_DEFINE ("LteRlcAm");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    30
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    31
namespace ns3 {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    32
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    33
NS_OBJECT_ENSURE_REGISTERED (LteRlcAm);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    34
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    35
LteRlcAm::LteRlcAm ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    36
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    37
  NS_LOG_FUNCTION (this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    38
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    39
  // Buffers
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    40
  m_txonBufferSize = 0;
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
    41
  m_retxBuffer.resize (1024);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    42
  m_retxBufferSize = 0;
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
    43
  m_txedBuffer.resize (1024);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    44
  m_txedBufferSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    45
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    46
  m_statusPduRequested = false;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    47
  m_statusPduBufferSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    48
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    49
  // State variables: transmitting side
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    50
  m_windowSize = 512;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    51
  m_vtA  = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    52
  m_vtMs = m_vtA + m_windowSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    53
  m_vtS  = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    54
  m_pollSn = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    55
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    56
  // State variables: receiving side
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    57
  m_vrR  = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    58
  m_vrMr = m_vrR + m_windowSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    59
  m_vrX  = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    60
  m_vrMs = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    61
  m_vrH  = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    62
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    63
  // Counters
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    64
  m_pduWithoutPoll  = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    65
  m_byteWithoutPoll = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    66
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    67
  // Configurable parameters
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    68
  m_maxRetxThreshold = 5;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    69
  m_pollPdu = 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    70
  m_pollByte = 50;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    71
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    72
  // SDU reassembling process
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    73
  m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    74
  m_expectedSeqNumber = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    75
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    76
  Simulator::ScheduleNow (&LteRlcAm::Start, this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    77
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    78
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    79
LteRlcAm::~LteRlcAm ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    80
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    81
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    82
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    83
TypeId
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    84
LteRlcAm::GetTypeId (void)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    85
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    86
  static TypeId tid = TypeId ("ns3::LteRlcAm")
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    87
    .SetParent<LteRlc> ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    88
    .AddConstructor<LteRlcAm> ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    89
    ;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    90
  return tid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    91
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    92
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    93
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    94
/**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    95
 * RLC SAP
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    96
 */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    97
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    98
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    99
LteRlcAm::DoTransmitPdcpPdu (Ptr<Packet> p)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   100
{
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   101
  NS_LOG_FUNCTION (this << p->GetSize ());
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   102
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   103
  /** Store arrival time */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   104
  Time now = Simulator::Now ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   105
  RlcTag timeTag (now);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   106
  p->AddPacketTag (timeTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   107
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   108
  /** Store PDCP PDU */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   109
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   110
  LteRlcSduStatusTag tag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   111
  tag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   112
  p->AddPacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   113
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   114
  NS_LOG_LOGIC ("Txon Buffer: New packet added");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   115
  m_txonBuffer.push_back (p);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   116
  m_txonBufferSize += p->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   117
  NS_LOG_LOGIC ("NumOfBuffers = " << m_txonBuffer.size() );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   118
  NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   119
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   120
  /** Report Buffer Status */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   121
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   122
  // Transmission Queue HOL time
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   123
  RlcTag txonQueueHolTimeTag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   124
  m_txonBuffer.front ()->PeekPacketTag (txonQueueHolTimeTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   125
  Time txonQueueHolDelay = now - txonQueueHolTimeTag.GetSenderTimestamp ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   126
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   127
  // Retransmission Queue HOL time
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   128
  RlcTag retxQueueHolTimeTag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   129
  Time retxQueueHolDelay (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   130
  if ( m_retxBufferSize )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   131
    {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   132
//MRE      m_retxBuffer.front ().m_pdu->PeekPacketTag (retxQueueHolTimeTag);
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   133
      retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   134
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   135
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   136
  LteMacSapProvider::ReportBufferStatusParameters r;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   137
  r.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   138
  r.lcid = m_lcid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   139
  r.txQueueSize = m_txonBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   140
  r.txQueueHolDelay = txonQueueHolDelay.GetMilliSeconds ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   141
  r.retxQueueSize = m_retxBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   142
  r.retxQueueHolDelay = retxQueueHolDelay.GetMilliSeconds ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   143
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   144
  if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   145
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   146
      r.statusPduSize = m_statusPduBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   147
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   148
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   149
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   150
      r.statusPduSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   151
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   152
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   153
  NS_LOG_INFO ("Send ReportBufferStatus: " << r.txQueueSize << ", " << r.txQueueHolDelay << ", " 
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   154
                                           << r.retxQueueSize << ", " << r.retxQueueHolDelay << ", " 
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   155
                                           << r.statusPduSize);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   156
  m_macSapProvider->ReportBufferStatus (r);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   157
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   158
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   159
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   160
/**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   161
 * MAC SAP
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   162
 */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   163
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   164
void
8714
398bbcbb3f42 Add MIMO model, test and documentation
Marco Miozzo <marco.miozzo@cttc.es>
parents: 8456
diff changeset
   165
LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer)
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   166
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   167
  NS_LOG_FUNCTION (this << bytes);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   168
  NS_ASSERT_MSG (bytes > 2, "Tx opportunity too small = " << bytes);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   169
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   170
  if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   171
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   172
      NS_LOG_LOGIC ("Sending STATUS PDU");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   173
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   174
      Ptr<Packet> packet = Create<Packet> ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   175
      LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   176
      rlcAmHeader.SetControlPdu (LteRlcAmHeader::STATUS_PDU);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   177
      rlcAmHeader.SetAckSn (m_vrR);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   178
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   179
      NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   180
      packet->AddHeader (rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   181
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   182
      // Send RLC PDU to MAC layer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   183
      LteMacSapProvider::TransmitPduParameters params;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   184
      params.pdu = packet;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   185
      params.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   186
      params.lcid = m_lcid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   187
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   188
      m_macSapProvider->TransmitPdu (params);
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   189
      return;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   190
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   191
  else if ( m_retxBufferSize > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   192
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   193
      NS_LOG_LOGIC ("Sending data from Retransmission Buffer");
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   194
      
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   195
      Ptr<Packet> packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->Copy ();
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   196
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   197
      if ( packet->GetSize () <= bytes )
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   198
        {
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   199
          LteRlcAmHeader rlcAmHeader;
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   200
          packet->PeekHeader (rlcAmHeader);
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   201
          NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   202
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   203
          // Send RLC PDU to MAC layer
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   204
          LteMacSapProvider::TransmitPduParameters params;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   205
          params.pdu = packet;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   206
          params.rnti = m_rnti;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   207
          params.lcid = m_lcid;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   208
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   209
          m_macSapProvider->TransmitPdu (params);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   210
          return;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   211
        }
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   212
      else
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   213
        {
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   214
          NS_LOG_LOGIC ("Tx opportunity too small for retransmission of the packet (" << packet->GetSize () << " bytes)");
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   215
          NS_LOG_LOGIC ("Waiting for bigger tx opportunity");
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   216
          return;
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   217
        }
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   218
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   219
  else if ( m_txonBufferSize > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   220
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   221
      NS_LOG_LOGIC ("Sending data from Transmission Buffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   222
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   223
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   224
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   225
      NS_LOG_LOGIC ("No data pending");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   226
      return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   227
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   228
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   229
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   230
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   231
  // Build new PDU
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   232
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   233
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   234
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   235
  Ptr<Packet> packet = Create<Packet> ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   236
  LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   237
  rlcAmHeader.SetDataPdu ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   238
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   239
  // Build Data field
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   240
  uint32_t nextSegmentSize = bytes - 4;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   241
  uint32_t nextSegmentId = 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   242
  uint32_t dataFieldTotalSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   243
  uint32_t dataFieldAddedSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   244
  std::vector < Ptr<Packet> > dataField;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   245
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   246
  // Remove the first packet from the transmission buffer.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   247
  // If only a segment of the packet is taken, then the remaining is given back later
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   248
  if ( m_txonBuffer.size () == 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   249
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   250
      NS_LOG_LOGIC ("No data pending");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   251
      return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   252
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   253
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   254
  NS_LOG_LOGIC ("SDUs in TxonBuffer  = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   255
  NS_LOG_LOGIC ("First SDU buffer  = " << *(m_txonBuffer.begin()));
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   256
  NS_LOG_LOGIC ("First SDU size    = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   257
  NS_LOG_LOGIC ("Next segment size = " << nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   258
  NS_LOG_LOGIC ("Remove SDU from TxBuffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   259
  Ptr<Packet> firstSegment = (*(m_txonBuffer.begin ()))->Copy ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   260
  m_txonBufferSize -= (*(m_txonBuffer.begin()))->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   261
  NS_LOG_LOGIC ("txBufferSize      = " << m_txonBufferSize );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   262
  m_txonBuffer.erase (m_txonBuffer.begin ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   263
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   264
  while ( firstSegment && (firstSegment->GetSize () > 0) && (nextSegmentSize > 0) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   265
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   266
      NS_LOG_LOGIC ("WHILE .. firstSegment && firstSegment->GetSize > 0 && nextSegmentSize > 0 ..");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   267
      NS_LOG_LOGIC ("    FirstSegment size = " << firstSegment->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   268
      NS_LOG_LOGIC ("    Next segment size = " << nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   269
      if ( firstSegment->GetSize () > nextSegmentSize )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   270
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   271
          NS_LOG_LOGIC ("    IF firstSegment > NextSegmentSize");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   272
          // Segment txBuffer.FirstBuffer and
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   273
          // Give back the remaining segment to the transmission buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   274
          Ptr<Packet> newSegment = firstSegment->CreateFragment (0, nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   275
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   276
          // Status tag of the new and remaining segments
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   277
          // Note: This is the only place where a PDU is segmented and
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   278
          // therefore its status can change
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   279
          LteRlcSduStatusTag oldTag, newTag;    // TODO CreateFragment copy the tag???
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   280
          firstSegment->RemovePacketTag (oldTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   281
          newSegment->RemovePacketTag (newTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   282
          if (oldTag.GetStatus () == LteRlcSduStatusTag::FULL_SDU)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   283
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   284
              newTag.SetStatus (LteRlcSduStatusTag::FIRST_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   285
              oldTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   286
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   287
          else if (oldTag.GetStatus () == LteRlcSduStatusTag::LAST_SEGMENT)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   288
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   289
              newTag.SetStatus (LteRlcSduStatusTag::MIDDLE_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   290
              //oldTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   291
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   292
          firstSegment->AddPacketTag (oldTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   293
          newSegment->AddPacketTag (newTag);  // TODO What happens if we add two tags???
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   294
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   295
          // Give back the remaining segment to the transmission buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   296
          firstSegment->RemoveAtStart (nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   297
          m_txonBuffer.insert (m_txonBuffer.begin (), firstSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   298
          m_txonBufferSize += (*(m_txonBuffer.begin()))->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   299
          firstSegment = 0; // TODO how to put a null ptr to Packet?
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   300
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   301
          NS_LOG_LOGIC ("    TX buffer: Give back the remaining segment");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   302
          NS_LOG_LOGIC ("    TX buffers = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   303
          NS_LOG_LOGIC ("    Front buffer size = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   304
          NS_LOG_LOGIC ("    txBufferSize = " << m_txonBufferSize );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   305
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   306
          // Add Segment to Data field
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   307
          dataFieldAddedSize = newSegment->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   308
          dataFieldTotalSize += dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   309
          dataField.push_back (newSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   310
          newSegment = 0; // TODO how to put a null ptr to Packet?
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   311
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   312
          // ExtensionBit (Next_Segment - 1) = 0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   313
          rlcAmHeader.PushExtensionBit (LteRlcAmHeader::DATA_FIELD_FOLLOWS);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   314
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   315
          // no LengthIndicator for the last one
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   316
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   317
          nextSegmentSize -= dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   318
          nextSegmentId++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   319
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   320
          // nextSegmentSize MUST be zero
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   321
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   322
          // (NO more segments) → exit
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   323
          // break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   324
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   325
      else if ( (firstSegment->GetSize () == nextSegmentSize) || (m_txonBuffer.size () == 0) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   326
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   327
          NS_LOG_LOGIC ("    IF firstSegment == NextSegmentSize || txonBuffer.size == 0");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   328
          // Add txBuffer.FirstBuffer to DataField
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   329
          dataFieldAddedSize = firstSegment->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   330
          dataFieldTotalSize += dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   331
          dataField.push_back (firstSegment);
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   332
          firstSegment = 0;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   333
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   334
          // ExtensionBit (Next_Segment - 1) = 0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   335
          rlcAmHeader.PushExtensionBit (LteRlcAmHeader::DATA_FIELD_FOLLOWS);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   336
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   337
          // no LengthIndicator for the last one
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   338
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   339
          nextSegmentSize -= dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   340
          nextSegmentId++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   341
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   342
          NS_LOG_LOGIC ("        SDUs in TxBuffer  = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   343
          if (m_txonBuffer.size () > 0)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   344
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   345
              NS_LOG_LOGIC ("        First SDU buffer  = " << *(m_txonBuffer.begin()));
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   346
              NS_LOG_LOGIC ("        First SDU size    = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   347
            }
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   348
          NS_LOG_LOGIC ("        Next segment size = " << nextSegmentSize);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   349
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   350
          // nextSegmentSize MUST be zero (only if txonBuffer is not empty)
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   351
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   352
          // (NO more segments) → exit
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   353
          // break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   354
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   355
      else // (firstSegment->GetSize () < m_nextSegmentSize) && (m_txBuffer.size () > 0)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   356
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   357
          NS_LOG_LOGIC ("    IF firstSegment < NextSegmentSize && txonBuffer.size > 0");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   358
          // Add txBuffer.FirstBuffer to DataField
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   359
          dataFieldAddedSize = firstSegment->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   360
          dataFieldTotalSize += dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   361
          dataField.push_back (firstSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   362
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   363
          // ExtensionBit (Next_Segment - 1) = 1
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   364
          rlcAmHeader.PushExtensionBit (LteRlcAmHeader::E_LI_FIELDS_FOLLOWS);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   365
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   366
          // LengthIndicator (Next_Segment)  = txBuffer.FirstBuffer.length()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   367
          rlcAmHeader.PushLengthIndicator (firstSegment->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   368
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   369
          nextSegmentSize -= ((nextSegmentId % 2) ? (2) : (1)) + dataFieldAddedSize;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   370
          nextSegmentId++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   371
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   372
          NS_LOG_LOGIC ("        SDUs in TxBuffer  = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   373
          if (m_txonBuffer.size () > 0)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   374
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   375
              NS_LOG_LOGIC ("        First SDU buffer  = " << *(m_txonBuffer.begin()));
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   376
              NS_LOG_LOGIC ("        First SDU size    = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   377
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   378
          NS_LOG_LOGIC ("        Next segment size = " << nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   379
          NS_LOG_LOGIC ("        Remove SDU from TxBuffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   380
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   381
          // (more segments)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   382
          firstSegment = (*(m_txonBuffer.begin ()))->Copy ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   383
          m_txonBufferSize -= (*(m_txonBuffer.begin()))->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   384
          m_txonBuffer.erase (m_txonBuffer.begin ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   385
          NS_LOG_LOGIC ("        txBufferSize = " << m_txonBufferSize );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   386
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   387
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   388
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   389
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   390
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   391
  // Build RLC header
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   392
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   393
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   394
  rlcAmHeader.SetSequenceNumber ( m_vtS++ );
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   395
  rlcAmHeader.SetResegmentationFlag (LteRlcAmHeader::PDU);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   396
  rlcAmHeader.SetLastSegmentFlag (LteRlcAmHeader::LAST_PDU_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   397
  rlcAmHeader.SetSegmentOffset (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   398
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   399
  // Calculate FramingInfo flag according the status of the SDUs in the DataField
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   400
  uint8_t framingInfo = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   401
  std::vector< Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   402
  it = dataField.begin ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   403
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   404
  // FIRST SEGMENT
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   405
  LteRlcSduStatusTag tag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   406
  (*it)->RemovePacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   407
  if ( (tag.GetStatus () == LteRlcSduStatusTag::FULL_SDU) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   408
       (tag.GetStatus () == LteRlcSduStatusTag::FIRST_SEGMENT)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   409
     )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   410
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   411
      framingInfo |= LteRlcAmHeader::FIRST_BYTE;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   412
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   413
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   414
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   415
      framingInfo |= LteRlcAmHeader::NO_FIRST_BYTE;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   416
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   417
  (*it)->AddPacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   418
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   419
  // Add all SDUs (in DataField) to the Packet
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   420
  while (it < dataField.end ())
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   421
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   422
      NS_LOG_LOGIC ("Adding SDU/segment to packet, length = " << (*it)->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   423
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   424
      packet->AddAtEnd (*it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   425
      it++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   426
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   427
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   428
  // LAST SEGMENT (Note: There could be only one and be the first one)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   429
  it--;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   430
  (*it)->RemovePacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   431
  if ( (tag.GetStatus () == LteRlcSduStatusTag::FULL_SDU) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   432
        (tag.GetStatus () == LteRlcSduStatusTag::LAST_SEGMENT) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   433
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   434
      framingInfo |= LteRlcAmHeader::LAST_BYTE;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   435
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   436
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   437
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   438
      framingInfo |= LteRlcAmHeader::NO_LAST_BYTE;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   439
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   440
  (*it)->AddPacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   441
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   442
  // Set the FramingInfo flag after the calculation
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   443
  rlcAmHeader.SetFramingInfo (framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   444
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   445
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   446
  // Calculate the Polling Bit (5.2.2.1)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   447
  rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_NOT_REQUESTED);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   449
  m_pduWithoutPoll++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   450
  NS_LOG_LOGIC ("PDU_WITHOUT_POLL = " << m_pduWithoutPoll);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   451
  m_byteWithoutPoll += packet->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   452
  NS_LOG_LOGIC ("BYTE_WITHOUT_POLL = " << m_byteWithoutPoll);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   453
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   454
  if ( (m_pduWithoutPoll >= m_pollPdu) || (m_byteWithoutPoll >= m_pollByte) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   455
       ( (m_txonBuffer.empty ()) && (m_retxBuffer.empty ()) ) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   456
       (m_vtS >= m_vtMs)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   457
     )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   458
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   459
      rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   460
      m_pduWithoutPoll = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   461
      m_byteWithoutPoll = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   462
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   463
      m_pollSn = m_vtS - 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   464
      NS_LOG_LOGIC ("New POLL_SN = " << m_pollSn);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   465
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   466
      if (! m_pollRetransmitTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   467
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   468
          NS_LOG_LOGIC ("Start PollRetransmit timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   469
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   470
          m_pollRetransmitTimer = Simulator::Schedule (Time ("0.1s"),
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   471
                                                       &LteRlcAm::ExpirePollRetransmitTimer, this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   472
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   473
      else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   474
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   475
          NS_LOG_LOGIC ("Restart PollRetransmit timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   476
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   477
          m_pollRetransmitTimer.Cancel ();
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   478
          m_pollRetransmitTimer = Simulator::Schedule (Time ("0.1s"),
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   479
                                                       &LteRlcAm::ExpirePollRetransmitTimer, this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   480
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   481
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   482
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   483
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   484
  // Build RLC PDU with DataField and Header
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   485
  NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   486
  packet->AddHeader (rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   487
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   488
  // Store new PDU into the Transmitted PDU Buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   489
  NS_LOG_LOGIC ("Put transmitted PDU in the txedBuffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   490
  m_txedBufferSize += packet->GetSize ();
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   491
  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet->Copy ();
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   492
  
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   493
  // Sender timestamp
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   494
  RlcTag rlcTag (Simulator::Now ());
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   495
  packet->AddByteTag (rlcTag);
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   496
  m_txPdu (m_rnti, m_lcid, packet->GetSize ());
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   497
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   498
  // Send RLC PDU to MAC layer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   499
  LteMacSapProvider::TransmitPduParameters params;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   500
  params.pdu = packet;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   501
  params.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   502
  params.lcid = m_lcid;
8714
398bbcbb3f42 Add MIMO model, test and documentation
Marco Miozzo <marco.miozzo@cttc.es>
parents: 8456
diff changeset
   503
  params.layer = layer;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   504
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   505
  m_macSapProvider->TransmitPdu (params);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   506
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   507
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   508
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   509
LteRlcAm::DoNotifyHarqDeliveryFailure ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   510
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   511
  NS_LOG_FUNCTION (this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   512
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   513
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   514
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   515
LteRlcAm::DoReceivePdu (Ptr<Packet> p)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   516
{
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   517
  NS_LOG_FUNCTION (this << p->GetSize ());
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   518
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   519
  // Receiver timestamp
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   520
  RlcTag rlcTag;
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   521
  Time delay;
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   522
  if (p->FindFirstMatchingByteTag (rlcTag))
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   523
    {
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   524
      delay = Simulator::Now() - rlcTag.GetSenderTimestamp ();
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   525
    }
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   526
  m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ());
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   527
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   528
  // Get RLC header parameters
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   529
  LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   530
  p->PeekHeader (rlcAmHeader);
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   531
  NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   532
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   533
  if ( rlcAmHeader.IsDataPdu () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   534
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   535
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   536
      // 5.1.3.1   Transmit operations
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   537
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   538
      // 5.1.3.1.1       General
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   539
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   540
      // The transmitting side of an AM RLC entity shall prioritize transmission of RLC control PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   541
      // over RLC data PDUs. The transmitting side of an AM RLC entity shall prioritize retransmission
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   542
      // of RLC data PDUs over transmission of new AMD PDUs.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   543
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   544
      // The transmitting side of an AM RLC entity shall maintain a transmitting window according to
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   545
      // state variables VT(A) and VT(MS) as follows:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   546
      // - a SN falls within the transmitting window if VT(A) <= SN < VT(MS);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   547
      // - a SN falls outside of the transmitting window otherwise.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   548
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   549
      // The transmitting side of an AM RLC entity shall not deliver to lower layer any RLC data PDU
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   550
      // whose SN falls outside of the transmitting window.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   551
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   552
      // When delivering a new AMD PDU to lower layer, the transmitting side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   553
      // - set the SN of the AMD PDU to VT(S), and then increment VT(S) by one.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   554
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   555
      // The transmitting side of an AM RLC entity can receive a positive acknowledgement (confirmation
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   556
      // of successful reception by its peer AM RLC entity) for a RLC data PDU by the following:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   557
      // - STATUS PDU from its peer AM RLC entity.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   558
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   559
      // When receiving a positive acknowledgement for an AMD PDU with SN = VT(A), the transmitting
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   560
      // side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   561
      // - set VT(A) equal to the SN of the AMD PDU with the smallest SN, whose SN falls within the
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   562
      //   range VT(A) <= SN <= VT(S) and for which a positive acknowledgment has not been received yet.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   563
      // - if positive acknowledgements have been received for all AMD PDUs associated with
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   564
      //   a transmitted RLC SDU:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   565
      // - send an indication to the upper layers of successful delivery of the RLC SDU.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   566
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   567
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   568
      // 5.1.3.2 Receive operations
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   569
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   570
      // 5.1.3.2.1 General
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   571
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   572
      // The receiving side of an AM RLC entity shall maintain a receiving window according to state
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   573
      // variables VR(R) and VR(MR) as follows:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   574
      // - a SN falls within the receiving window if VR(R) <= SN < VR(MR);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   575
      // - a SN falls outside of the receiving window otherwise.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   576
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   577
      // When receiving a RLC data PDU from lower layer, the receiving side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   578
      // - either discard the received RLC data PDU or place it in the reception buffer (see sub clause 5.1.3.2.2);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   579
      // - if the received RLC data PDU was placed in the reception buffer:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   580
      // - update state variables, reassemble and deliver RLC SDUs to upper layer and start/stop t-Reordering as needed (see sub clause 5.1.3.2.3).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   581
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   582
      // When t-Reordering expires, the receiving side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   583
      // - update state variables and start t-Reordering as needed (see sub clause 5.1.3.2.4).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   584
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   585
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   586
      SequenceNumber10 seqNumber = rlcAmHeader.GetSequenceNumber ();
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   587
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   588
      if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::SEGMENT )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   589
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   590
          NS_LOG_LOGIC ("AMD PDU segment received ( SN = " << seqNumber << " )");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   591
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   592
      else if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::PDU )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   593
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   594
          NS_LOG_LOGIC ("AMD PDU received ( SN = " << seqNumber << " )");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   595
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   596
      else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   597
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   598
          NS_ASSERT_MSG (false, "Neither an AMD PDU segment nor a AMD PDU received");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   599
          return ;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   600
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   601
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   602
      // STATUS PDU is requested
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   603
      if ( rlcAmHeader.GetPollingBit () == LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   604
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   605
          m_statusPduRequested = true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   606
          m_statusPduBufferSize = 4;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   607
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   608
          if (! m_statusProhibitTimer.IsRunning ())
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   609
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   610
              Time now = Simulator::Now ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   611
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   612
              // Transmission Queue HOL time
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   613
              RlcTag txonQueueHolTimeTag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   614
              Time txonQueueHolDelay (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   615
              if ( ! m_txonBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   616
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   617
                  m_txonBuffer.front ()->PeekPacketTag (txonQueueHolTimeTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   618
                  txonQueueHolDelay = now - txonQueueHolTimeTag.GetSenderTimestamp ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   619
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   620
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   621
              // Retransmission Queue HOL time
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   622
              RlcTag retxQueueHolTimeTag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   623
              Time retxQueueHolDelay (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   624
              if ( m_retxBufferSize )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   625
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   626
                  m_retxBuffer.front ().m_pdu->PeekPacketTag (retxQueueHolTimeTag);
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   627
                  retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   628
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   629
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   630
              LteMacSapProvider::ReportBufferStatusParameters r;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   631
              r.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   632
              r.lcid = m_lcid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   633
              r.txQueueSize = m_txonBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   634
              r.txQueueHolDelay = txonQueueHolDelay.GetMilliSeconds ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   635
              r.retxQueueSize = m_retxBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   636
              r.retxQueueHolDelay = retxQueueHolDelay.GetMilliSeconds ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   637
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   638
              if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   639
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   640
                  r.statusPduSize = m_statusPduBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   641
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   642
              else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   643
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   644
                  r.statusPduSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   645
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   646
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   647
              NS_LOG_INFO ("Send ReportBufferStatus: " << r.txQueueSize << ", " << r.txQueueHolDelay << ", "
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   648
                                                      << r.retxQueueSize << ", " << r.retxQueueHolDelay << ", "
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   649
                                                      << r.statusPduSize );
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   650
              m_macSapProvider->ReportBufferStatus (r);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   651
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   652
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   653
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   654
      // 5.1.3.2.2 Actions when a RLC data PDU is received from lower layer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   655
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   656
      // When a RLC data PDU is received from lower layer, where the RLC data PDU contains
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   657
      // byte segment numbers y to z of an AMD PDU with SN = x, the receiving side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   658
      // - if x falls outside of the receiving window; or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   659
      // - if byte segment numbers y to z of the AMD PDU with SN = x have been received before:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   660
      //     - discard the received RLC data PDU;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   661
      // - else:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   662
      //     - place the received RLC data PDU in the reception buffer;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   663
      //     - if some byte segments of the AMD PDU contained in the RLC data PDU have been received before:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   664
      //         - discard the duplicate byte segments.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   665
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   666
      NS_LOG_LOGIC ("VR(R)  = " << m_vrR);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   667
      NS_LOG_LOGIC ("VR(MR) = " << m_vrMr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   668
      NS_LOG_LOGIC ("VR(X)  = " << m_vrX);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   669
      NS_LOG_LOGIC ("VR(MS) = " << m_vrMs);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   670
      NS_LOG_LOGIC ("VR(H)  = " << m_vrH);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   671
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   672
      // - if x falls outside of the receiving window; or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   673
      // - if byte segment numbers y to z of the AMD PDU with SN = x have been received before:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   674
      if ( ! IsInsideReceivingWindow (seqNumber) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   675
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   676
          NS_LOG_LOGIC ("AMD PDU discarded");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   677
          return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   678
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   679
      else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   680
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   681
          NS_LOG_LOGIC ("Place AMD PDU in the reception buffer ( SN = " << seqNumber << " )");
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   682
          m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p);
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   683
          m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   684
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   685
          // - if some byte segments of the AMD PDU contained in the RLC data PDU have been received before:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   686
          //         - discard the duplicate byte segments.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   687
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   688
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   689
      // 5.1.3.2.3 Actions when a RLC data PDU is placed in the reception buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   690
      // When a RLC data PDU with SN = x is placed in the reception buffer,
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   691
      // the receiving side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   692
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   693
      // - if x >= VR(H)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   694
      //     - update VR(H) to x+ 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   695
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   696
      if ( seqNumber >= m_vrH )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   697
        {
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   698
          m_vrH = seqNumber + 1;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   699
          NS_LOG_LOGIC ("New VR(H)  = " << m_vrH);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   700
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   701
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   702
      // - if all byte segments of the AMD PDU with SN = VR(MS) are received:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   703
      //     - update VR(MS) to the SN of the first AMD PDU with SN > current VR(MS) for
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   704
      //       which not all byte segments have been received;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   705
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   706
      if ( m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   707
        {
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   708
          while ( m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   709
            {
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   710
              m_vrMs++;
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   711
              NS_LOG_LOGIC ("Incr VR(MS) = " << m_vrMs);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   712
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   713
          NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   714
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   715
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   716
      // - if x = VR(R):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   717
      //     - if all byte segments of the AMD PDU with SN = VR(R) are received:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   718
      //         - update VR(R) to the SN of the first AMD PDU with SN > current VR(R) for which not all byte segments have been received;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   719
      //         - update VR(MR) to the updated VR(R) + AM_Window_Size;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   720
      //     - reassemble RLC SDUs from any byte segments of AMD PDUs with SN that falls outside of the receiving window and in-sequence byte segments of the AMD PDU with SN = VR(R), remove RLC headers when doing so and deliver the reassembled RLC SDUs to upper layer in sequence if not delivered before;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   721
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   722
      if ( seqNumber == m_vrR )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   723
        {
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   724
          if ( m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete )
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   725
            {
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   726
              while ( m_rxonBuffer[ m_vrR.GetValue () ].m_pduComplete )
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   727
                {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   728
                  NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << m_vrR << " )");
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   729
                  NS_ASSERT_MSG (m_rxonBuffer[ m_vrR.GetValue () ].m_byteSegments.size () == 1,
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   730
                                "Too many segments. PDU Reassembly process didn't work");
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   731
                  ReassembleAndDeliver (m_rxonBuffer[ m_vrR.GetValue () ].m_byteSegments.front ());
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   732
                  m_rxonBuffer.erase (m_vrR.GetValue ());
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   733
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   734
                  m_vrR++;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   735
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   736
              NS_LOG_LOGIC ("New VR(R)  = " << m_vrR);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   737
              m_vrMr = m_vrR + m_windowSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   738
              NS_LOG_LOGIC ("New VR(MR) = " << m_vrMr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   739
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   740
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   741
//           NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << seqNumber << " )");
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   742
//           NS_ASSERT_MSG (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.size () == 1,
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   743
//                          "Too many segments. PDU Reassembly process didn't work");
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   744
//           ReassembleAndDeliver (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.front ());
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   745
//           m_rxonBuffer.erase (seqNumber.GetValue ());
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   746
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   747
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   748
      // - if t-Reordering is running:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   749
      //     - if VR(X) = VR(R); or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   750
      //     - if VR(X) falls outside of the receiving window and VR(X) is not equal to VR(MR):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   751
      //         - stop and reset t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   752
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   753
      if ( m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   754
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   755
          NS_LOG_LOGIC ("Reordering timer is running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   756
          if ( (m_vrX == m_vrR) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   757
               ( (! IsInsideReceivingWindow (m_vrX)) && (m_vrX != m_vrMr) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   758
             )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   759
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   760
              // TODO stop and reset the t-Reordering
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   761
              NS_LOG_LOGIC ("Stop reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   762
              m_reorderingTimer.Cancel ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   763
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   764
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   765
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   766
      // - if t-Reordering is not running (includes the case t-Reordering is stopped due to actions above):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   767
      //     - if VR (H) > VR(R):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   768
      //         - start t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   769
      //         - set VR(X) to VR(H).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   770
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   771
      if ( ! m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   772
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   773
          NS_LOG_LOGIC ("Reordering timer is not running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   774
          if ( m_vrH > m_vrR )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   775
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   776
              NS_LOG_LOGIC ("Start reordering timer");
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   777
              m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   778
                                                       &LteRlcAm::ExpireReorderingTimer ,this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   779
              m_vrX = m_vrH;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   780
              NS_LOG_LOGIC ("New VR(X) = " << m_vrX);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   781
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   782
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   783
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   784
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   785
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   786
      // TODO To remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   787
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   788
      // 5.1.2.2.3 Actions when an UMD PDU is placed in the reception buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   789
      // When an UMD PDU with SN = x is placed in the reception buffer, the receiving UM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   790
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   791
      // - if x falls outside of the reordering window:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   792
      //    - update VR(UH) to x + 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   793
      //    - reassemble RLC SDUs from any UMD PDUs with SN that falls outside of the reordering window, remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   794
      //      RLC headers when doing so and deliver the reassembled RLC SDUs to upper layer in ascending order of the
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   795
      //      RLC SN if not delivered before;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   796
      //    - if VR(UR) falls outside of the reordering window:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   797
      //        - set VR(UR) to (VR(UH) - UM_Window_Size);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   798
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   799
//       if ( ! IsInsideReorderingWindow (seqNumber))
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   800
//         {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   801
//           NS_LOG_LOGIC ("SN outside the reordering window");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   802
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   803
//           m_vrUh = seqNumber + 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   804
//           NS_LOG_LOGIC ("New VR(UH) = " << m_vrUh);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   805
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   806
//           ReassembleOutsideWindow ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   807
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   808
//           if ( ! IsInsideReorderingWindow (m_vrUr) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   809
//             {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   810
//               m_vrUr = m_vrUh - m_windowSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   811
//               NS_LOG_LOGIC ("VR(UR) outside the reordering window");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   812
//               NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   813
//             }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   814
//         }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   815
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   816
      // - if the reception buffer contains an UMD PDU with SN = VR(UR):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   817
      //    - update VR(UR) to the SN of the first UMD PDU with SN > current VR(UR) that has not been received;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   818
      //    - reassemble RLC SDUs from any UMD PDUs with SN < updated VR(UR), remove RLC headers when doing
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   819
      //      so and deliver the reassembled RLC SDUs to upper layer in ascending order of the RLC SN if not delivered
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   820
      //      before;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   821
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   822
//       if ( m_rxBuffer.count (m_vrUr) > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   823
//         {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   824
//           NS_LOG_LOGIC ("Reception buffer contains SN = " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   825
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   826
//           std::map <uint16_t, Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   827
//           uint16_t newVrUr;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   828
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   829
//           it = m_rxBuffer.find (m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   830
//           newVrUr = (it->first) + 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   831
//           while ( m_rxBuffer.count (newVrUr) > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   832
//             {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   833
//               newVrUr++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   834
//             }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   835
//           m_vrUr = newVrUr;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   836
//           NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   837
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   838
//           ReassembleSnLessThan (m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   839
//         }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   840
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   841
      // - if t-Reordering is running:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   842
      //    - if VR(UX) <= VR(UR); or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   843
      //    - if VR(UX) falls outside of the reordering window and VR(UX) is not equal to VR(UH)::
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   844
      //        - stop and reset t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   845
//       if ( m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   846
//         {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   847
//           NS_LOG_LOGIC ("Reordering timer is running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   848
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   849
//           if ( (m_vrUx <= m_vrUr) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   850
//               ((! IsInsideReorderingWindow (m_vrUx)) && (m_vrUx != m_vrUh)) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   851
//             {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   852
//               NS_LOG_LOGIC ("Stop reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   853
//               m_reorderingTimer.Cancel ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   854
//             }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   855
//         }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   856
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   857
      // - if t-Reordering is not running (includes the case when t-Reordering is stopped due to actions above):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   858
      //    - if VR(UH) > VR(UR):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   859
      //        - start t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   860
      //        - set VR(UX) to VR(UH).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   861
//       if ( ! m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   862
//         {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   863
//           NS_LOG_LOGIC ("Reordering timer is not running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   864
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   865
//           if ( m_vrUx > m_vrUr )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   866
//             {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   867
//               NS_LOG_LOGIC ("VR(UX) > VR(UR). " << m_vrUx << " > " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   868
//               NS_LOG_LOGIC ("Start reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   869
//               m_reorderingTimer = Simulator::Schedule (Time ("1.0s"),
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   870
//                                                       &LteRlcAm::ExpireReorderingTimer ,this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   871
//               m_vrUx = m_vrUh;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   872
//               NS_LOG_LOGIC ("New VR(UX) = " << m_vrUx);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   873
//             }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   874
//         }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   875
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   876
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   877
  else if ( rlcAmHeader.IsControlPdu () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   878
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   879
      NS_LOG_INFO ("Control AM RLC PDU");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   880
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   881
      SequenceNumber10 ackSn = rlcAmHeader.GetAckSn ();
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   882
//       SequenceNumber10 seqNumber = m_vtA;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   883
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   884
      NS_LOG_INFO ("ackSn     = " << ackSn);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   885
      NS_LOG_INFO ("VT(A)     = " << m_vtA);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   886
      NS_LOG_INFO ("VT(S)     = " << m_vtS);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   887
      while (m_vtA < ackSn && m_vtA < m_vtS)
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   888
        {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   889
//           NS_LOG_INFO ("seqNumber = " << seqNumber);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   890
//           NS_LOG_INFO ("m_txedBuffer( VT(A) ).size = " << m_txedBuffer.size ());
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   891
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   892
          uint16_t seqNumberValue = m_vtA.GetValue ();
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   893
          if (m_txedBuffer.at (seqNumberValue))
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   894
            {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   895
              NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from txedBuffer");
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   896
//               NS_LOG_INFO ("m_txedBuffer( " << m_vtA << " )->GetSize = " << m_txedBuffer.at (m_vtA.GetValue ())->GetSize ());
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   897
              m_txedBufferSize -= m_txedBuffer.at (seqNumberValue)->GetSize ();
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   898
              m_txedBuffer.at (seqNumberValue) = 0;
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   899
            }
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   900
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   901
          if (m_retxBuffer.at (seqNumberValue).m_pdu)
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   902
            {
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   903
              NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from retxBuffer");
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   904
              m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   905
              m_retxBuffer.at (seqNumberValue).m_pdu = 0;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   906
              m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   907
            }
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   908
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   909
          m_vtA++;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   910
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   911
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   912
      NS_LOG_INFO ("New VT(A) = " << m_vtA);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   913
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   914
      SequenceNumber10 seqNumber = m_vtA;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   915
      uint16_t seqNumberValue;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   916
      while (seqNumber < m_vtS)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   917
        {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   918
          seqNumberValue = seqNumber.GetValue ();
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   919
          if (m_txedBuffer.at (seqNumberValue))
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   920
            {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   921
              NS_LOG_INFO ("Move SN = " << seqNumberValue << " to retxBuffer");
8667
5fcab10ff001 Copy packets before send them to MAC layer
Manuel Requena <manuel.requena@cttc.es>
parents: 8628
diff changeset
   922
              m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seqNumberValue)->Copy ();
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   923
              m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   924
              m_retxBufferSize += m_retxBuffer.at (seqNumberValue).m_pdu->GetSize ();
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   925
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   926
              m_txedBufferSize -= m_txedBuffer.at (seqNumberValue)->GetSize ();
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   927
              m_txedBuffer.at (seqNumberValue) = 0;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   928
            }
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   929
          else if (m_retxBuffer.at (seqNumberValue).m_pdu)
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   930
            {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   931
              m_retxBuffer.at (seqNumberValue).m_retxCount++;
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   932
              NS_LOG_INFO ("Incr RETX_COUNT for SN = " << seqNumberValue);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   933
              if (m_retxBuffer.at (seqNumberValue).m_retxCount >= m_maxRetxThreshold)
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   934
                {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   935
                  NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumberValue);
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   936
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   937
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   938
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   939
          seqNumber++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   940
        }
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   941
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   942
      return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   943
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   944
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   945
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   946
      NS_LOG_WARN ("Wrong AM RLC PDU type");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   947
      return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   948
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   949
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   950
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   951
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   952
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   953
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   954
LteRlcAm::Start ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   955
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   956
  NS_LOG_FUNCTION (this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   957
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   958
  LteMacSapProvider::ReportBufferStatusParameters p;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   959
  p.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   960
  p.lcid = m_lcid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   961
  p.txQueueSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   962
  p.txQueueHolDelay = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   963
  p.retxQueueSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   964
  p.retxQueueHolDelay = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   965
  p.statusPduSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   966
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   967
  m_macSapProvider->ReportBufferStatus (p);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   968
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   969
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   970
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   971
bool
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
   972
LteRlcAm::IsInsideReceivingWindow (SequenceNumber10 seqNumber)
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   973
{
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   974
  NS_LOG_FUNCTION (this << seqNumber);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   975
  NS_LOG_LOGIC ("Receiving Window: " <<
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   976
                m_vrR << " <= " << seqNumber << " <= " << m_vrMr);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   977
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   978
  m_vrR.SetModulusBase (m_vrR);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   979
  m_vrMr.SetModulusBase (m_vrR);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   980
  seqNumber.SetModulusBase (m_vrR);
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   981
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   982
  if ( (m_vrR <= seqNumber) && (seqNumber < m_vrMr ) )
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   983
    {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   984
      NS_LOG_LOGIC (seqNumber << " is INSIDE the receiving window");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   985
      return true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   986
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   987
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   988
    {
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
   989
      NS_LOG_LOGIC (seqNumber << " is OUTSIDE the receiving window");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   990
      return false;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   991
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   992
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   993
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   994
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   995
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   996
LteRlcAm::ReassembleAndDeliver (Ptr<Packet> packet)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   997
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   998
  LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   999
  packet->RemoveHeader (rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1000
  uint8_t framingInfo = rlcAmHeader.GetFramingInfo ();
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
  1001
  SequenceNumber10 currSeqNumber = rlcAmHeader.GetSequenceNumber ();
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1002
  bool expectedSnLost;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1003
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1004
  if ( currSeqNumber != m_expectedSeqNumber )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1005
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1006
      expectedSnLost = true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1007
      NS_LOG_LOGIC ("There are losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
  1008
      m_expectedSeqNumber = currSeqNumber + 1;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1009
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1010
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1011
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1012
      expectedSnLost = false;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1013
      NS_LOG_LOGIC ("No losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
  1014
      m_expectedSeqNumber = m_expectedSeqNumber + 1;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1015
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1016
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1017
  // Build list of SDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1018
  uint8_t extensionBit;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1019
  uint16_t lengthIndicator;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1020
  do
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1021
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1022
      extensionBit = rlcAmHeader.PopExtensionBit ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1023
      NS_LOG_LOGIC ("E = " << (uint16_t)extensionBit);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1024
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1025
      if ( extensionBit == 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1026
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1027
          m_sdusBuffer.push_back (packet);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1028
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1029
      else // extensionBit == 1
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1030
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1031
          lengthIndicator = rlcAmHeader.PopLengthIndicator ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1032
          NS_LOG_LOGIC ("LI = " << lengthIndicator);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1033
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1034
          // Check if there is enough data in the packet
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1035
          if ( lengthIndicator >= packet->GetSize () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1036
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1037
              NS_LOG_LOGIC ("INTERNAL ERROR: Not enough data in the packet (" << packet->GetSize () << "). Needed LI=" << lengthIndicator);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1038
              // TODO What to do in this case? Discard packet and continue? Or Assert?
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1039
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1040
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1041
          // Split packet in two fragments
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1042
          Ptr<Packet> data_field = packet->CreateFragment (0, lengthIndicator);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1043
          packet->RemoveAtStart (lengthIndicator);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1044
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1045
          m_sdusBuffer.push_back (data_field);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1046
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1047
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1048
  while ( extensionBit == 1 );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1049
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1050
  std::list < Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1051
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1052
  // Current reassembling state
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1053
  if      (m_reassemblingState == WAITING_S0_FULL)  NS_LOG_LOGIC ("Reassembling State = 'WAITING_S0_FULL'");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1054
  else if (m_reassemblingState == WAITING_SI_SF)    NS_LOG_LOGIC ("Reassembling State = 'WAITING_SI_SF'");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1055
  else                                              NS_LOG_LOGIC ("Reassembling State = Unknown state");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1056
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1057
  // Received framing Info
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1058
  NS_LOG_LOGIC ("Framing Info = " << (uint16_t)framingInfo);
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
  1059
  NS_LOG_LOGIC ("m_sdusBuffer = " << m_sdusBuffer.size ());
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1060
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1061
  // Reassemble the list of SDUs (when there is no losses)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1062
  if (!expectedSnLost)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1063
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1064
      switch (m_reassemblingState)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1065
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1066
          case WAITING_S0_FULL:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1067
                  switch (framingInfo)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1068
                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1069
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1070
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1071
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1072
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1073
                              * Deliver one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1074
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1075
                              for ( it = m_sdusBuffer.begin () ; it != m_sdusBuffer.end () ; it++ )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1076
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1077
                                  m_rlcSapUser->ReceivePdcpPdu (*it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1078
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1079
                              m_sdusBuffer.clear ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1080
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1081
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1082
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1083
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1084
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1085
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1086
                              * Deliver full PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1087
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1088
                              while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1089
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1090
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1091
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1092
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1093
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1094
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1095
                              * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1096
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1097
                              m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1098
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1099
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1100
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1101
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1102
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1103
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1104
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1105
                              * ERROR: Transition not possible
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1106
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1107
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1108
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1109
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1110
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1111
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1112
          case WAITING_SI_SF:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1113
                  switch (framingInfo)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1114
                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1115
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1116
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1117
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1118
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1119
                              * Deliver (Kept)S0 + SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1120
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1121
                              m_keepS0->AddAtEnd (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1122
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1123
                              m_rlcSapUser->ReceivePdcpPdu (m_keepS0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1124
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1125
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1126
                                * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1127
                                */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1128
                              while ( ! m_sdusBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1129
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1130
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1131
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1132
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1133
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1134
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1135
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1136
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1137
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1138
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1139
                              * Keep SI
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1140
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1141
                              if ( m_sdusBuffer.size () == 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1142
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1143
                                  m_keepS0->AddAtEnd (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1144
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1145
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1146
                              else // m_sdusBuffer.size () > 1
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1147
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1148
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1149
                                  * Deliver (Kept)S0 + SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1150
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1151
                                  m_keepS0->AddAtEnd (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1152
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1153
                                  m_rlcSapUser->ReceivePdcpPdu (m_keepS0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1154
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1155
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1156
                                  * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1157
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1158
                                  while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1159
                                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1160
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1161
                                      m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1162
                                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1163
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1164
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1165
                                  * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1166
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1167
                                  m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1168
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1169
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1170
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1171
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1172
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1173
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1174
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1175
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1176
                                * ERROR: Transition not possible
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1177
                                */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1178
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1179
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1180
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1181
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1182
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1183
          default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1184
                NS_LOG_LOGIC ("INTERNAL ERROR: Wrong reassembling state = " << m_reassemblingState);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1185
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1186
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1187
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1188
  else // Reassemble the list of SDUs (when there are losses, i.e. the received SN is not the expected one)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1189
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1190
      switch (m_reassemblingState)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1191
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1192
          case WAITING_S0_FULL:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1193
                  switch (framingInfo)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1194
                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1195
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1196
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1197
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1198
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1199
                               * Deliver one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1200
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1201
                              for ( it = m_sdusBuffer.begin () ; it != m_sdusBuffer.end () ; it++ )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1202
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1203
                                  m_rlcSapUser->ReceivePdcpPdu (*it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1204
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1205
                              m_sdusBuffer.clear ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1206
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1207
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1208
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1209
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1210
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1211
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1212
                               * Deliver full PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1213
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1214
                              while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1215
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1216
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1217
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1218
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1219
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1220
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1221
                               * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1222
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1223
                              m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1224
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1225
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1226
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1227
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1228
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1229
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1230
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1231
                               * Discard SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1232
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1233
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1234
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1235
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1236
                               * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1237
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1238
                              while ( ! m_sdusBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1239
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1240
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1241
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1242
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1243
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1244
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1245
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1246
                              if ( m_sdusBuffer.size () == 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1247
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1248
                                  m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1249
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1250
                              else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1251
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1252
                                  m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1253
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1254
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1255
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1256
                               * Discard SI or SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1257
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1258
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1259
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1260
                              if ( m_sdusBuffer.size () > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1261
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1262
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1263
                                  * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1264
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1265
                                  while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1266
                                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1267
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1268
                                      m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1269
                                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1270
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1271
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1272
                                  * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1273
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1274
                                  m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1275
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1276
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1277
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1278
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1279
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1280
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1281
                               * ERROR: Transition not possible
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1282
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1283
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1284
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1285
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1286
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1287
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1288
          case WAITING_SI_SF:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1289
                  switch (framingInfo)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1290
                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1291
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1292
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1293
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1294
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1295
                               * Discard S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1296
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1297
                              m_keepS0 = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1298
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1299
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1300
                               * Deliver one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1301
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1302
                              while ( ! m_sdusBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1303
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1304
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1305
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1306
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1307
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1308
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1309
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1310
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1311
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1312
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1313
                               * Discard S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1314
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1315
                              m_keepS0 = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1316
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1317
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1318
                               * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1319
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1320
                              while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1321
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1322
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1323
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1324
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1325
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1326
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1327
                               * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1328
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1329
                              m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1330
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1331
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1332
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1333
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1334
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1335
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1336
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1337
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1338
                               * Discard S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1339
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1340
                              m_keepS0 = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1341
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1342
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1343
                               * Discard SI or SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1344
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1345
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1346
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1347
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1348
                               * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1349
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1350
                              while ( ! m_sdusBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1351
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1352
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1353
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1354
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1355
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1356
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1357
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1358
                              if ( m_sdusBuffer.size () == 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1359
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1360
                                  m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1361
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1362
                              else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1363
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1364
                                  m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1365
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1366
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1367
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1368
                               * Discard S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1369
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1370
                              m_keepS0 = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1371
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1372
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1373
                               * Discard SI or SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1374
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1375
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1376
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1377
                              if ( m_sdusBuffer.size () > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1378
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1379
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1380
                                   * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1381
                                   */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1382
                                  while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1383
                                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1384
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1385
                                      m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1386
                                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1387
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1388
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1389
                                   * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1390
                                   */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1391
                                  m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1392
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1393
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1394
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1395
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1396
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1397
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1398
                                * ERROR: Transition not possible
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1399
                                */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1400
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1401
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1402
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1403
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1404
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1405
          default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1406
                NS_LOG_LOGIC ("INTERNAL ERROR: Wrong reassembling state = " << m_reassemblingState);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1407
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1408
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1409
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1410
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1411
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1412
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1413
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1414
// TODO To remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1415
// void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1416
// LteRlcAm::ReassembleOutsideWindow (void)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1417
// {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1418
//   NS_LOG_LOGIC ("Reassemble Outside Window");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1419
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1420
//   std::map <uint16_t, Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1421
//   it = m_rxBuffer.begin ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1422
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1423
//   while ( (it != m_rxBuffer.end ()) && ! IsInsideReorderingWindow (it->first) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1424
//     {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1425
//       NS_LOG_LOGIC ("SN = " << it->first);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1426
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1427
//       // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1428
//       ReassembleAndDeliver (it->second);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1429
//       m_rxBuffer.erase (it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1430
//       it++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1431
//     }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1432
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1433
//   if (it != m_rxBuffer.end ())
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1434
//     {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1435
//       NS_LOG_LOGIC ("(SN = " << it->first << ") is inside the reordering window");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1436
//     }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1437
// }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1438
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1439
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1440
// TODO To remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1441
// void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1442
// LteRlcAm::ReassembleSnLessThan (uint16_t seqNumber)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1443
// {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1444
//   NS_LOG_LOGIC ("Reassemble SN < updated VR(UR)" );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1445
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1446
//   std::map <uint16_t, Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1447
//   it = m_rxBuffer.begin ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1448
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1449
//   while ( (it != m_rxBuffer.end ()) && (it->first < seqNumber) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1450
//     {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1451
//       NS_LOG_LOGIC ("SN = " << it->first);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1452
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1453
//       // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1454
//       ReassembleAndDeliver (it->second);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1455
//       m_rxBuffer.erase (it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1456
//       it++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1457
//     }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1458
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1459
//   if (it != m_rxBuffer.end ())
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1460
//     {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1461
//       NS_LOG_LOGIC ("(SN = " << it->first << ") >= " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1462
//     }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1463
// }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1464
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1465
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1466
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1467
LteRlcAm::ExpireReorderingTimer (void)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1468
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1469
  NS_LOG_LOGIC ("Reordering Timer has expired");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1470
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1471
  // 5.1.3.2.4 Actions when t-Reordering expires
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1472
  // When t-Reordering expires, the receiving side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1473
  // - update VR(MS) to the SN of the first AMD PDU with SN >= VR(X) for which not all byte segments
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1474
  //   have been received;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1475
  // - if VR(H) > VR(MS):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1476
  //    - start t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1477
  //    - set VR(X) to VR(H).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1478
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1479
  m_vrMs = m_vrX;
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
  1480
  while ( m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1481
    {
8612
c98ed562f921 Change sequence number type
Manuel Requena <manuel.requena@cttc.es>
parents: 8456
diff changeset
  1482
      m_vrMs++;
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1483
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1484
  NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1485
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1486
  if ( m_vrH > m_vrMs )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1487
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1488
      NS_LOG_LOGIC ("Start reordering timer");
8628
b86b82c76693 Fix some bugs in the RLC AM entity
Manuel Requena <manuel.requena@cttc.es>
parents: 8612
diff changeset
  1489
      m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1490
                                              &LteRlcAm::ExpireReorderingTimer ,this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1491
      m_vrX = m_vrH;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1492
      NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1493
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1494
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1495
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1496
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1497
LteRlcAm::ExpirePollRetransmitTimer (void)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1498
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1499
  NS_LOG_LOGIC ("PollRetransmit Timer has expired");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1500
  NS_LOG_LOGIC ("TODO To Check");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1501
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1502
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1503
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1504
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1505
} // namespace ns3