23 #include "ns3/lte-rlc-am-header.h"
29 NS_OBJECT_ENSURE_REGISTERED (LteRlcAmHeader);
33 m_dataControlBit (0xff),
34 m_resegmentationFlag (0xff),
37 m_sequenceNumber (0xfffa),
38 m_segmentOffset (0xffff),
39 m_lastOffset (0xffff),
40 m_controlPduType (0xff),
46 LteRlcAmHeader::~LteRlcAmHeader ()
49 m_dataControlBit = 0xff;
50 m_resegmentationFlag = 0xff;
53 m_sequenceNumber = 0xfffb;
54 m_segmentOffset = 0xffff;
55 m_lastOffset = 0xffff;
56 m_controlPduType = 0xff;
62 LteRlcAmHeader::SetDataPdu (
void)
65 m_dataControlBit = DATA_PDU;
68 LteRlcAmHeader::SetControlPdu (uint8_t controlPduType)
71 m_dataControlBit = CONTROL_PDU;
72 m_controlPduType = controlPduType;
75 LteRlcAmHeader::IsDataPdu (
void)
const
77 return (m_dataControlBit == DATA_PDU) ?
true :
false;
80 LteRlcAmHeader::IsControlPdu (
void)
const
82 return (m_dataControlBit == CONTROL_PDU) ?
true :
false;
86 LteRlcAmHeader::SetFramingInfo (uint8_t framingInfo)
88 m_framingInfo = framingInfo & 0x03;
92 LteRlcAmHeader::SetSequenceNumber (SequenceNumber10 sequenceNumber)
94 m_sequenceNumber = sequenceNumber;
98 LteRlcAmHeader::GetFramingInfo ()
const
100 return m_framingInfo;
104 LteRlcAmHeader::GetSequenceNumber ()
const
106 return m_sequenceNumber;
111 LteRlcAmHeader::PushExtensionBit (uint8_t extensionBit)
113 m_extensionBits.push_back (extensionBit);
114 if (m_extensionBits.size() > 1)
116 if (m_extensionBits.size() % 2)
128 LteRlcAmHeader::PushLengthIndicator (uint16_t lengthIndicator)
130 m_lengthIndicators.push_back (lengthIndicator);
135 LteRlcAmHeader::PopExtensionBit (
void)
137 uint8_t extensionBit = m_extensionBits.front ();
138 m_extensionBits.pop_front ();
144 LteRlcAmHeader::PopLengthIndicator (
void)
146 uint16_t lengthIndicator = m_lengthIndicators.front ();
147 m_lengthIndicators.pop_front ();
149 return lengthIndicator;
154 LteRlcAmHeader::SetResegmentationFlag (uint8_t resegFlag)
156 m_resegmentationFlag = resegFlag & 0x01;
160 LteRlcAmHeader::GetResegmentationFlag ()
const
162 return m_resegmentationFlag;
167 LteRlcAmHeader::SetPollingBit (uint8_t pollingBit)
169 m_pollingBit = pollingBit & 0x01;
173 LteRlcAmHeader::GetPollingBit (
void)
const
180 LteRlcAmHeader::SetLastSegmentFlag (uint8_t lsf)
182 m_lastSegmentFlag = lsf & 0x01;
186 LteRlcAmHeader::GetLastSegmentFlag (
void)
const
188 return m_lastSegmentFlag;
193 LteRlcAmHeader::SetSegmentOffset (uint16_t segmentOffset)
195 m_segmentOffset = segmentOffset & 0x7FFF;
199 LteRlcAmHeader::GetSegmentOffset (
void)
const
201 return m_segmentOffset;
205 LteRlcAmHeader::GetLastOffset (
void)
const
212 LteRlcAmHeader::SetAckSn (SequenceNumber10 ackSn)
218 LteRlcAmHeader::GetAckSn (
void)
const
225 LteRlcAmHeader::GetTypeId (
void)
227 static TypeId tid = TypeId (
"ns3::LteRlcAmHeader")
228 .SetParent<Header> ()
229 .AddConstructor<LteRlcAmHeader> ()
243 std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
244 std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
246 os <<
"Len=" << m_headerLength;
247 os <<
" D/C=" << (uint16_t)m_dataControlBit;
249 if ( m_dataControlBit == DATA_PDU )
251 os <<
" RF=" << (uint16_t)m_resegmentationFlag;
252 os <<
" P=" << (uint16_t)m_pollingBit;
253 os <<
" FI=" << (uint16_t)m_framingInfo;
254 os <<
" E=" << (uint16_t)(*it1);
255 os <<
" SN=" << m_sequenceNumber;
256 os <<
" LSF=" << (uint16_t)(m_lastSegmentFlag);
257 os <<
" SO=" << m_segmentOffset;
260 if (it1 != m_extensionBits.end ())
264 while ( it1 != m_extensionBits.end () )
266 os << (uint16_t)(*it1);
270 if (it2 != m_lengthIndicators.end ())
274 while ( it2 != m_lengthIndicators.end () )
276 os << (uint16_t)(*it2) <<
" ";
282 os <<
" ACK_SN=" << m_ackSn;
283 os <<
" NACK_SN=" << m_nackSn;
289 return m_headerLength;
296 std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
297 std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
299 if ( m_dataControlBit == DATA_PDU )
301 i.
WriteU8 ( ((DATA_PDU << 7) & 0x80) |
302 ((m_resegmentationFlag << 6) & 0x40) |
303 ((m_pollingBit << 5) & 0x20) |
304 ((m_framingInfo << 3) & 0x18) |
305 (((*it1) << 2) & 0x04) |
306 ((m_sequenceNumber.
GetValue () >> 8) & 0x0003) );
308 i.
WriteU8 ( ((m_lastSegmentFlag << 7) & 0x80) |
309 ((m_segmentOffset >> 8) & 0x007F) );
310 i.
WriteU8 ( m_segmentOffset & 0x00FF );
313 while ( it1 != m_extensionBits.end () &&
314 it2 != m_lengthIndicators.end () )
316 uint16_t oddLi, evenLi;
325 if ( it1 != m_extensionBits.end () &&
326 it2 != m_lengthIndicators.end () )
331 i.
WriteU8 ( ((oddE << 7) & 0x80) | ((oddLi >> 4) & 0x007F) );
332 i.
WriteU8 ( ((oddLi << 4) & 0x00F0) | ((evenE << 3) & 0x08) | ((evenLi >> 8) & 0x0007) );
340 i.
WriteU8 ( ((oddE << 7) & 0x80) | ((oddLi >> 4) & 0x007F) );
341 i.
WriteU8 ( ((oddLi << 4) & 0x00F0) );
347 i.
WriteU8 ( ((CONTROL_PDU << 7) & 0x80) |
348 ((m_controlPduType << 4) & 0x70) |
349 ((m_ackSn.
GetValue () >> 6) & 0x0F) );
361 uint8_t extensionBit;
365 m_dataControlBit = (byte_1 & 0x80) >> 7;
367 if ( m_dataControlBit == DATA_PDU )
374 m_resegmentationFlag = (byte_1 & 0x40) >> 6;
375 m_pollingBit = (byte_1 & 0x20) >> 5;
376 m_framingInfo = (byte_1 & 0x18) >> 3;
377 m_sequenceNumber = ((byte_1 & 0x03) << 8) | byte_2;
379 m_lastSegmentFlag = (byte_3 & 0x80) >> 7;
380 m_segmentOffset = (byte_3 & 0x7F) | byte_4;
382 extensionBit = (byte_1 & 0x04) >> 2;
383 m_extensionBits.push_back (extensionBit);
385 if (extensionBit == DATA_FIELD_FOLLOWS)
390 uint16_t oddLi, evenLi;
392 bool moreLiFields = (extensionBit == E_LI_FIELDS_FOLLOWS);
399 oddE = (byte_1 & 0x80) >> 7;
400 oddLi = ((byte_1 & 0x7F) << 4) | ((byte_2 & 0xF0) >> 4);
401 moreLiFields = (oddE == E_LI_FIELDS_FOLLOWS);
403 m_extensionBits.push_back (oddE);
404 m_lengthIndicators.push_back (oddLi);
411 evenE = (byte_2 & 0x08) >> 3;
412 evenLi = ((byte_2 & 0x07) << 8) | (byte_3 & 0xFF);
413 moreLiFields = (evenE == E_LI_FIELDS_FOLLOWS);
415 m_extensionBits.push_back (evenE);
416 m_lengthIndicators.push_back (evenLi);
422 if (m_resegmentationFlag == SEGMENT)
424 m_lastOffset = m_segmentOffset + start.
GetSize () - m_headerLength;
431 m_controlPduType = (byte_1 & 0x70) >> 4;
432 m_ackSn = ((byte_1 & 0x0F) << 6 ) | ((byte_2 & 0xFC) >> 2);
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)
uint32_t GetSize(void) const