src/lte/model/lte-rlc-header.cc
author Nicola Baldo <nbaldo@cttc.es>
Mon, 04 Feb 2013 18:47:25 +0100
changeset 9653 382d27da8905
parent 8572 ada66b065cc2
child 10410 4d4eb8097fa3
permissions -rw-r--r--
merged lena-dev with ns-3-dev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     2
/*
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     3
 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     4
 *
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     8
 *
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    12
 * GNU General Public License for more details.
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    13
 *
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    17
 *
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    18
 * Author: Manuel Requena <manuel.requena@cttc.es>
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    19
 */
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    20
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    21
#include "ns3/log.h"
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    22
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    23
#include "ns3/lte-rlc-header.h"
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    24
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    25
NS_LOG_COMPONENT_DEFINE ("LteRlcHeader");
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    26
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    27
namespace ns3 {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    28
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    29
NS_OBJECT_ENSURE_REGISTERED (LteRlcHeader);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    30
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    31
LteRlcHeader::LteRlcHeader ()
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    32
  : m_headerLength (0),
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    33
    m_framingInfo (0xff),
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    34
    m_sequenceNumber (0xfffa)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    35
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    36
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    37
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    38
LteRlcHeader::~LteRlcHeader ()
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    39
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    40
    m_headerLength = 0;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    41
    m_framingInfo = 0xff;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    42
    m_sequenceNumber = 0xfffb;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    43
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    44
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    45
void
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    46
LteRlcHeader::SetFramingInfo (uint8_t framingInfo)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    47
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    48
  m_framingInfo = framingInfo & 0x03;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    49
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    50
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    51
void
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8373
diff changeset
    52
LteRlcHeader::SetSequenceNumber (SequenceNumber10 sequenceNumber)
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    53
{
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8373
diff changeset
    54
  m_sequenceNumber = sequenceNumber;
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    55
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    56
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    57
uint8_t
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    58
LteRlcHeader::GetFramingInfo () const
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    59
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    60
  return m_framingInfo;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    61
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    62
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8373
diff changeset
    63
SequenceNumber10
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    64
LteRlcHeader::GetSequenceNumber () const
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    65
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    66
  return m_sequenceNumber;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    67
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    68
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    69
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    70
void
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    71
LteRlcHeader::PushExtensionBit (uint8_t extensionBit)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    72
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    73
  m_extensionBits.push_back (extensionBit);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    74
  if (m_extensionBits.size() == 1)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    75
    {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    76
      m_headerLength = 2; // Only fixed part
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    77
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    78
  else if (m_extensionBits.size() % 2)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    79
    {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    80
      m_headerLength += 1;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    81
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    82
  else
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    83
    {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    84
      m_headerLength += 2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    85
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    86
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    87
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    88
void
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    89
LteRlcHeader::PushLengthIndicator (uint16_t lengthIndicator)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    90
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    91
  m_lengthIndicators.push_back (lengthIndicator);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    92
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    93
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    94
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    95
uint8_t
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    96
LteRlcHeader::PopExtensionBit (void)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    97
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    98
  uint8_t extensionBit = m_extensionBits.front ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    99
  m_extensionBits.pop_front ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   100
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   101
  return extensionBit;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   102
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   103
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   104
uint16_t
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   105
LteRlcHeader::PopLengthIndicator (void)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   106
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   107
  uint16_t lengthIndicator = m_lengthIndicators.front ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   108
  m_lengthIndicators.pop_front ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   109
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   110
  return lengthIndicator;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   111
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   112
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   113
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   114
TypeId
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   115
LteRlcHeader::GetTypeId (void)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   116
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   117
  static TypeId tid = TypeId ("ns3::LteRlcHeader")
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   118
    .SetParent<Header> ()
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   119
    .AddConstructor<LteRlcHeader> ()
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   120
  ;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   121
  return tid;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   122
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   123
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   124
TypeId
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   125
LteRlcHeader::GetInstanceTypeId (void) const
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   126
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   127
  return GetTypeId ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   128
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   129
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   130
void LteRlcHeader::Print (std::ostream &os)  const
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   131
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   132
  std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   133
  std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   134
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   135
  os << "Len=" << m_headerLength;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   136
  os << " FI=" << (uint16_t)m_framingInfo;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   137
  os << " E=" << (uint16_t)(*it1);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   138
  os << " SN=" << m_sequenceNumber;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   139
8367
753e6ab9d12c Fix RLC header printing
Manuel Requena <manuel.requena@cttc.es>
parents: 8360
diff changeset
   140
  it1++;
8373
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   141
  if (it1 != m_extensionBits.end ())
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   142
    {
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   143
      os << " E=";
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   144
    }
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   145
  while ( it1 != m_extensionBits.end () )
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   146
    {
8373
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   147
      os << (uint16_t)(*it1);
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   148
      it1++;
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   149
    }
8367
753e6ab9d12c Fix RLC header printing
Manuel Requena <manuel.requena@cttc.es>
parents: 8360
diff changeset
   150
8373
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   151
  if (it2 != m_lengthIndicators.end ())
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   152
    {
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   153
      os << " LI=";
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   154
    }
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   155
  while ( it2 != m_lengthIndicators.end () )
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   156
    {
fb8828d3673b Change RLC header traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8367
diff changeset
   157
      os << (uint16_t)(*it2) << " ";
8367
753e6ab9d12c Fix RLC header printing
Manuel Requena <manuel.requena@cttc.es>
parents: 8360
diff changeset
   158
      it2++;
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   159
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   160
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   161
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   162
uint32_t LteRlcHeader::GetSerializedSize (void) const
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   163
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   164
  return m_headerLength;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   165
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   166
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   167
void LteRlcHeader::Serialize (Buffer::Iterator start) const
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   168
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   169
  Buffer::Iterator i = start;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   170
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   171
  std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   172
  std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   173
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   174
  i.WriteU8 ( ((m_framingInfo << 3) & 0x18) |
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   175
              (((*it1) << 2) & 0x04) |
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8373
diff changeset
   176
              ((m_sequenceNumber.GetValue () >> 8) & 0x0003) );
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8373
diff changeset
   177
  i.WriteU8 ( m_sequenceNumber.GetValue () & 0x00FF );
8360
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   178
  it1++;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   179
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   180
  while ( it1 != m_extensionBits.end () &&
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   181
          it2 != m_lengthIndicators.end () )
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   182
    {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   183
      uint16_t oddLi, evenLi;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   184
      uint8_t oddE, evenE;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   185
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   186
      oddE = *it1;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   187
      oddLi = *it2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   188
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   189
      it1++;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   190
      it2++;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   191
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   192
      if ( it1 != m_extensionBits.end () &&
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   193
           it2 != m_lengthIndicators.end () )
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   194
        {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   195
          evenE = *it1;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   196
          evenLi = *it2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   197
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   198
          i.WriteU8 ( ((oddE << 7) & 0x80) | ((oddLi >> 4) & 0x007F) );
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   199
          i.WriteU8 ( ((oddLi << 4) & 0x00F0) | ((evenE << 3) & 0x08) | ((evenLi >> 8) & 0x0007) );
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   200
          i.WriteU8 ( evenLi & 0x00FF );
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   201
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   202
          it1++;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   203
          it2++;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   204
        }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   205
      else
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   206
        {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   207
          i.WriteU8 ( ((oddE << 7) & 0x80) | ((oddLi >> 4) & 0x007F) );
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   208
          i.WriteU8 ( ((oddLi << 4) & 0x00F0) ); // Padding is implicit
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   209
        }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   210
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   211
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   212
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   213
uint32_t LteRlcHeader::Deserialize (Buffer::Iterator start)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   214
{
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   215
  Buffer::Iterator i = start;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   216
  uint8_t byte_1;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   217
  uint8_t byte_2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   218
  uint8_t byte_3;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   219
  uint8_t extensionBit;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   220
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   221
  byte_1 = i.ReadU8 ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   222
  byte_2 = i.ReadU8 ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   223
  m_headerLength = 2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   224
  m_framingInfo = (byte_1 & 0x18) >> 3;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   225
  m_sequenceNumber = ((byte_1 & 0x03) << 8) | byte_2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   226
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   227
  extensionBit = (byte_1 & 0x04) >> 2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   228
  m_extensionBits.push_back (extensionBit);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   229
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   230
  if (extensionBit == DATA_FIELD_FOLLOWS)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   231
    {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   232
      return GetSerializedSize ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   233
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   234
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   235
  uint16_t oddLi, evenLi;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   236
  uint8_t oddE, evenE;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   237
  bool moreLiFields = (extensionBit == E_LI_FIELDS_FOLLOWS);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   238
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   239
  while (moreLiFields)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   240
    {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   241
      byte_1 = i.ReadU8 ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   242
      byte_2 = i.ReadU8 ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   243
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   244
      oddE = (byte_1 & 0x80) >> 7;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   245
      oddLi = ((byte_1 & 0x7F) << 4) | ((byte_2 & 0xF0) >> 4);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   246
      moreLiFields = (oddE == E_LI_FIELDS_FOLLOWS);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   247
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   248
      m_extensionBits.push_back (oddE);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   249
      m_lengthIndicators.push_back (oddLi);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   250
      m_headerLength += 2;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   251
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   252
      if (moreLiFields)
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   253
        {
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   254
          byte_3 = i.ReadU8 ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   255
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   256
          evenE = (byte_2 & 0x08) >> 3;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   257
          evenLi = ((byte_2 & 0x07) << 8) | (byte_3 & 0xFF);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   258
          moreLiFields = (evenE == E_LI_FIELDS_FOLLOWS);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   259
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   260
          m_extensionBits.push_back (evenE);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   261
          m_lengthIndicators.push_back (evenLi);
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   262
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   263
          m_headerLength += 1;
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   264
        }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   265
    }
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   266
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   267
  return GetSerializedSize ();
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   268
}
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   269
c14732f4f477 RLC header
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   270
}; // namespace ns3