5G-LENA nr-v4.0
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-asn1-header.cc
1// Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
2//
3// SPDX-License-Identifier: GPL-2.0-only
4//
5// Author: Lluis Parcerisa <lparcerisa@cttc.cat>
6
7#include "nr-asn1-header.h"
8
9#include "ns3/log.h"
10
11#include <cmath>
12#include <sstream>
13
14namespace ns3
15{
16
17NS_LOG_COMPONENT_DEFINE("NrAsn1Header");
18
19NS_OBJECT_ENSURE_REGISTERED(NrAsn1Header);
20
21TypeId
23{
24 static TypeId tid = TypeId("ns3::NrAsn1Header").SetParent<Header>().SetGroupName("Nr");
25 return tid;
26}
27
28TypeId
29NrAsn1Header::GetInstanceTypeId() const
30{
31 return GetTypeId();
32}
33
34NrAsn1Header::NrAsn1Header()
35{
38 m_isDataSerialized = false;
39}
40
41NrAsn1Header::~NrAsn1Header()
42{
43}
44
45uint32_t
46NrAsn1Header::GetSerializedSize() const
47{
49 {
51 }
52 return m_serializationResult.GetSize();
53}
54
55void
56NrAsn1Header::Serialize(Buffer::Iterator bIterator) const
57{
59 {
61 }
62 bIterator.Write(m_serializationResult.Begin(), m_serializationResult.End());
63}
64
65void
66NrAsn1Header::WriteOctet(uint8_t octet) const
67{
68 m_serializationResult.AddAtEnd(1);
69 Buffer::Iterator bIterator = m_serializationResult.End();
70 bIterator.Prev();
71 bIterator.WriteU8(octet);
72}
73
74template <int N>
75void
76NrAsn1Header::SerializeBitset(std::bitset<N> data) const
77{
78 size_t dataSize = data.size();
79 uint8_t pendingBits = dataSize;
80 uint8_t mask = 1;
81 int j;
82
83 // No extension marker (Clause 16.7 ITU-T X.691),
84 // as 3GPP TS 36.331 does not use it in its IE's.
85
86 // Clause 16.8 ITU-T X.691
87 if (dataSize == 0)
88 {
89 return;
90 }
91
92 // Clause 16.9 ITU-T X.691
93 // Clause 16.10 ITU-T X.691
94 if (dataSize <= 65536)
95 {
96 // If there are bits pending to be processed,
97 // append first bits in data to complete an octet.
99 {
100 mask = 0x80 >> m_numSerializationPendingBits;
101 while (pendingBits > 0 && m_numSerializationPendingBits < 8)
102 {
103 m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
104 pendingBits--;
106 mask = (mask >> 1) & (~mask);
107 }
108
110 {
114 }
115 }
116
117 while (pendingBits > 0)
118 {
119 mask = 1;
120 j = 8;
121
122 // If there are less than 8 remaining bits,
123 // store it to m_serializationPendingBits.
124 if (pendingBits < 8)
125 {
126 mask = 0x80;
127 m_numSerializationPendingBits = pendingBits;
128 while (pendingBits > 0)
129 {
130 m_serializationPendingBits |= (data[pendingBits - 1]) ? mask : 0;
131 mask = (mask >> 1) & (~mask);
132 pendingBits--;
133 }
134 }
135
136 // Write the data to buffer
137 else
138 {
139 uint8_t octetToWrite = 0;
140 for (; j > 0; j--)
141 {
142 octetToWrite |= (data[pendingBits - j]) ? mask : 0;
143 mask = (mask << 1) & (~mask);
144 }
145 WriteOctet(octetToWrite);
146 pendingBits -= 8;
147 }
148 }
149 }
150
151 // Clause 16.11 ITU-T X.691
152 else
153 {
154 NS_LOG_DEBUG("Fragmentation needed!");
155 }
156}
157
158template <int N>
159void
160NrAsn1Header::SerializeBitstring(std::bitset<N> data) const
161{
162 SerializeBitset<N>(data);
163}
164
165void
166NrAsn1Header::SerializeBitstring(std::bitset<1> data) const
167{
168 SerializeBitstring<1>(data);
169}
170
171void
172NrAsn1Header::SerializeBitstring(std::bitset<2> data) const
173{
174 SerializeBitstring<2>(data);
175}
176
177void
178NrAsn1Header::SerializeBitstring(std::bitset<8> data) const
179{
180 SerializeBitstring<8>(data);
181}
182
183void
184NrAsn1Header::SerializeBitstring(std::bitset<10> data) const
185{
186 SerializeBitstring<10>(data);
187}
188
189void
190NrAsn1Header::SerializeBitstring(std::bitset<16> data) const
191{
192 SerializeBitstring<16>(data);
193}
194
195void
196NrAsn1Header::SerializeBitstring(std::bitset<27> data) const
197{
198 SerializeBitstring<27>(data);
199}
200
201void
202NrAsn1Header::SerializeBitstring(std::bitset<28> data) const
203{
204 SerializeBitstring<28>(data);
205}
206
207void
208NrAsn1Header::SerializeBitstring(std::bitset<32> data) const
209{
210 SerializeBitstring<32>(data);
211}
212
213void
215{
216 // Clause 12 ITU-T X.691
217 std::bitset<1> val;
218 (value) ? val.set() : val.reset();
219 SerializeBitset<1>(val);
220}
221
222template <int N>
223void
224NrAsn1Header::SerializeSequence(std::bitset<N> optionalOrDefaultMask,
225 bool isExtensionMarkerPresent) const
226{
227 if (isExtensionMarkerPresent)
228 {
229 // Extension marker present, but no extension
230 SerializeBoolean(false);
231 }
232 SerializeBitstring<N>(optionalOrDefaultMask);
233}
234
235void
236NrAsn1Header::SerializeSequence(std::bitset<0> optionalOrDefaultMask,
237 bool isExtensionMarkerPresent) const
238{
239 SerializeSequence<0>(optionalOrDefaultMask, isExtensionMarkerPresent);
240}
241
242void
243NrAsn1Header::SerializeSequence(std::bitset<1> optionalOrDefaultMask,
244 bool isExtensionMarkerPresent) const
245{
246 SerializeSequence<1>(optionalOrDefaultMask, isExtensionMarkerPresent);
247}
248
249void
250NrAsn1Header::SerializeSequence(std::bitset<2> optionalOrDefaultMask,
251 bool isExtensionMarkerPresent) const
252{
253 SerializeSequence<2>(optionalOrDefaultMask, isExtensionMarkerPresent);
254}
255
256void
257NrAsn1Header::SerializeSequence(std::bitset<3> optionalOrDefaultMask,
258 bool isExtensionMarkerPresent) const
259{
260 SerializeSequence<3>(optionalOrDefaultMask, isExtensionMarkerPresent);
261}
262
263void
264NrAsn1Header::SerializeSequence(std::bitset<4> optionalOrDefaultMask,
265 bool isExtensionMarkerPresent) const
266{
267 SerializeSequence<4>(optionalOrDefaultMask, isExtensionMarkerPresent);
268}
269
270void
271NrAsn1Header::SerializeSequence(std::bitset<5> optionalOrDefaultMask,
272 bool isExtensionMarkerPresent) const
273{
274 SerializeSequence<5>(optionalOrDefaultMask, isExtensionMarkerPresent);
275}
276
277void
278NrAsn1Header::SerializeSequence(std::bitset<6> optionalOrDefaultMask,
279 bool isExtensionMarkerPresent) const
280{
281 SerializeSequence<6>(optionalOrDefaultMask, isExtensionMarkerPresent);
282}
283
284void
285NrAsn1Header::SerializeSequence(std::bitset<7> optionalOrDefaultMask,
286 bool isExtensionMarkerPresent) const
287{
288 SerializeSequence<7>(optionalOrDefaultMask, isExtensionMarkerPresent);
289}
290
291void
292NrAsn1Header::SerializeSequence(std::bitset<9> optionalOrDefaultMask,
293 bool isExtensionMarkerPresent) const
294{
295 SerializeSequence<9>(optionalOrDefaultMask, isExtensionMarkerPresent);
296}
297
298void
299NrAsn1Header::SerializeSequence(std::bitset<10> optionalOrDefaultMask,
300 bool isExtensionMarkerPresent) const
301{
302 SerializeSequence<10>(optionalOrDefaultMask, isExtensionMarkerPresent);
303}
304
305void
306NrAsn1Header::SerializeSequence(std::bitset<11> optionalOrDefaultMask,
307 bool isExtensionMarkerPresent) const
308{
309 SerializeSequence<11>(optionalOrDefaultMask, isExtensionMarkerPresent);
310}
311
312void
313NrAsn1Header::SerializeSequenceOf(int numElems, int nMax, int nMin) const
314{
315 // Clause 20.6 ITU-T X.691
316 SerializeInteger(numElems, nMin, nMax);
317}
318
319void
320NrAsn1Header::SerializeEnum(int numElems, int selectedElem) const
321{
322 // Clause 14 ITU-T X.691
323 SerializeInteger(selectedElem, 0, numElems - 1);
324}
325
326void
328 int selectedOption,
329 bool isExtensionMarkerPresent) const
330{
331 if (isExtensionMarkerPresent)
332 {
333 // Never extended attributes
334 SerializeBoolean(false);
335 }
336
337 // Clause 23.4 ITU-T X.691
338 if (numOptions < 2)
339 {
340 return;
341 }
342
343 SerializeInteger(selectedOption, 0, numOptions - 1);
344}
345
346void
347NrAsn1Header::SerializeInteger(int n, int nmin, int nmax) const
348{
349 // The following is equivalent to:
350 // NS_ASSERT_MSG (nmin <= n && n <= nmax,
351 // "Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");
352 // This is a workaround to gcc-7 aggressive optimization, see #346, and can be dropped
353 // once gcc-7 will not be anymore supported.
354 long int nComp = nmin;
355 nComp -= n;
356 NS_ASSERT_MSG(nComp <= 0 && n <= nmax,
357 "Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");
358
359 // Clause 11.5.3 ITU-T X.691
360 int range = nmax - nmin + 1;
361 // Subtract nmin to n
362 n -= nmin;
363
364 // Clause 11.5.4 ITU-T X.691
365 if (range <= 1)
366 {
367 return;
368 }
369
370 // Clause 11.5.6 ITU-T X.691
371 int requiredBits = std::ceil(std::log(range) / std::log(2.0));
372
373 switch (requiredBits)
374 {
375 case 1:
376 SerializeBitset<1>(std::bitset<1>(n));
377 break;
378 case 2:
379 SerializeBitset<2>(std::bitset<2>(n));
380 break;
381 case 3:
382 SerializeBitset<3>(std::bitset<3>(n));
383 break;
384 case 4:
385 SerializeBitset<4>(std::bitset<4>(n));
386 break;
387 case 5:
388 SerializeBitset<5>(std::bitset<5>(n));
389 break;
390 case 6:
391 SerializeBitset<6>(std::bitset<6>(n));
392 break;
393 case 7:
394 SerializeBitset<7>(std::bitset<7>(n));
395 break;
396 case 8:
397 SerializeBitset<8>(std::bitset<8>(n));
398 break;
399 case 9:
400 SerializeBitset<9>(std::bitset<9>(n));
401 break;
402 case 10:
403 SerializeBitset<10>(std::bitset<10>(n));
404 break;
405 case 11:
406 SerializeBitset<11>(std::bitset<11>(n));
407 break;
408 case 12:
409 SerializeBitset<12>(std::bitset<12>(n));
410 break;
411 case 13:
412 SerializeBitset<13>(std::bitset<13>(n));
413 break;
414 case 14:
415 SerializeBitset<14>(std::bitset<14>(n));
416 break;
417 case 15:
418 SerializeBitset<15>(std::bitset<15>(n));
419 break;
420 case 16:
421 SerializeBitset<16>(std::bitset<16>(n));
422 break;
423 case 17:
424 SerializeBitset<17>(std::bitset<17>(n));
425 break;
426 case 18:
427 SerializeBitset<18>(std::bitset<18>(n));
428 break;
429 case 19:
430 SerializeBitset<19>(std::bitset<19>(n));
431 break;
432 case 20:
433 SerializeBitset<20>(std::bitset<20>(n));
434 break;
435 default: {
436 std::cout << "SerializeInteger " << requiredBits << " Out of range!!" << std::endl;
437 exit(1);
438 }
439 }
440}
441
442void
444{
445 // Clause 18 ITU-T X.691
446}
447
448void
450{
452 {
454 SerializeBitset<8>(std::bitset<8>(m_serializationPendingBits));
455 }
456 m_isDataSerialized = true;
457}
458
459template <int N>
460Buffer::Iterator
461NrAsn1Header::DeserializeBitset(std::bitset<N>* data, Buffer::Iterator bIterator)
462{
463 int bitsToRead = N;
464 uint8_t mask;
465
466 // Read bits from pending bits
468 {
469 while (bitsToRead > 0 && m_numSerializationPendingBits > 0)
470 {
471 data->set(bitsToRead - 1, (m_serializationPendingBits & 0x80) ? 1 : 0);
472 bitsToRead--;
475 }
476 }
477
478 // Read bits from buffer
479 while (bitsToRead > 0)
480 {
481 uint8_t octet = bIterator.ReadU8();
482 // If 8 bits can be allocated to the bitset, set the bits
483 if (bitsToRead >= 8)
484 {
485 mask = 0x80;
486 for (int j = 0; j < 8; j++)
487 {
488 data->set(bitsToRead - 1, (octet & mask) ? 1 : 0);
489 bitsToRead--;
490 mask = mask >> 1;
491 }
492 }
493
494 // Otherwise, we'll have to save the remaining bits
495 else
496 {
497 mask = 0x80;
498 m_numSerializationPendingBits = 8 - bitsToRead;
499 m_serializationPendingBits = octet << bitsToRead;
500 while (bitsToRead > 0)
501 {
502 data->set(bitsToRead - 1, (octet & mask) ? 1 : 0);
503 bitsToRead--;
504 mask = mask >> 1;
505 }
506 }
507 }
508
509 return bIterator;
510}
511
512template <int N>
513Buffer::Iterator
514NrAsn1Header::DeserializeBitstring(std::bitset<N>* data, Buffer::Iterator bIterator)
515{
516 return DeserializeBitset<N>(data, bIterator);
517}
518
519Buffer::Iterator
520NrAsn1Header::DeserializeBitstring(std::bitset<1>* data, Buffer::Iterator bIterator)
521{
522 return DeserializeBitstring<1>(data, bIterator);
523}
524
525Buffer::Iterator
526NrAsn1Header::DeserializeBitstring(std::bitset<2>* data, Buffer::Iterator bIterator)
527{
528 return DeserializeBitstring<2>(data, bIterator);
529}
530
531Buffer::Iterator
532NrAsn1Header::DeserializeBitstring(std::bitset<8>* data, Buffer::Iterator bIterator)
533{
534 return DeserializeBitstring<8>(data, bIterator);
535}
536
537Buffer::Iterator
538NrAsn1Header::DeserializeBitstring(std::bitset<10>* data, Buffer::Iterator bIterator)
539{
540 return DeserializeBitstring<10>(data, bIterator);
541}
542
543Buffer::Iterator
544NrAsn1Header::DeserializeBitstring(std::bitset<16>* data, Buffer::Iterator bIterator)
545{
546 return DeserializeBitstring<16>(data, bIterator);
547}
548
549Buffer::Iterator
550NrAsn1Header::DeserializeBitstring(std::bitset<27>* data, Buffer::Iterator bIterator)
551{
552 return DeserializeBitstring<27>(data, bIterator);
553}
554
555Buffer::Iterator
556NrAsn1Header::DeserializeBitstring(std::bitset<28>* data, Buffer::Iterator bIterator)
557{
558 return DeserializeBitstring<28>(data, bIterator);
559}
560
561Buffer::Iterator
562NrAsn1Header::DeserializeBitstring(std::bitset<32>* data, Buffer::Iterator bIterator)
563{
564 return DeserializeBitstring<32>(data, bIterator);
565}
566
567Buffer::Iterator
568NrAsn1Header::DeserializeBoolean(bool* value, Buffer::Iterator bIterator)
569{
570 std::bitset<1> readBit;
571 bIterator = DeserializeBitset<1>(&readBit, bIterator);
572 *value = (readBit[0] == 1);
573 return bIterator;
574}
575
576Buffer::Iterator
577NrAsn1Header::DeserializeInteger(int* n, int nmin, int nmax, Buffer::Iterator bIterator)
578{
579 // Misusage check: Ensure nmax>nmin ...
580 if (nmin > nmax)
581 {
582 int aux = nmin;
583 nmin = nmax;
584 nmax = aux;
585 }
586
587 int range = nmax - nmin + 1;
588
589 if (range == 1)
590 {
591 return bIterator;
592 }
593
594 int requiredBits = std::ceil(std::log(range) / std::log(2.0));
595
596 std::bitset<1> bitsRead1;
597 std::bitset<2> bitsRead2;
598 std::bitset<3> bitsRead3;
599 std::bitset<4> bitsRead4;
600 std::bitset<5> bitsRead5;
601 std::bitset<6> bitsRead6;
602 std::bitset<7> bitsRead7;
603 std::bitset<8> bitsRead8;
604 std::bitset<9> bitsRead9;
605 std::bitset<10> bitsRead10;
606 std::bitset<11> bitsRead11;
607 std::bitset<12> bitsRead12;
608 std::bitset<13> bitsRead13;
609 std::bitset<14> bitsRead14;
610 std::bitset<15> bitsRead15;
611 std::bitset<16> bitsRead16;
612 std::bitset<17> bitsRead17;
613 std::bitset<18> bitsRead18;
614 std::bitset<19> bitsRead19;
615 std::bitset<20> bitsRead20;
616
617 switch (requiredBits)
618 {
619 case 1:
620 bIterator = DeserializeBitset<1>(&bitsRead1, bIterator);
621 *n = (int)bitsRead1.to_ulong();
622 break;
623 case 2:
624 bIterator = DeserializeBitset<2>(&bitsRead2, bIterator);
625 *n = (int)bitsRead2.to_ulong();
626 break;
627 case 3:
628 bIterator = DeserializeBitset<3>(&bitsRead3, bIterator);
629 *n = (int)bitsRead3.to_ulong();
630 break;
631 case 4:
632 bIterator = DeserializeBitset<4>(&bitsRead4, bIterator);
633 *n = (int)bitsRead4.to_ulong();
634 break;
635 case 5:
636 bIterator = DeserializeBitset<5>(&bitsRead5, bIterator);
637 *n = (int)bitsRead5.to_ulong();
638 break;
639 case 6:
640 bIterator = DeserializeBitset<6>(&bitsRead6, bIterator);
641 *n = (int)bitsRead6.to_ulong();
642 break;
643 case 7:
644 bIterator = DeserializeBitset<7>(&bitsRead7, bIterator);
645 *n = (int)bitsRead7.to_ulong();
646 break;
647 case 8:
648 bIterator = DeserializeBitset<8>(&bitsRead8, bIterator);
649 *n = (int)bitsRead8.to_ulong();
650 break;
651 case 9:
652 bIterator = DeserializeBitset<9>(&bitsRead9, bIterator);
653 *n = (int)bitsRead9.to_ulong();
654 break;
655 case 10:
656 bIterator = DeserializeBitset<10>(&bitsRead10, bIterator);
657 *n = (int)bitsRead10.to_ulong();
658 break;
659 case 11:
660 bIterator = DeserializeBitset<11>(&bitsRead11, bIterator);
661 *n = (int)bitsRead11.to_ulong();
662 break;
663 case 12:
664 bIterator = DeserializeBitset<12>(&bitsRead12, bIterator);
665 *n = (int)bitsRead12.to_ulong();
666 break;
667 case 13:
668 bIterator = DeserializeBitset<13>(&bitsRead13, bIterator);
669 *n = (int)bitsRead13.to_ulong();
670 break;
671 case 14:
672 bIterator = DeserializeBitset<14>(&bitsRead14, bIterator);
673 *n = (int)bitsRead14.to_ulong();
674 break;
675 case 15:
676 bIterator = DeserializeBitset<15>(&bitsRead15, bIterator);
677 *n = (int)bitsRead15.to_ulong();
678 break;
679 case 16:
680 bIterator = DeserializeBitset<16>(&bitsRead16, bIterator);
681 *n = (int)bitsRead16.to_ulong();
682 break;
683 case 17:
684 bIterator = DeserializeBitset<17>(&bitsRead17, bIterator);
685 *n = (int)bitsRead17.to_ulong();
686 break;
687 case 18:
688 bIterator = DeserializeBitset<18>(&bitsRead18, bIterator);
689 *n = (int)bitsRead18.to_ulong();
690 break;
691 case 19:
692 bIterator = DeserializeBitset<19>(&bitsRead19, bIterator);
693 *n = (int)bitsRead19.to_ulong();
694 break;
695 case 20:
696 bIterator = DeserializeBitset<20>(&bitsRead20, bIterator);
697 *n = (int)bitsRead20.to_ulong();
698 break;
699 default: {
700 std::cout << "SerializeInteger Out of range!!" << std::endl;
701 exit(1);
702 }
703 }
704
705 *n += nmin;
706
707 return bIterator;
708}
709
710Buffer::Iterator
712 bool isExtensionMarkerPresent,
713 int* selectedOption,
714 Buffer::Iterator bIterator)
715{
716 if (isExtensionMarkerPresent)
717 {
718 bool marker;
719 bIterator = DeserializeBoolean(&marker, bIterator);
720 }
721 return DeserializeInteger(selectedOption, 0, numOptions - 1, bIterator);
722}
723
724Buffer::Iterator
725NrAsn1Header::DeserializeEnum(int numElems, int* selectedElem, Buffer::Iterator bIterator)
726{
727 return DeserializeInteger(selectedElem, 0, numElems - 1, bIterator);
728}
729
730template <int N>
731Buffer::Iterator
732NrAsn1Header::DeserializeSequence(std::bitset<N>* optionalOrDefaultMask,
733 bool isExtensionMarkerPresent,
734 Buffer::Iterator bIterator)
735{
736 if (isExtensionMarkerPresent)
737 {
738 bool dummy;
739 bIterator = DeserializeBoolean(&dummy, bIterator);
740 }
741 bIterator = DeserializeBitset<N>(optionalOrDefaultMask, bIterator);
742 return bIterator;
743}
744
745Buffer::Iterator
746NrAsn1Header::DeserializeSequence(std::bitset<0>* optionalOrDefaultMask,
747 bool isExtensionMarkerPresent,
748 Buffer::Iterator bIterator)
749{
750 return DeserializeSequence<0>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
751}
752
753Buffer::Iterator
754NrAsn1Header::DeserializeSequence(std::bitset<1>* optionalOrDefaultMask,
755 bool isExtensionMarkerPresent,
756 Buffer::Iterator bIterator)
757{
758 return DeserializeSequence<1>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
759}
760
761Buffer::Iterator
762NrAsn1Header::DeserializeSequence(std::bitset<2>* optionalOrDefaultMask,
763 bool isExtensionMarkerPresent,
764 Buffer::Iterator bIterator)
765{
766 return DeserializeSequence<2>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
767}
768
769Buffer::Iterator
770NrAsn1Header::DeserializeSequence(std::bitset<3>* optionalOrDefaultMask,
771 bool isExtensionMarkerPresent,
772 Buffer::Iterator bIterator)
773{
774 return DeserializeSequence<3>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
775}
776
777Buffer::Iterator
778NrAsn1Header::DeserializeSequence(std::bitset<4>* optionalOrDefaultMask,
779 bool isExtensionMarkerPresent,
780 Buffer::Iterator bIterator)
781{
782 return DeserializeSequence<4>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
783}
784
785Buffer::Iterator
786NrAsn1Header::DeserializeSequence(std::bitset<5>* optionalOrDefaultMask,
787 bool isExtensionMarkerPresent,
788 Buffer::Iterator bIterator)
789{
790 return DeserializeSequence<5>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
791}
792
793Buffer::Iterator
794NrAsn1Header::DeserializeSequence(std::bitset<6>* optionalOrDefaultMask,
795 bool isExtensionMarkerPresent,
796 Buffer::Iterator bIterator)
797{
798 return DeserializeSequence<6>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
799}
800
801Buffer::Iterator
802NrAsn1Header::DeserializeSequence(std::bitset<7>* optionalOrDefaultMask,
803 bool isExtensionMarkerPresent,
804 Buffer::Iterator bIterator)
805{
806 return DeserializeSequence<7>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
807}
808
809Buffer::Iterator
810NrAsn1Header::DeserializeSequence(std::bitset<9>* optionalOrDefaultMask,
811 bool isExtensionMarkerPresent,
812 Buffer::Iterator bIterator)
813{
814 return DeserializeSequence<9>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
815}
816
817Buffer::Iterator
818NrAsn1Header::DeserializeSequence(std::bitset<10>* optionalOrDefaultMask,
819 bool isExtensionMarkerPresent,
820 Buffer::Iterator bIterator)
821{
822 return DeserializeSequence<10>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
823}
824
825Buffer::Iterator
826NrAsn1Header::DeserializeSequence(std::bitset<11>* optionalOrDefaultMask,
827 bool isExtensionMarkerPresent,
828 Buffer::Iterator bIterator)
829{
830 return DeserializeSequence<11>(optionalOrDefaultMask, isExtensionMarkerPresent, bIterator);
831}
832
833Buffer::Iterator
834NrAsn1Header::DeserializeNull(Buffer::Iterator bIterator)
835{
836 return bIterator;
837}
838
839Buffer::Iterator
840NrAsn1Header::DeserializeSequenceOf(int* numElems, int nMax, int nMin, Buffer::Iterator bIterator)
841{
842 return DeserializeInteger(numElems, nMin, nMax, bIterator);
843}
844
845} // namespace ns3
void WriteOctet(uint8_t octet) const
Buffer::Iterator DeserializeBitset(std::bitset< N > *data, Buffer::Iterator bIterator)
void SerializeSequence(std::bitset< N > optionalOrDefaultMask, bool isExtensionMarkerPresent) const
void SerializeBitstring(std::bitset< N > bitstring) const
Buffer::Iterator DeserializeChoice(int numOptions, bool isExtensionMarkerPresent, int *selectedOption, Buffer::Iterator bIterator)
Buffer::Iterator DeserializeEnum(int numElems, int *selectedElem, Buffer::Iterator bIterator)
uint8_t m_numSerializationPendingBits
number of pending bits
Buffer::Iterator DeserializeBitstring(std::bitset< N > *bitstring, Buffer::Iterator bIterator)
Buffer m_serializationResult
serialization result
void FinalizeSerialization() const
Buffer::Iterator DeserializeSequenceOf(int *numElems, int nMax, int nMin, Buffer::Iterator bIterator)
void SerializeEnum(int numElems, int selectedElem) const
Buffer::Iterator DeserializeSequence(std::bitset< N > *optionalOrDefaultMask, bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
void SerializeBoolean(bool value) const
Buffer::Iterator DeserializeBoolean(bool *value, Buffer::Iterator bIterator)
void SerializeChoice(int numOptions, int selectedOption, bool isExtensionMarkerPresent) const
void SerializeBitset(std::bitset< N > data) const
static TypeId GetTypeId()
Get the type ID.
void SerializeSequenceOf(int numElems, int nMax, int nMin) const
void SerializeInteger(int n, int nmin, int nmax) const
uint8_t m_serializationPendingBits
pending bits
bool m_isDataSerialized
true if data is serialized
Buffer::Iterator DeserializeNull(Buffer::Iterator bIterator)
virtual void PreSerialize() const =0
void SerializeNull() const
Buffer::Iterator DeserializeInteger(int *n, int nmin, int nmax, Buffer::Iterator bIterator)