22 #include "ns3/lte-asn1-header.h"
32 NS_OBJECT_ENSURE_REGISTERED (Asn1Header);
35 Asn1Header::GetTypeId (
void)
37 static TypeId tid = TypeId (
"ns3::Asn1Header")
49 Asn1Header::Asn1Header ()
51 m_serializationPendingBits = 0x00;
52 m_numSerializationPendingBits = 0;
53 m_isDataSerialized =
false;
56 Asn1Header::~Asn1Header ()
63 if (!m_isDataSerialized)
67 return m_serializationResult.
GetSize ();
72 if (!m_isDataSerialized)
76 bIterator.
Write (m_serializationResult.
Begin (),m_serializationResult.
End ());
79 void Asn1Header::WriteOctet (uint8_t octet)
const
88 void Asn1Header::SerializeBitset (std::bitset<N> data)
const
91 size_t dataSize = data.size ();
92 uint8_t pendingBits = dataSize;
107 if (dataSize <= 65536)
111 if (m_numSerializationPendingBits > 0)
113 mask = 0x80 >> m_numSerializationPendingBits;
114 while (pendingBits > 0 && m_numSerializationPendingBits < 8)
116 m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
118 m_numSerializationPendingBits++;
119 mask = (mask >> 1) & (~mask);
122 if (m_numSerializationPendingBits >= 8)
124 WriteOctet (m_serializationPendingBits);
125 m_numSerializationPendingBits = 0;
126 m_serializationPendingBits = 0;
130 while (pendingBits > 0)
140 m_numSerializationPendingBits = pendingBits;
141 while (pendingBits > 0)
143 m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
144 mask = (mask >> 1) & (~mask);
152 uint8_t octetToWrite = 0;
155 octetToWrite |= (data[pendingBits - j]) ? mask : 0;
156 mask = (mask << 1) & (~mask);
158 WriteOctet (octetToWrite);
167 printf (
"FRAGMENTATION NEEDED!\n");
172 void Asn1Header::SerializeBitstring (std::bitset<N> data)
const
174 SerializeBitset<N> (data);
178 void Asn1Header::SerializeBitstring (std::bitset<1> data)
const
180 SerializeBitstring<1> (data);
183 void Asn1Header::SerializeBitstring (std::bitset<2> data)
const
185 SerializeBitstring<2> (data);
188 void Asn1Header::SerializeBitstring (std::bitset<8> data)
const
190 SerializeBitstring<8> (data);
193 void Asn1Header::SerializeBitstring (std::bitset<10> data)
const
195 SerializeBitstring<10> (data);
198 void Asn1Header::SerializeBitstring (std::bitset<16> data)
const
200 SerializeBitstring<16> (data);
203 void Asn1Header::SerializeBitstring (std::bitset<27> data)
const
205 SerializeBitstring<27> (data);
208 void Asn1Header::SerializeBitstring (std::bitset<28> data)
const
210 SerializeBitstring<28> (data);
213 void Asn1Header::SerializeBitstring (std::bitset<32> data)
const
215 SerializeBitstring<32> (data);
218 void Asn1Header::SerializeBoolean (
bool value)
const
222 (value) ? val.set () : val.reset ();
223 SerializeBitset<1> (val);
227 void Asn1Header::SerializeSequence (std::bitset<N> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
229 if (isExtensionMarkerPresent)
232 SerializeBoolean (
false);
234 SerializeBitstring<N> (optionalOrDefaultMask);
237 void Asn1Header::SerializeSequence (std::bitset<0> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
239 SerializeSequence<0> (optionalOrDefaultMask,isExtensionMarkerPresent);
242 void Asn1Header::SerializeSequence (std::bitset<1> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
244 SerializeSequence<1> (optionalOrDefaultMask,isExtensionMarkerPresent);
247 void Asn1Header::SerializeSequence (std::bitset<2> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
249 SerializeSequence<2> (optionalOrDefaultMask,isExtensionMarkerPresent);
252 void Asn1Header::SerializeSequence (std::bitset<3> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
254 SerializeSequence<3> (optionalOrDefaultMask,isExtensionMarkerPresent);
257 void Asn1Header::SerializeSequence (std::bitset<4> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
259 SerializeSequence<4> (optionalOrDefaultMask,isExtensionMarkerPresent);
262 void Asn1Header::SerializeSequence (std::bitset<5> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
264 SerializeSequence<5> (optionalOrDefaultMask,isExtensionMarkerPresent);
267 void Asn1Header::SerializeSequence (std::bitset<6> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
269 SerializeSequence<6> (optionalOrDefaultMask,isExtensionMarkerPresent);
272 void Asn1Header::SerializeSequence (std::bitset<9> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
274 SerializeSequence<9> (optionalOrDefaultMask,isExtensionMarkerPresent);
277 void Asn1Header::SerializeSequence (std::bitset<10> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
279 SerializeSequence<10> (optionalOrDefaultMask,isExtensionMarkerPresent);
282 void Asn1Header::SerializeSequence (std::bitset<11> optionalOrDefaultMask,
bool isExtensionMarkerPresent)
const
284 SerializeSequence<11> (optionalOrDefaultMask,isExtensionMarkerPresent);
287 void Asn1Header::SerializeSequenceOf (
int numElems,
int nMax,
int nMin)
const
290 SerializeInteger (numElems, nMin, nMax);
293 void Asn1Header::SerializeEnum (
int numElems,
int selectedElem)
const
296 SerializeInteger (selectedElem, 0, numElems - 1);
299 void Asn1Header::SerializeChoice (
int numOptions,
int selectedOption,
bool isExtensionMarkerPresent)
const
301 if(isExtensionMarkerPresent)
304 SerializeBoolean(
false);
313 SerializeInteger (selectedOption,0,numOptions - 1);
316 void Asn1Header::SerializeInteger (
int n,
int nmin,
int nmax)
const
327 int range = nmax - nmin + 1;
338 int requiredBits = std::ceil (std::log (range) / std::log (2.0));
340 switch (requiredBits)
343 SerializeBitset<1> (std::bitset<1> (n));
346 SerializeBitset<2> (std::bitset<2> (n));
349 SerializeBitset<3> (std::bitset<3> (n));
352 SerializeBitset<4> (std::bitset<4> (n));
355 SerializeBitset<5> (std::bitset<5> (n));
358 SerializeBitset<6> (std::bitset<6> (n));
361 SerializeBitset<7> (std::bitset<7> (n));
364 SerializeBitset<8> (std::bitset<8> (n));
367 SerializeBitset<9> (std::bitset<9> (n));
370 SerializeBitset<10> (std::bitset<10> (n));
373 SerializeBitset<11> (std::bitset<11> (n));
376 SerializeBitset<12> (std::bitset<12> (n));
379 SerializeBitset<13> (std::bitset<13> (n));
382 SerializeBitset<14> (std::bitset<14> (n));
385 SerializeBitset<15> (std::bitset<15> (n));
388 SerializeBitset<16> (std::bitset<16> (n));
391 SerializeBitset<17> (std::bitset<17> (n));
394 SerializeBitset<18> (std::bitset<18> (n));
397 SerializeBitset<19> (std::bitset<19> (n));
400 SerializeBitset<20> (std::bitset<20> (n));
404 std::cout <<
"SerializeInteger " << requiredBits <<
" Out of range!!" << std::endl;
410 void Asn1Header::SerializeNull ()
const
416 void Asn1Header::FinalizeSerialization ()
const
418 if (m_numSerializationPendingBits > 0)
420 m_numSerializationPendingBits = 0;
421 SerializeBitset<8> (std::bitset<8> (m_serializationPendingBits));
423 m_isDataSerialized =
true;
427 Buffer::Iterator Asn1Header::DeserializeBitset (std::bitset<N> *data, Buffer::Iterator bIterator)
434 if (m_numSerializationPendingBits > 0)
436 while (bitsToRead > 0 && m_numSerializationPendingBits > 0)
438 data->set (bitsToRead - 1,(m_serializationPendingBits & 0x80) ? 1 : 0);
440 m_numSerializationPendingBits--;
441 m_serializationPendingBits = m_serializationPendingBits << 1;
446 while (bitsToRead > 0)
448 uint8_t octet = bIterator.ReadU8 ();
453 for (
int j = 0; j < 8; j++)
455 data->set (bitsToRead - 1,(octet & mask) ? 1 : 0);
465 m_numSerializationPendingBits = 8 - bitsToRead;
466 m_serializationPendingBits = octet << bitsToRead;
467 while (bitsToRead > 0)
469 data->set (bitsToRead - 1,(octet & mask) ? 1 : 0);
480 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<N> *data, Buffer::Iterator bIterator)
482 return DeserializeBitset<N> (data,bIterator);
485 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<1> *data, Buffer::Iterator bIterator)
487 return DeserializeBitstring<1> (data,bIterator);
490 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<2> *data, Buffer::Iterator bIterator)
492 return DeserializeBitstring<2> (data,bIterator);
495 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<8> *data, Buffer::Iterator bIterator)
497 return DeserializeBitstring<8> (data,bIterator);
500 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<10> *data, Buffer::Iterator bIterator)
502 return DeserializeBitstring<10> (data,bIterator);
505 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<16> *data, Buffer::Iterator bIterator)
507 return DeserializeBitstring<16> (data,bIterator);
510 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<27> *data, Buffer::Iterator bIterator)
512 return DeserializeBitstring<27> (data,bIterator);
515 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<28> *data, Buffer::Iterator bIterator)
517 return DeserializeBitstring<28> (data,bIterator);
520 Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<32> *data, Buffer::Iterator bIterator)
522 return DeserializeBitstring<32> (data,bIterator);
525 Buffer::Iterator Asn1Header::DeserializeBoolean (
bool *value, Buffer::Iterator bIterator)
527 std::bitset<1> readBit;
528 bIterator = DeserializeBitset<1> (&readBit,bIterator);
529 *value = (readBit[0] == 1) ?
true :
false;
533 Buffer::Iterator Asn1Header::DeserializeInteger (
int *n,
int nmin,
int nmax, Buffer::Iterator bIterator)
543 int range = nmax - nmin + 1;
550 int requiredBits = std::ceil (std::log (range) / std::log (2.0));
552 std::bitset<1> bitsRead1;
553 std::bitset<2> bitsRead2;
554 std::bitset<3> bitsRead3;
555 std::bitset<4> bitsRead4;
556 std::bitset<5> bitsRead5;
557 std::bitset<6> bitsRead6;
558 std::bitset<7> bitsRead7;
559 std::bitset<8> bitsRead8;
560 std::bitset<9> bitsRead9;
561 std::bitset<10> bitsRead10;
562 std::bitset<11> bitsRead11;
563 std::bitset<12> bitsRead12;
564 std::bitset<13> bitsRead13;
565 std::bitset<14> bitsRead14;
566 std::bitset<15> bitsRead15;
567 std::bitset<16> bitsRead16;
568 std::bitset<17> bitsRead17;
569 std::bitset<18> bitsRead18;
570 std::bitset<19> bitsRead19;
571 std::bitset<20> bitsRead20;
573 switch (requiredBits)
576 bIterator = DeserializeBitset<1> (&bitsRead1,bIterator);
577 *n = (int)bitsRead1.to_ulong ();
580 bIterator = DeserializeBitset<2> (&bitsRead2,bIterator);
581 *n = (int)bitsRead2.to_ulong ();
584 bIterator = DeserializeBitset<3> (&bitsRead3,bIterator);
585 *n = (int)bitsRead3.to_ulong ();
588 bIterator = DeserializeBitset<4> (&bitsRead4,bIterator);
589 *n = (int)bitsRead4.to_ulong ();
592 bIterator = DeserializeBitset<5> (&bitsRead5,bIterator);
593 *n = (int)bitsRead5.to_ulong ();
596 bIterator = DeserializeBitset<6> (&bitsRead6,bIterator);
597 *n = (int)bitsRead6.to_ulong ();
600 bIterator = DeserializeBitset<7> (&bitsRead7,bIterator);
601 *n = (int)bitsRead7.to_ulong ();
604 bIterator = DeserializeBitset<8> (&bitsRead8,bIterator);
605 *n = (int)bitsRead8.to_ulong ();
608 bIterator = DeserializeBitset<9> (&bitsRead9,bIterator);
609 *n = (int)bitsRead9.to_ulong ();
612 bIterator = DeserializeBitset<10> (&bitsRead10,bIterator);
613 *n = (int)bitsRead10.to_ulong ();
616 bIterator = DeserializeBitset<11> (&bitsRead11,bIterator);
617 *n = (int)bitsRead11.to_ulong ();
620 bIterator = DeserializeBitset<12> (&bitsRead12,bIterator);
621 *n = (int)bitsRead12.to_ulong ();
624 bIterator = DeserializeBitset<13> (&bitsRead13,bIterator);
625 *n = (int)bitsRead13.to_ulong ();
628 bIterator = DeserializeBitset<14> (&bitsRead14,bIterator);
629 *n = (int)bitsRead14.to_ulong ();
632 bIterator = DeserializeBitset<15> (&bitsRead15,bIterator);
633 *n = (int)bitsRead15.to_ulong ();
636 bIterator = DeserializeBitset<16> (&bitsRead16,bIterator);
637 *n = (int)bitsRead16.to_ulong ();
640 bIterator = DeserializeBitset<17> (&bitsRead17,bIterator);
641 *n = (int)bitsRead17.to_ulong ();
644 bIterator = DeserializeBitset<18> (&bitsRead18,bIterator);
645 *n = (int)bitsRead18.to_ulong ();
648 bIterator = DeserializeBitset<19> (&bitsRead19,bIterator);
649 *n = (int)bitsRead19.to_ulong ();
652 bIterator = DeserializeBitset<20> (&bitsRead20,bIterator);
653 *n = (int)bitsRead20.to_ulong ();
657 std::cout <<
"SerializeInteger Out of range!!" << std::endl;
667 Buffer::Iterator Asn1Header::DeserializeChoice (
int numOptions,
bool isExtensionMarkerPresent,
int *selectedOption, Buffer::Iterator bIterator)
669 if (isExtensionMarkerPresent)
672 bIterator = DeserializeBoolean (&marker,bIterator);
674 return DeserializeInteger (selectedOption,0,numOptions - 1,bIterator);
677 Buffer::Iterator Asn1Header::DeserializeEnum (
int numElems,
int *selectedElem, Buffer::Iterator bIterator)
679 return DeserializeInteger (selectedElem,0,numElems - 1,bIterator);
683 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<N> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
685 if (isExtensionMarkerPresent)
688 bIterator = DeserializeBoolean (&dummy,bIterator);
690 bIterator = DeserializeBitset<N> (optionalOrDefaultMask,bIterator);
694 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<0> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
696 return DeserializeSequence<0> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
699 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<1> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
701 return DeserializeSequence<1> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
704 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<2> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
706 return DeserializeSequence<2> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
709 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<3> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
711 return DeserializeSequence<3> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
714 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<4> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
716 return DeserializeSequence<4> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
719 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<5> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
721 return DeserializeSequence<5> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
724 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<6> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
726 return DeserializeSequence<6> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
729 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<9> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
731 return DeserializeSequence<9> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
734 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<10> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
736 return DeserializeSequence<10> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
739 Buffer::Iterator Asn1Header::DeserializeSequence (std::bitset<11> *optionalOrDefaultMask,
bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
741 return DeserializeSequence<11> (optionalOrDefaultMask,isExtensionMarkerPresent,bIterator);
744 Buffer::Iterator Asn1Header::DeserializeNull (Buffer::Iterator bIterator)
749 Buffer::Iterator Asn1Header::DeserializeSequenceOf (
int *numElems,
int nMax,
int nMin, Buffer::Iterator bIterator)
751 return DeserializeInteger (numElems,nMin,nMax,bIterator);
#define NS_LOG_COMPONENT_DEFINE(name)
iterator in a Buffer instance
Buffer::Iterator End(void) const
Buffer::Iterator Begin(void) const
uint32_t GetSize(void) const
bool AddAtEnd(uint32_t end)
void WriteU8(uint8_t data)
void Write(uint8_t const *buffer, uint32_t size)