A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Documentation ▼
Installation
Manual
Models
Contributing
Wiki
Development ▼
API Docs
Issue Tracker
Merge Requests
API
Loading...
Searching...
No Matches
lte-asn1-header.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3
*
4
* SPDX-License-Identifier: GPL-2.0-only
5
*
6
* Author: Lluis Parcerisa <lparcerisa@cttc.cat>
7
*/
8
9
#include "
lte-asn1-header.h
"
10
11
#include "ns3/log.h"
12
13
#include <cmath>
14
#include <sstream>
15
16
namespace
ns3
17
{
18
19
NS_LOG_COMPONENT_DEFINE
(
"Asn1Header"
);
20
21
NS_OBJECT_ENSURE_REGISTERED
(Asn1Header);
22
23
TypeId
24
Asn1Header::GetTypeId
()
25
{
26
static
TypeId
tid =
TypeId
(
"ns3::Asn1Header"
).
SetParent
<
Header
>().SetGroupName(
"Lte"
);
27
return
tid;
28
}
29
30
TypeId
31
Asn1Header::GetInstanceTypeId
()
const
32
{
33
return
GetTypeId
();
34
}
35
36
Asn1Header::Asn1Header
()
37
{
38
m_serializationPendingBits
= 0x00;
39
m_numSerializationPendingBits
= 0;
40
m_isDataSerialized
=
false
;
41
}
42
43
Asn1Header::~Asn1Header
()
44
{
45
}
46
47
uint32_t
48
Asn1Header::GetSerializedSize
()
const
49
{
50
if
(!
m_isDataSerialized
)
51
{
52
PreSerialize
();
53
}
54
return
m_serializationResult
.
GetSize
();
55
}
56
57
void
58
Asn1Header::Serialize
(
Buffer::Iterator
bIterator
)
const
59
{
60
if
(!
m_isDataSerialized
)
61
{
62
PreSerialize
();
63
}
64
bIterator
.Write(
m_serializationResult
.
Begin
(),
m_serializationResult
.
End
());
65
}
66
67
void
68
Asn1Header::WriteOctet
(uint8_t
octet
)
const
69
{
70
m_serializationResult
.
AddAtEnd
(1);
71
Buffer::Iterator
bIterator
=
m_serializationResult
.
End
();
72
bIterator
.
Prev
();
73
bIterator
.WriteU8(
octet
);
74
}
75
76
template
<
int
N>
77
void
78
Asn1Header::SerializeBitset
(std::bitset<N>
data
)
const
79
{
80
size_t
dataSize
=
data
.size();
81
uint8_t
pendingBits
=
dataSize
;
82
uint8_t mask = 1;
83
int
j
;
84
85
// No extension marker (Clause 16.7 ITU-T X.691),
86
// as 3GPP TS 36.331 does not use it in its IE's.
87
88
// Clause 16.8 ITU-T X.691
89
if
(
dataSize
== 0)
90
{
91
return
;
92
}
93
94
// Clause 16.9 ITU-T X.691
95
// Clause 16.10 ITU-T X.691
96
if
(
dataSize
<= 65536)
97
{
98
// If there are bits pending to be processed,
99
// append first bits in data to complete an octet.
100
if
(
m_numSerializationPendingBits
> 0)
101
{
102
mask = 0x80 >>
m_numSerializationPendingBits
;
103
while
(
pendingBits
> 0 &&
m_numSerializationPendingBits
< 8)
104
{
105
m_serializationPendingBits
|= (
data
[
pendingBits
- 1]) ? mask : 0;
106
pendingBits
--;
107
m_numSerializationPendingBits
++;
108
mask = (mask >> 1) & (~mask);
109
}
110
111
if
(
m_numSerializationPendingBits
>= 8)
112
{
113
WriteOctet
(
m_serializationPendingBits
);
114
m_numSerializationPendingBits
= 0;
115
m_serializationPendingBits
= 0;
116
}
117
}
118
119
while
(
pendingBits
> 0)
120
{
121
mask = 1;
122
j
= 8;
123
124
// If there are less than 8 remaining bits,
125
// store it to m_serializationPendingBits.
126
if
(
pendingBits
< 8)
127
{
128
mask = 0x80;
129
m_numSerializationPendingBits
=
pendingBits
;
130
while
(
pendingBits
> 0)
131
{
132
m_serializationPendingBits
|= (
data
[
pendingBits
- 1]) ? mask : 0;
133
mask = (mask >> 1) & (~mask);
134
pendingBits
--;
135
}
136
}
137
138
// Write the data to buffer
139
else
140
{
141
uint8_t
octetToWrite
= 0;
142
for
(;
j
> 0;
j
--)
143
{
144
octetToWrite
|= (
data
[
pendingBits
-
j
]) ? mask : 0;
145
mask = (mask << 1) & (~mask);
146
}
147
WriteOctet
(
octetToWrite
);
148
pendingBits
-= 8;
149
}
150
}
151
}
152
153
// Clause 16.11 ITU-T X.691
154
else
155
{
156
NS_LOG_DEBUG
(
"Fragmentation needed!"
);
157
}
158
}
159
160
template
<
int
N>
161
void
162
Asn1Header::SerializeBitstring
(std::bitset<N>
data
)
const
163
{
164
SerializeBitset<N>
(
data
);
165
}
166
167
void
168
Asn1Header::SerializeBitstring
(std::bitset<1>
data
)
const
169
{
170
SerializeBitstring<1>
(
data
);
171
}
172
173
void
174
Asn1Header::SerializeBitstring
(std::bitset<2>
data
)
const
175
{
176
SerializeBitstring<2>
(
data
);
177
}
178
179
void
180
Asn1Header::SerializeBitstring
(std::bitset<8>
data
)
const
181
{
182
SerializeBitstring<8>
(
data
);
183
}
184
185
void
186
Asn1Header::SerializeBitstring
(std::bitset<10>
data
)
const
187
{
188
SerializeBitstring<10>
(
data
);
189
}
190
191
void
192
Asn1Header::SerializeBitstring
(std::bitset<16>
data
)
const
193
{
194
SerializeBitstring<16>
(
data
);
195
}
196
197
void
198
Asn1Header::SerializeBitstring
(std::bitset<27>
data
)
const
199
{
200
SerializeBitstring<27>
(
data
);
201
}
202
203
void
204
Asn1Header::SerializeBitstring
(std::bitset<28>
data
)
const
205
{
206
SerializeBitstring<28>
(
data
);
207
}
208
209
void
210
Asn1Header::SerializeBitstring
(std::bitset<32>
data
)
const
211
{
212
SerializeBitstring<32>
(
data
);
213
}
214
215
void
216
Asn1Header::SerializeBoolean
(
bool
value
)
const
217
{
218
// Clause 12 ITU-T X.691
219
std::bitset<1>
val
;
220
(
value
) ?
val
.set() :
val
.reset();
221
SerializeBitset<1>
(
val
);
222
}
223
224
template
<
int
N>
225
void
226
Asn1Header::SerializeSequence
(std::bitset<N>
optionalOrDefaultMask
,
227
bool
isExtensionMarkerPresent
)
const
228
{
229
if
(
isExtensionMarkerPresent
)
230
{
231
// Extension marker present, but no extension
232
SerializeBoolean
(
false
);
233
}
234
SerializeBitstring<N>
(
optionalOrDefaultMask
);
235
}
236
237
void
238
Asn1Header::SerializeSequence
(std::bitset<0>
optionalOrDefaultMask
,
239
bool
isExtensionMarkerPresent
)
const
240
{
241
SerializeSequence<0>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
242
}
243
244
void
245
Asn1Header::SerializeSequence
(std::bitset<1>
optionalOrDefaultMask
,
246
bool
isExtensionMarkerPresent
)
const
247
{
248
SerializeSequence<1>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
249
}
250
251
void
252
Asn1Header::SerializeSequence
(std::bitset<2>
optionalOrDefaultMask
,
253
bool
isExtensionMarkerPresent
)
const
254
{
255
SerializeSequence<2>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
256
}
257
258
void
259
Asn1Header::SerializeSequence
(std::bitset<3>
optionalOrDefaultMask
,
260
bool
isExtensionMarkerPresent
)
const
261
{
262
SerializeSequence<3>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
263
}
264
265
void
266
Asn1Header::SerializeSequence
(std::bitset<4>
optionalOrDefaultMask
,
267
bool
isExtensionMarkerPresent
)
const
268
{
269
SerializeSequence<4>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
270
}
271
272
void
273
Asn1Header::SerializeSequence
(std::bitset<5>
optionalOrDefaultMask
,
274
bool
isExtensionMarkerPresent
)
const
275
{
276
SerializeSequence<5>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
277
}
278
279
void
280
Asn1Header::SerializeSequence
(std::bitset<6>
optionalOrDefaultMask
,
281
bool
isExtensionMarkerPresent
)
const
282
{
283
SerializeSequence<6>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
284
}
285
286
void
287
Asn1Header::SerializeSequence
(std::bitset<7>
optionalOrDefaultMask
,
288
bool
isExtensionMarkerPresent
)
const
289
{
290
SerializeSequence<7>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
291
}
292
293
void
294
Asn1Header::SerializeSequence
(std::bitset<9>
optionalOrDefaultMask
,
295
bool
isExtensionMarkerPresent
)
const
296
{
297
SerializeSequence<9>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
298
}
299
300
void
301
Asn1Header::SerializeSequence
(std::bitset<10>
optionalOrDefaultMask
,
302
bool
isExtensionMarkerPresent
)
const
303
{
304
SerializeSequence<10>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
305
}
306
307
void
308
Asn1Header::SerializeSequence
(std::bitset<11>
optionalOrDefaultMask
,
309
bool
isExtensionMarkerPresent
)
const
310
{
311
SerializeSequence<11>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
);
312
}
313
314
void
315
Asn1Header::SerializeSequenceOf
(
int
numElems
,
int
nMax
,
int
nMin
)
const
316
{
317
// Clause 20.6 ITU-T X.691
318
SerializeInteger
(
numElems
,
nMin
,
nMax
);
319
}
320
321
void
322
Asn1Header::SerializeEnum
(
int
numElems
,
int
selectedElem
)
const
323
{
324
// Clause 14 ITU-T X.691
325
SerializeInteger
(
selectedElem
, 0,
numElems
- 1);
326
}
327
328
void
329
Asn1Header::SerializeChoice
(
int
numOptions
,
int
selectedOption
,
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
346
void
347
Asn1Header::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
442
void
443
Asn1Header::SerializeNull
()
const
444
{
445
// Clause 18 ITU-T X.691
446
}
447
448
void
449
Asn1Header::FinalizeSerialization
()
const
450
{
451
if
(
m_numSerializationPendingBits
> 0)
452
{
453
m_numSerializationPendingBits
= 0;
454
SerializeBitset<8>
(std::bitset<8>(
m_serializationPendingBits
));
455
}
456
m_isDataSerialized
=
true
;
457
}
458
459
template
<
int
N>
460
Buffer::Iterator
461
Asn1Header::DeserializeBitset
(std::bitset<N>*
data
,
Buffer::Iterator
bIterator
)
462
{
463
int
bitsToRead
=
N
;
464
uint8_t mask;
465
466
// Read bits from pending bits
467
if
(
m_numSerializationPendingBits
> 0)
468
{
469
while
(
bitsToRead
> 0 &&
m_numSerializationPendingBits
> 0)
470
{
471
data
->set(
bitsToRead
- 1, (
m_serializationPendingBits
& 0x80) ? 1 : 0);
472
bitsToRead
--;
473
m_numSerializationPendingBits
--;
474
m_serializationPendingBits
=
m_serializationPendingBits
<< 1;
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
512
template
<
int
N>
513
Buffer::Iterator
514
Asn1Header::DeserializeBitstring
(std::bitset<N>*
data
,
Buffer::Iterator
bIterator
)
515
{
516
return
DeserializeBitset<N>
(
data
,
bIterator
);
517
}
518
519
Buffer::Iterator
520
Asn1Header::DeserializeBitstring
(std::bitset<1>*
data
,
Buffer::Iterator
bIterator
)
521
{
522
return
DeserializeBitstring<1>
(
data
,
bIterator
);
523
}
524
525
Buffer::Iterator
526
Asn1Header::DeserializeBitstring
(std::bitset<2>*
data
,
Buffer::Iterator
bIterator
)
527
{
528
return
DeserializeBitstring<2>
(
data
,
bIterator
);
529
}
530
531
Buffer::Iterator
532
Asn1Header::DeserializeBitstring
(std::bitset<8>*
data
,
Buffer::Iterator
bIterator
)
533
{
534
return
DeserializeBitstring<8>
(
data
,
bIterator
);
535
}
536
537
Buffer::Iterator
538
Asn1Header::DeserializeBitstring
(std::bitset<10>*
data
,
Buffer::Iterator
bIterator
)
539
{
540
return
DeserializeBitstring<10>
(
data
,
bIterator
);
541
}
542
543
Buffer::Iterator
544
Asn1Header::DeserializeBitstring
(std::bitset<16>*
data
,
Buffer::Iterator
bIterator
)
545
{
546
return
DeserializeBitstring<16>
(
data
,
bIterator
);
547
}
548
549
Buffer::Iterator
550
Asn1Header::DeserializeBitstring
(std::bitset<27>*
data
,
Buffer::Iterator
bIterator
)
551
{
552
return
DeserializeBitstring<27>
(
data
,
bIterator
);
553
}
554
555
Buffer::Iterator
556
Asn1Header::DeserializeBitstring
(std::bitset<28>*
data
,
Buffer::Iterator
bIterator
)
557
{
558
return
DeserializeBitstring<28>
(
data
,
bIterator
);
559
}
560
561
Buffer::Iterator
562
Asn1Header::DeserializeBitstring
(std::bitset<32>*
data
,
Buffer::Iterator
bIterator
)
563
{
564
return
DeserializeBitstring<32>
(
data
,
bIterator
);
565
}
566
567
Buffer::Iterator
568
Asn1Header::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
576
Buffer::Iterator
577
Asn1Header::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
710
Buffer::Iterator
711
Asn1Header::DeserializeChoice
(
int
numOptions
,
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
724
Buffer::Iterator
725
Asn1Header::DeserializeEnum
(
int
numElems
,
int
*
selectedElem
,
Buffer::Iterator
bIterator
)
726
{
727
return
DeserializeInteger
(
selectedElem
, 0,
numElems
- 1,
bIterator
);
728
}
729
730
template
<
int
N>
731
Buffer::Iterator
732
Asn1Header::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
745
Buffer::Iterator
746
Asn1Header::DeserializeSequence
(std::bitset<0>*
optionalOrDefaultMask
,
747
bool
isExtensionMarkerPresent
,
748
Buffer::Iterator
bIterator
)
749
{
750
return
DeserializeSequence<0>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
751
}
752
753
Buffer::Iterator
754
Asn1Header::DeserializeSequence
(std::bitset<1>*
optionalOrDefaultMask
,
755
bool
isExtensionMarkerPresent
,
756
Buffer::Iterator
bIterator
)
757
{
758
return
DeserializeSequence<1>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
759
}
760
761
Buffer::Iterator
762
Asn1Header::DeserializeSequence
(std::bitset<2>*
optionalOrDefaultMask
,
763
bool
isExtensionMarkerPresent
,
764
Buffer::Iterator
bIterator
)
765
{
766
return
DeserializeSequence<2>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
767
}
768
769
Buffer::Iterator
770
Asn1Header::DeserializeSequence
(std::bitset<3>*
optionalOrDefaultMask
,
771
bool
isExtensionMarkerPresent
,
772
Buffer::Iterator
bIterator
)
773
{
774
return
DeserializeSequence<3>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
775
}
776
777
Buffer::Iterator
778
Asn1Header::DeserializeSequence
(std::bitset<4>*
optionalOrDefaultMask
,
779
bool
isExtensionMarkerPresent
,
780
Buffer::Iterator
bIterator
)
781
{
782
return
DeserializeSequence<4>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
783
}
784
785
Buffer::Iterator
786
Asn1Header::DeserializeSequence
(std::bitset<5>*
optionalOrDefaultMask
,
787
bool
isExtensionMarkerPresent
,
788
Buffer::Iterator
bIterator
)
789
{
790
return
DeserializeSequence<5>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
791
}
792
793
Buffer::Iterator
794
Asn1Header::DeserializeSequence
(std::bitset<6>*
optionalOrDefaultMask
,
795
bool
isExtensionMarkerPresent
,
796
Buffer::Iterator
bIterator
)
797
{
798
return
DeserializeSequence<6>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
799
}
800
801
Buffer::Iterator
802
Asn1Header::DeserializeSequence
(std::bitset<7>*
optionalOrDefaultMask
,
803
bool
isExtensionMarkerPresent
,
804
Buffer::Iterator
bIterator
)
805
{
806
return
DeserializeSequence<7>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
807
}
808
809
Buffer::Iterator
810
Asn1Header::DeserializeSequence
(std::bitset<9>*
optionalOrDefaultMask
,
811
bool
isExtensionMarkerPresent
,
812
Buffer::Iterator
bIterator
)
813
{
814
return
DeserializeSequence<9>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
815
}
816
817
Buffer::Iterator
818
Asn1Header::DeserializeSequence
(std::bitset<10>*
optionalOrDefaultMask
,
819
bool
isExtensionMarkerPresent
,
820
Buffer::Iterator
bIterator
)
821
{
822
return
DeserializeSequence<10>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
823
}
824
825
Buffer::Iterator
826
Asn1Header::DeserializeSequence
(std::bitset<11>*
optionalOrDefaultMask
,
827
bool
isExtensionMarkerPresent
,
828
Buffer::Iterator
bIterator
)
829
{
830
return
DeserializeSequence<11>
(
optionalOrDefaultMask
,
isExtensionMarkerPresent
,
bIterator
);
831
}
832
833
Buffer::Iterator
834
Asn1Header::DeserializeNull
(
Buffer::Iterator
bIterator
)
835
{
836
return
bIterator
;
837
}
838
839
Buffer::Iterator
840
Asn1Header::DeserializeSequenceOf
(
int
*
numElems
,
int
nMax
,
int
nMin
,
Buffer::Iterator
bIterator
)
841
{
842
return
DeserializeInteger
(
numElems
,
nMin
,
nMax
,
bIterator
);
843
}
844
845
}
// namespace ns3
ns3::Asn1Header::DeserializeBitset
Buffer::Iterator DeserializeBitset(std::bitset< N > *data, Buffer::Iterator bIterator)
Deserialize a bitset.
Definition
lte-asn1-header.cc:461
ns3::Asn1Header::DeserializeChoice
Buffer::Iterator DeserializeChoice(int numOptions, bool isExtensionMarkerPresent, int *selectedOption, Buffer::Iterator bIterator)
Deserialize a Choice (set of options)
Definition
lte-asn1-header.cc:711
ns3::Asn1Header::GetTypeId
static TypeId GetTypeId()
Get the type ID.
Definition
lte-asn1-header.cc:24
ns3::Asn1Header::DeserializeSequenceOf
Buffer::Iterator DeserializeSequenceOf(int *numElems, int nMax, int nMin, Buffer::Iterator bIterator)
Deserialize a Sequence.
Definition
lte-asn1-header.cc:840
ns3::Asn1Header::DeserializeNull
Buffer::Iterator DeserializeNull(Buffer::Iterator bIterator)
Deserialize nothing (null op)
Definition
lte-asn1-header.cc:834
ns3::Asn1Header::WriteOctet
void WriteOctet(uint8_t octet) const
Function to write in m_serializationResult, after resizing its size.
Definition
lte-asn1-header.cc:68
ns3::Asn1Header::SerializeBitset
void SerializeBitset(std::bitset< N > data) const
Serialize a bitset.
Definition
lte-asn1-header.cc:78
ns3::Asn1Header::DeserializeInteger
Buffer::Iterator DeserializeInteger(int *n, int nmin, int nmax, Buffer::Iterator bIterator)
Deserialize an integer.
Definition
lte-asn1-header.cc:577
ns3::Asn1Header::GetInstanceTypeId
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
Definition
lte-asn1-header.cc:31
ns3::Asn1Header::SerializeBitstring
void SerializeBitstring(std::bitset< N > bitstring) const
Serialize a bitstring.
Definition
lte-asn1-header.cc:162
ns3::Asn1Header::DeserializeEnum
Buffer::Iterator DeserializeEnum(int numElems, int *selectedElem, Buffer::Iterator bIterator)
Deserialize an Enum.
Definition
lte-asn1-header.cc:725
ns3::Asn1Header::PreSerialize
virtual void PreSerialize() const =0
This function serializes class attributes to m_serializationResult local Buffer.
ns3::Asn1Header::DeserializeSequence
Buffer::Iterator DeserializeSequence(std::bitset< N > *optionalOrDefaultMask, bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
Deserialize a sequence.
Definition
lte-asn1-header.cc:732
ns3::Asn1Header::m_numSerializationPendingBits
uint8_t m_numSerializationPendingBits
number of pending bits
Definition
lte-asn1-header.h:58
ns3::Asn1Header::SerializeSequence
void SerializeSequence(std::bitset< N > optionalOrDefaultMask, bool isExtensionMarkerPresent) const
Serialize a sequence.
Definition
lte-asn1-header.cc:226
ns3::Asn1Header::SerializeChoice
void SerializeChoice(int numOptions, int selectedOption, bool isExtensionMarkerPresent) const
Serialize a Choice (set of options)
Definition
lte-asn1-header.cc:329
ns3::Asn1Header::m_serializationResult
Buffer m_serializationResult
serialization result
Definition
lte-asn1-header.h:60
ns3::Asn1Header::FinalizeSerialization
void FinalizeSerialization() const
Finalizes an in progress serialization.
Definition
lte-asn1-header.cc:449
ns3::Asn1Header::~Asn1Header
~Asn1Header() override
Definition
lte-asn1-header.cc:43
ns3::Asn1Header::SerializeInteger
void SerializeInteger(int n, int nmin, int nmax) const
Serialize an Integer.
Definition
lte-asn1-header.cc:347
ns3::Asn1Header::DeserializeBoolean
Buffer::Iterator DeserializeBoolean(bool *value, Buffer::Iterator bIterator)
Deserialize a boolean.
Definition
lte-asn1-header.cc:568
ns3::Asn1Header::m_serializationPendingBits
uint8_t m_serializationPendingBits
pending bits
Definition
lte-asn1-header.h:57
ns3::Asn1Header::GetSerializedSize
uint32_t GetSerializedSize() const override
Definition
lte-asn1-header.cc:48
ns3::Asn1Header::Serialize
void Serialize(Buffer::Iterator bIterator) const override
Definition
lte-asn1-header.cc:58
ns3::Asn1Header::SerializeBoolean
void SerializeBoolean(bool value) const
Serialize a bool.
Definition
lte-asn1-header.cc:216
ns3::Asn1Header::DeserializeBitstring
Buffer::Iterator DeserializeBitstring(std::bitset< N > *bitstring, Buffer::Iterator bIterator)
Deserialize a bitstring.
Definition
lte-asn1-header.cc:514
ns3::Asn1Header::SerializeNull
void SerializeNull() const
Serialize nothing (null op)
Definition
lte-asn1-header.cc:443
ns3::Asn1Header::m_isDataSerialized
bool m_isDataSerialized
true if data is serialized
Definition
lte-asn1-header.h:59
ns3::Asn1Header::SerializeSequenceOf
void SerializeSequenceOf(int numElems, int nMax, int nMin) const
Serialize a Sequence.
Definition
lte-asn1-header.cc:315
ns3::Asn1Header::Asn1Header
Asn1Header()
Definition
lte-asn1-header.cc:36
ns3::Asn1Header::SerializeEnum
void SerializeEnum(int numElems, int selectedElem) const
Serialize an Enum.
Definition
lte-asn1-header.cc:322
ns3::Buffer::Iterator
iterator in a Buffer instance
Definition
buffer.h:89
ns3::Buffer::Iterator::ReadU8
uint8_t ReadU8()
Definition
buffer.h:1016
ns3::Buffer::Iterator::Prev
void Prev()
go backward by one byte
Definition
buffer.h:849
ns3::Buffer::GetSize
uint32_t GetSize() const
Definition
buffer.h:1057
ns3::Buffer::Begin
Buffer::Iterator Begin() const
Definition
buffer.h:1063
ns3::Buffer::AddAtEnd
void AddAtEnd(uint32_t end)
Definition
buffer.cc:349
ns3::Buffer::End
Buffer::Iterator End() const
Definition
buffer.h:1070
ns3::Header
Protocol header serialization and deserialization.
Definition
header.h:33
ns3::TypeId
a unique identifier for an interface.
Definition
type-id.h:49
ns3::TypeId::SetParent
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition
type-id.cc:1001
uint32_t
NS_ASSERT_MSG
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition
assert.h:75
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition
log.h:191
NS_LOG_DEBUG
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition
log.h:257
NS_OBJECT_ENSURE_REGISTERED
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition
object-base.h:35
ns3::Create
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition
ptr.h:436
lte-asn1-header.h
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::value
static unsigned int value(char c)
Definition
qkd-encryptor.cc:267
data
uint8_t data[writeSize]
Definition
socket-bound-tcp-static-routing.cc:41
src
lte
model
lte-asn1-header.cc
Generated on Mon Dec 15 2025 15:21:56 for ns-3 by
1.9.8