23 #include "ns3/lte-rlc-header.h"
29 NS_OBJECT_ENSURE_REGISTERED (LteRlcHeader);
34 m_sequenceNumber (0xfffa)
38 LteRlcHeader::~LteRlcHeader ()
42 m_sequenceNumber = 0xfffb;
46 LteRlcHeader::SetFramingInfo (uint8_t framingInfo)
48 m_framingInfo = framingInfo & 0x03;
52 LteRlcHeader::SetSequenceNumber (SequenceNumber10 sequenceNumber)
54 m_sequenceNumber = sequenceNumber;
58 LteRlcHeader::GetFramingInfo ()
const
64 LteRlcHeader::GetSequenceNumber ()
const
66 return m_sequenceNumber;
71 LteRlcHeader::PushExtensionBit (uint8_t extensionBit)
73 m_extensionBits.push_back (extensionBit);
74 if (m_extensionBits.size() == 1)
78 else if (m_extensionBits.size() % 2)
89 LteRlcHeader::PushLengthIndicator (uint16_t lengthIndicator)
91 m_lengthIndicators.push_back (lengthIndicator);
96 LteRlcHeader::PopExtensionBit (
void)
98 uint8_t extensionBit = m_extensionBits.front ();
99 m_extensionBits.pop_front ();
105 LteRlcHeader::PopLengthIndicator (
void)
107 uint16_t lengthIndicator = m_lengthIndicators.front ();
108 m_lengthIndicators.pop_front ();
110 return lengthIndicator;
115 LteRlcHeader::GetTypeId (
void)
117 static TypeId tid = TypeId (
"ns3::LteRlcHeader")
118 .SetParent<Header> ()
119 .AddConstructor<LteRlcHeader> ()
132 std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
133 std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
135 os <<
"Len=" << m_headerLength;
136 os <<
" FI=" << (uint16_t)m_framingInfo;
137 os <<
" E=" << (uint16_t)(*it1);
138 os <<
" SN=" << m_sequenceNumber;
141 if (it1 != m_extensionBits.end ())
145 while ( it1 != m_extensionBits.end () )
147 os << (uint16_t)(*it1);
151 if (it2 != m_lengthIndicators.end ())
155 while ( it2 != m_lengthIndicators.end () )
157 os << (uint16_t)(*it2) <<
" ";
164 return m_headerLength;
171 std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
172 std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
174 i.
WriteU8 ( ((m_framingInfo << 3) & 0x18) |
175 (((*it1) << 2) & 0x04) |
176 ((m_sequenceNumber.
GetValue () >> 8) & 0x0003) );
180 while ( it1 != m_extensionBits.end () &&
181 it2 != m_lengthIndicators.end () )
183 uint16_t oddLi, evenLi;
192 if ( it1 != m_extensionBits.end () &&
193 it2 != m_lengthIndicators.end () )
198 i.
WriteU8 ( ((oddE << 7) & 0x80) | ((oddLi >> 4) & 0x007F) );
199 i.
WriteU8 ( ((oddLi << 4) & 0x00F0) | ((evenE << 3) & 0x08) | ((evenLi >> 8) & 0x0007) );
207 i.
WriteU8 ( ((oddE << 7) & 0x80) | ((oddLi >> 4) & 0x007F) );
208 i.
WriteU8 ( ((oddLi << 4) & 0x00F0) );
219 uint8_t extensionBit;
224 m_framingInfo = (byte_1 & 0x18) >> 3;
225 m_sequenceNumber = ((byte_1 & 0x03) << 8) | byte_2;
227 extensionBit = (byte_1 & 0x04) >> 2;
228 m_extensionBits.push_back (extensionBit);
230 if (extensionBit == DATA_FIELD_FOLLOWS)
235 uint16_t oddLi, evenLi;
237 bool moreLiFields = (extensionBit == E_LI_FIELDS_FOLLOWS);
244 oddE = (byte_1 & 0x80) >> 7;
245 oddLi = ((byte_1 & 0x7F) << 4) | ((byte_2 & 0xF0) >> 4);
246 moreLiFields = (oddE == E_LI_FIELDS_FOLLOWS);
248 m_extensionBits.push_back (oddE);
249 m_lengthIndicators.push_back (oddLi);
256 evenE = (byte_2 & 0x08) >> 3;
257 evenLi = ((byte_2 & 0x07) << 8) | (byte_3 & 0xFF);
258 moreLiFields = (evenE == E_LI_FIELDS_FOLLOWS);
260 m_extensionBits.push_back (evenE);
261 m_lengthIndicators.push_back (evenLi);
uint16_t GetValue() const
Extracts the numeric value of the sequence number.
#define NS_LOG_COMPONENT_DEFINE(name)
iterator in a Buffer instance
void WriteU8(uint8_t data)