src/lte/model/lte-rlc-am.cc
author Marco Miozzo <marco.miozzo@cttc.es>
Thu, 22 Mar 2012 18:16:01 +0100
changeset 8714 398bbcbb3f42
parent 8456 782a47ccaf2a
child 8726 f6f0e2531457
permissions -rw-r--r--
Add MIMO model, test and documentation
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;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    41
  m_retxBuffer.resize (512);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    42
  m_retxBufferSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    43
  m_txedBuffer.resize (512);
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
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   101
  NS_LOG_FUNCTION (this);
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
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   132
      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);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   189
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   190
  else if ( m_retxBufferSize > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   191
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   192
      NS_LOG_LOGIC ("Sending data from Retransmission Buffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   193
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   194
  else if ( m_txonBufferSize > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   195
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   196
      NS_LOG_LOGIC ("Sending data from Transmission Buffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   197
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   198
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   199
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   200
      NS_LOG_LOGIC ("No data pending");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   201
      return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   202
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   203
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   204
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   205
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   206
  // Build new PDU
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   207
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   208
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   209
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   210
  Ptr<Packet> packet = Create<Packet> ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   211
  LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   212
  rlcAmHeader.SetDataPdu ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   213
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   214
  // Build Data field
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   215
  uint32_t nextSegmentSize = bytes - 2;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   216
  uint32_t nextSegmentId = 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   217
  uint32_t dataFieldTotalSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   218
  uint32_t dataFieldAddedSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   219
  std::vector < Ptr<Packet> > dataField;
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
  // Remove the first packet from the transmission buffer.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   222
  // 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
   223
  if ( m_txonBuffer.size () == 0 )
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
  NS_LOG_LOGIC ("SDUs in TxonBuffer  = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   230
  NS_LOG_LOGIC ("First SDU buffer  = " << *(m_txonBuffer.begin()));
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   231
  NS_LOG_LOGIC ("First SDU size    = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   232
  NS_LOG_LOGIC ("Next segment size = " << nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   233
  NS_LOG_LOGIC ("Remove SDU from TxBuffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   234
  Ptr<Packet> firstSegment = (*(m_txonBuffer.begin ()))->Copy ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   235
  m_txonBufferSize -= (*(m_txonBuffer.begin()))->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   236
  NS_LOG_LOGIC ("txBufferSize      = " << m_txonBufferSize );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   237
  m_txonBuffer.erase (m_txonBuffer.begin ());
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
  while ( firstSegment && (firstSegment->GetSize () > 0) && (nextSegmentSize > 0) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   240
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   241
      NS_LOG_LOGIC ("WHILE .. firstSegment && firstSegment->GetSize > 0 && nextSegmentSize > 0 ..");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   242
      NS_LOG_LOGIC ("    FirstSegment size = " << firstSegment->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   243
      NS_LOG_LOGIC ("    Next segment size = " << nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   244
      if ( firstSegment->GetSize () > nextSegmentSize )
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
          NS_LOG_LOGIC ("    IF firstSegment > NextSegmentSize");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   247
          // Segment txBuffer.FirstBuffer and
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   248
          // Give back the remaining segment to the transmission buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   249
          Ptr<Packet> newSegment = firstSegment->CreateFragment (0, nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   250
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   251
          // Status tag of the new and remaining segments
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   252
          // 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
   253
          // therefore its status can change
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   254
          LteRlcSduStatusTag oldTag, newTag;    // TODO CreateFragment copy the tag???
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   255
          firstSegment->RemovePacketTag (oldTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   256
          newSegment->RemovePacketTag (newTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   257
          if (oldTag.GetStatus () == LteRlcSduStatusTag::FULL_SDU)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   258
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   259
              newTag.SetStatus (LteRlcSduStatusTag::FIRST_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   260
              oldTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   261
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   262
          else if (oldTag.GetStatus () == LteRlcSduStatusTag::LAST_SEGMENT)
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
              newTag.SetStatus (LteRlcSduStatusTag::MIDDLE_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   265
              //oldTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   266
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   267
          firstSegment->AddPacketTag (oldTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   268
          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
   269
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   270
          // Give back the remaining segment to the transmission buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   271
          firstSegment->RemoveAtStart (nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   272
          m_txonBuffer.insert (m_txonBuffer.begin (), firstSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   273
          m_txonBufferSize += (*(m_txonBuffer.begin()))->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   274
          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
   275
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   276
          NS_LOG_LOGIC ("    TX buffer: Give back the remaining segment");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   277
          NS_LOG_LOGIC ("    TX buffers = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   278
          NS_LOG_LOGIC ("    Front buffer size = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   279
          NS_LOG_LOGIC ("    txBufferSize = " << m_txonBufferSize );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   280
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   281
          // Add Segment to Data field
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   282
          dataFieldAddedSize = newSegment->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   283
          dataFieldTotalSize += dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   284
          dataField.push_back (newSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   285
          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
   286
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   287
          // ExtensionBit (Next_Segment - 1) = 0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   288
          rlcAmHeader.PushExtensionBit (LteRlcAmHeader::DATA_FIELD_FOLLOWS);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   289
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   290
          // no LengthIndicator for the last one
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
          nextSegmentSize -= dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   293
          nextSegmentId++;
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
          // nextSegmentSize MUST be zero
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   296
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   297
          // (NO more segments) → exit
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   298
          // break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   299
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   300
      else if ( (firstSegment->GetSize () == nextSegmentSize) || (m_txonBuffer.size () == 0) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   301
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   302
          NS_LOG_LOGIC ("    IF firstSegment == NextSegmentSize || txonBuffer.size == 0");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   303
          // Add txBuffer.FirstBuffer to DataField
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   304
          dataFieldAddedSize = firstSegment->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   305
          dataFieldTotalSize += dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   306
          dataField.push_back (firstSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   307
          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
   308
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   309
          // ExtensionBit (Next_Segment - 1) = 0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   310
          rlcAmHeader.PushExtensionBit (LteRlcAmHeader::DATA_FIELD_FOLLOWS);
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
          // no LengthIndicator for the last one
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   313
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   314
          nextSegmentSize -= dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   315
          nextSegmentId++;
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
          NS_LOG_LOGIC ("        SDUs in TxBuffer  = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   318
          if (m_txonBuffer.size () > 0)
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
              NS_LOG_LOGIC ("        First SDU buffer  = " << *(m_txonBuffer.begin()));
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   321
              NS_LOG_LOGIC ("        First SDU size    = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   322
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   323
          NS_LOG_LOGIC ("        Next segment size = " << nextSegmentSize << " (should be 0)");
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
          // nextSegmentSize MUST be zero
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
          // (NO more segments) → exit
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   328
          // break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   329
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   330
      else // (firstSegment->GetSize () < m_nextSegmentSize) && (m_txBuffer.size () > 0)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   331
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   332
          NS_LOG_LOGIC ("    IF firstSegment < NextSegmentSize && txonBuffer.size > 0");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   333
          // Add txBuffer.FirstBuffer to DataField
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   334
          dataFieldAddedSize = firstSegment->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   335
          dataFieldTotalSize += dataFieldAddedSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   336
          dataField.push_back (firstSegment);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   337
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   338
          // ExtensionBit (Next_Segment - 1) = 1
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   339
          rlcAmHeader.PushExtensionBit (LteRlcAmHeader::E_LI_FIELDS_FOLLOWS);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   340
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   341
          // LengthIndicator (Next_Segment)  = txBuffer.FirstBuffer.length()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   342
          rlcAmHeader.PushLengthIndicator (firstSegment->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   343
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   344
          nextSegmentSize -= ((nextSegmentId % 2) ? (2) : (1)) + dataFieldAddedSize; // TODO???
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   345
          nextSegmentId++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   346
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   347
          NS_LOG_LOGIC ("        SDUs in TxBuffer  = " << m_txonBuffer.size ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   348
          if (m_txonBuffer.size () > 0)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   349
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   350
              NS_LOG_LOGIC ("        First SDU buffer  = " << *(m_txonBuffer.begin()));
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   351
              NS_LOG_LOGIC ("        First SDU size    = " << (*(m_txonBuffer.begin()))->GetSize ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   352
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   353
          NS_LOG_LOGIC ("        Next segment size = " << nextSegmentSize);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   354
          NS_LOG_LOGIC ("        Remove SDU from TxBuffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   355
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   356
          // (more segments)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   357
          firstSegment = (*(m_txonBuffer.begin ()))->Copy ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   358
          m_txonBufferSize -= (*(m_txonBuffer.begin()))->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   359
          m_txonBuffer.erase (m_txonBuffer.begin ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   360
          NS_LOG_LOGIC ("        txBufferSize = " << m_txonBufferSize );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   361
        }
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
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   364
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
  // Build RLC header
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   367
  //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   368
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   369
  rlcAmHeader.SetSequenceNumber ( m_vtS );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   370
  m_vtS = (m_vtS + 1) % 1024;
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
  rlcAmHeader.SetResegmentationFlag (LteRlcAmHeader::PDU);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   373
  rlcAmHeader.SetLastSegmentFlag (LteRlcAmHeader::LAST_PDU_SEGMENT);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   374
  rlcAmHeader.SetSegmentOffset (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   375
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   376
  // 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
   377
  uint8_t framingInfo = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   378
  std::vector< Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   379
  it = dataField.begin ();
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
  // FIRST SEGMENT
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   382
  LteRlcSduStatusTag tag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   383
  (*it)->RemovePacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   384
  if ( (tag.GetStatus () == LteRlcSduStatusTag::FULL_SDU) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   385
       (tag.GetStatus () == LteRlcSduStatusTag::FIRST_SEGMENT)
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
      framingInfo |= LteRlcAmHeader::FIRST_BYTE;
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
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   391
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   392
      framingInfo |= LteRlcAmHeader::NO_FIRST_BYTE;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   393
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   394
  (*it)->AddPacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   395
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   396
  // Add all SDUs (in DataField) to the Packet
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   397
  while (it < dataField.end ())
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
      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
   400
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   401
      packet->AddAtEnd (*it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   402
      it++;
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   405
  // 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
   406
  it--;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   407
  (*it)->RemovePacketTag (tag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   408
  if ( (tag.GetStatus () == LteRlcSduStatusTag::FULL_SDU) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   409
        (tag.GetStatus () == LteRlcSduStatusTag::LAST_SEGMENT) )
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::LAST_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_LAST_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
  // Set the FramingInfo flag after the calculation
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   420
  rlcAmHeader.SetFramingInfo (framingInfo);
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   423
  // Calculate the Polling Bit (5.2.2.1)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   424
  rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_NOT_REQUESTED);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   425
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   426
  m_pduWithoutPoll++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   427
  NS_LOG_LOGIC ("PDU_WITHOUT_POLL = " << m_pduWithoutPoll);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   428
  m_byteWithoutPoll += packet->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   429
  NS_LOG_LOGIC ("BYTE_WITHOUT_POLL = " << m_byteWithoutPoll);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   430
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   431
  if ( (m_pduWithoutPoll >= m_pollPdu) || (m_byteWithoutPoll >= m_pollByte) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   432
       ( (m_txonBuffer.empty ()) && (m_retxBuffer.empty ()) ) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   433
       (m_vtS >= m_vtMs)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   434
     )
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
      rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   437
      m_pduWithoutPoll = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   438
      m_byteWithoutPoll = 0;
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
      m_pollSn = m_vtS - 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   441
      NS_LOG_LOGIC ("New POLL_SN = " << m_pollSn);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   442
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   443
      if (! m_pollRetransmitTimer.IsRunning () )
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
          NS_LOG_LOGIC ("Start PollRetransmit timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   446
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   447
          m_pollRetransmitTimer = Simulator::Schedule (Time ("1.0s"),
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   448
                                                       &LteRlcAm::ExpirePollRetransmitTimer, this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   449
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   450
      else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   451
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   452
          NS_LOG_LOGIC ("Restart PollRetransmit timer");
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
          m_pollRetransmitTimer.Cancel ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   455
          m_pollRetransmitTimer = Simulator::Schedule (Time ("1.0s"),
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   456
                                                       &LteRlcAm::ExpirePollRetransmitTimer, this);
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   460
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   461
  // Build RLC PDU with DataField and Header
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   462
  NS_LOG_LOGIC ("AM RLC header: " << rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   463
  packet->AddHeader (rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   464
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   465
  // Store new PDU into the Transmitted PDU Buffer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   466
  NS_LOG_LOGIC ("Put transmitted PDU in the txedBuffer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   467
  m_txedBufferSize += packet->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   468
  m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber () ) = packet;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   469
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   470
  // Send RLC PDU to MAC layer
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   471
  LteMacSapProvider::TransmitPduParameters params;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   472
  params.pdu = packet;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   473
  params.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   474
  params.lcid = m_lcid;
8714
398bbcbb3f42 Add MIMO model, test and documentation
Marco Miozzo <marco.miozzo@cttc.es>
parents: 8456
diff changeset
   475
  params.layer = layer;
8448
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_macSapProvider->TransmitPdu (params);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   478
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   479
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   480
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   481
LteRlcAm::DoNotifyHarqDeliveryFailure ()
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
  NS_LOG_FUNCTION (this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   484
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   485
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   486
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   487
LteRlcAm::DoReceivePdu (Ptr<Packet> p)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   488
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   489
  NS_LOG_FUNCTION (this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   490
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   491
  // Get RLC header parameters
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   492
  LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   493
  p->PeekHeader (rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   494
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   495
  if ( rlcAmHeader.IsDataPdu () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   496
    {
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
      // 5.1.3.1   Transmit operations
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   499
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   500
      // 5.1.3.1.1       General
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   501
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   502
      // 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
   503
      // 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
   504
      // of RLC data PDUs over transmission of new AMD PDUs.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   505
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   506
      // 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
   507
      // state variables VT(A) and VT(MS) as follows:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   508
      // - 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
   509
      // - a SN falls outside of the transmitting window otherwise.
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
      // 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
   512
      // whose SN falls outside of the transmitting window.
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
      // 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
   515
      // - 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
   516
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   517
      // 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
   518
      // 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
   519
      // - STATUS PDU from its peer AM RLC entity.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   520
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   521
      // 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
   522
      // side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   523
      // - 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
   524
      //   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
   525
      // - 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
   526
      //   a transmitted RLC SDU:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   527
      // - 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
   528
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   529
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   530
      // 5.1.3.2 Receive operations
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   531
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   532
      // 5.1.3.2.1 General
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   533
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   534
      // 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
   535
      // variables VR(R) and VR(MR) as follows:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   536
      // - 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
   537
      // - a SN falls outside of the receiving window otherwise.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   538
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   539
      // 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
   540
      // - 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
   541
      // - 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
   542
      // - 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
   543
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   544
      // 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
   545
      // - 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
   546
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   547
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   548
      uint16_t seqNumber = rlcAmHeader.GetSequenceNumber ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   549
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   550
      if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::SEGMENT )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   551
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   552
          NS_LOG_LOGIC ("AMD PDU segment received ( SN = " << seqNumber << " )");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   553
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   554
      else if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::PDU )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   555
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   556
          NS_LOG_LOGIC ("AMD PDU received ( SN = " << seqNumber << " )");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   557
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   558
      else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   559
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   560
          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
   561
          return ;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   562
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   563
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   564
      // STATUS PDU is requested
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   565
      if ( rlcAmHeader.GetPollingBit () == LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED )
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
          m_statusPduRequested = true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   568
          m_statusPduBufferSize = 4;
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
          if (! m_statusProhibitTimer.IsRunning ())
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
              Time now = Simulator::Now ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   573
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   574
              // Transmission Queue HOL time
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   575
              RlcTag txonQueueHolTimeTag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   576
              Time txonQueueHolDelay (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   577
              if ( ! m_txonBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   578
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   579
                  m_txonBuffer.front ()->PeekPacketTag (txonQueueHolTimeTag);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   580
                  txonQueueHolDelay = now - txonQueueHolTimeTag.GetSenderTimestamp ();
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   583
              // Retransmission Queue HOL time
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   584
              RlcTag retxQueueHolTimeTag;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   585
              Time retxQueueHolDelay (0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   586
              if ( m_retxBufferSize )
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
                  m_retxBuffer.front ().m_pdu->PeekPacketTag (retxQueueHolTimeTag);
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   589
                  retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   590
                }
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
              LteMacSapProvider::ReportBufferStatusParameters r;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   593
              r.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   594
              r.lcid = m_lcid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   595
              r.txQueueSize = m_txonBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   596
              r.txQueueHolDelay = txonQueueHolDelay.GetMilliSeconds ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   597
              r.retxQueueSize = m_retxBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   598
              r.retxQueueHolDelay = retxQueueHolDelay.GetMilliSeconds ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   599
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   600
              if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () )
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
                  r.statusPduSize = m_statusPduBufferSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   603
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   604
              else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   605
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   606
                  r.statusPduSize = 0;
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
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   609
              NS_LOG_INFO ("Send ReportBufferStatus: " << r.txQueueSize << ", " << r.txQueueHolDelay << ", "
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   610
                                                      << r.retxQueueSize << ", " << r.retxQueueHolDelay << ", "
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   611
                                                      << r.statusPduSize );
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   612
              m_macSapProvider->ReportBufferStatus (r);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   613
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   614
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   615
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   616
      // 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
   617
      //
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   618
      // 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
   619
      // 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
   620
      // - if x falls outside of the receiving window; or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   621
      // - 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
   622
      //     - discard the received RLC data PDU;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   623
      // - else:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   624
      //     - place the received RLC data PDU in the reception buffer;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   625
      //     - 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
   626
      //         - discard the duplicate byte segments.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   627
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   628
      NS_LOG_LOGIC ("VR(R)  = " << m_vrR);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   629
      NS_LOG_LOGIC ("VR(MR) = " << m_vrMr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   630
      NS_LOG_LOGIC ("VR(X)  = " << m_vrX);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   631
      NS_LOG_LOGIC ("VR(MS) = " << m_vrMs);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   632
      NS_LOG_LOGIC ("VR(H)  = " << m_vrH);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   633
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   634
      // - if x falls outside of the receiving window; or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   635
      // - 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
   636
      if ( ! IsInsideReceivingWindow (seqNumber) )
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
          NS_LOG_LOGIC ("AMD PDU discarded");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   639
          return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   640
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   641
      else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   642
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   643
          NS_LOG_LOGIC ("Place AMD PDU in the reception buffer ( SN = " << seqNumber << " )");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   644
          m_rxonBuffer[ seqNumber ].m_byteSegments.push_back (p);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   645
          m_rxonBuffer[ seqNumber ].m_pduComplete = true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   646
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   647
          // - 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
   648
          //         - discard the duplicate byte segments.
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   649
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   650
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   651
      // 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
   652
      // 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
   653
      // the receiving side of an AM RLC entity shall:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   654
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   655
      // - if x >= VR(H)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   656
      //     - update VR(H) to x+ 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   657
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   658
      if ( seqNumber >= m_vrH )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   659
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   660
          m_vrH = (seqNumber + 1) % 1024;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   661
          NS_LOG_LOGIC ("New VR(H)  = " << m_vrH);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   662
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   663
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   664
      // - 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
   665
      //     - 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
   666
      //       which not all byte segments have been received;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   667
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   668
      if ( m_rxonBuffer[ m_vrMs ].m_pduComplete )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   669
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   670
          while ( m_rxonBuffer[ m_vrMs ].m_pduComplete )
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
              m_vrMs = (m_vrMs + 1) % 1024;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   673
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   674
          NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   677
      // - if x = VR(R):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   678
      //     - 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
   679
      //         - 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
   680
      //         - 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
   681
      //     - 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
   682
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   683
      if ( seqNumber == m_vrR )
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 ( m_rxonBuffer[ seqNumber ].m_pduComplete )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   686
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   687
              while ( m_rxonBuffer[ m_vrR ].m_pduComplete )
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
                  m_vrR = (m_vrR + 1) % 1024;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   690
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   691
              NS_LOG_LOGIC ("New VR(R)  = " << m_vrR);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   692
              m_vrMr = m_vrR + m_windowSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   693
              NS_LOG_LOGIC ("New VR(MR) = " << m_vrMr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   694
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   695
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   696
          NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << seqNumber << " )");
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   697
          NS_ASSERT_MSG (m_rxonBuffer[ seqNumber ].m_byteSegments.size () == 1,
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   698
                         "Too many segments. PDU Reassembly process didn't work");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   699
          ReassembleAndDeliver (m_rxonBuffer[ seqNumber ].m_byteSegments.front ());
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 t-Reordering is running:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   703
      //     - if VR(X) = VR(R); or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   704
      //     - 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
   705
      //         - stop and reset t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   706
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   707
      if ( m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   708
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   709
          NS_LOG_LOGIC ("Reordering timer is running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   710
          if ( (m_vrX == m_vrR) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   711
               ( (! IsInsideReceivingWindow (m_vrX)) && (m_vrX != m_vrMr) )
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
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   714
              // TODO stop and reset the t-Reordering
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   715
              NS_LOG_LOGIC ("Stop reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   716
              m_reorderingTimer.Cancel ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   717
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   718
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   719
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   720
      // - 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
   721
      //     - if VR (H) > VR(R):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   722
      //         - start t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   723
      //         - set VR(X) to VR(H).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   724
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   725
      if ( ! m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   726
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   727
          NS_LOG_LOGIC ("Reordering timer is not running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   728
          if ( m_vrH > m_vrR )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   729
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   730
              NS_LOG_LOGIC ("Start reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   731
              m_reorderingTimer = Simulator::Schedule (Time ("1.0s"),
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   732
                                                       &LteRlcAm::ExpireReorderingTimer ,this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   733
              m_vrX = m_vrH;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   734
              NS_LOG_LOGIC ("New VR(X) = " << m_vrX);
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
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   737
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   738
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
      // TODO To remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   741
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   742
      // 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
   743
      // 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
   744
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   745
      // - if x falls outside of the reordering window:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   746
      //    - update VR(UH) to x + 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   747
      //    - 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
   748
      //      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
   749
      //      RLC SN if not delivered before;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   750
      //    - if VR(UR) falls outside of the reordering window:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   751
      //        - set VR(UR) to (VR(UH) - UM_Window_Size);
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 ( ! IsInsideReorderingWindow (seqNumber))
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 ("SN outside the reordering window");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   756
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   757
//           m_vrUh = seqNumber + 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   758
//           NS_LOG_LOGIC ("New VR(UH) = " << m_vrUh);
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
//           ReassembleOutsideWindow ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   761
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   762
//           if ( ! IsInsideReorderingWindow (m_vrUr) )
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
//               m_vrUr = m_vrUh - m_windowSize;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   765
//               NS_LOG_LOGIC ("VR(UR) outside the reordering window");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   766
//               NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   767
//             }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   768
//         }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   769
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   770
      // - 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
   771
      //    - 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
   772
      //    - 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
   773
      //      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
   774
      //      before;
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
//       if ( m_rxBuffer.count (m_vrUr) > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   777
//         {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   778
//           NS_LOG_LOGIC ("Reception buffer contains SN = " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   779
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   780
//           std::map <uint16_t, Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   781
//           uint16_t newVrUr;
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
//           it = m_rxBuffer.find (m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   784
//           newVrUr = (it->first) + 1;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   785
//           while ( m_rxBuffer.count (newVrUr) > 0 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   786
//             {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   787
//               newVrUr++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   788
//             }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   789
//           m_vrUr = newVrUr;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   790
//           NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   791
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   792
//           ReassembleSnLessThan (m_vrUr);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   793
//         }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   794
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   795
      // - if t-Reordering is running:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   796
      //    - if VR(UX) <= VR(UR); or
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   797
      //    - 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
   798
      //        - stop and reset t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   799
//       if ( m_reorderingTimer.IsRunning () )
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 ("Reordering timer is running");
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
//           if ( (m_vrUx <= m_vrUr) ||
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   804
//               ((! IsInsideReorderingWindow (m_vrUx)) && (m_vrUx != 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
//               NS_LOG_LOGIC ("Stop reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   807
//               m_reorderingTimer.Cancel ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   808
//             }
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   811
      // - 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
   812
      //    - if VR(UH) > VR(UR):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   813
      //        - start t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   814
      //        - set VR(UX) to VR(UH).
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   815
//       if ( ! m_reorderingTimer.IsRunning () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   816
//         {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   817
//           NS_LOG_LOGIC ("Reordering timer is not running");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   818
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   819
//           if ( m_vrUx > m_vrUr )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   820
//             {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   821
//               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
   822
//               NS_LOG_LOGIC ("Start reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   823
//               m_reorderingTimer = Simulator::Schedule (Time ("1.0s"),
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   824
//                                                       &LteRlcAm::ExpireReorderingTimer ,this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   825
//               m_vrUx = m_vrUh;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   826
//               NS_LOG_LOGIC ("New VR(UX) = " << m_vrUx);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   827
//             }
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   830
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   831
  else if ( rlcAmHeader.IsControlPdu () )
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
      NS_LOG_INFO ("Control AM RLC PDU");
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
      uint16_t ackSn = rlcAmHeader.GetAckSn ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   836
      uint16_t seqNumber = m_vtA;
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
      while (seqNumber < ackSn)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   839
        {
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   840
          NS_LOG_INFO ("seqNumber = " << seqNumber);
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   841
          NS_LOG_INFO ("ackSn     = " << ackSn);
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   842
          NS_LOG_INFO ("m_txedBuffer(seqNumber).size = " << m_txedBuffer.size ());
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   843
          if (m_txedBuffer.at (seqNumber))
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   844
            {
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   845
              NS_LOG_INFO ("m_txedBuffer(seqNumber)->GetSize = " << m_txedBuffer.at (seqNumber)->GetSize ());
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   846
              m_txedBufferSize -= m_txedBuffer.at (seqNumber)->GetSize ();
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   847
              m_txedBuffer.at (seqNumber) = 0;
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   848
            }
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   849
          seqNumber++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   850
        }
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
      while (seqNumber < m_vtS)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   853
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   854
          if (m_txedBuffer.at (seqNumber))
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
              m_retxBuffer.at (seqNumber).m_pdu = m_txedBuffer.at (seqNumber);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   857
              m_retxBuffer.at (seqNumber).m_retxCount = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   858
              m_retxBufferSize += m_retxBuffer.at (seqNumber).m_pdu->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   859
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   860
              m_txedBufferSize -= m_txedBuffer.at (seqNumber)->GetSize ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   861
              m_txedBuffer.at (seqNumber) = 0;
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
          else if (m_retxBuffer.at (seqNumber).m_pdu)
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
              m_retxBuffer.at (seqNumber).m_retxCount++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   866
              if (m_retxBuffer.at (seqNumber).m_retxCount >= m_maxRetxThreshold)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   867
                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   868
                  NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumber);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   869
                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   870
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   871
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   872
          seqNumber++;
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
      return;
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
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_WARN ("Wrong AM RLC PDU type");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   880
      return;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   881
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   882
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   883
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   884
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   885
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   886
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   887
LteRlcAm::Start ()
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   888
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   889
  NS_LOG_FUNCTION (this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   890
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   891
  LteMacSapProvider::ReportBufferStatusParameters p;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   892
  p.rnti = m_rnti;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   893
  p.lcid = m_lcid;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   894
  p.txQueueSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   895
  p.txQueueHolDelay = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   896
  p.retxQueueSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   897
  p.retxQueueHolDelay = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   898
  p.statusPduSize = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   899
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   900
  m_macSapProvider->ReportBufferStatus (p);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   901
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   902
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   903
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   904
bool
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   905
LteRlcAm::IsInsideReceivingWindow (uint16_t seqNumber)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   906
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   907
  if  ( ( ((m_vrR - m_vrR) % 1024) <= ((seqNumber - m_vrR) % 1024) ) &&
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   908
        ( ((seqNumber - m_vrR) % 1024) < ((m_vrMr - m_vrR) % 1024) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   909
      )
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
      return true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   912
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   913
  else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   914
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   915
      return false;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   916
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   917
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   918
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   919
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   920
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   921
LteRlcAm::ReassembleAndDeliver (Ptr<Packet> packet)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   922
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   923
  LteRlcAmHeader rlcAmHeader;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   924
  packet->RemoveHeader (rlcAmHeader);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   925
  uint8_t framingInfo = rlcAmHeader.GetFramingInfo ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   926
  uint16_t currSeqNumber = rlcAmHeader.GetSequenceNumber ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   927
  bool expectedSnLost;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   928
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   929
  if ( currSeqNumber != m_expectedSeqNumber )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   930
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   931
      expectedSnLost = true;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   932
      NS_LOG_LOGIC ("There are losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   933
      m_expectedSeqNumber = (currSeqNumber + 1) % 1024;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   934
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   935
  else
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
      expectedSnLost = false;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   938
      NS_LOG_LOGIC ("No losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   939
      m_expectedSeqNumber = (m_expectedSeqNumber + 1) % 1024;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   940
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   941
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   942
  // Build list of SDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   943
  uint8_t extensionBit;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   944
  uint16_t lengthIndicator;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   945
  do
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   946
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   947
      extensionBit = rlcAmHeader.PopExtensionBit ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   948
      NS_LOG_LOGIC ("E = " << (uint16_t)extensionBit);
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
      if ( extensionBit == 0 )
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
          m_sdusBuffer.push_back (packet);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   953
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   954
      else // extensionBit == 1
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
          lengthIndicator = rlcAmHeader.PopLengthIndicator ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   957
          NS_LOG_LOGIC ("LI = " << lengthIndicator);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   958
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   959
          // Check if there is enough data in the packet
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   960
          if ( lengthIndicator >= packet->GetSize () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   961
            {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   962
              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
   963
              // 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
   964
            }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   965
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   966
          // Split packet in two fragments
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   967
          Ptr<Packet> data_field = packet->CreateFragment (0, lengthIndicator);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   968
          packet->RemoveAtStart (lengthIndicator);
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
          m_sdusBuffer.push_back (data_field);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   971
        }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   972
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   973
  while ( extensionBit == 1 );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   974
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   975
  std::list < Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   976
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   977
  // Current reassembling state
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   978
  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
   979
  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
   980
  else                                              NS_LOG_LOGIC ("Reassembling State = Unknown state");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   981
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   982
  // Received framing Info
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   983
  NS_LOG_LOGIC ("Framing Info = " << (uint16_t)framingInfo);
8456
782a47ccaf2a Fix unused variable
Manuel Requena <manuel.requena@cttc.es>
parents: 8448
diff changeset
   984
  NS_LOG_LOGIC ("m_sdusBuffer = " << m_sdusBuffer.size ());
8448
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   985
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   986
  // Reassemble the list of SDUs (when there is no losses)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   987
  if (!expectedSnLost)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   988
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   989
      switch (m_reassemblingState)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   990
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   991
          case WAITING_S0_FULL:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   992
                  switch (framingInfo)
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
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   995
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   996
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
                              * Deliver one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   999
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1000
                              for ( it = m_sdusBuffer.begin () ; it != m_sdusBuffer.end () ; it++ )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1001
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1002
                                  m_rlcSapUser->ReceivePdcpPdu (*it);
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
                              m_sdusBuffer.clear ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1005
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1006
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1007
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1008
                              m_reassemblingState = WAITING_SI_SF;
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
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1011
                              * Deliver full PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1012
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1013
                              while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1014
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1015
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1016
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1017
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1018
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1019
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1020
                              * Keep S0
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
                              m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1023
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1024
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1025
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1026
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1027
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1028
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1029
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1030
                              * ERROR: Transition not possible
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1031
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1032
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1033
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1034
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1035
          break;
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
          case WAITING_SI_SF:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1038
                  switch (framingInfo)
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
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1041
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1042
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1043
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1044
                              * Deliver (Kept)S0 + SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1045
                              */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1046
                              m_keepS0->AddAtEnd (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1047
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1048
                              m_rlcSapUser->ReceivePdcpPdu (m_keepS0);
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
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1051
                                * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1052
                                */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1053
                              while ( ! m_sdusBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1054
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1055
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1056
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1057
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1058
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1059
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1060
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1061
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1062
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
                              * Keep SI
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
                              if ( m_sdusBuffer.size () == 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1067
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1068
                                  m_keepS0->AddAtEnd (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1069
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1070
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1071
                              else // m_sdusBuffer.size () > 1
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
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1074
                                  * Deliver (Kept)S0 + SN
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1075
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1076
                                  m_keepS0->AddAtEnd (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1077
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1078
                                  m_rlcSapUser->ReceivePdcpPdu (m_keepS0);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1079
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1080
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1081
                                  * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1082
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1083
                                  while ( m_sdusBuffer.size () > 1 )
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
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1086
                                      m_sdusBuffer.pop_front ();
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
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
                                  * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1091
                                  */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1092
                                  m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1093
                                  m_sdusBuffer.pop_front ();
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
                      break;
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
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1098
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1099
                      default:
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
                                * ERROR: Transition not possible
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1102
                                */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1103
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1104
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1105
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1106
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1107
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1108
          default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1109
                NS_LOG_LOGIC ("INTERNAL ERROR: Wrong reassembling state = " << m_reassemblingState);
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
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1113
  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
  1114
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1115
      switch (m_reassemblingState)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1116
        {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1117
          case WAITING_S0_FULL:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1118
                  switch (framingInfo)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1119
                    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1120
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1121
                              m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1122
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1123
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1124
                               * Deliver one or multiple PDUs
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
                              for ( it = m_sdusBuffer.begin () ; it != m_sdusBuffer.end () ; it++ )
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
                                  m_rlcSapUser->ReceivePdcpPdu (*it);
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_sdusBuffer.clear ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1131
                      break;
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
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1134
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1135
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1136
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1137
                               * Deliver full PDUs
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
                              while ( m_sdusBuffer.size () > 1 )
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
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1142
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1143
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1144
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
                               * Keep S0
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
                              m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1149
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1150
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1151
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1152
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1153
                              m_reassemblingState = WAITING_S0_FULL;
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
                               * Discard SN
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
                              m_sdusBuffer.pop_front ();
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
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1161
                               * Deliver zero, one or multiple PDUs
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
                              while ( ! m_sdusBuffer.empty () )
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
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1166
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1167
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1168
                      break;
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
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1171
                              if ( m_sdusBuffer.size () == 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1172
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1173
                                  m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1174
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1175
                              else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1176
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1177
                                  m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1178
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1179
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
                               * Discard SI or SN
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
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1184
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1185
                              if ( m_sdusBuffer.size () > 0 )
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
                                  * Deliver zero, one or multiple PDUs
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
                                  while ( m_sdusBuffer.size () > 1 )
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
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1193
                                      m_sdusBuffer.pop_front ();
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1196
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1197
                                  * Keep S0
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
                                  m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1200
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1201
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1202
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1203
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1204
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1205
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1206
                               * ERROR: Transition not possible
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
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1209
                      break;
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
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1212
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1213
          case WAITING_SI_SF:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1214
                  switch (framingInfo)
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
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1217
                              m_reassemblingState = WAITING_S0_FULL;
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
                               * Discard S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1221
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1222
                              m_keepS0 = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1223
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1224
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1225
                               * Deliver one or multiple PDUs
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
                              while ( ! m_sdusBuffer.empty () )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1228
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1229
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1230
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1231
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1232
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1233
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1234
                      case (LteRlcAmHeader::FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1235
                              m_reassemblingState = WAITING_SI_SF;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1236
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
                               * Discard S0
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_keepS0 = 0;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1241
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
                               * Deliver zero, one or multiple PDUs
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
                              while ( m_sdusBuffer.size () > 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1246
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1247
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1248
                                  m_sdusBuffer.pop_front ();
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
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
                               * Keep S0
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
                              m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1255
                              m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1256
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1257
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1258
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1259
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1260
                              m_reassemblingState = WAITING_S0_FULL;
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
                               * Discard S0
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
                              m_keepS0 = 0;
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
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1268
                               * Discard SI or SN
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
                              m_sdusBuffer.pop_front ();
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
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1273
                               * Deliver zero, one or multiple PDUs
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1274
                               */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1275
                              while ( ! m_sdusBuffer.empty () )
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
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1278
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1279
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1280
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1281
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1282
                      case (LteRlcAmHeader::NO_FIRST_BYTE | LteRlcAmHeader::NO_LAST_BYTE):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1283
                              if ( m_sdusBuffer.size () == 1 )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1284
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1285
                                  m_reassemblingState = WAITING_S0_FULL;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1286
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1287
                              else
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1288
                                {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1289
                                  m_reassemblingState = WAITING_SI_SF;
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1292
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1293
                               * Discard S0
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
                              m_keepS0 = 0;
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
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1298
                               * Discard SI or SN
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
                              m_sdusBuffer.pop_front ();
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
                              if ( m_sdusBuffer.size () > 0 )
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
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1305
                                   * Deliver zero, one or multiple PDUs
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
                                  while ( m_sdusBuffer.size () > 1 )
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
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1310
                                      m_sdusBuffer.pop_front ();
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
                                  /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1314
                                   * Keep S0
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1315
                                   */
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1316
                                  m_keepS0 = m_sdusBuffer.front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1317
                                  m_sdusBuffer.pop_front ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1318
                                }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1319
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1320
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1321
                      default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1322
                              /**
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1323
                                * ERROR: Transition not possible
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
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << framingInfo);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1326
                      break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1327
                    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1328
          break;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1329
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1330
          default:
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1331
                NS_LOG_LOGIC ("INTERNAL ERROR: Wrong reassembling state = " << m_reassemblingState);
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
    }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1335
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1339
// TODO To remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1340
// void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1341
// LteRlcAm::ReassembleOutsideWindow (void)
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
//   NS_LOG_LOGIC ("Reassemble Outside Window");
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
//   std::map <uint16_t, Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1346
//   it = m_rxBuffer.begin ();
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
//   while ( (it != m_rxBuffer.end ()) && ! IsInsideReorderingWindow (it->first) )
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
//       NS_LOG_LOGIC ("SN = " << it->first);
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
//       // 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
  1353
//       ReassembleAndDeliver (it->second);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1354
//       m_rxBuffer.erase (it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1355
//       it++;
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
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1358
//   if (it != m_rxBuffer.end ())
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
//       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
  1361
//     }
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1362
// }
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
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1365
// TODO To remove
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1366
// void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1367
// LteRlcAm::ReassembleSnLessThan (uint16_t seqNumber)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1368
// {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1369
//   NS_LOG_LOGIC ("Reassemble SN < updated VR(UR)" );
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1370
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1371
//   std::map <uint16_t, Ptr<Packet> >::iterator it;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1372
//   it = m_rxBuffer.begin ();
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1373
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1374
//   while ( (it != m_rxBuffer.end ()) && (it->first < seqNumber) )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1375
//     {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1376
//       NS_LOG_LOGIC ("SN = " << it->first);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1377
// 
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1378
//       // 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
  1379
//       ReassembleAndDeliver (it->second);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1380
//       m_rxBuffer.erase (it);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1381
//       it++;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1382
//     }
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
//   if (it != m_rxBuffer.end ())
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1385
//     {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1386
//       NS_LOG_LOGIC ("(SN = " << it->first << ") >= " << m_vrUr);
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
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
// TODO To check
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1392
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1393
LteRlcAm::ExpireReorderingTimer (void)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1394
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1395
  NS_LOG_LOGIC ("Reordering Timer has expired");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1396
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1397
  // 5.1.3.2.4 Actions when t-Reordering expires
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1398
  // 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
  1399
  // - 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
  1400
  //   have been received;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1401
  // - if VR(H) > VR(MS):
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1402
  //    - start t-Reordering;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1403
  //    - set VR(X) to VR(H).
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
  m_vrMs = m_vrX;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1406
  while ( m_rxonBuffer[ m_vrMs ].m_pduComplete )
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1407
    {
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1408
      m_vrMs = (m_vrMs + 1) % 1024;
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
  NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
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
  if ( m_vrH > m_vrMs )
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
      NS_LOG_LOGIC ("Start reordering timer");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1415
      m_reorderingTimer = Simulator::Schedule (Time ("1.0s"),
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1416
                                              &LteRlcAm::ExpireReorderingTimer ,this);
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1417
      m_vrX = m_vrH;
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1418
      NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
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
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1421
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1422
// TODO To check
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1423
void
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1424
LteRlcAm::ExpirePollRetransmitTimer (void)
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1425
{
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1426
  NS_LOG_LOGIC ("PollRetransmit Timer has expired");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1427
  NS_LOG_LOGIC ("TODO To Check");
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1428
}
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1429
6848d8dfe6db Add AM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1430
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
} // namespace ns3