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)