A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lte-rrc-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 * Modified by:
8 * Danilo Abrignani <danilo.abrignani@unibo.it> (Carrier Aggregation - GSoC 2015)
9 * Biljana Bojovic <biljana.bojovic@cttc.es> (Carrier Aggregation)
10 */
11
12#include "lte-rrc-header.h"
13
14#include "ns3/log.h"
15
16#include <sstream>
17#include <stdio.h>
18
19#define MAX_DRB 11 // According to section 6.4 3GPP TS 36.331
20#define MAX_EARFCN 262143
21#define MAX_RAT_CAPABILITIES 8
22#define MAX_SI_MESSAGE 32
23#define MAX_SIB 32
24
25#define MAX_REPORT_CONFIG_ID 32
26#define MAX_OBJECT_ID 32
27#define MAX_MEAS_ID 32
28#define MAX_CELL_MEAS 32
29#define MAX_CELL_REPORT 8
30
31#define MAX_SCELL_REPORT 5
32
33namespace ns3
34{
35
36NS_LOG_COMPONENT_DEFINE("RrcHeader");
37
38//////////////////// RrcAsn1Header class ///////////////////////////////
42
45{
46 static TypeId tid = TypeId("ns3::RrcAsn1Header").SetParent<Header>().SetGroupName("Lte");
47 return tid;
48}
49
52{
53 return GetTypeId();
54}
55
56int
61
62int
63RrcAsn1Header::BandwidthToEnum(uint16_t bandwidth) const
64{
65 int n;
66 switch (bandwidth)
67 {
68 case 6:
69 n = 0;
70 break;
71 case 15:
72 n = 1;
73 break;
74 case 25:
75 n = 2;
76 break;
77 case 50:
78 n = 3;
79 break;
80 case 75:
81 n = 4;
82 break;
83 case 100:
84 n = 5;
85 break;
86 default:
87 NS_FATAL_ERROR("Wrong bandwidth: " << bandwidth);
88 }
89 return n;
90}
91
92uint16_t
94{
95 uint16_t bw;
96 switch (n)
97 {
98 case 0:
99 bw = 6;
100 break;
101 case 1:
102 bw = 15;
103 break;
104 case 2:
105 bw = 25;
106 break;
107 case 3:
108 bw = 50;
109 break;
110 case 4:
111 bw = 75;
112 break;
113 case 5:
114 bw = 100;
115 break;
116 default:
117 NS_FATAL_ERROR("Wrong enum value for bandwidth: " << n);
118 }
119 return bw;
120}
121
122void
123RrcAsn1Header::SerializeDrbToAddModList(std::list<LteRrcSap::DrbToAddMod> drbToAddModList) const
124{
125 // Serialize DRB-ToAddModList sequence-of
126 SerializeSequenceOf(drbToAddModList.size(), MAX_DRB, 1);
127
128 // Serialize the elements in the sequence-of list
129 auto it = drbToAddModList.begin();
130 for (; it != drbToAddModList.end(); it++)
131 {
132 // Serialize DRB-ToAddMod sequence
133 // 5 optional fields. Extension marker is present.
134 std::bitset<5> drbToAddModListOptionalFieldsPresent = std::bitset<5>();
135 drbToAddModListOptionalFieldsPresent.set(4, true); // eps-BearerIdentity present
136 drbToAddModListOptionalFieldsPresent.set(3, false); // pdcp-Config not present
137 drbToAddModListOptionalFieldsPresent.set(2, true); // rlc-Config present
138 drbToAddModListOptionalFieldsPresent.set(1, true); // logicalChannelIdentity present
139 drbToAddModListOptionalFieldsPresent.set(0, true); // logicalChannelConfig present
140 SerializeSequence(drbToAddModListOptionalFieldsPresent, true);
141
142 // Serialize eps-BearerIdentity::=INTEGER (0..15)
143 SerializeInteger(it->epsBearerIdentity, 0, 15);
144
145 // Serialize drb-Identity ::= INTEGER (1..32)
146 SerializeInteger(it->drbIdentity, 1, 32);
147
148 switch (it->rlcConfig.choice)
149 {
151 // Serialize rlc-Config choice
152 SerializeChoice(4, 1, true);
153
154 // Serialize UL-UM-RLC
155 SerializeSequence(std::bitset<0>(), false);
156 SerializeEnum(2, 0); // sn-FieldLength
157
158 // Serialize DL-UM-RLC
159 SerializeSequence(std::bitset<0>(), false);
160 SerializeEnum(2, 0); // sn-FieldLength
161 SerializeEnum(32, 0); // t-Reordering
162 break;
163
165 // Serialize rlc-Config choice
166 SerializeChoice(4, 2, true);
167
168 // Serialize UL-UM-RLC
169 SerializeSequence(std::bitset<0>(), false);
170 SerializeEnum(2, 0); // sn-FieldLength
171 break;
172
174 // Serialize rlc-Config choice
175 SerializeChoice(4, 3, true);
176
177 // Serialize DL-UM-RLC
178 SerializeSequence(std::bitset<0>(), false);
179 SerializeEnum(2, 0); // sn-FieldLength
180 SerializeEnum(32, 0); // t-Reordering
181 break;
182
184 default:
185 // Serialize rlc-Config choice
186 SerializeChoice(4, 0, true);
187
188 // Serialize UL-AM-RLC
189 SerializeSequence(std::bitset<0>(), false);
190 SerializeEnum(64, 0); // t-PollRetransmit
191 SerializeEnum(8, 0); // pollPDU
192 SerializeEnum(16, 0); // pollByte
193 SerializeEnum(8, 0); // maxRetxThreshold
194
195 // Serialize DL-AM-RLC
196 SerializeSequence(std::bitset<0>(), false);
197 SerializeEnum(32, 0); // t-Reordering
198 SerializeEnum(64, 0); // t-StatusProhibit
199 break;
200 }
201
202 // Serialize logicalChannelIdentity ::=INTEGER (3..10)
203 SerializeInteger(it->logicalChannelIdentity, 3, 10);
204
205 // Serialize logicalChannelConfig
206 SerializeLogicalChannelConfig(it->logicalChannelConfig);
207 }
208}
209
210void
211RrcAsn1Header::SerializeSrbToAddModList(std::list<LteRrcSap::SrbToAddMod> srbToAddModList) const
212{
213 // Serialize SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod
214 SerializeSequenceOf(srbToAddModList.size(), 2, 1);
215
216 // Serialize the elements in the sequence-of list
217 auto it = srbToAddModList.begin();
218 for (; it != srbToAddModList.end(); it++)
219 {
220 // Serialize SRB-ToAddMod sequence
221 // 2 optional fields. Extension marker is present.
222 std::bitset<2> srbToAddModListOptionalFieldsPresent = std::bitset<2>();
223 srbToAddModListOptionalFieldsPresent.set(1, false); // rlc-Config not present
224 srbToAddModListOptionalFieldsPresent.set(0, true); // logicalChannelConfig present
225 SerializeSequence(srbToAddModListOptionalFieldsPresent, true);
226
227 // Serialize srb-Identity ::= INTEGER (1..2)
228 SerializeInteger(it->srbIdentity, 1, 2);
229
230 // Serialize logicalChannelConfig choice
231 // 2 options, selected option 0 (var "explicitValue", of type LogicalChannelConfig)
232 SerializeChoice(2, 0, false);
233
234 // Serialize LogicalChannelConfig
235 SerializeLogicalChannelConfig(it->logicalChannelConfig);
236 }
237}
238
239void
241 LteRrcSap::LogicalChannelConfig logicalChannelConfig) const
242{
243 // Serialize LogicalChannelConfig sequence
244 // 1 optional field (ul-SpecificParameters), which is present. Extension marker present.
245 SerializeSequence(std::bitset<1>(1), true);
246
247 // Serialize ul-SpecificParameters sequence
248 // 1 optional field (logicalChannelGroup), which is present. No extension marker.
249 SerializeSequence(std::bitset<1>(1), false);
250
251 // Serialize priority ::= INTEGER (1..16)
252 SerializeInteger(logicalChannelConfig.priority, 1, 16);
253
254 // Serialize prioritisedBitRate
255 int prioritizedBitRate;
256 switch (logicalChannelConfig.prioritizedBitRateKbps)
257 {
258 case 0:
259 prioritizedBitRate = 0;
260 break;
261 case 8:
262 prioritizedBitRate = 1;
263 break;
264 case 16:
265 prioritizedBitRate = 2;
266 break;
267 case 32:
268 prioritizedBitRate = 3;
269 break;
270 case 64:
271 prioritizedBitRate = 4;
272 break;
273 case 128:
274 prioritizedBitRate = 5;
275 break;
276 case 256:
277 prioritizedBitRate = 6;
278 break;
279 default:
280 prioritizedBitRate = 7; // Infinity
281 }
282 SerializeEnum(16, prioritizedBitRate);
283
284 // Serialize bucketSizeDuration
285 int bucketSizeDuration;
286 switch (logicalChannelConfig.bucketSizeDurationMs)
287 {
288 case 50:
289 bucketSizeDuration = 0;
290 break;
291 case 100:
292 bucketSizeDuration = 1;
293 break;
294 case 150:
295 bucketSizeDuration = 2;
296 break;
297 case 300:
298 bucketSizeDuration = 3;
299 break;
300 case 500:
301 bucketSizeDuration = 4;
302 break;
303 case 1000:
304 bucketSizeDuration = 5;
305 break;
306 default:
307 bucketSizeDuration = 5;
308 }
309 SerializeEnum(8, bucketSizeDuration);
310
311 // Serialize logicalChannelGroup ::= INTEGER (0..3)
312 SerializeInteger(logicalChannelConfig.logicalChannelGroup, 0, 3);
313}
314
315void
317 LteRrcSap::PhysicalConfigDedicated physicalConfigDedicated) const
318{
319 // Serialize PhysicalConfigDedicated Sequence
320 std::bitset<10> optionalFieldsPhysicalConfigDedicated;
321 optionalFieldsPhysicalConfigDedicated.set(
322 9,
323 physicalConfigDedicated.havePdschConfigDedicated); // pdsch-ConfigDedicated
324 optionalFieldsPhysicalConfigDedicated.set(8, false); // pucch-ConfigDedicated not present
325 optionalFieldsPhysicalConfigDedicated.set(7, false); // pusch-ConfigDedicated not present
326 optionalFieldsPhysicalConfigDedicated.set(6, false); // uplinkPowerControlDedicated not present
327 optionalFieldsPhysicalConfigDedicated.set(5, false); // tpc-PDCCH-ConfigPUCCH not present
328 optionalFieldsPhysicalConfigDedicated.set(4, false); // tpc-PDCCH-ConfigPUSCH not present
329 optionalFieldsPhysicalConfigDedicated.set(3, false); // cqi-ReportConfig not present
330 optionalFieldsPhysicalConfigDedicated.set(
331 2,
332 physicalConfigDedicated.haveSoundingRsUlConfigDedicated); // soundingRS-UL-ConfigDedicated
333 optionalFieldsPhysicalConfigDedicated.set(
334 1,
335 physicalConfigDedicated.haveAntennaInfoDedicated); // antennaInfo
336 optionalFieldsPhysicalConfigDedicated.set(0, false); // schedulingRequestConfig not present
337 SerializeSequence(optionalFieldsPhysicalConfigDedicated, true);
338
339 if (physicalConfigDedicated.havePdschConfigDedicated)
340 {
341 // Serialize Pdsch-ConfigDedicated Sequence:
342 // 0 optional / default fields, no extension marker.
343 SerializeSequence(std::bitset<0>(), false);
344
345 // Serialize p-a
346 // Assuming the value in the struct is the enum index
347 SerializeEnum(8, physicalConfigDedicated.pdschConfigDedicated.pa);
348
349 // Serialize release
351 }
352
353 if (physicalConfigDedicated.haveSoundingRsUlConfigDedicated)
354 {
355 // Serialize SoundingRS-UL-ConfigDedicated choice:
356 switch (physicalConfigDedicated.soundingRsUlConfigDedicated.type)
357 {
359 SerializeChoice(2, 0, false);
361 break;
362
364 default:
365 // 2 options, selected: 1 (setup)
366 SerializeChoice(2, 1, false);
367
368 // Serialize setup sequence
369 // 0 optional / default fields, no extension marker.
370 SerializeSequence(std::bitset<0>(), false);
371
372 // Serialize srs-Bandwidth
373 SerializeEnum(4, physicalConfigDedicated.soundingRsUlConfigDedicated.srsBandwidth);
374
375 // Serialize srs-HoppingBandwidth
376 SerializeEnum(4, 0);
377
378 // Serialize freqDomainPosition
379 SerializeInteger(0, 0, 23);
380
381 // Serialize duration
382 SerializeBoolean(false);
383
384 // Serialize srs-ConfigIndex
386 0,
387 1023);
388
389 // Serialize transmissionComb
390 SerializeInteger(0, 0, 1);
391
392 // Serialize cyclicShift
393 SerializeEnum(8, 0);
394
395 break;
396 }
397 }
398
399 if (physicalConfigDedicated.haveAntennaInfoDedicated)
400 {
401 // Serialize antennaInfo choice
402 // 2 options. Selected: 0 ("explicitValue" of type "AntennaInfoDedicated")
403 SerializeChoice(2, 0, false);
404
405 // Serialize AntennaInfoDedicated sequence
406 // 1 optional parameter, not present. No extension marker.
407 SerializeSequence(std::bitset<1>(0), false);
408
409 // Serialize transmissionMode
410 // Assuming the value in the struct is the enum index
411 SerializeEnum(8, physicalConfigDedicated.antennaInfo.transmissionMode);
412
413 // Serialize ue-TransmitAntennaSelection choice
414 SerializeChoice(2, 0, false);
415
416 // Serialize release
418 }
419}
420
421void
423 LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
424{
425 bool isSrbToAddModListPresent = !radioResourceConfigDedicated.srbToAddModList.empty();
426 bool isDrbToAddModListPresent = !radioResourceConfigDedicated.drbToAddModList.empty();
427 bool isDrbToReleaseListPresent = !radioResourceConfigDedicated.drbToReleaseList.empty();
428
429 // 6 optional fields. Extension marker is present.
430 std::bitset<6> optionalFieldsPresent = std::bitset<6>();
431 optionalFieldsPresent.set(5, isSrbToAddModListPresent); // srb-ToAddModList present
432 optionalFieldsPresent.set(4, isDrbToAddModListPresent); // drb-ToAddModList present
433 optionalFieldsPresent.set(3, isDrbToReleaseListPresent); // drb-ToReleaseList present
434 optionalFieldsPresent.set(2, false); // mac-MainConfig not present
435 optionalFieldsPresent.set(1, false); // sps-Config not present
436 optionalFieldsPresent.set(0, radioResourceConfigDedicated.havePhysicalConfigDedicated);
437 SerializeSequence(optionalFieldsPresent, true);
438
439 // Serialize srbToAddModList
440 if (isSrbToAddModListPresent)
441 {
442 SerializeSrbToAddModList(radioResourceConfigDedicated.srbToAddModList);
443 }
444
445 // Serialize drbToAddModList
446 if (isDrbToAddModListPresent)
447 {
448 SerializeDrbToAddModList(radioResourceConfigDedicated.drbToAddModList);
449 }
450
451 // Serialize drbToReleaseList
452 if (isDrbToReleaseListPresent)
453 {
454 SerializeSequenceOf(radioResourceConfigDedicated.drbToReleaseList.size(), MAX_DRB, 1);
455 auto it = radioResourceConfigDedicated.drbToReleaseList.begin();
456 for (; it != radioResourceConfigDedicated.drbToReleaseList.end(); it++)
457 {
458 // DRB-Identity ::= INTEGER (1..32)
459 SerializeInteger(*it, 1, 32);
460 }
461 }
462
463 if (radioResourceConfigDedicated.havePhysicalConfigDedicated)
464 {
465 SerializePhysicalConfigDedicated(radioResourceConfigDedicated.physicalConfigDedicated);
466 }
467}
468
469void
471 LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const
472{
473 // 3 optional fields, no extension marker.
474 std::bitset<3> sysInfoBlk1Opts;
475 sysInfoBlk1Opts.set(2, false); // p-Max absent
476 sysInfoBlk1Opts.set(1, false); // tdd-Config absent
477 sysInfoBlk1Opts.set(0, false); // nonCriticalExtension absent
478 SerializeSequence(sysInfoBlk1Opts, false);
479
480 // Serialize cellAccessRelatedInfo
481 // 1 optional field (csgIdentity) which is present, no extension marker.
482 SerializeSequence(std::bitset<1>(1), false);
483
484 // Serialize plmn-IdentityList
485 SerializeSequenceOf(1, 6, 1);
486
487 // PLMN-IdentityInfo
488 SerializeSequence(std::bitset<0>(), false);
489
491 systemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity);
492
493 // Serialize trackingAreaCode
494 SerializeBitstring(std::bitset<16>(0));
495 // Serialize cellIdentity
497 std::bitset<28>(systemInformationBlockType1.cellAccessRelatedInfo.cellIdentity));
498 // Serialize cellBarred
499 SerializeEnum(2, 0);
500 // Serialize intraFreqReselection
501 SerializeEnum(2, 0);
502 // Serialize csg-Indication
503 SerializeBoolean(systemInformationBlockType1.cellAccessRelatedInfo.csgIndication);
504 // Serialize csg-Identity
506 std::bitset<27>(systemInformationBlockType1.cellAccessRelatedInfo.csgIdentity));
507
508 // Serialize cellSelectionInfo
509 SerializeSequence(std::bitset<1>(0), false);
510 // Serialize q-RxLevMin
511 SerializeInteger(-50, -70, -22);
512
513 // Serialize freqBandIndicator
514 SerializeInteger(1, 1, 64);
515
516 // Serialize schedulingInfoList
518 // SchedulingInfo
519 SerializeSequence(std::bitset<0>(), false);
520 // si-Periodicity
521 SerializeEnum(7, 0);
522 // sib-MappingInfo
523 SerializeSequenceOf(0, MAX_SIB - 1, 0);
524
525 // Serialize si-WindowLength
526 SerializeEnum(7, 0);
527
528 // Serialize systemInfoValueTag
529 SerializeInteger(0, 0, 31);
530}
531
532void
534 LteRrcSap::RadioResourceConfigCommon radioResourceConfigCommon) const
535{
536 // 9 optional fields. Extension marker yes.
537 std::bitset<9> rrCfgCmmOpts;
538 rrCfgCmmOpts.set(8, true); // rach-ConfigCommon is present
539 rrCfgCmmOpts.set(7, false); // pdsch-ConfigCommon not present
540 rrCfgCmmOpts.set(6, false); // phich-Config not present
541 rrCfgCmmOpts.set(5, false); // pucch-ConfigCommon not present
542 rrCfgCmmOpts.set(4, false); // soundingRS-UL-ConfigCommon not present
543 rrCfgCmmOpts.set(3, false); // uplinkPowerControlCommon not present
544 rrCfgCmmOpts.set(2, false); // antennaInfoCommon not present
545 rrCfgCmmOpts.set(1, false); // p-Max not present
546 rrCfgCmmOpts.set(0, false); // tdd-Config not present
547
548 SerializeSequence(rrCfgCmmOpts, true);
549
550 if (rrCfgCmmOpts[8])
551 {
552 // Serialize RACH-ConfigCommon
553 SerializeRachConfigCommon(radioResourceConfigCommon.rachConfigCommon);
554 }
555
556 // Serialize PRACH-Config
557 // 1 optional, 0 extension marker.
558 SerializeSequence(std::bitset<1>(0), false);
559
560 // Serialize PRACH-Config rootSequenceIndex
561 SerializeInteger(0, 0, 1023);
562
563 // Serialize PUSCH-ConfigCommon
564 SerializeSequence(std::bitset<0>(), false);
565
566 // Serialize pusch-ConfigBasic
567 SerializeSequence(std::bitset<0>(), false);
568 SerializeInteger(1, 1, 4);
569 SerializeEnum(2, 0);
570 SerializeInteger(0, 0, 98);
571 SerializeBoolean(false);
572
573 // Serialize UL-ReferenceSignalsPUSCH
574 SerializeSequence(std::bitset<0>(), false);
575 SerializeBoolean(false);
576 SerializeInteger(0, 0, 29);
577 SerializeBoolean(false);
578 SerializeInteger(4, 0, 7);
579
580 // Serialize UL-CyclicPrefixLength
581 SerializeEnum(2, 0);
582}
583
584void
586 LteRrcSap::RadioResourceConfigCommonSib radioResourceConfigCommonSib) const
587{
588 SerializeSequence(std::bitset<0>(0), true);
589
590 // rach-ConfigCommon
591 SerializeRachConfigCommon(radioResourceConfigCommonSib.rachConfigCommon);
592
593 // bcch-Config
594 SerializeSequence(std::bitset<0>(0), false);
595 SerializeEnum(4, 0); // modificationPeriodCoeff
596 // pcch-Config
597 SerializeSequence(std::bitset<0>(0), false);
598 SerializeEnum(4, 0); // defaultPagingCycle
599 SerializeEnum(8, 0); // nB
600 // prach-Config
601 SerializeSequence(std::bitset<1>(0), false);
602 SerializeInteger(0, 0, 1023); // rootSequenceIndex
603 // pdsch-ConfigCommon
604 SerializeSequence(std::bitset<0>(0), false);
605 SerializeInteger(0, -60, 50); // referenceSignalPower
606 SerializeInteger(0, 0, 3); // p-b
607 // pusch-ConfigCommon
608 SerializeSequence(std::bitset<0>(0), false);
609 SerializeSequence(std::bitset<0>(0), false); // pusch-ConfigBasic
610 SerializeInteger(1, 1, 4); // n-SB
611 SerializeEnum(2, 0); // hoppingMode
612 SerializeInteger(0, 0, 98); // pusch-HoppingOffset
613 SerializeBoolean(false); // enable64QAM
614 SerializeSequence(std::bitset<0>(0), false); // UL-ReferenceSignalsPUSCH
615 SerializeBoolean(false); // groupHoppingEnabled
616 SerializeInteger(0, 0, 29); // groupAssignmentPUSCH
617 SerializeBoolean(false); // sequenceHoppingEnabled
618 SerializeInteger(0, 0, 7); // cyclicShift
619 // pucch-ConfigCommon
620 SerializeSequence(std::bitset<0>(0), false);
621 SerializeEnum(3, 0); // deltaPUCCH-Shift
622 SerializeInteger(0, 0, 98); // nRB-CQI
623 SerializeInteger(0, 0, 7); // nCS-AN
624 SerializeInteger(0, 0, 2047); // n1PUCCH-AN
625 // soundingRS-UL-ConfigCommon
626 SerializeChoice(2, 0, false);
627 SerializeNull(); // release
628 // uplinkPowerControlCommon
629 SerializeSequence(std::bitset<0>(0), false);
630 SerializeInteger(0, -126, 24); // p0-NominalPUSCH
631 SerializeEnum(8, 0); // alpha
632 SerializeInteger(-110, -127, -96); // p0-NominalPUCCH
633 SerializeSequence(std::bitset<0>(0), false); // deltaFList-PUCCH
634 SerializeEnum(3, 0); // deltaF-PUCCH-Format1
635 SerializeEnum(3, 0); // deltaF-PUCCH-Format1b
636 SerializeEnum(4, 0); // deltaF-PUCCH-Format2
637 SerializeEnum(3, 0); // deltaF-PUCCH-Format2a
638 SerializeEnum(3, 0); // deltaF-PUCCH-Format2b
639 SerializeInteger(0, -1, 6);
640 // ul-CyclicPrefixLength
641 SerializeEnum(2, 0);
642}
643
644void
646 LteRrcSap::SystemInformationBlockType2 systemInformationBlockType2) const
647{
648 SerializeSequence(std::bitset<2>(0), true);
649
650 // RadioResourceConfigCommonSib
652
653 // ue-TimersAndConstants
654 SerializeSequence(std::bitset<0>(0), true);
655 SerializeEnum(8, 0); // t300
656 SerializeEnum(8, 0); // t301
657 SerializeEnum(7, 0); // t310
658 SerializeEnum(8, 0); // n310
659 SerializeEnum(7, 0); // t311
660 SerializeEnum(8, 0); // n311
661
662 // freqInfo
663 SerializeSequence(std::bitset<2>(3), false);
664 SerializeInteger((int)systemInformationBlockType2.freqInfo.ulCarrierFreq, 0, MAX_EARFCN);
665 SerializeEnum(6, BandwidthToEnum(systemInformationBlockType2.freqInfo.ulBandwidth));
666
667 SerializeInteger(29, 1, 32); // additionalSpectrumEmission
668 // timeAlignmentTimerCommon
669 SerializeEnum(8, 0);
670}
671
672void
674{
675 // Watchdog: if list has 0 elements, set boolean to false
676 if (measResults.measResultListEutra.empty())
677 {
678 measResults.haveMeasResultNeighCells = false;
679 }
680
681 std::bitset<4> measResultOptional;
682 measResultOptional.set(3, measResults.haveMeasResultServFreqList);
683 measResultOptional.set(2, false); // LocationInfo-r10
684 measResultOptional.set(1, false); // MeasResultForECID-r9
685 measResultOptional.set(0, measResults.haveMeasResultNeighCells);
686 SerializeSequence(measResultOptional, true);
687
688 // Serialize measId
689 SerializeInteger(measResults.measId, 1, MAX_MEAS_ID);
690
691 // Serialize measResultPCell sequence
692 SerializeSequence(std::bitset<0>(0), false);
693
694 // Serialize rsrpResult
695 SerializeInteger(measResults.measResultPCell.rsrpResult, 0, 97);
696
697 // Serialize rsrqResult
698 SerializeInteger(measResults.measResultPCell.rsrqResult, 0, 34);
699
700 if (measResults.haveMeasResultNeighCells)
701 {
702 // Serialize Choice = 0 (MeasResultListEUTRA)
703 SerializeChoice(4, 0, false);
704
705 // Serialize measResultNeighCells
707
708 // serialize MeasResultEutra elements in the list
709 for (auto it = measResults.measResultListEutra.begin();
710 it != measResults.measResultListEutra.end();
711 it++)
712 {
713 SerializeSequence(std::bitset<1>(it->haveCgiInfo), false);
714
715 // Serialize PhysCellId
716 SerializeInteger(it->physCellId, 0, 503);
717
718 // Serialize CgiInfo
719 if (it->haveCgiInfo)
720 {
721 SerializeSequence(std::bitset<1>(it->cgiInfo.plmnIdentityList.size()), false);
722
723 // Serialize cellGlobalId
724 SerializeSequence(std::bitset<0>(0), false);
725 SerializePlmnIdentity(it->cgiInfo.plmnIdentity);
726 SerializeBitstring(std::bitset<28>(it->cgiInfo.cellIdentity));
727
728 // Serialize trackingAreaCode
729 SerializeBitstring(std::bitset<16>(it->cgiInfo.trackingAreaCode));
730
731 // Serialize plmn-IdentityList
732 if (!it->cgiInfo.plmnIdentityList.empty())
733 {
734 SerializeSequenceOf(it->cgiInfo.plmnIdentityList.size(), 5, 1);
735 for (auto it2 = it->cgiInfo.plmnIdentityList.begin();
736 it2 != it->cgiInfo.plmnIdentityList.end();
737 it2++)
738 {
740 }
741 }
742 }
743
744 // Serialize measResult
745 std::bitset<2> measResultFieldsPresent;
746 measResultFieldsPresent[1] = it->haveRsrpResult;
747 measResultFieldsPresent[0] = it->haveRsrqResult;
748 SerializeSequence(measResultFieldsPresent, true);
749
750 if (it->haveRsrpResult)
751 {
752 SerializeInteger(it->rsrpResult, 0, 97);
753 }
754
755 if (it->haveRsrqResult)
756 {
757 SerializeInteger(it->rsrqResult, 0, 34);
758 }
759 }
760 }
761
762 // measResultServFreqList-r10 serialization
763 if (measResults.haveMeasResultServFreqList)
764 {
765 // Serialize measResultServFreqList-r10
767 // serialize MeasResultServFreqList-r10 elements in the list
768 for (const auto& it : measResults.measResultServFreqList)
769 {
770 // Serialize MeasResultServFreq-r10
771 std::bitset<2> measResultServFreqPresent;
772 measResultServFreqPresent[0] = it.haveMeasResultSCell;
773 measResultServFreqPresent[1] = it.haveMeasResultBestNeighCell;
774 SerializeSequence(measResultServFreqPresent, true);
775
776 // Serialize servFreqId-r10
777 SerializeInteger(it.servFreqId, 0, 7);
778
779 if (it.haveMeasResultSCell)
780 {
781 // Serialize rsrpResultSCell-r10
782 SerializeInteger(it.measResultSCell.rsrpResult, 0, 97);
783
784 // Serialize rsrqResultSCell-r10
785 SerializeInteger(it.measResultSCell.rsrqResult, 0, 34);
786 }
787
788 if (it.haveMeasResultBestNeighCell)
789 {
790 // Serialize physCellId-r10
791 SerializeInteger(it.measResultBestNeighCell.physCellId, 0, 503);
792
793 // Serialize rsrpResultNCell-r10
794 SerializeInteger(it.measResultBestNeighCell.rsrpResult, 0, 97);
795
796 // Serialize rsrqResultNCell-r10
797 SerializeInteger(it.measResultBestNeighCell.rsrqResult, 0, 34);
798 }
799
800 NS_ASSERT(!it.haveMeasResultBestNeighCell); // Not implemented
801 }
802 }
803}
804
805void
807{
808 // plmn-Identity sequence, mcc is optional, no extension marker
809 SerializeSequence(std::bitset<1>(0), false);
810
811 // Serialize mnc
812 int nDig = (plmnId > 99) ? 3 : 2;
813
814 SerializeSequenceOf(nDig, 3, 2);
815 for (int i = nDig - 1; i >= 0; i--)
816 {
817 int n = floor(plmnId / pow(10, i));
818 SerializeInteger(n, 0, 9);
819 plmnId -= n * pow(10, i);
820 }
821
822 // cellReservedForOperatorUse
823 SerializeEnum(2, 0);
824}
825
826void
828{
829 // rach-ConfigCommon
830 SerializeSequence(std::bitset<0>(0), true);
831
832 // preambleInfo
833 SerializeSequence(std::bitset<1>(0), false);
834
835 // numberOfRA-Preambles
836 switch (rachConfigCommon.preambleInfo.numberOfRaPreambles)
837 {
838 case 4:
839 SerializeEnum(16, 0);
840 break;
841 case 8:
842 SerializeEnum(16, 1);
843 break;
844 case 12:
845 SerializeEnum(16, 2);
846 break;
847 case 16:
848 SerializeEnum(16, 3);
849 break;
850 case 20:
851 SerializeEnum(16, 4);
852 break;
853 case 24:
854 SerializeEnum(16, 5);
855 break;
856 case 28:
857 SerializeEnum(16, 6);
858 break;
859 case 32:
860 SerializeEnum(16, 7);
861 break;
862 case 36:
863 SerializeEnum(16, 8);
864 break;
865 case 40:
866 SerializeEnum(16, 9);
867 break;
868 case 44:
869 SerializeEnum(16, 10);
870 break;
871 case 48:
872 SerializeEnum(16, 11);
873 break;
874 case 52:
875 SerializeEnum(16, 12);
876 break;
877 case 56:
878 SerializeEnum(16, 13);
879 break;
880 case 60:
881 SerializeEnum(16, 14);
882 break;
883 case 64:
884 SerializeEnum(16, 15);
885 break;
886 default:
887 NS_FATAL_ERROR("Wrong numberOfRA-Preambles value");
888 }
889
890 SerializeSequence(std::bitset<0>(0), false); // powerRampingParameters
891 SerializeEnum(4, 0); // powerRampingStep
892 SerializeEnum(16, 0); // preambleInitialReceivedTargetPower
893 SerializeSequence(std::bitset<0>(0), false); // ra-SupervisionInfo
894
895 // preambleTransMax
896 switch (rachConfigCommon.raSupervisionInfo.preambleTransMax)
897 {
898 case 3:
899 SerializeEnum(11, 0);
900 break;
901 case 4:
902 SerializeEnum(11, 1);
903 break;
904 case 5:
905 SerializeEnum(11, 2);
906 break;
907 case 6:
908 SerializeEnum(11, 3);
909 break;
910 case 7:
911 SerializeEnum(11, 4);
912 break;
913 case 8:
914 SerializeEnum(11, 5);
915 break;
916 case 10:
917 SerializeEnum(11, 6);
918 break;
919 case 20:
920 SerializeEnum(11, 7);
921 break;
922 case 50:
923 SerializeEnum(11, 8);
924 break;
925 case 100:
926 SerializeEnum(11, 9);
927 break;
928 case 200:
929 SerializeEnum(11, 10);
930 break;
931 default:
932 SerializeEnum(11, 0);
933 }
934
935 // ra-ResponseWindowSize
936 switch (rachConfigCommon.raSupervisionInfo.raResponseWindowSize)
937 {
938 case 2:
939 SerializeEnum(8, 0);
940 break;
941 case 3:
942 SerializeEnum(8, 1);
943 break;
944 case 4:
945 SerializeEnum(8, 2);
946 break;
947 case 5:
948 SerializeEnum(8, 3);
949 break;
950 case 6:
951 SerializeEnum(8, 4);
952 break;
953 case 7:
954 SerializeEnum(8, 5);
955 break;
956 case 8:
957 SerializeEnum(8, 6);
958 break;
959 case 10:
960 SerializeEnum(8, 7);
961 break;
962 default:
963 SerializeEnum(8, 0);
964 }
965
966 SerializeEnum(8, 0); // mac-ContentionResolutionTimer
967 SerializeInteger(1, 1, 8); // maxHARQ-Msg3Tx
968
969 // connEstFailCount
970 switch (rachConfigCommon.txFailParam.connEstFailCount)
971 {
972 case 1:
973 SerializeEnum(8, 1);
974 break;
975 case 2:
976 SerializeEnum(8, 2);
977 break;
978 case 3:
979 SerializeEnum(8, 3);
980 break;
981 case 4:
982 SerializeEnum(8, 4);
983 break;
984 default:
985 SerializeEnum(8, 1);
986 }
987}
988
989void
991{
992 switch (qOffsetRange)
993 {
994 case -24:
995 SerializeEnum(31, 0);
996 break;
997 case -22:
998 SerializeEnum(31, 1);
999 break;
1000 case -20:
1001 SerializeEnum(31, 2);
1002 break;
1003 case -18:
1004 SerializeEnum(31, 3);
1005 break;
1006 case -16:
1007 SerializeEnum(31, 4);
1008 break;
1009 case -14:
1010 SerializeEnum(31, 5);
1011 break;
1012 case -12:
1013 SerializeEnum(31, 6);
1014 break;
1015 case -10:
1016 SerializeEnum(31, 7);
1017 break;
1018 case -8:
1019 SerializeEnum(31, 8);
1020 break;
1021 case -6:
1022 SerializeEnum(31, 9);
1023 break;
1024 case -5:
1025 SerializeEnum(31, 10);
1026 break;
1027 case -4:
1028 SerializeEnum(31, 11);
1029 break;
1030 case -3:
1031 SerializeEnum(31, 12);
1032 break;
1033 case -2:
1034 SerializeEnum(31, 13);
1035 break;
1036 case -1:
1037 SerializeEnum(31, 14);
1038 break;
1039 case 0:
1040 SerializeEnum(31, 15);
1041 break;
1042 case 1:
1043 SerializeEnum(31, 16);
1044 break;
1045 case 2:
1046 SerializeEnum(31, 17);
1047 break;
1048 case 3:
1049 SerializeEnum(31, 18);
1050 break;
1051 case 4:
1052 SerializeEnum(31, 19);
1053 break;
1054 case 5:
1055 SerializeEnum(31, 20);
1056 break;
1057 case 6:
1058 SerializeEnum(31, 21);
1059 break;
1060 case 8:
1061 SerializeEnum(31, 22);
1062 break;
1063 case 10:
1064 SerializeEnum(31, 23);
1065 break;
1066 case 12:
1067 SerializeEnum(31, 24);
1068 break;
1069 case 14:
1070 SerializeEnum(31, 25);
1071 break;
1072 case 16:
1073 SerializeEnum(31, 26);
1074 break;
1075 case 18:
1076 SerializeEnum(31, 27);
1077 break;
1078 case 20:
1079 SerializeEnum(31, 28);
1080 break;
1081 case 22:
1082 SerializeEnum(31, 29);
1083 break;
1084 case 24:
1085 SerializeEnum(31, 30);
1086 break;
1087 default:
1088 SerializeEnum(31, 15);
1089 }
1090}
1091
1092void
1094{
1095 switch (thresholdEutra.choice)
1096 {
1098 SerializeChoice(2, 0, false);
1099 SerializeInteger(thresholdEutra.range, 0, 97);
1100 break;
1102 default:
1103 SerializeChoice(2, 1, false);
1104 SerializeInteger(thresholdEutra.range, 0, 34);
1105 }
1106}
1107
1108void
1110{
1111 // Serialize MeasConfig sequence
1112 // 11 optional fields, extension marker present
1113 std::bitset<11> measConfigOptional;
1114 measConfigOptional.set(10, !measConfig.measObjectToRemoveList.empty());
1115 measConfigOptional.set(9, !measConfig.measObjectToAddModList.empty());
1116 measConfigOptional.set(8, !measConfig.reportConfigToRemoveList.empty());
1117 measConfigOptional.set(7, !measConfig.reportConfigToAddModList.empty());
1118 measConfigOptional.set(6, !measConfig.measIdToRemoveList.empty());
1119 measConfigOptional.set(5, !measConfig.measIdToAddModList.empty());
1120 measConfigOptional.set(4, measConfig.haveQuantityConfig);
1121 measConfigOptional.set(3, measConfig.haveMeasGapConfig);
1122 measConfigOptional.set(2, measConfig.haveSmeasure);
1123 measConfigOptional.set(1, false); // preRegistrationInfoHRPD
1124 measConfigOptional.set(0, measConfig.haveSpeedStatePars);
1125 SerializeSequence(measConfigOptional, true);
1126
1127 if (!measConfig.measObjectToRemoveList.empty())
1128 {
1130 for (auto it = measConfig.measObjectToRemoveList.begin();
1131 it != measConfig.measObjectToRemoveList.end();
1132 it++)
1133 {
1135 }
1136 }
1137
1138 if (!measConfig.measObjectToAddModList.empty())
1139 {
1141 for (auto it = measConfig.measObjectToAddModList.begin();
1142 it != measConfig.measObjectToAddModList.end();
1143 it++)
1144 {
1145 SerializeSequence(std::bitset<0>(), false);
1146 SerializeInteger(it->measObjectId, 1, MAX_OBJECT_ID);
1147 SerializeChoice(4, 0, true); // Select MeasObjectEUTRA
1148
1149 // Serialize measObjectEutra
1150 std::bitset<5> measObjOpts;
1151 measObjOpts.set(4, !it->measObjectEutra.cellsToRemoveList.empty());
1152 measObjOpts.set(3, !it->measObjectEutra.cellsToAddModList.empty());
1153 measObjOpts.set(2, !it->measObjectEutra.blackCellsToRemoveList.empty());
1154 measObjOpts.set(1, !it->measObjectEutra.blackCellsToAddModList.empty());
1155 measObjOpts.set(0, it->measObjectEutra.haveCellForWhichToReportCGI);
1156 SerializeSequence(measObjOpts, true);
1157
1158 // Serialize carrierFreq
1159 SerializeInteger(it->measObjectEutra.carrierFreq, 0, MAX_EARFCN);
1160
1161 // Serialize allowedMeasBandwidth
1162 SerializeEnum(6, BandwidthToEnum(it->measObjectEutra.allowedMeasBandwidth));
1163
1164 SerializeBoolean(it->measObjectEutra.presenceAntennaPort1);
1165 SerializeBitstring(std::bitset<2>(it->measObjectEutra.neighCellConfig));
1166 SerializeQoffsetRange(it->measObjectEutra.offsetFreq);
1167
1168 if (!it->measObjectEutra.cellsToRemoveList.empty())
1169 {
1170 SerializeSequenceOf(it->measObjectEutra.cellsToRemoveList.size(), MAX_CELL_MEAS, 1);
1171 for (auto it2 = it->measObjectEutra.cellsToRemoveList.begin();
1172 it2 != it->measObjectEutra.cellsToRemoveList.end();
1173 it2++)
1174 {
1176 }
1177 }
1178
1179 if (!it->measObjectEutra.cellsToAddModList.empty())
1180 {
1181 SerializeSequenceOf(it->measObjectEutra.cellsToAddModList.size(), MAX_CELL_MEAS, 1);
1182 for (auto it2 = it->measObjectEutra.cellsToAddModList.begin();
1183 it2 != it->measObjectEutra.cellsToAddModList.end();
1184 it2++)
1185 {
1186 SerializeSequence(std::bitset<0>(), false);
1187
1188 // Serialize cellIndex
1189 SerializeInteger(it2->cellIndex, 1, MAX_CELL_MEAS);
1190
1191 // Serialize PhysCellId
1192 SerializeInteger(it2->physCellId, 0, 503);
1193
1194 // Serialize cellIndividualOffset
1195 SerializeQoffsetRange(it2->cellIndividualOffset);
1196 }
1197 }
1198
1199 if (!it->measObjectEutra.blackCellsToRemoveList.empty())
1200 {
1201 SerializeSequenceOf(it->measObjectEutra.blackCellsToRemoveList.size(),
1203 1);
1204 for (auto it2 = it->measObjectEutra.blackCellsToRemoveList.begin();
1205 it2 != it->measObjectEutra.blackCellsToRemoveList.end();
1206 it2++)
1207 {
1209 }
1210 }
1211
1212 if (!it->measObjectEutra.blackCellsToAddModList.empty())
1213 {
1214 SerializeSequenceOf(it->measObjectEutra.blackCellsToAddModList.size(),
1216 1);
1217 for (auto it2 = it->measObjectEutra.blackCellsToAddModList.begin();
1218 it2 != it->measObjectEutra.blackCellsToAddModList.end();
1219 it2++)
1220 {
1221 SerializeSequence(std::bitset<0>(), false);
1222 SerializeInteger(it2->cellIndex, 1, MAX_CELL_MEAS);
1223
1224 // Serialize PhysCellIdRange
1225 // range optional
1226 std::bitset<1> rangePresent(it2->physCellIdRange.haveRange);
1227 SerializeSequence(rangePresent, false);
1228 SerializeInteger(it2->physCellIdRange.start, 0, 503);
1229 if (it2->physCellIdRange.haveRange)
1230 {
1231 switch (it2->physCellIdRange.range)
1232 {
1233 case 4:
1234 SerializeEnum(16, 0);
1235 break;
1236 case 8:
1237 SerializeEnum(16, 1);
1238 break;
1239 case 12:
1240 SerializeEnum(16, 2);
1241 break;
1242 case 16:
1243 SerializeEnum(16, 3);
1244 break;
1245 case 24:
1246 SerializeEnum(16, 4);
1247 break;
1248 case 32:
1249 SerializeEnum(16, 5);
1250 break;
1251 case 48:
1252 SerializeEnum(16, 6);
1253 break;
1254 case 64:
1255 SerializeEnum(16, 7);
1256 break;
1257 case 84:
1258 SerializeEnum(16, 8);
1259 break;
1260 case 96:
1261 SerializeEnum(16, 9);
1262 break;
1263 case 128:
1264 SerializeEnum(16, 10);
1265 break;
1266 case 168:
1267 SerializeEnum(16, 11);
1268 break;
1269 case 252:
1270 SerializeEnum(16, 12);
1271 break;
1272 case 504:
1273 SerializeEnum(16, 13);
1274 break;
1275 default:
1276 SerializeEnum(16, 0);
1277 }
1278 }
1279 }
1280 }
1281
1282 if (it->measObjectEutra.haveCellForWhichToReportCGI)
1283 {
1284 SerializeInteger(it->measObjectEutra.cellForWhichToReportCGI, 0, 503);
1285 }
1286 }
1287 }
1288
1289 if (!measConfig.reportConfigToRemoveList.empty())
1290 {
1292 for (auto it = measConfig.reportConfigToRemoveList.begin();
1293 it != measConfig.reportConfigToRemoveList.end();
1294 it++)
1295 {
1297 }
1298 }
1299
1300 if (!measConfig.reportConfigToAddModList.empty())
1301 {
1303 for (auto it = measConfig.reportConfigToAddModList.begin();
1304 it != measConfig.reportConfigToAddModList.end();
1305 it++)
1306 {
1307 SerializeSequence(std::bitset<0>(), false);
1308 SerializeInteger(it->reportConfigId, 1, MAX_REPORT_CONFIG_ID);
1309 SerializeChoice(2, 0, false); // reportConfigEUTRA
1310
1311 // Serialize ReportConfigEUTRA
1312 SerializeSequence(std::bitset<0>(), true);
1313 switch (it->reportConfigEutra.triggerType)
1314 {
1316 SerializeChoice(2, 1, false);
1317 SerializeSequence(std::bitset<0>(), false);
1318 switch (it->reportConfigEutra.purpose)
1319 {
1321 SerializeEnum(2, 1);
1322 break;
1324 default:
1325 SerializeEnum(2, 0);
1326 }
1327 break;
1329 default:
1330 SerializeChoice(2, 0, false);
1331 SerializeSequence(std::bitset<0>(), false);
1332 switch (it->reportConfigEutra.eventId)
1333 {
1335 SerializeChoice(5, 0, true);
1336 SerializeSequence(std::bitset<0>(), false);
1337 SerializeThresholdEutra(it->reportConfigEutra.threshold1);
1338 break;
1340 SerializeChoice(5, 1, true);
1341 SerializeSequence(std::bitset<0>(), false);
1342 SerializeThresholdEutra(it->reportConfigEutra.threshold1);
1343 break;
1345 SerializeChoice(5, 2, true);
1346 SerializeSequence(std::bitset<0>(), false);
1347 SerializeInteger(it->reportConfigEutra.a3Offset, -30, 30);
1348 SerializeBoolean(it->reportConfigEutra.reportOnLeave);
1349 break;
1351 SerializeChoice(5, 3, true);
1352 SerializeSequence(std::bitset<0>(), false);
1353 SerializeThresholdEutra(it->reportConfigEutra.threshold1);
1354 break;
1356 default:
1357 SerializeChoice(5, 4, true);
1358 SerializeSequence(std::bitset<0>(), false);
1359 SerializeThresholdEutra(it->reportConfigEutra.threshold1);
1360 SerializeThresholdEutra(it->reportConfigEutra.threshold2);
1361 }
1362
1363 SerializeInteger(it->reportConfigEutra.hysteresis, 0, 30);
1364
1365 switch (it->reportConfigEutra.timeToTrigger)
1366 {
1367 case 0:
1368 SerializeEnum(16, 0);
1369 break;
1370 case 40:
1371 SerializeEnum(16, 1);
1372 break;
1373 case 64:
1374 SerializeEnum(16, 2);
1375 break;
1376 case 80:
1377 SerializeEnum(16, 3);
1378 break;
1379 case 100:
1380 SerializeEnum(16, 4);
1381 break;
1382 case 128:
1383 SerializeEnum(16, 5);
1384 break;
1385 case 160:
1386 SerializeEnum(16, 6);
1387 break;
1388 case 256:
1389 SerializeEnum(16, 7);
1390 break;
1391 case 320:
1392 SerializeEnum(16, 8);
1393 break;
1394 case 480:
1395 SerializeEnum(16, 9);
1396 break;
1397 case 512:
1398 SerializeEnum(16, 10);
1399 break;
1400 case 640:
1401 SerializeEnum(16, 11);
1402 break;
1403 case 1024:
1404 SerializeEnum(16, 12);
1405 break;
1406 case 1280:
1407 SerializeEnum(16, 13);
1408 break;
1409 case 2560:
1410 SerializeEnum(16, 14);
1411 break;
1412 case 5120:
1413 default:
1414 SerializeEnum(16, 15);
1415 }
1416 }
1417
1418 // Serialize triggerQuantity
1419 if (it->reportConfigEutra.triggerQuantity == LteRrcSap::ReportConfigEutra::RSRP)
1420 {
1421 SerializeEnum(2, 0);
1422 }
1423 else
1424 {
1425 SerializeEnum(2, 1);
1426 }
1427
1428 // Serialize reportQuantity
1429 if (it->reportConfigEutra.reportQuantity ==
1431 {
1432 SerializeEnum(2, 0);
1433 }
1434 else
1435 {
1436 SerializeEnum(2, 1);
1437 }
1438
1439 // Serialize maxReportCells
1440 SerializeInteger(it->reportConfigEutra.maxReportCells, 1, MAX_CELL_REPORT);
1441
1442 // Serialize reportInterval
1443 switch (it->reportConfigEutra.reportInterval)
1444 {
1446 SerializeEnum(16, 0);
1447 break;
1449 SerializeEnum(16, 1);
1450 break;
1452 SerializeEnum(16, 2);
1453 break;
1455 SerializeEnum(16, 3);
1456 break;
1458 SerializeEnum(16, 4);
1459 break;
1461 SerializeEnum(16, 5);
1462 break;
1464 SerializeEnum(16, 6);
1465 break;
1467 SerializeEnum(16, 7);
1468 break;
1470 SerializeEnum(16, 8);
1471 break;
1473 SerializeEnum(16, 9);
1474 break;
1476 SerializeEnum(16, 10);
1477 break;
1479 SerializeEnum(16, 11);
1480 break;
1482 SerializeEnum(16, 12);
1483 break;
1485 SerializeEnum(16, 13);
1486 break;
1488 SerializeEnum(16, 14);
1489 break;
1491 default:
1492 SerializeEnum(16, 15);
1493 }
1494
1495 // Serialize reportAmount
1496 switch (it->reportConfigEutra.reportAmount)
1497 {
1498 case 1:
1499 SerializeEnum(8, 0);
1500 break;
1501 case 2:
1502 SerializeEnum(8, 1);
1503 break;
1504 case 4:
1505 SerializeEnum(8, 2);
1506 break;
1507 case 8:
1508 SerializeEnum(8, 3);
1509 break;
1510 case 16:
1511 SerializeEnum(8, 4);
1512 break;
1513 case 32:
1514 SerializeEnum(8, 5);
1515 break;
1516 case 64:
1517 SerializeEnum(8, 6);
1518 break;
1519 default:
1520 SerializeEnum(8, 7);
1521 }
1522 }
1523 }
1524
1525 if (!measConfig.measIdToRemoveList.empty())
1526 {
1527 SerializeSequenceOf(measConfig.measIdToRemoveList.size(), MAX_MEAS_ID, 1);
1528 for (auto it = measConfig.measIdToRemoveList.begin();
1529 it != measConfig.measIdToRemoveList.end();
1530 it++)
1531 {
1533 }
1534 }
1535
1536 if (!measConfig.measIdToAddModList.empty())
1537 {
1538 SerializeSequenceOf(measConfig.measIdToAddModList.size(), MAX_MEAS_ID, 1);
1539 for (auto it = measConfig.measIdToAddModList.begin();
1540 it != measConfig.measIdToAddModList.end();
1541 it++)
1542 {
1543 SerializeInteger(it->measId, 1, MAX_MEAS_ID);
1544 SerializeInteger(it->measObjectId, 1, MAX_OBJECT_ID);
1545 SerializeInteger(it->reportConfigId, 1, MAX_REPORT_CONFIG_ID);
1546 }
1547 }
1548
1549 if (measConfig.haveQuantityConfig)
1550 {
1551 // QuantityConfig sequence
1552 // 4 optional fields, only first (EUTRA) present. Extension marker yes.
1553 std::bitset<4> quantityConfigOpts(0);
1554 quantityConfigOpts.set(3, true);
1555 SerializeSequence(quantityConfigOpts, true);
1556 SerializeSequence(std::bitset<0>(), false);
1557
1558 switch (measConfig.quantityConfig.filterCoefficientRSRP)
1559 {
1560 case 0:
1561 SerializeEnum(16, 0);
1562 break;
1563 case 1:
1564 SerializeEnum(16, 1);
1565 break;
1566 case 2:
1567 SerializeEnum(16, 2);
1568 break;
1569 case 3:
1570 SerializeEnum(16, 3);
1571 break;
1572 case 4:
1573 SerializeEnum(16, 4);
1574 break;
1575 case 5:
1576 SerializeEnum(16, 5);
1577 break;
1578 case 6:
1579 SerializeEnum(16, 6);
1580 break;
1581 case 7:
1582 SerializeEnum(16, 7);
1583 break;
1584 case 8:
1585 SerializeEnum(16, 8);
1586 break;
1587 case 9:
1588 SerializeEnum(16, 9);
1589 break;
1590 case 11:
1591 SerializeEnum(16, 10);
1592 break;
1593 case 13:
1594 SerializeEnum(16, 11);
1595 break;
1596 case 15:
1597 SerializeEnum(16, 12);
1598 break;
1599 case 17:
1600 SerializeEnum(16, 13);
1601 break;
1602 case 19:
1603 SerializeEnum(16, 14);
1604 break;
1605 default:
1606 SerializeEnum(16, 4);
1607 }
1608
1609 switch (measConfig.quantityConfig.filterCoefficientRSRQ)
1610 {
1611 case 0:
1612 SerializeEnum(16, 0);
1613 break;
1614 case 1:
1615 SerializeEnum(16, 1);
1616 break;
1617 case 2:
1618 SerializeEnum(16, 2);
1619 break;
1620 case 3:
1621 SerializeEnum(16, 3);
1622 break;
1623 case 4:
1624 SerializeEnum(16, 4);
1625 break;
1626 case 5:
1627 SerializeEnum(16, 5);
1628 break;
1629 case 6:
1630 SerializeEnum(16, 6);
1631 break;
1632 case 7:
1633 SerializeEnum(16, 7);
1634 break;
1635 case 8:
1636 SerializeEnum(16, 8);
1637 break;
1638 case 9:
1639 SerializeEnum(16, 9);
1640 break;
1641 case 11:
1642 SerializeEnum(16, 10);
1643 break;
1644 case 13:
1645 SerializeEnum(16, 11);
1646 break;
1647 case 15:
1648 SerializeEnum(16, 12);
1649 break;
1650 case 17:
1651 SerializeEnum(16, 13);
1652 break;
1653 case 19:
1654 SerializeEnum(16, 14);
1655 break;
1656 default:
1657 SerializeEnum(16, 4);
1658 }
1659 }
1660
1661 if (measConfig.haveMeasGapConfig)
1662 {
1663 switch (measConfig.measGapConfig.type)
1664 {
1666 SerializeChoice(2, 0, false);
1667 SerializeNull();
1668 break;
1670 default:
1671 SerializeChoice(2, 1, false);
1672 SerializeSequence(std::bitset<0>(), false);
1673 switch (measConfig.measGapConfig.gapOffsetChoice)
1674 {
1676 SerializeChoice(2, 0, true);
1678 break;
1680 default:
1681 SerializeChoice(2, 1, true);
1683 }
1684 }
1685 }
1686
1687 if (measConfig.haveSmeasure)
1688 {
1689 SerializeInteger(measConfig.sMeasure, 0, 97);
1690 }
1691
1692 // ...Here preRegistrationInfoHRPD would be serialized
1693
1694 if (measConfig.haveSpeedStatePars)
1695 {
1696 switch (measConfig.speedStatePars.type)
1697 {
1699 SerializeChoice(2, 0, false);
1700 SerializeNull();
1701 break;
1703 default:
1704 SerializeChoice(2, 1, false);
1705 SerializeSequence(std::bitset<0>(), false);
1707 {
1708 case 30:
1709 SerializeEnum(8, 0);
1710 break;
1711 case 60:
1712 SerializeEnum(8, 1);
1713 break;
1714 case 120:
1715 SerializeEnum(8, 2);
1716 break;
1717 case 180:
1718 SerializeEnum(8, 3);
1719 break;
1720 case 240:
1721 SerializeEnum(8, 4);
1722 break;
1723 default:
1724 SerializeEnum(8, 5);
1725 break;
1726 }
1727
1729 {
1730 case 30:
1731 SerializeEnum(8, 0);
1732 break;
1733 case 60:
1734 SerializeEnum(8, 1);
1735 break;
1736 case 120:
1737 SerializeEnum(8, 2);
1738 break;
1739 case 180:
1740 SerializeEnum(8, 3);
1741 break;
1742 case 240:
1743 SerializeEnum(8, 4);
1744 break;
1745 default:
1746 SerializeEnum(8, 5);
1747 break;
1748 }
1749
1751 1,
1752 16);
1754 1,
1755 16);
1756
1757 SerializeSequence(std::bitset<0>(), false);
1758 switch (measConfig.speedStatePars.timeToTriggerSf.sfMedium)
1759 {
1760 case 25:
1761 SerializeEnum(4, 0);
1762 break;
1763 case 50:
1764 SerializeEnum(4, 1);
1765 break;
1766 case 75:
1767 SerializeEnum(4, 2);
1768 break;
1769 case 100:
1770 default:
1771 SerializeEnum(4, 3);
1772 }
1773
1774 switch (measConfig.speedStatePars.timeToTriggerSf.sfHigh)
1775 {
1776 case 25:
1777 SerializeEnum(4, 0);
1778 break;
1779 case 50:
1780 SerializeEnum(4, 1);
1781 break;
1782 case 75:
1783 SerializeEnum(4, 2);
1784 break;
1785 case 100:
1786 default:
1787 SerializeEnum(4, 3);
1788 }
1789 }
1790 }
1791}
1792
1793void
1795 LteRrcSap::NonCriticalExtensionConfiguration nonCriticalExtension) const
1796{
1797 // 3 optional fields. Extension marker not present.
1798 std::bitset<3> noncriticalExtension_v1020;
1799 noncriticalExtension_v1020.set(
1800 2,
1801 !nonCriticalExtension.sCellToReleaseList.empty()); // sCellToReleaseList-r10
1802 noncriticalExtension_v1020.set(
1803 1,
1804 !nonCriticalExtension.sCellToAddModList.empty()); // sCellToAddModList-r10
1805 noncriticalExtension_v1020.set(
1806 0,
1807 false); // No nonCriticalExtension RRCConnectionReconfiguration-v1130-IEs
1808 SerializeSequence(noncriticalExtension_v1020, false);
1809
1810 if (!nonCriticalExtension.sCellToReleaseList.empty())
1811 {
1812 SerializeSequenceOf(nonCriticalExtension.sCellToReleaseList.size(), MAX_OBJECT_ID, 1);
1813 for (uint8_t sCellIndex : nonCriticalExtension.sCellToReleaseList)
1814 {
1815 SerializeInteger(sCellIndex, 1, 7); // sCellIndex-r10
1816 }
1817 }
1818
1819 if (!nonCriticalExtension.sCellToAddModList.empty())
1820 {
1821 SerializeSequenceOf(nonCriticalExtension.sCellToAddModList.size(), MAX_OBJECT_ID, 1);
1822 for (auto& it : nonCriticalExtension.sCellToAddModList)
1823 {
1824 std::bitset<4> sCellToAddMod_r10;
1825 sCellToAddMod_r10.set(3, true); // sCellIndex
1826 sCellToAddMod_r10.set(2, true); // CellIdentification
1827 sCellToAddMod_r10.set(1, true); // RadioResourceConfigCommonSCell
1828 sCellToAddMod_r10.set(
1829 0,
1830 it.haveRadioResourceConfigDedicatedSCell); // No nonCriticalExtension RRC
1831 SerializeSequence(sCellToAddMod_r10, false);
1832 SerializeInteger(it.sCellIndex, 1, 7); // sCellIndex-r10
1833
1834 // Serialize CellIdentification
1835 std::bitset<2> cellIdentification_r10;
1836 cellIdentification_r10.set(1, true); // phyCellId-r10
1837 cellIdentification_r10.set(0, true); // dl-CarrierFreq-r10
1838 SerializeSequence(cellIdentification_r10, false);
1839
1840 SerializeInteger(it.cellIdentification.physCellId, 1, 65536);
1841 SerializeInteger(it.cellIdentification.dlCarrierFreq, 1, MAX_EARFCN);
1842
1843 // Serialize RadioResourceConfigCommonSCell
1844 SerializeRadioResourceConfigCommonSCell(it.radioResourceConfigCommonSCell);
1845
1846 if (it.haveRadioResourceConfigDedicatedSCell)
1847 {
1848 // Serialize RadioResourceConfigDedicatedSCell
1849 SerializeRadioResourceDedicatedSCell(it.radioResourceConfigDedicatedSCell);
1850 }
1851 }
1852 }
1853}
1854
1855void
1858{
1859 // 2 optional fields. Extension marker not present.
1860 std::bitset<2> radioResourceConfigCommonSCell_r10;
1861 radioResourceConfigCommonSCell_r10.set(1, rrccsc.haveNonUlConfiguration); // NonUlConfiguration
1862 radioResourceConfigCommonSCell_r10.set(0, rrccsc.haveUlConfiguration); // UlConfiguration
1863 SerializeSequence(radioResourceConfigCommonSCell_r10, false);
1864
1865 if (rrccsc.haveNonUlConfiguration)
1866 {
1867 // 5 optional fields. Extension marker not present.
1868 std::bitset<5> nonUlConfiguration_r10;
1869 nonUlConfiguration_r10.set(4, true); // Dl- bandwidth --> convert in enum
1870 nonUlConfiguration_r10.set(3, true); // AntennaInfoCommon-r10
1871 nonUlConfiguration_r10.set(2, false); // phich-Config-r10 Not Implemented
1872 nonUlConfiguration_r10.set(1, true); // pdschConfigCommon
1873 nonUlConfiguration_r10.set(0, false); // Tdd-Config-r10 Not Implemented
1874 SerializeSequence(nonUlConfiguration_r10, false);
1875
1877
1878 std::bitset<1> antennaInfoCommon_r10;
1879 antennaInfoCommon_r10.set(0, true);
1880 SerializeSequence(antennaInfoCommon_r10, false);
1882
1883 std::bitset<2> pdschConfigCommon_r10;
1884 pdschConfigCommon_r10.set(1, true);
1885 pdschConfigCommon_r10.set(0, true);
1886 SerializeSequence(pdschConfigCommon_r10, false);
1887
1890 }
1891 if (rrccsc.haveUlConfiguration)
1892 {
1893 // Serialize Ul Configuration
1894 // 7 optional fields. Extension marker present.
1895 std::bitset<7> UlConfiguration_r10;
1896 UlConfiguration_r10.set(6, true); // ul-Configuration-r10
1897 UlConfiguration_r10.set(5, false); // p-Max-r10 Not Implemented
1898 UlConfiguration_r10.set(4, true); // uplinkPowerControlCommonSCell-r10
1899 UlConfiguration_r10.set(3, false); // soundingRS-UL-ConfigCommon-r10
1900 UlConfiguration_r10.set(2, false); // ul-CyclicPrefixLength-r10
1901 UlConfiguration_r10.set(1, true); // prach-ConfigSCell-r10
1902 UlConfiguration_r10.set(0, false); // pusch-ConfigCommon-r10 Not Implemented
1903 SerializeSequence(UlConfiguration_r10, true);
1904
1905 // Serialize ulFreqInfo
1906 std::bitset<3> FreqInfo_r10;
1907 FreqInfo_r10.set(2, true); // ulCarrierFreq
1908 FreqInfo_r10.set(1, true); // UlBandwidth
1909 FreqInfo_r10.set(0, false); // additionalSpectrumEmissionSCell-r10 Not Implemented
1910 SerializeSequence(FreqInfo_r10, false);
1911
1914
1915 // Serialize UlPowerControlCommonSCell
1916 std::bitset<2> UlPowerControlCommonSCell_r10;
1917 UlPowerControlCommonSCell_r10.set(1, false); // p0-NominalPUSCH-r10 Not Implemented
1918 UlPowerControlCommonSCell_r10.set(0, true); // alpha
1919 SerializeSequence(UlPowerControlCommonSCell_r10, false);
1920
1922
1923 // Serialize soundingRs-UlConfigCommon
1924 // Not Implemented
1925
1926 // Serialize PrachConfigSCell
1927 std::bitset<1> prachConfigSCell_r10;
1928 prachConfigSCell_r10.set(0, true);
1929 SerializeSequence(prachConfigSCell_r10, false);
1931 }
1932}
1933
1934void
1937{
1938 // Serialize RadioResourceConfigDedicatedSCell
1939 std::bitset<1> RadioResourceConfigDedicatedSCell_r10;
1940 RadioResourceConfigDedicatedSCell_r10.set(0, true);
1941 SerializeSequence(RadioResourceConfigDedicatedSCell_r10, false);
1942
1945}
1946
1947void
1950{
1951 std::bitset<2> pcdscOpt;
1952 pcdscOpt.set(1, pcdsc.haveNonUlConfiguration);
1953 pcdscOpt.set(0, pcdsc.haveUlConfiguration);
1954 SerializeSequence(pcdscOpt, true);
1955
1956 if (pcdsc.haveNonUlConfiguration)
1957 {
1958 // Serialize NonUl configuration
1959 std::bitset<4> nulOpt;
1960 nulOpt.set(3, pcdsc.haveAntennaInfoDedicated);
1961 nulOpt.set(2, false); // crossCarrierSchedulingConfig-r10 Not Implemented
1962 nulOpt.set(1, false); // csi-RS-Config-r10 Not Implemented
1963 nulOpt.set(0, pcdsc.havePdschConfigDedicated); // pdsch-ConfigDedicated-r10
1964 SerializeSequence(nulOpt, false);
1965
1966 if (pcdsc.haveAntennaInfoDedicated)
1967 {
1968 // Serialize antennaInfo choice
1969 // 2 options. Selected: 0 ("explicitValue" of type "AntennaInfoDedicated")
1970 SerializeChoice(2, 0, false);
1971
1972 // Serialize AntennaInfoDedicated sequence
1973 // 1 optional parameter, not present. No extension marker.
1974 SerializeSequence(std::bitset<1>(0), false);
1975
1976 // Serialize transmissionMode
1977 // Assuming the value in the struct is the enum index
1979
1980 // Serialize ue-TransmitAntennaSelection choice
1981 SerializeChoice(2, 0, false);
1982
1983 // Serialize release
1984 SerializeNull();
1985 }
1986 if (pcdsc.havePdschConfigDedicated)
1987 {
1988 // Serialize Pdsch-ConfigDedicated Sequence:
1989 // 0 optional / default fields, no extension marker.
1990 SerializeSequence(std::bitset<0>(), false);
1991
1992 // Serialize p-a
1993 // Assuming the value in the struct is the enum index
1995
1996 // Serialize release
1997 SerializeNull();
1998 }
1999 }
2000 if (pcdsc.haveUlConfiguration)
2001 {
2002 // Serialize Ul Configuration
2003 std::bitset<7> ulOpt;
2004 ulOpt.set(6, pcdsc.haveAntennaInfoUlDedicated); // antennaInfoUL-r10
2005 ulOpt.set(5, false); // pusch-ConfigDedicatedSCell-r10 not present
2006 ulOpt.set(4, false); // uplinkPowerControlDedicatedSCell-r10 not present
2007 ulOpt.set(3, false); // cqi-ReportConfigSCell-r10 not present
2008 ulOpt.set(2, pcdsc.haveSoundingRsUlConfigDedicated); // soundingRS-UL-ConfigDedicated-r10
2009 ulOpt.set(1, false); // soundingRS-UL-ConfigDedicated-v1020 not present
2010 ulOpt.set(0, false); // soundingRS-UL-ConfigDedicatedAperiodic-r10 not present
2011 SerializeSequence(ulOpt, false);
2012
2014 {
2015 // Serialize antennaInfo choice
2016 // 2 options. Selected: 0 ("explicitValue" of type "AntennaInfoDedicated")
2017 SerializeChoice(2, 0, false);
2018
2019 // Serialize AntennaInfoDedicated sequence
2020 // 1 optional parameter, not present. No extension marker.
2021 SerializeSequence(std::bitset<1>(0), false);
2022
2023 // Serialize transmissionMode
2024 // Assuming the value in the struct is the enum index
2026
2027 // Serialize ue-TransmitAntennaSelection choice
2028 SerializeChoice(2, 0, false);
2029
2030 // Serialize release
2031 SerializeNull();
2032 }
2034 {
2035 // Serialize SoundingRS-UL-ConfigDedicated choice:
2036 switch (pcdsc.soundingRsUlConfigDedicated.type)
2037 {
2039 SerializeChoice(2, 0, false);
2040 SerializeNull();
2041 break;
2042
2044 default:
2045 // 2 options, selected: 1 (setup)
2046 SerializeChoice(2, 1, false);
2047
2048 // Serialize setup sequence
2049 // 0 optional / default fields, no extension marker.
2050 SerializeSequence(std::bitset<0>(), false);
2051
2052 // Serialize srs-Bandwidth
2054
2055 // Serialize srs-HoppingBandwidth
2056 SerializeEnum(4, 0);
2057
2058 // Serialize freqDomainPosition
2059 SerializeInteger(0, 0, 23);
2060
2061 // Serialize duration
2062 SerializeBoolean(false);
2063
2064 // Serialize srs-ConfigIndex
2066
2067 // Serialize transmissionComb
2068 SerializeInteger(0, 0, 1);
2069
2070 // Serialize cyclicShift
2071 SerializeEnum(8, 0);
2072
2073 break;
2074 }
2075 }
2076 }
2077}
2078
2081 Buffer::Iterator bIterator)
2082{
2083 int thresholdEutraChoice;
2084 int range;
2085 bIterator = DeserializeChoice(2, false, &thresholdEutraChoice, bIterator);
2086
2087 switch (thresholdEutraChoice)
2088 {
2089 case 0:
2091 bIterator = DeserializeInteger(&range, 0, 97, bIterator);
2092 thresholdEutra->range = range;
2093 break;
2094 case 1:
2095 default:
2097 bIterator = DeserializeInteger(&range, 0, 34, bIterator);
2098 thresholdEutra->range = range;
2099 }
2100
2101 return bIterator;
2102}
2103
2106{
2107 int n;
2108 bIterator = DeserializeEnum(31, &n, bIterator);
2109 switch (n)
2110 {
2111 case 0:
2112 *qOffsetRange = -24;
2113 break;
2114 case 1:
2115 *qOffsetRange = -22;
2116 break;
2117 case 2:
2118 *qOffsetRange = -20;
2119 break;
2120 case 3:
2121 *qOffsetRange = -18;
2122 break;
2123 case 4:
2124 *qOffsetRange = -16;
2125 break;
2126 case 5:
2127 *qOffsetRange = -14;
2128 break;
2129 case 6:
2130 *qOffsetRange = -12;
2131 break;
2132 case 7:
2133 *qOffsetRange = -10;
2134 break;
2135 case 8:
2136 *qOffsetRange = -8;
2137 break;
2138 case 9:
2139 *qOffsetRange = -6;
2140 break;
2141 case 10:
2142 *qOffsetRange = -5;
2143 break;
2144 case 11:
2145 *qOffsetRange = -4;
2146 break;
2147 case 12:
2148 *qOffsetRange = -3;
2149 break;
2150 case 13:
2151 *qOffsetRange = -2;
2152 break;
2153 case 14:
2154 *qOffsetRange = -1;
2155 break;
2156 case 15:
2157 *qOffsetRange = 0;
2158 break;
2159 case 16:
2160 *qOffsetRange = 1;
2161 break;
2162 case 17:
2163 *qOffsetRange = 2;
2164 break;
2165 case 18:
2166 *qOffsetRange = 3;
2167 break;
2168 case 19:
2169 *qOffsetRange = 4;
2170 break;
2171 case 20:
2172 *qOffsetRange = 5;
2173 break;
2174 case 21:
2175 *qOffsetRange = 6;
2176 break;
2177 case 22:
2178 *qOffsetRange = 8;
2179 break;
2180 case 23:
2181 *qOffsetRange = 10;
2182 break;
2183 case 24:
2184 *qOffsetRange = 12;
2185 break;
2186 case 25:
2187 *qOffsetRange = 14;
2188 break;
2189 case 26:
2190 *qOffsetRange = 16;
2191 break;
2192 case 27:
2193 *qOffsetRange = 18;
2194 break;
2195 case 28:
2196 *qOffsetRange = 20;
2197 break;
2198 case 29:
2199 *qOffsetRange = 22;
2200 break;
2201 case 30:
2202 default:
2203 *qOffsetRange = 24;
2204 }
2205 return bIterator;
2206}
2207
2210 LteRrcSap::RadioResourceConfigDedicated* radioResourceConfigDedicated,
2211 Buffer::Iterator bIterator)
2212{
2213 // Deserialize RadioResourceConfigDedicated sequence
2214 std::bitset<6> optionalFieldsPresent = std::bitset<6>();
2215 bIterator = DeserializeSequence(&optionalFieldsPresent, true, bIterator);
2216
2217 if (optionalFieldsPresent[5])
2218 {
2219 // Deserialize srb-ToAddModList
2220 bIterator =
2221 DeserializeSrbToAddModList(&(radioResourceConfigDedicated->srbToAddModList), bIterator);
2222 }
2223
2224 if (optionalFieldsPresent[4])
2225 {
2226 // Deserialize drb-ToAddModList
2227 bIterator =
2228 DeserializeDrbToAddModList(&(radioResourceConfigDedicated->drbToAddModList), bIterator);
2229 }
2230
2231 if (optionalFieldsPresent[3])
2232 {
2233 // Deserialize drb-ToReleaseList
2234 int n;
2235 int val;
2236 bIterator = DeserializeSequenceOf(&n, MAX_DRB, 1, bIterator);
2237 for (int i = 0; i < n; i++)
2238 {
2239 bIterator = DeserializeInteger(&val, 1, 32, bIterator);
2240 radioResourceConfigDedicated->drbToReleaseList.push_back(val);
2241 }
2242 }
2243
2244 if (optionalFieldsPresent[2])
2245 {
2246 // Deserialize mac-MainConfig
2247 // ...
2248 }
2249
2250 if (optionalFieldsPresent[1])
2251 {
2252 // Deserialize sps-Config
2253 // ...
2254 }
2255
2256 radioResourceConfigDedicated->havePhysicalConfigDedicated = optionalFieldsPresent[0];
2257 if (optionalFieldsPresent[0])
2258 {
2259 // Deserialize physicalConfigDedicated
2261 &radioResourceConfigDedicated->physicalConfigDedicated,
2262 bIterator);
2263 }
2264
2265 return bIterator;
2266}
2267
2269RrcAsn1Header::DeserializeSrbToAddModList(std::list<LteRrcSap::SrbToAddMod>* srbToAddModList,
2270 Buffer::Iterator bIterator)
2271{
2272 int numElems;
2273 bIterator = DeserializeSequenceOf(&numElems, 2, 1, bIterator);
2274
2275 srbToAddModList->clear();
2276
2277 // Deserialize SRB-ToAddMod elements
2278 for (int i = 0; i < numElems; i++)
2279 {
2280 LteRrcSap::SrbToAddMod srbToAddMod;
2281 // Deserialize SRB-ToAddMod sequence
2282 // 2 optional fields, extension marker present
2283 std::bitset<2> optionalFields;
2284 bIterator = DeserializeSequence(&optionalFields, true, bIterator);
2285
2286 // Deserialize srbIdentity
2287 int n;
2288 bIterator = DeserializeInteger(&n, 1, 2, bIterator);
2289 srbToAddMod.srbIdentity = n;
2290
2291 if (optionalFields[1])
2292 {
2293 // Deserialize rlcConfig choice
2294 // ...
2295 }
2296
2297 if (optionalFields[0])
2298 {
2299 // Deserialize logicalChannelConfig choice
2300 int sel;
2301 bIterator = DeserializeChoice(2, false, &sel, bIterator);
2302
2303 // Deserialize logicalChannelConfig defaultValue
2304 if (sel == 1)
2305 {
2306 bIterator = DeserializeNull(bIterator);
2307 }
2308
2309 // Deserialize logicalChannelConfig explicitValue
2310 else if (sel == 0)
2311 {
2312 bIterator =
2314 }
2315 }
2316 srbToAddModList->insert(srbToAddModList->end(), srbToAddMod);
2317 }
2318
2319 return bIterator;
2320}
2321
2323RrcAsn1Header::DeserializeDrbToAddModList(std::list<LteRrcSap::DrbToAddMod>* drbToAddModList,
2324 Buffer::Iterator bIterator)
2325{
2326 int n;
2327 int val;
2328 bIterator = DeserializeSequenceOf(&n, MAX_DRB, 1, bIterator);
2329
2330 drbToAddModList->clear();
2331
2332 for (int i = 0; i < n; i++)
2333 {
2334 LteRrcSap::DrbToAddMod drbToAddMod;
2335
2336 std::bitset<5> optionalFields;
2337 bIterator = DeserializeSequence(&optionalFields, true, bIterator);
2338
2339 if (optionalFields[4])
2340 {
2341 // Deserialize epsBearerIdentity
2342 bIterator = DeserializeInteger(&val, 0, 15, bIterator);
2343 drbToAddMod.epsBearerIdentity = val;
2344 }
2345
2346 bIterator = DeserializeInteger(&val, 1, 32, bIterator);
2347 drbToAddMod.drbIdentity = val;
2348
2349 if (optionalFields[3])
2350 {
2351 // Deserialize pdcp-Config
2352 // ...
2353 }
2354
2355 if (optionalFields[2])
2356 {
2357 // Deserialize RLC-Config
2358 int chosen;
2359 bIterator = DeserializeChoice(4, true, &chosen, bIterator);
2360
2361 int sel;
2362 std::bitset<0> bitset0;
2363 switch (chosen)
2364 {
2365 case 0:
2367
2368 // Deserialize UL-AM-RLC
2369 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2370 bIterator = DeserializeEnum(64, &sel, bIterator); // t-PollRetransmit
2371 bIterator = DeserializeEnum(8, &sel, bIterator); // pollPDU
2372 bIterator = DeserializeEnum(16, &sel, bIterator); // pollByte
2373 bIterator = DeserializeEnum(8, &sel, bIterator); // maxRetxThreshold
2374
2375 // Deserialize DL-AM-RLC
2376 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2377 bIterator = DeserializeEnum(32, &sel, bIterator); // t-Reordering
2378 bIterator = DeserializeEnum(64, &sel, bIterator); // t-StatusProhibit
2379 break;
2380
2381 case 1:
2383
2384 // Deserialize UL-UM-RLC
2385 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2386 bIterator = DeserializeEnum(2, &sel, bIterator); // sn-FieldLength
2387
2388 // Deserialize DL-UM-RLC
2389 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2390 bIterator = DeserializeEnum(2, &sel, bIterator); // sn-FieldLength
2391 bIterator = DeserializeEnum(32, &sel, bIterator); // t-Reordering
2392 break;
2393
2394 case 2:
2396
2397 // Deserialize UL-UM-RLC
2398 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2399 bIterator = DeserializeEnum(2, &sel, bIterator); // sn-FieldLength
2400 break;
2401
2402 case 3:
2404
2405 // Deserialize DL-UM-RLC
2406 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2407 bIterator = DeserializeEnum(2, &sel, bIterator); // sn-FieldLength
2408 bIterator = DeserializeEnum(32, &sel, bIterator); // t-Reordering
2409 break;
2410 }
2411 }
2412
2413 if (optionalFields[1])
2414 {
2415 bIterator = DeserializeInteger(&val, 3, 10, bIterator);
2416 drbToAddMod.logicalChannelIdentity = val;
2417 }
2418
2419 if (optionalFields[0])
2420 {
2421 bIterator =
2423 }
2424
2425 drbToAddModList->insert(drbToAddModList->end(), drbToAddMod);
2426 }
2427 return bIterator;
2428}
2429
2432 LteRrcSap::LogicalChannelConfig* logicalChannelConfig,
2433 Buffer::Iterator bIterator)
2434{
2435 int n;
2436
2437 // Deserialize LogicalChannelConfig sequence
2438 // 1 optional field, extension marker is present.
2439 std::bitset<1> bitset1;
2440 bIterator = DeserializeSequence(&bitset1, true, bIterator);
2441
2442 if (bitset1[0])
2443 {
2444 // Deserialize ul-SpecificParameters sequence
2445 bIterator = DeserializeSequence(&bitset1, false, bIterator);
2446
2447 // Deserialize priority
2448 bIterator = DeserializeInteger(&n, 1, 16, bIterator);
2449 logicalChannelConfig->priority = n;
2450
2451 // Deserialize prioritisedBitRate
2452 bIterator = DeserializeEnum(16, &n, bIterator);
2453 uint16_t prioritizedBitRateKbps;
2454
2455 switch (n)
2456 {
2457 case 0:
2458 prioritizedBitRateKbps = 0;
2459 break;
2460 case 1:
2461 prioritizedBitRateKbps = 8;
2462 break;
2463 case 2:
2464 prioritizedBitRateKbps = 16;
2465 break;
2466 case 3:
2467 prioritizedBitRateKbps = 32;
2468 break;
2469 case 4:
2470 prioritizedBitRateKbps = 64;
2471 break;
2472 case 5:
2473 prioritizedBitRateKbps = 128;
2474 break;
2475 case 6:
2476 prioritizedBitRateKbps = 256;
2477 break;
2478 case 7:
2479 prioritizedBitRateKbps = 10000;
2480 break;
2481 default:
2482 prioritizedBitRateKbps = 10000;
2483 }
2484 logicalChannelConfig->prioritizedBitRateKbps = prioritizedBitRateKbps;
2485
2486 // Deserialize bucketSizeDuration
2487 bIterator = DeserializeEnum(8, &n, bIterator);
2488 uint16_t bucketSizeDurationMs;
2489 switch (n)
2490 {
2491 case 0:
2492 bucketSizeDurationMs = 50;
2493 break;
2494 case 1:
2495 bucketSizeDurationMs = 100;
2496 break;
2497 case 2:
2498 bucketSizeDurationMs = 150;
2499 break;
2500 case 3:
2501 bucketSizeDurationMs = 300;
2502 break;
2503 case 4:
2504 bucketSizeDurationMs = 500;
2505 break;
2506 case 5:
2507 bucketSizeDurationMs = 1000;
2508 break;
2509 default:
2510 bucketSizeDurationMs = 1000;
2511 }
2512 logicalChannelConfig->bucketSizeDurationMs = bucketSizeDurationMs;
2513
2514 if (bitset1[0])
2515 {
2516 // Deserialize logicalChannelGroup
2517 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
2518 logicalChannelConfig->logicalChannelGroup = n;
2519 }
2520 }
2521 return bIterator;
2522}
2523
2526 LteRrcSap::PhysicalConfigDedicated* physicalConfigDedicated,
2527 Buffer::Iterator bIterator)
2528{
2529 std::bitset<10> optionalFieldPresent;
2530 bIterator = DeserializeSequence(&optionalFieldPresent, true, bIterator);
2531
2532 physicalConfigDedicated->havePdschConfigDedicated = optionalFieldPresent[9];
2533 if (optionalFieldPresent[9])
2534 {
2535 // Deserialize pdsch-ConfigDedicated
2536 std::bitset<0> bitset0;
2537 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2538
2539 int slct;
2540
2541 // Deserialize p-a
2542 bIterator = DeserializeEnum(8, &slct, bIterator);
2543 physicalConfigDedicated->pdschConfigDedicated.pa = slct;
2544
2545 bIterator = DeserializeNull(bIterator);
2546 }
2547 if (optionalFieldPresent[8])
2548 {
2549 // Deserialize pucch-ConfigDedicated
2550 // ...
2551 }
2552 if (optionalFieldPresent[7])
2553 {
2554 // Deserialize pusch-ConfigDedicated
2555 // ...
2556 }
2557 if (optionalFieldPresent[6])
2558 {
2559 // Deserialize uplinkPowerControlDedicated
2560 // ...
2561 }
2562 if (optionalFieldPresent[5])
2563 {
2564 // Deserialize tpc-PDCCH-ConfigPUCCH
2565 // ...
2566 }
2567 if (optionalFieldPresent[4])
2568 {
2569 // Deserialize tpc-PDCCH-ConfigPUSCH
2570 // ...
2571 }
2572 if (optionalFieldPresent[3])
2573 {
2574 // Deserialize cqi-ReportConfig
2575 // ...
2576 }
2577 physicalConfigDedicated->haveSoundingRsUlConfigDedicated = optionalFieldPresent[2];
2578 if (optionalFieldPresent[2])
2579 {
2580 // Deserialize soundingRS-UL-ConfigDedicated
2581 int sel;
2582 bIterator = DeserializeChoice(2, false, &sel, bIterator);
2583
2584 if (sel == 0)
2585 {
2586 physicalConfigDedicated->soundingRsUlConfigDedicated.type =
2588
2589 bIterator = DeserializeNull(bIterator);
2590 }
2591
2592 else if (sel == 1)
2593 {
2594 physicalConfigDedicated->soundingRsUlConfigDedicated.type =
2596
2597 std::bitset<0> bitset0;
2598 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2599
2600 int slct;
2601
2602 // Deserialize srs-Bandwidth
2603 bIterator = DeserializeEnum(4, &slct, bIterator);
2604 physicalConfigDedicated->soundingRsUlConfigDedicated.srsBandwidth = slct;
2605
2606 // Deserialize srs-HoppingBandwidth
2607 bIterator = DeserializeEnum(4, &slct, bIterator);
2608
2609 // Deserialize freqDomainPosition
2610 bIterator = DeserializeInteger(&slct, 0, 23, bIterator);
2611
2612 // Deserialize duration
2613 bool duration;
2614 bIterator = DeserializeBoolean(&duration, bIterator);
2615
2616 // Deserialize srs-ConfigIndex
2617 bIterator = DeserializeInteger(&slct, 0, 1023, bIterator);
2618 physicalConfigDedicated->soundingRsUlConfigDedicated.srsConfigIndex = slct;
2619
2620 // Deserialize transmissionComb
2621 bIterator = DeserializeInteger(&slct, 0, 1, bIterator);
2622
2623 // Deserialize cyclicShift
2624 bIterator = DeserializeEnum(8, &slct, bIterator);
2625 }
2626 }
2627 physicalConfigDedicated->haveAntennaInfoDedicated = optionalFieldPresent[1];
2628 if (optionalFieldPresent[1])
2629 {
2630 // Deserialize antennaInfo
2631 int sel;
2632 bIterator = DeserializeChoice(2, false, &sel, bIterator);
2633 if (sel == 1)
2634 {
2635 bIterator = DeserializeNull(bIterator);
2636 }
2637 else if (sel == 0)
2638 {
2639 std::bitset<1> codebookSubsetRestrictionPresent;
2640 bIterator = DeserializeSequence(&codebookSubsetRestrictionPresent, false, bIterator);
2641
2642 int txmode;
2643 bIterator = DeserializeEnum(8, &txmode, bIterator);
2644 physicalConfigDedicated->antennaInfo.transmissionMode = txmode;
2645
2646 if (codebookSubsetRestrictionPresent[0])
2647 {
2648 // Deserialize codebookSubsetRestriction
2649 // ...
2650 }
2651
2652 int txantennaselchosen;
2653 bIterator = DeserializeChoice(2, false, &txantennaselchosen, bIterator);
2654 if (txantennaselchosen == 0)
2655 {
2656 // Deserialize ue-TransmitAntennaSelection release
2657 bIterator = DeserializeNull(bIterator);
2658 }
2659 else if (txantennaselchosen == 1)
2660 {
2661 // Deserialize ue-TransmitAntennaSelection setup
2662 // ...
2663 }
2664 }
2665 }
2666 if (optionalFieldPresent[0])
2667 {
2668 // Deserialize schedulingRequestConfig
2669 // ...
2670 }
2671 return bIterator;
2672}
2673
2674void
2675RrcAsn1Header::Print(std::ostream& os) const
2676{
2677 NS_LOG_FUNCTION(this << &os);
2678 NS_FATAL_ERROR("RrcAsn1Header Print() function must also specify "
2679 "LteRrcSap::RadioResourceConfigDedicated as a second argument");
2680}
2681
2685 Buffer::Iterator bIterator)
2686{
2687 NS_LOG_FUNCTION(this);
2688 std::bitset<2> nonCriticalExtension_v890;
2689 bIterator = DeserializeSequence(&nonCriticalExtension_v890, false, bIterator);
2690
2691 if (nonCriticalExtension_v890[0])
2692 {
2693 // Continue to analyze future Release optional fields
2694 std::bitset<3> nonCriticalExtension_v920;
2695 bIterator = DeserializeSequence(&nonCriticalExtension_v920, false, bIterator);
2696 if (nonCriticalExtension_v920[0])
2697 {
2698 // Continue to deserialize future Release optional fields
2699 std::bitset<3> nonCriticalExtension_v1020;
2700 bIterator = DeserializeSequence(&nonCriticalExtension_v1020, false, bIterator);
2701
2702 if (nonCriticalExtension_v1020[2])
2703 {
2704 // sCellToReleaseList-r10
2705 int numElems;
2706
2707 bIterator = DeserializeSequenceOf(&numElems, MAX_OBJECT_ID, 1, bIterator);
2708 nonCriticalExtension->sCellToReleaseList.clear();
2709
2710 for (int i = 0; i < numElems; i++)
2711 {
2712 // Deserialize SCellIndex-r10
2713 int sCellIndex;
2714 bIterator = DeserializeInteger(&sCellIndex, 1, 7, bIterator);
2715 nonCriticalExtension->sCellToReleaseList.push_back(sCellIndex);
2716 }
2717 }
2718
2719 if (nonCriticalExtension_v1020[1])
2720 {
2721 // sCellToAddModList-r10
2722
2723 int numElems;
2724 bIterator = DeserializeSequenceOf(&numElems, MAX_OBJECT_ID, 1, bIterator);
2725 nonCriticalExtension->sCellToAddModList.clear();
2726 // Deserialize SCellToAddMod
2727 for (int i = 0; i < numElems; i++)
2728 {
2729 std::bitset<4> sCellToAddMod_r10;
2730 bIterator = DeserializeSequence(&sCellToAddMod_r10, false, bIterator);
2731
2733 // Deserialize sCellIndex
2734 NS_ASSERT(sCellToAddMod_r10[3]); // sCellIndex
2735 int n;
2736 bIterator = DeserializeInteger(&n, 1, 7, bIterator);
2737 sctam.sCellIndex = n;
2738 // Deserialize CellIdentification
2739 NS_ASSERT(sCellToAddMod_r10[2]); // CellIdentification
2740 bIterator = DeserializeCellIdentification(&sctam.cellIdentification, bIterator);
2741
2742 // Deserialize RadioResourceConfigCommonSCell
2743 NS_ASSERT(sCellToAddMod_r10[1]);
2746 bIterator);
2747 if (sCellToAddMod_r10[0])
2748 {
2750 // Deserialize RadioResourceConfigDedicatedSCell
2753 bIterator);
2754 }
2755 else
2756 {
2758 }
2759
2760 nonCriticalExtension->sCellToAddModList.push_back(sctam);
2761 }
2762 }
2763
2764 NS_ASSERT(!nonCriticalExtension_v1020[0]); // No nonCriticalExtension
2765 // RRCConnectionReconfiguration-v1130-IEs
2766 }
2767 }
2768
2769 return bIterator;
2770}
2771
2774 Buffer::Iterator bIterator)
2775{
2776 NS_LOG_FUNCTION(this);
2777 std::bitset<2> cellIdentification_r10;
2778 bIterator = DeserializeSequence(&cellIdentification_r10, false, bIterator);
2779 NS_ASSERT(cellIdentification_r10[1]); // phyCellId-r10
2780 int n1;
2781 bIterator = DeserializeInteger(&n1, 1, 65536, bIterator);
2782 ci->physCellId = n1;
2783 int n2;
2784 NS_ASSERT(cellIdentification_r10[0]); // dl-CarrierFreq-r10
2785 bIterator = DeserializeInteger(&n2, 1, MAX_EARFCN, bIterator);
2786 ci->dlCarrierFreq = n2;
2787
2788 return bIterator;
2789}
2790
2794 Buffer::Iterator bIterator)
2795{
2796 NS_LOG_FUNCTION(this);
2797 std::bitset<2> radioResourceConfigCommonSCell_r10;
2798 bIterator = DeserializeSequence(&radioResourceConfigCommonSCell_r10, false, bIterator);
2799 rrccsc->haveNonUlConfiguration = radioResourceConfigCommonSCell_r10[1];
2800 rrccsc->haveUlConfiguration = radioResourceConfigCommonSCell_r10[0];
2801 if (rrccsc->haveNonUlConfiguration)
2802 {
2803 std::bitset<5> nonUlConfiguration_r10;
2804 bIterator = DeserializeSequence(&nonUlConfiguration_r10, false, bIterator);
2805 int n;
2806 bIterator = DeserializeInteger(&n, 6, 100, bIterator);
2807 rrccsc->nonUlConfiguration.dlBandwidth = n;
2808
2809 std::bitset<1> antennaInfoCommon_r10;
2810 bIterator = DeserializeSequence(&antennaInfoCommon_r10, false, bIterator);
2811 bIterator = DeserializeInteger(&n, 0, 65536, bIterator);
2813
2814 std::bitset<2> pdschConfigCommon_r10;
2815 bIterator = DeserializeSequence(&pdschConfigCommon_r10, false, bIterator);
2816 bIterator = DeserializeInteger(&n, -60, 50, bIterator);
2818 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
2820 }
2821 if (rrccsc->haveUlConfiguration)
2822 {
2823 std::bitset<7> UlConfiguration_r10;
2824 bIterator = DeserializeSequence(&UlConfiguration_r10, true, bIterator);
2825
2826 std::bitset<3> FreqInfo_r10;
2827 bIterator = DeserializeSequence(&FreqInfo_r10, false, bIterator);
2828 int n;
2829 bIterator = DeserializeInteger(&n, 0, MAX_EARFCN, bIterator);
2831 bIterator = DeserializeInteger(&n, 6, 100, bIterator);
2833
2834 std::bitset<2> UlPowerControlCommonSCell_r10;
2835 bIterator = DeserializeSequence(&UlPowerControlCommonSCell_r10, false, bIterator);
2836 bIterator = DeserializeInteger(&n, 0, 65536, bIterator);
2838
2839 std::bitset<1> prachConfigSCell_r10;
2840 bIterator = DeserializeSequence(&prachConfigSCell_r10, false, bIterator);
2841 bIterator = DeserializeInteger(&n, 0, 256, bIterator);
2843 }
2844
2845 return bIterator;
2846}
2847
2851 Buffer::Iterator bIterator)
2852{
2853 NS_LOG_FUNCTION(this);
2854 std::bitset<1> RadioResourceConfigDedicatedSCell_r10;
2855 bIterator = DeserializeSequence(&RadioResourceConfigDedicatedSCell_r10, false, bIterator);
2856 bIterator =
2858
2859 return bIterator;
2860}
2861
2865 Buffer::Iterator bIterator)
2866{
2867 NS_LOG_FUNCTION(this);
2868 std::bitset<2> pcdscOpt;
2869 bIterator = DeserializeSequence(&pcdscOpt, true, bIterator);
2870 pcdsc->haveNonUlConfiguration = pcdscOpt[1];
2871 pcdsc->haveUlConfiguration = pcdscOpt[0];
2872 if (pcdsc->haveNonUlConfiguration)
2873 {
2874 std::bitset<4> nulOpt;
2875 bIterator = DeserializeSequence(&nulOpt, false, bIterator);
2876 pcdsc->haveAntennaInfoDedicated = nulOpt[3];
2877 NS_ASSERT(!nulOpt[2]); // crossCarrierSchedulingConfig-r10 Not Implemented
2878 NS_ASSERT(!nulOpt[1]); // csi-RS-Config-r10 Not Implemented
2879 pcdsc->havePdschConfigDedicated = nulOpt[0];
2880
2881 if (pcdsc->haveAntennaInfoDedicated)
2882 {
2883 // Deserialize antennaInfo
2884 int sel;
2885 bIterator = DeserializeChoice(2, false, &sel, bIterator);
2886 if (sel == 1)
2887 {
2888 bIterator = DeserializeNull(bIterator);
2889 }
2890 else if (sel == 0)
2891 {
2892 std::bitset<1> codebookSubsetRestrictionPresent;
2893 bIterator =
2894 DeserializeSequence(&codebookSubsetRestrictionPresent, false, bIterator);
2895
2896 int txmode;
2897 bIterator = DeserializeEnum(8, &txmode, bIterator);
2898 pcdsc->antennaInfo.transmissionMode = txmode;
2899
2900 if (codebookSubsetRestrictionPresent[0])
2901 {
2902 // Deserialize codebookSubsetRestriction
2903 NS_FATAL_ERROR("Not implemented yet");
2904 // ...
2905 }
2906
2907 int txantennaselchosen;
2908 bIterator = DeserializeChoice(2, false, &txantennaselchosen, bIterator);
2909 if (txantennaselchosen == 0)
2910 {
2911 // Deserialize ue-TransmitAntennaSelection release
2912 bIterator = DeserializeNull(bIterator);
2913 }
2914 else if (txantennaselchosen == 1)
2915 {
2916 // Deserialize ue-TransmitAntennaSelection setup
2917 NS_FATAL_ERROR("Not implemented yet");
2918 // ...
2919 }
2920 }
2921 }
2922 if (pcdsc->havePdschConfigDedicated)
2923 {
2924 // Deserialize pdsch-ConfigDedicated
2925 std::bitset<0> bitset0;
2926 bIterator = DeserializeSequence(&bitset0, false, bIterator);
2927
2928 int slct;
2929
2930 // Deserialize p-a
2931 bIterator = DeserializeEnum(8, &slct, bIterator);
2932 pcdsc->pdschConfigDedicated.pa = slct;
2933
2934 bIterator = DeserializeNull(bIterator);
2935 }
2936 }
2937 if (pcdsc->haveUlConfiguration)
2938 {
2939 std::bitset<7> ulOpt;
2940 bIterator = DeserializeSequence(&ulOpt, false, bIterator);
2941 pcdsc->haveAntennaInfoUlDedicated = ulOpt[6];
2942 NS_ASSERT(!ulOpt[5]); // pusch-ConfigDedicatedSCell-r10 not present
2943 NS_ASSERT(!ulOpt[4]); // uplinkPowerControlDedicatedSCell-r10 not present
2944 NS_ASSERT(!ulOpt[3]); // cqi-ReportConfigSCell-r10 not present
2945 pcdsc->haveSoundingRsUlConfigDedicated = ulOpt[2];
2946 NS_ASSERT(!ulOpt[1]); // soundingRS-UL-ConfigDedicated-v1020 not present
2947 NS_ASSERT(!ulOpt[0]); // soundingRS-UL-ConfigDedicatedAperiodic-r10 not present
2948
2949 if (pcdsc->haveAntennaInfoUlDedicated)
2950 {
2951 // Deserialize antennaInfo
2952 int sel;
2953 bIterator = DeserializeChoice(2, false, &sel, bIterator);
2954 if (sel == 1)
2955 {
2956 bIterator = DeserializeNull(bIterator);
2957 }
2958 else if (sel == 0)
2959 {
2960 std::bitset<1> codebookSubsetRestrictionPresent;
2961 bIterator =
2962 DeserializeSequence(&codebookSubsetRestrictionPresent, false, bIterator);
2963
2964 int txmode;
2965 bIterator = DeserializeEnum(8, &txmode, bIterator);
2966 pcdsc->antennaInfoUl.transmissionMode = txmode;
2967
2968 if (codebookSubsetRestrictionPresent[0])
2969 {
2970 // Deserialize codebookSubsetRestriction
2971 NS_FATAL_ERROR("Not implemented yet");
2972 // ...
2973 }
2974
2975 int txantennaselchosen;
2976 bIterator = DeserializeChoice(2, false, &txantennaselchosen, bIterator);
2977 if (txantennaselchosen == 0)
2978 {
2979 // Deserialize ue-TransmitAntennaSelection release
2980 bIterator = DeserializeNull(bIterator);
2981 }
2982 else if (txantennaselchosen == 1)
2983 {
2984 // Deserialize ue-TransmitAntennaSelection setup
2985 NS_FATAL_ERROR("Not implemented yet");
2986 // ...
2987 }
2988 }
2989 }
2991 {
2992 // Deserialize soundingRS-UL-ConfigDedicated
2993 int sel;
2994 bIterator = DeserializeChoice(2, false, &sel, bIterator);
2995
2996 if (sel == 0)
2997 {
3000
3001 bIterator = DeserializeNull(bIterator);
3002 }
3003
3004 else if (sel == 1)
3005 {
3008
3009 std::bitset<0> bitset0;
3010 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3011
3012 int slct;
3013
3014 // Deserialize srs-Bandwidth
3015 bIterator = DeserializeEnum(4, &slct, bIterator);
3017
3018 // Deserialize srs-HoppingBandwidth
3019 bIterator = DeserializeEnum(4, &slct, bIterator);
3020
3021 // Deserialize freqDomainPosition
3022 bIterator = DeserializeInteger(&slct, 0, 23, bIterator);
3023
3024 // Deserialize duration
3025 bool duration;
3026 bIterator = DeserializeBoolean(&duration, bIterator);
3027
3028 // Deserialize srs-ConfigIndex
3029 bIterator = DeserializeInteger(&slct, 0, 1023, bIterator);
3031
3032 // Deserialize transmissionComb
3033 bIterator = DeserializeInteger(&slct, 0, 1, bIterator);
3034
3035 // Deserialize cyclicShift
3036 bIterator = DeserializeEnum(8, &slct, bIterator);
3037 }
3038 }
3039 }
3040
3041 return bIterator;
3042}
3043
3044void
3045RrcAsn1Header::Print(std::ostream& os,
3046 LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
3047{
3048 os << " srbToAddModList: " << std::endl;
3049 auto it = radioResourceConfigDedicated.srbToAddModList.begin();
3050 for (; it != radioResourceConfigDedicated.srbToAddModList.end(); it++)
3051 {
3052 os << " srbIdentity: " << (int)it->srbIdentity << std::endl;
3053 os << " logicalChannelConfig: " << std::endl;
3054 os << " priority: " << (int)it->logicalChannelConfig.priority << std::endl;
3055 os << " prioritizedBitRateKbps: "
3056 << (int)it->logicalChannelConfig.prioritizedBitRateKbps << std::endl;
3057 os << " bucketSizeDurationMs: "
3058 << (int)it->logicalChannelConfig.bucketSizeDurationMs << std::endl;
3059 os << " logicalChannelGroup: " << (int)it->logicalChannelConfig.logicalChannelGroup
3060 << std::endl;
3061 }
3062 os << std::endl;
3063
3064 os << " drbToAddModList: " << std::endl;
3065 auto it2 = radioResourceConfigDedicated.drbToAddModList.begin();
3066 for (; it2 != radioResourceConfigDedicated.drbToAddModList.end(); it2++)
3067 {
3068 os << " epsBearerIdentity: " << (int)it2->epsBearerIdentity << std::endl;
3069 os << " drbIdentity: " << (int)it2->drbIdentity << std::endl;
3070 os << " rlcConfig: " << it2->rlcConfig.choice << std::endl;
3071 os << " logicalChannelIdentity: " << (int)it2->logicalChannelIdentity << std::endl;
3072 os << " logicalChannelConfig: " << std::endl;
3073 os << " priority: " << (int)it2->logicalChannelConfig.priority << std::endl;
3074 os << " prioritizedBitRateKbps: "
3075 << (int)it2->logicalChannelConfig.prioritizedBitRateKbps << std::endl;
3076 os << " bucketSizeDurationMs: "
3077 << (int)it2->logicalChannelConfig.bucketSizeDurationMs << std::endl;
3078 os << " logicalChannelGroup: " << (int)it2->logicalChannelConfig.logicalChannelGroup
3079 << std::endl;
3080 }
3081 os << std::endl;
3082
3083 os << " drbToReleaseList: ";
3084 auto it3 = radioResourceConfigDedicated.drbToReleaseList.begin();
3085 for (; it3 != radioResourceConfigDedicated.drbToReleaseList.end(); it3++)
3086 {
3087 os << (int)*it3 << ", ";
3088 }
3089 os << std::endl;
3090
3091 os << " havePhysicalConfigDedicated: "
3092 << radioResourceConfigDedicated.havePhysicalConfigDedicated << std::endl;
3093
3094 if (radioResourceConfigDedicated.havePhysicalConfigDedicated)
3095 {
3096 os << " physicalConfigDedicated: " << std::endl;
3097
3098 os << " haveSoundingRsUlConfigDedicated: "
3099 << radioResourceConfigDedicated.physicalConfigDedicated.haveSoundingRsUlConfigDedicated
3100 << std::endl;
3101 if (radioResourceConfigDedicated.physicalConfigDedicated.haveSoundingRsUlConfigDedicated)
3102 {
3103 os << " soundingRsUlConfigDedicated: " << std::endl;
3104 os << " type: "
3105 << radioResourceConfigDedicated.physicalConfigDedicated.soundingRsUlConfigDedicated
3106 .type
3107 << std::endl;
3108 os << " srsBandwidth: "
3109 << (int)radioResourceConfigDedicated.physicalConfigDedicated
3111 << std::endl;
3112 os << " srsConfigIndex: "
3113 << (int)radioResourceConfigDedicated.physicalConfigDedicated
3115 << std::endl;
3116 }
3117
3118 os << " haveAntennaInfoDedicated: "
3119 << radioResourceConfigDedicated.physicalConfigDedicated.haveAntennaInfoDedicated
3120 << std::endl;
3121 if (radioResourceConfigDedicated.physicalConfigDedicated.haveAntennaInfoDedicated)
3122 {
3123 os << " antennaInfo Tx mode: "
3124 << (int)radioResourceConfigDedicated.physicalConfigDedicated.antennaInfo
3126 << std::endl;
3127 }
3128 }
3129}
3130
3133 LteRrcSap::SystemInformationBlockType1* systemInformationBlockType1,
3134 Buffer::Iterator bIterator)
3135{
3136 std::bitset<0> bitset0;
3137 int n;
3138
3139 std::bitset<3> sysInfoBlkT1Opts;
3140 bIterator = DeserializeSequence(&sysInfoBlkT1Opts, false, bIterator);
3141
3142 // Deserialize cellAccessRelatedInfo
3143 std::bitset<1> cellAccessRelatedInfoOpts;
3144 bIterator = DeserializeSequence(&cellAccessRelatedInfoOpts, false, bIterator);
3145
3146 // Deserialize plmn-IdentityList
3147 int numPlmnIdentityInfoElements;
3148 bIterator = DeserializeSequenceOf(&numPlmnIdentityInfoElements, 6, 1, bIterator);
3149 for (int i = 0; i < numPlmnIdentityInfoElements; i++)
3150 {
3151 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3152
3153 // plmn-Identity
3154 bIterator = DeserializePlmnIdentity(
3155 &systemInformationBlockType1->cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity,
3156 bIterator);
3157 }
3158
3159 // Deserialize trackingAreaCode
3160 std::bitset<16> trackingAreaCode;
3161 bIterator = DeserializeBitstring(&trackingAreaCode, bIterator);
3162
3163 // Deserialize cellIdentity
3164 std::bitset<28> cellIdentity;
3165 bIterator = DeserializeBitstring(&cellIdentity, bIterator);
3166 systemInformationBlockType1->cellAccessRelatedInfo.cellIdentity = cellIdentity.to_ulong();
3167
3168 // Deserialize cellBarred
3169 bIterator = DeserializeEnum(2, &n, bIterator);
3170
3171 // Deserialize intraFreqReselection
3172 bIterator = DeserializeEnum(2, &n, bIterator);
3173
3174 // Deserialize csg-Indication
3175 bIterator =
3176 DeserializeBoolean(&systemInformationBlockType1->cellAccessRelatedInfo.csgIndication,
3177 bIterator);
3178
3179 if (cellAccessRelatedInfoOpts[0])
3180 {
3181 // Deserialize csg-Identity
3182 std::bitset<27> csgIdentity;
3183 bIterator = DeserializeBitstring(&csgIdentity, bIterator);
3184 systemInformationBlockType1->cellAccessRelatedInfo.csgIdentity = csgIdentity.to_ulong();
3185 }
3186
3187 // Deserialize cellSelectionInfo
3188 std::bitset<1> qRxLevMinOffsetPresent;
3189 bIterator = DeserializeSequence(&qRxLevMinOffsetPresent, false, bIterator);
3190 bIterator = DeserializeInteger(&n, -70, -22, bIterator); // q-RxLevMin
3191 if (qRxLevMinOffsetPresent[0])
3192 {
3193 // Deserialize qRxLevMinOffset
3194 // ...
3195 }
3196
3197 if (sysInfoBlkT1Opts[2])
3198 {
3199 // Deserialize p-Max
3200 // ...
3201 }
3202
3203 // freqBandIndicator
3204 bIterator = DeserializeInteger(&n, 1, 64, bIterator);
3205
3206 // schedulingInfoList
3207 int numSchedulingInfo;
3208 bIterator = DeserializeSequenceOf(&numSchedulingInfo, MAX_SI_MESSAGE, 1, bIterator);
3209 for (int i = 0; i < numSchedulingInfo; i++)
3210 {
3211 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3212 bIterator = DeserializeEnum(7, &n, bIterator); // si-Periodicity
3213 int numSibType;
3214 bIterator =
3215 DeserializeSequenceOf(&numSibType, MAX_SIB - 1, 0, bIterator); // sib-MappingInfo
3216 for (int j = 0; j < numSibType; j++)
3217 {
3218 bIterator = DeserializeEnum(16, &n, bIterator); // SIB-Type
3219 }
3220 }
3221
3222 if (sysInfoBlkT1Opts[1])
3223 {
3224 // tdd-Config
3225 // ...
3226 }
3227
3228 // si-WindowLength
3229 bIterator = DeserializeEnum(7, &n, bIterator);
3230
3231 // systemInfoValueTag
3232 bIterator = DeserializeInteger(&n, 0, 31, bIterator);
3233
3234 if (sysInfoBlkT1Opts[0])
3235 {
3236 // Deserialize nonCriticalExtension
3237 // ...
3238 }
3239 return bIterator;
3240}
3241
3244 LteRrcSap::SystemInformationBlockType2* systemInformationBlockType2,
3245 Buffer::Iterator bIterator)
3246{
3247 std::bitset<0> bitset0;
3248 int n;
3249
3250 std::bitset<2> sysInfoBlkT2Opts;
3251 bIterator = DeserializeSequence(&sysInfoBlkT2Opts, true, bIterator);
3252 if (sysInfoBlkT2Opts[1])
3253 {
3254 // Deserialize ac-BarringInfo
3255 // ...
3256 }
3257
3258 // Deserialize radioResourceConfigCommon
3260 &systemInformationBlockType2->radioResourceConfigCommon,
3261 bIterator);
3262
3263 // Deserialize ue-TimersAndConstants
3264 bIterator = DeserializeSequence(&bitset0, true, bIterator);
3265 bIterator = DeserializeEnum(8, &n, bIterator); // t300
3266 bIterator = DeserializeEnum(8, &n, bIterator); // t301
3267 bIterator = DeserializeEnum(7, &n, bIterator); // t310
3268 bIterator = DeserializeEnum(8, &n, bIterator); // n310
3269 bIterator = DeserializeEnum(7, &n, bIterator); // t311
3270 bIterator = DeserializeEnum(8, &n, bIterator); // n311
3271
3272 // Deserialize freqInfo
3273 std::bitset<2> freqInfoOpts;
3274 bIterator = DeserializeSequence(&freqInfoOpts, false, bIterator);
3275 if (freqInfoOpts[1])
3276 {
3277 // Deserialize ul-CarrierFreq
3278 bIterator = DeserializeInteger(&n, 0, MAX_EARFCN, bIterator);
3279 systemInformationBlockType2->freqInfo.ulCarrierFreq = n;
3280 }
3281 if (freqInfoOpts[0])
3282 {
3283 // Deserialize ul-Bandwidth
3284 bIterator = DeserializeEnum(6, &n, bIterator);
3285 systemInformationBlockType2->freqInfo.ulBandwidth = EnumToBandwidth(n);
3286 }
3287
3288 // additionalSpectrumEmission
3289 bIterator = DeserializeInteger(&n, 1, 32, bIterator);
3290
3291 if (sysInfoBlkT2Opts[0])
3292 {
3293 // Deserialize mbsfn-SubframeConfigList
3294 // ...
3295 }
3296
3297 // Deserialize timeAlignmentTimerCommon
3298 bIterator = DeserializeEnum(8, &n, bIterator);
3299
3300 return bIterator;
3301}
3302
3305 LteRrcSap::RadioResourceConfigCommon* radioResourceConfigCommon,
3306 Buffer::Iterator bIterator)
3307{
3308 std::bitset<0> bitset0;
3309 int n;
3310
3311 std::bitset<9> rrCfgCommOptions;
3312 bIterator = DeserializeSequence(&rrCfgCommOptions, true, bIterator);
3313
3314 // rach-ConfigCommon
3315 if (rrCfgCommOptions[8])
3316 {
3317 bIterator =
3318 DeserializeRachConfigCommon(&radioResourceConfigCommon->rachConfigCommon, bIterator);
3319 }
3320
3321 // prach-Config
3322 std::bitset<1> prachConfigInfoPresent;
3323 bIterator = DeserializeSequence(&prachConfigInfoPresent, false, bIterator);
3324
3325 // prach-Config -> rootSequenceIndex
3326 bIterator = DeserializeInteger(&n, 0, 1023, bIterator);
3327
3328 // prach-Config -> prach-ConfigInfo
3329 if (prachConfigInfoPresent[0])
3330 {
3331 // ...
3332 }
3333
3334 // pdsch-ConfigCommon
3335 if (rrCfgCommOptions[7])
3336 {
3337 // ...
3338 }
3339
3340 // pusch-ConfigCommon
3341 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3342
3343 // pusch-ConfigCommon -> pusch-ConfigBasic
3344 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3345
3346 // pusch-ConfigCommon -> pusch-ConfigBasic -> n-SB
3347 bIterator = DeserializeInteger(&n, 1, 4, bIterator);
3348
3349 // pusch-ConfigCommon -> pusch-ConfigBasic -> hoppingMode
3350 bIterator = DeserializeEnum(2, &n, bIterator);
3351
3352 // pusch-ConfigCommon -> pusch-ConfigBasic -> pusch-HoppingOffset
3353 bIterator = DeserializeInteger(&n, 0, 98, bIterator);
3354
3355 // pusch-ConfigCommon -> pusch-ConfigBasic -> enable64QAM
3356 bool enable64QAM;
3357 bIterator = DeserializeBoolean(&enable64QAM, bIterator);
3358
3359 // ul-ReferenceSignalsPUSCH
3360 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3361
3362 // groupHoppingEnabled
3363 bool dummyBool;
3364 bIterator = DeserializeBoolean(&dummyBool, bIterator);
3365
3366 // groupAssignmentPUSCH
3367 bIterator = DeserializeInteger(&n, 0, 29, bIterator);
3368
3369 // sequenceHoppingEnabled
3370 bIterator = DeserializeBoolean(&dummyBool, bIterator);
3371
3372 // cyclicShift
3373 bIterator = DeserializeInteger(&n, 0, 7, bIterator);
3374
3375 // phich-Config
3376 if (rrCfgCommOptions[6])
3377 {
3378 // ...
3379 }
3380
3381 // pucch-ConfigCommon
3382 if (rrCfgCommOptions[5])
3383 {
3384 // ...
3385 }
3386
3387 // soundingRS-UL-ConfigCommon
3388 if (rrCfgCommOptions[4])
3389 {
3390 // ...
3391 }
3392
3393 // uplinkPowerControlCommon
3394 if (rrCfgCommOptions[3])
3395 {
3396 // ...
3397 }
3398
3399 // antennaInfoCommon
3400 if (rrCfgCommOptions[2])
3401 {
3402 // ...
3403 }
3404
3405 // p-Max
3406 if (rrCfgCommOptions[1])
3407 {
3408 // ...
3409 }
3410
3411 // tdd-Config
3412 if (rrCfgCommOptions[0])
3413 {
3414 // ...
3415 }
3416
3417 // ul-CyclicPrefixLength
3418 bIterator = DeserializeEnum(2, &n, bIterator);
3419
3420 return bIterator;
3421}
3422
3425 Buffer::Iterator bIterator)
3426{
3427 std::bitset<0> bitset0;
3428 int n;
3429
3430 bIterator = DeserializeSequence(&bitset0, true, bIterator);
3431
3432 // preambleInfo
3433 std::bitset<1> preamblesGroupAConfigPresent;
3434 bIterator = DeserializeSequence(&preamblesGroupAConfigPresent, false, bIterator);
3435
3436 // numberOfRA-Preambles
3437 bIterator = DeserializeEnum(16, &n, bIterator);
3438 switch (n)
3439 {
3440 case 0:
3441 rachConfigCommon->preambleInfo.numberOfRaPreambles = 4;
3442 break;
3443 case 1:
3444 rachConfigCommon->preambleInfo.numberOfRaPreambles = 8;
3445 break;
3446 case 2:
3447 rachConfigCommon->preambleInfo.numberOfRaPreambles = 12;
3448 break;
3449 case 3:
3450 rachConfigCommon->preambleInfo.numberOfRaPreambles = 16;
3451 break;
3452 case 4:
3453 rachConfigCommon->preambleInfo.numberOfRaPreambles = 20;
3454 break;
3455 case 5:
3456 rachConfigCommon->preambleInfo.numberOfRaPreambles = 24;
3457 break;
3458 case 6:
3459 rachConfigCommon->preambleInfo.numberOfRaPreambles = 28;
3460 break;
3461 case 7:
3462 rachConfigCommon->preambleInfo.numberOfRaPreambles = 32;
3463 break;
3464 case 8:
3465 rachConfigCommon->preambleInfo.numberOfRaPreambles = 36;
3466 break;
3467 case 9:
3468 rachConfigCommon->preambleInfo.numberOfRaPreambles = 40;
3469 break;
3470 case 10:
3471 rachConfigCommon->preambleInfo.numberOfRaPreambles = 44;
3472 break;
3473 case 11:
3474 rachConfigCommon->preambleInfo.numberOfRaPreambles = 48;
3475 break;
3476 case 12:
3477 rachConfigCommon->preambleInfo.numberOfRaPreambles = 52;
3478 break;
3479 case 13:
3480 rachConfigCommon->preambleInfo.numberOfRaPreambles = 56;
3481 break;
3482 case 14:
3483 rachConfigCommon->preambleInfo.numberOfRaPreambles = 60;
3484 break;
3485 case 15:
3486 rachConfigCommon->preambleInfo.numberOfRaPreambles = 64;
3487 break;
3488 default:
3489 rachConfigCommon->preambleInfo.numberOfRaPreambles = 4;
3490 }
3491
3492 if (preamblesGroupAConfigPresent[0])
3493 {
3494 // Deserialize preamblesGroupAConfig
3495 // ...
3496 }
3497
3498 // powerRampingParameters
3499 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3500 bIterator = DeserializeEnum(4, &n, bIterator); // powerRampingStep
3501 bIterator = DeserializeEnum(16, &n, bIterator); // preambleInitialReceivedTargetPower
3502
3503 // ra-SupervisionInfo
3504 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3505 bIterator = DeserializeEnum(11, &n, bIterator); // preambleTransMax
3506 switch (n)
3507 {
3508 case 0:
3509 rachConfigCommon->raSupervisionInfo.preambleTransMax = 3;
3510 break;
3511 case 1:
3512 rachConfigCommon->raSupervisionInfo.preambleTransMax = 4;
3513 break;
3514 case 2:
3515 rachConfigCommon->raSupervisionInfo.preambleTransMax = 5;
3516 break;
3517 case 3:
3518 rachConfigCommon->raSupervisionInfo.preambleTransMax = 6;
3519 break;
3520 case 4:
3521 rachConfigCommon->raSupervisionInfo.preambleTransMax = 7;
3522 break;
3523 case 5:
3524 rachConfigCommon->raSupervisionInfo.preambleTransMax = 8;
3525 break;
3526 case 6:
3527 rachConfigCommon->raSupervisionInfo.preambleTransMax = 10;
3528 break;
3529 case 7:
3530 rachConfigCommon->raSupervisionInfo.preambleTransMax = 20;
3531 break;
3532 case 8:
3533 rachConfigCommon->raSupervisionInfo.preambleTransMax = 50;
3534 break;
3535 case 9:
3536 rachConfigCommon->raSupervisionInfo.preambleTransMax = 100;
3537 break;
3538 case 10:
3539 rachConfigCommon->raSupervisionInfo.preambleTransMax = 200;
3540 break;
3541 default:
3542 rachConfigCommon->raSupervisionInfo.preambleTransMax = 0;
3543 }
3544
3545 // ra-ResponseWindowSize
3546 bIterator = DeserializeEnum(8, &n, bIterator);
3547 switch (n)
3548 {
3549 case 0:
3550 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 2;
3551 break;
3552 case 1:
3553 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 3;
3554 break;
3555 case 2:
3556 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 4;
3557 break;
3558 case 3:
3559 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 5;
3560 break;
3561 case 4:
3562 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 6;
3563 break;
3564 case 5:
3565 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 7;
3566 break;
3567 case 6:
3568 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 8;
3569 break;
3570 case 7:
3571 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 10;
3572 break;
3573 default:
3574 rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 0;
3575 }
3576
3577 bIterator = DeserializeEnum(8, &n, bIterator); // mac-ContentionResolutionTimer
3578 bIterator = DeserializeInteger(&n, 1, 8, bIterator); // maxHARQ-Msg3Tx
3579
3580 // connEstFailCount
3581 bIterator = DeserializeEnum(8, &n, bIterator);
3582 switch (n)
3583 {
3584 case 1:
3585 rachConfigCommon->txFailParam.connEstFailCount = 1;
3586 break;
3587 case 2:
3588 rachConfigCommon->txFailParam.connEstFailCount = 2;
3589 break;
3590 case 3:
3591 rachConfigCommon->txFailParam.connEstFailCount = 3;
3592 break;
3593 case 4:
3594 rachConfigCommon->txFailParam.connEstFailCount = 4;
3595 break;
3596 default:
3597 rachConfigCommon->txFailParam.connEstFailCount = 1;
3598 }
3599 return bIterator;
3600}
3601
3604 LteRrcSap::RadioResourceConfigCommonSib* radioResourceConfigCommonSib,
3605 Buffer::Iterator bIterator)
3606{
3607 std::bitset<0> bitset0;
3608 int n;
3609
3610 bIterator = DeserializeSequence(&bitset0, true, bIterator);
3611
3612 // rach-ConfigCommon
3613 bIterator =
3614 DeserializeRachConfigCommon(&radioResourceConfigCommonSib->rachConfigCommon, bIterator);
3615
3616 // bcch-Config
3617 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3618 bIterator = DeserializeEnum(4, &n, bIterator); // modificationPeriodCoeff
3619
3620 // pcch-Config
3621 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3622 bIterator = DeserializeEnum(4, &n, bIterator); // defaultPagingCycle
3623 bIterator = DeserializeEnum(8, &n, bIterator); // nB
3624
3625 // prach-Config
3626 std::bitset<1> prachConfigInfoPresent;
3627 bIterator = DeserializeSequence(&prachConfigInfoPresent, false, bIterator);
3628 // prach-Config -> rootSequenceIndex
3629 bIterator = DeserializeInteger(&n, 0, 1023, bIterator);
3630 // prach-Config -> prach-ConfigInfo
3631 if (prachConfigInfoPresent[0])
3632 {
3633 // ...
3634 }
3635
3636 // pdsch-ConfigCommon
3637 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3638 bIterator = DeserializeInteger(&n, -60, 50, bIterator); // referenceSignalPower
3639 bIterator = DeserializeInteger(&n, 0, 3, bIterator); // p-b
3640
3641 // pusch-ConfigCommon
3642 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3643
3644 // pusch-ConfigCommon -> pusch-ConfigBasic
3645 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3646
3647 // pusch-ConfigCommon -> pusch-ConfigBasic -> n-SB
3648 bIterator = DeserializeInteger(&n, 1, 4, bIterator);
3649
3650 // pusch-ConfigCommon -> pusch-ConfigBasic -> hoppingMode
3651 bIterator = DeserializeEnum(2, &n, bIterator);
3652
3653 // pusch-ConfigCommon -> pusch-ConfigBasic -> pusch-HoppingOffset
3654 bIterator = DeserializeInteger(&n, 0, 98, bIterator);
3655
3656 // pusch-ConfigCommon -> pusch-ConfigBasic -> enable64QAM
3657 bool dummyBoolean;
3658 bIterator = DeserializeBoolean(&dummyBoolean, bIterator);
3659
3660 // ul-ReferenceSignalsPUSCH
3661 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3662
3663 // groupHoppingEnabled
3664 bIterator = DeserializeBoolean(&dummyBoolean, bIterator);
3665
3666 // groupAssignmentPUSCH
3667 bIterator = DeserializeInteger(&n, 0, 29, bIterator);
3668
3669 // sequenceHoppingEnabled
3670 bIterator = DeserializeBoolean(&dummyBoolean, bIterator);
3671
3672 // cyclicShift
3673 bIterator = DeserializeInteger(&n, 0, 7, bIterator);
3674
3675 // pucch-ConfigCommon
3676 bIterator = DeserializeEnum(3, &n, bIterator); // deltaPUCCH-Shift
3677 bIterator = DeserializeInteger(&n, 0, 98, bIterator); // nRB-CQI
3678 bIterator = DeserializeInteger(&n, 0, 7, bIterator); // nCS-AN
3679 bIterator = DeserializeInteger(&n, 0, 2047, bIterator); // n1PUCCH-AN
3680
3681 // soundingRS-UL-ConfigCommon
3682 int choice;
3683 bIterator = DeserializeChoice(2, false, &choice, bIterator);
3684 if (choice == 0)
3685 {
3686 bIterator = DeserializeNull(bIterator); // release
3687 }
3688 if (choice == 1)
3689 {
3690 // setup
3691 // ...
3692 }
3693
3694 // uplinkPowerControlCommon
3695 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3696 bIterator = DeserializeInteger(&n, -126, 24, bIterator); // p0-NominalPUSCH
3697 bIterator = DeserializeEnum(8, &n, bIterator); // alpha
3698 bIterator = DeserializeInteger(&n, -127, -96, bIterator); // p0-NominalPUCCH
3699 // deltaFList-PUCCH
3700 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3701 bIterator = DeserializeEnum(3, &n, bIterator); // deltaF-PUCCH-Format1
3702 bIterator = DeserializeEnum(3, &n, bIterator); // deltaF-PUCCH-Format1b
3703 bIterator = DeserializeEnum(4, &n, bIterator); // deltaF-PUCCH-Format2
3704 bIterator = DeserializeEnum(3, &n, bIterator); // deltaF-PUCCH-Format2a
3705 bIterator = DeserializeEnum(3, &n, bIterator); // deltaF-PUCCH-Format2b
3706 bIterator = DeserializeInteger(&n, -1, 6, bIterator); // deltaPreambleMsg3
3707
3708 // ul-CyclicPrefixLength
3709 bIterator = DeserializeEnum(2, &n, bIterator);
3710
3711 return bIterator;
3712}
3713
3716 Buffer::Iterator bIterator)
3717{
3718 int n;
3719 std::bitset<0> b0;
3720 std::bitset<4> measResultOptionalPresent;
3721 // bIterator = DeserializeSequence (&measResultNeighCellsPresent,true,bIterator);
3722 bIterator = DeserializeSequence(&measResultOptionalPresent, true, bIterator);
3723
3724 // Deserialize measId
3725 bIterator = DeserializeInteger(&n, 1, MAX_MEAS_ID, bIterator);
3726 measResults->measId = n;
3727
3728 // Deserialize measResultServCell
3729 bIterator = DeserializeSequence(&b0, false, bIterator);
3730
3731 // Deserialize rsrpResult
3732 bIterator = DeserializeInteger(&n, 0, 97, bIterator);
3733 measResults->measResultPCell.rsrpResult = n;
3734
3735 // Deserialize rsrqResult
3736 bIterator = DeserializeInteger(&n, 0, 34, bIterator);
3737 measResults->measResultPCell.rsrqResult = n;
3738
3739 measResults->haveMeasResultNeighCells = measResultOptionalPresent[0];
3740 measResults->haveMeasResultServFreqList = measResultOptionalPresent[3];
3741 if (measResults->haveMeasResultNeighCells)
3742 {
3743 int measResultNeighCellsChoice;
3744
3745 // Deserialize measResultNeighCells
3746 bIterator = DeserializeChoice(4, false, &measResultNeighCellsChoice, bIterator);
3747
3748 if (measResultNeighCellsChoice == 0)
3749 {
3750 // Deserialize measResultListEUTRA
3751 int numElems;
3752 bIterator = DeserializeSequenceOf(&numElems, MAX_CELL_REPORT, 1, bIterator);
3753
3754 for (int i = 0; i < numElems; i++)
3755 {
3756 LteRrcSap::MeasResultEutra measResultEutra;
3757
3758 std::bitset<1> isCgiInfoPresent;
3759 bIterator = DeserializeSequence(&isCgiInfoPresent, false, bIterator);
3760
3761 // PhysCellId
3762 bIterator = DeserializeInteger(&n, 0, 503, bIterator);
3763 measResultEutra.physCellId = n;
3764
3765 measResultEutra.haveCgiInfo = isCgiInfoPresent[0];
3766 if (isCgiInfoPresent[0])
3767 {
3768 std::bitset<1> havePlmnIdentityList;
3769 bIterator = DeserializeSequence(&havePlmnIdentityList, false, bIterator);
3770
3771 // Deserialize cellGlobalId
3772 bIterator = DeserializeSequence(&b0, false, bIterator);
3773
3774 // Deserialize plmn-Identity
3775 bIterator =
3776 DeserializePlmnIdentity(&measResultEutra.cgiInfo.plmnIdentity, bIterator);
3777
3778 // Deserialize CellIdentity
3779 std::bitset<28> cellId;
3780 bIterator = DeserializeBitstring(&cellId, bIterator);
3781 measResultEutra.cgiInfo.cellIdentity = cellId.to_ulong();
3782
3783 // Deserialize trackingAreaCode
3784 std::bitset<16> trArCo;
3785 bIterator = DeserializeBitstring(&trArCo, bIterator);
3786 measResultEutra.cgiInfo.trackingAreaCode = trArCo.to_ulong();
3787
3788 // Deserialize plmn-IdentityList
3789 if (havePlmnIdentityList[0])
3790 {
3791 int numPlmnElems;
3792 bIterator = DeserializeSequenceOf(&numPlmnElems, 5, 1, bIterator);
3793
3794 for (int j = 0; j < numPlmnElems; j++)
3795 {
3796 uint32_t plmnId;
3797 bIterator = DeserializePlmnIdentity(&plmnId, bIterator);
3798 measResultEutra.cgiInfo.plmnIdentityList.push_back(plmnId);
3799 }
3800 }
3801 }
3802
3803 // Deserialize measResult
3804 std::bitset<2> measResultOpts;
3805 bIterator = DeserializeSequence(&measResultOpts, true, bIterator);
3806
3807 measResultEutra.haveRsrpResult = measResultOpts[1];
3808 if (measResultOpts[1])
3809 {
3810 // Deserialize rsrpResult
3811 bIterator = DeserializeInteger(&n, 0, 97, bIterator);
3812 measResultEutra.rsrpResult = n;
3813 }
3814
3815 measResultEutra.haveRsrqResult = measResultOpts[0];
3816 if (measResultOpts[0])
3817 {
3818 // Deserialize rsrqResult
3819 bIterator = DeserializeInteger(&n, 0, 34, bIterator);
3820 measResultEutra.rsrqResult = n;
3821 }
3822
3823 measResults->measResultListEutra.push_back(measResultEutra);
3824 }
3825 }
3826
3827 if (measResultNeighCellsChoice == 1)
3828 {
3829 // Deserialize measResultListUTRA
3830 // ...
3831 }
3832
3833 if (measResultNeighCellsChoice == 2)
3834 {
3835 // Deserialize measResultListGERAN
3836 // ...
3837 }
3838 if (measResultNeighCellsChoice == 3)
3839 {
3840 // Deserialize measResultsCDMA2000
3841 // ...
3842 }
3843 }
3844 if (measResults->haveMeasResultServFreqList)
3845 {
3846 int numElems;
3847 bIterator = DeserializeSequenceOf(&numElems, MAX_SCELL_REPORT, 1, bIterator);
3848 for (int i = 0; i < numElems; i++)
3849 {
3850 LteRrcSap::MeasResultServFreq measResultServFreq;
3851
3852 // Deserialize MeasResultServFreq-r10
3853 std::bitset<2> measResultScellPresent;
3854 bIterator = DeserializeSequence(&measResultScellPresent, true, bIterator);
3855 measResultServFreq.haveMeasResultSCell = measResultScellPresent[0];
3856 measResultServFreq.haveMeasResultBestNeighCell = measResultScellPresent[1];
3857
3858 // Deserialize servFreqId-r10
3859 int servFreqId;
3860 bIterator = DeserializeInteger(&servFreqId, 0, 7, bIterator);
3861 measResultServFreq.servFreqId = servFreqId;
3862
3863 if (measResultServFreq.haveMeasResultSCell)
3864 {
3865 // Deserialize rsrpResult
3866 bIterator = DeserializeInteger(&n, 0, 97, bIterator);
3867 measResultServFreq.measResultSCell.rsrpResult = n;
3868
3869 // Deserialize rsrqResult
3870 bIterator = DeserializeInteger(&n, 0, 34, bIterator);
3871 measResultServFreq.measResultSCell.rsrqResult = n;
3872 }
3873
3874 if (measResultServFreq.haveMeasResultBestNeighCell)
3875 {
3876 // Deserialize physCellId-r10
3877 bIterator = DeserializeInteger(&n, 0, 503, bIterator);
3878 measResultServFreq.measResultBestNeighCell.physCellId = n;
3879
3880 // Deserialize rsrpResultNCell-r10
3881 bIterator = DeserializeInteger(&n, 0, 97, bIterator);
3882 measResultServFreq.measResultBestNeighCell.rsrpResult = n;
3883
3884 // Deserialize rsrqResultNCell-r10
3885 bIterator = DeserializeInteger(&n, 0, 34, bIterator);
3886 measResultServFreq.measResultBestNeighCell.rsrqResult = n;
3887 }
3888 measResults->measResultServFreqList.push_back(measResultServFreq);
3889 }
3890 }
3891 return bIterator;
3892}
3893
3896{
3897 int n;
3898 std::bitset<1> isMccPresent;
3899 bIterator = DeserializeSequence(&isMccPresent, false, bIterator);
3900
3901 if (isMccPresent[0])
3902 {
3903 // Deserialize mcc
3904 // ...
3905 }
3906
3907 // Deserialize mnc
3908 int mncDigits;
3909 int mnc = 0;
3910 bIterator = DeserializeSequenceOf(&mncDigits, 3, 2, bIterator);
3911
3912 for (int j = mncDigits - 1; j >= 0; j--)
3913 {
3914 bIterator = DeserializeInteger(&n, 0, 9, bIterator);
3915 mnc += n * pow(10, j);
3916 }
3917
3918 *plmnId = mnc;
3919
3920 // cellReservedForOperatorUse
3921 bIterator = DeserializeEnum(2, &n, bIterator);
3922 return bIterator;
3923}
3924
3927{
3928 std::bitset<0> bitset0;
3929 std::bitset<2> bitset2;
3930 std::bitset<11> bitset11;
3931 int n;
3932
3933 // measConfig
3934 bIterator = DeserializeSequence(&bitset11, true, bIterator);
3935
3936 if (bitset11[10])
3937 {
3938 // measObjectToRemoveList
3939 int measObjectToRemoveListElems;
3940 bIterator =
3941 DeserializeSequenceOf(&measObjectToRemoveListElems, MAX_OBJECT_ID, 1, bIterator);
3942
3943 for (int i = 0; i < measObjectToRemoveListElems; i++)
3944 {
3945 bIterator = DeserializeInteger(&n, 1, MAX_OBJECT_ID, bIterator);
3946 measConfig->measObjectToRemoveList.push_back(n);
3947 }
3948 }
3949
3950 if (bitset11[9])
3951 {
3952 // measObjectToAddModList
3953 int measObjectToAddModListElems;
3954 bIterator =
3955 DeserializeSequenceOf(&measObjectToAddModListElems, MAX_OBJECT_ID, 1, bIterator);
3956
3957 for (int i = 0; i < measObjectToAddModListElems; i++)
3958 {
3960
3961 bIterator = DeserializeSequence(&bitset0, false, bIterator);
3962
3963 bIterator = DeserializeInteger(&n, 1, MAX_OBJECT_ID, bIterator);
3964 elem.measObjectId = n;
3965
3966 int measObjectChoice;
3967 bIterator = DeserializeChoice(4, true, &measObjectChoice, bIterator);
3968
3969 switch (measObjectChoice)
3970 {
3971 case 1:
3972 // Deserialize measObjectUTRA
3973 // ...
3974
3975 case 2:
3976 // Deserialize measObjectGERAN
3977 // ...
3978
3979 case 3:
3980 // Deserialize measObjectCDMA2000
3981 // ...
3982 break;
3983
3984 case 0:
3985 default:
3986 // Deserialize measObjectEUTRA
3987 std::bitset<5> measObjectEutraOpts;
3988 bIterator = DeserializeSequence(&measObjectEutraOpts, true, bIterator);
3989
3990 // carrierFreq
3991 bIterator = DeserializeInteger(&n, 0, MAX_EARFCN, bIterator);
3993
3994 // allowedMeasBandwidth
3995 bIterator = DeserializeEnum(6, &n, bIterator);
3997
3998 // presenceAntennaPort1
3999 bIterator =
4001
4002 // neighCellConfig
4003 bIterator = DeserializeBitstring(&bitset2, bIterator);
4004 elem.measObjectEutra.neighCellConfig = bitset2.to_ulong();
4005
4006 // offsetFreq
4007 bIterator = DeserializeQoffsetRange(&elem.measObjectEutra.offsetFreq, bIterator);
4008
4009 if (measObjectEutraOpts[4])
4010 {
4011 // cellsToRemoveList
4012 int numElems;
4013 bIterator = DeserializeSequenceOf(&numElems, MAX_CELL_MEAS, 1, bIterator);
4014
4015 for (int i = 0; i < numElems; i++)
4016 {
4017 bIterator = DeserializeInteger(&n, 1, MAX_CELL_MEAS, bIterator);
4018 elem.measObjectEutra.cellsToRemoveList.push_back(n);
4019 }
4020 }
4021
4022 if (measObjectEutraOpts[3])
4023 {
4024 // cellsToAddModList
4025 int numElems;
4026 bIterator = DeserializeSequenceOf(&numElems, MAX_CELL_MEAS, 1, bIterator);
4027
4028 for (int i = 0; i < numElems; i++)
4029 {
4030 LteRrcSap::CellsToAddMod cellsToAddMod;
4031
4032 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4033
4034 // cellIndex
4035 bIterator = DeserializeInteger(&n, 1, MAX_CELL_MEAS, bIterator);
4036 cellsToAddMod.cellIndex = n;
4037
4038 // PhysCellId
4039 bIterator = DeserializeInteger(&n, 0, 503, bIterator);
4040 cellsToAddMod.physCellId = n;
4041
4042 // cellIndividualOffset
4043 bIterator =
4044 DeserializeQoffsetRange(&cellsToAddMod.cellIndividualOffset, bIterator);
4045
4046 elem.measObjectEutra.cellsToAddModList.push_back(cellsToAddMod);
4047 }
4048 }
4049
4050 if (measObjectEutraOpts[2])
4051 {
4052 // blackCellsToRemoveList
4053 int numElems;
4054 bIterator = DeserializeSequenceOf(&numElems, MAX_CELL_MEAS, 1, bIterator);
4055
4056 for (int i = 0; i < numElems; i++)
4057 {
4058 bIterator = DeserializeInteger(&n, 1, MAX_CELL_MEAS, bIterator);
4059 elem.measObjectEutra.blackCellsToRemoveList.push_back(n);
4060 }
4061 }
4062
4063 if (measObjectEutraOpts[1])
4064 {
4065 // blackCellsToAddModList
4066 int numElems;
4067 bIterator = DeserializeSequenceOf(&numElems, MAX_CELL_MEAS, 1, bIterator);
4068
4069 for (int i = 0; i < numElems; i++)
4070 {
4071 LteRrcSap::BlackCellsToAddMod blackCellsToAddMod;
4072 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4073
4074 bIterator = DeserializeInteger(&n, 1, MAX_CELL_MEAS, bIterator);
4075 blackCellsToAddMod.cellIndex = n;
4076
4077 // PhysCellIdRange
4078 std::bitset<1> isRangePresent;
4079 bIterator = DeserializeSequence(&isRangePresent, false, bIterator);
4080
4081 // start
4082 bIterator = DeserializeInteger(&n, 0, 503, bIterator);
4083 blackCellsToAddMod.physCellIdRange.start = n;
4084
4085 blackCellsToAddMod.physCellIdRange.haveRange = isRangePresent[0];
4086 // initialize range to silence compiler warning
4087 blackCellsToAddMod.physCellIdRange.range = 0;
4088 if (blackCellsToAddMod.physCellIdRange.haveRange)
4089 {
4090 // range
4091 bIterator = DeserializeEnum(16, &n, bIterator);
4092 switch (n)
4093 {
4094 case 0:
4095 blackCellsToAddMod.physCellIdRange.range = 4;
4096 break;
4097 case 1:
4098 blackCellsToAddMod.physCellIdRange.range = 8;
4099 break;
4100 case 2:
4101 blackCellsToAddMod.physCellIdRange.range = 12;
4102 break;
4103 case 3:
4104 blackCellsToAddMod.physCellIdRange.range = 16;
4105 break;
4106 case 4:
4107 blackCellsToAddMod.physCellIdRange.range = 24;
4108 break;
4109 case 5:
4110 blackCellsToAddMod.physCellIdRange.range = 32;
4111 break;
4112 case 6:
4113 blackCellsToAddMod.physCellIdRange.range = 48;
4114 break;
4115 case 7:
4116 blackCellsToAddMod.physCellIdRange.range = 64;
4117 break;
4118 case 8:
4119 blackCellsToAddMod.physCellIdRange.range = 84;
4120 break;
4121 case 9:
4122 blackCellsToAddMod.physCellIdRange.range = 96;
4123 break;
4124 case 10:
4125 blackCellsToAddMod.physCellIdRange.range = 128;
4126 break;
4127 case 11:
4128 blackCellsToAddMod.physCellIdRange.range = 168;
4129 break;
4130 case 12:
4131 blackCellsToAddMod.physCellIdRange.range = 252;
4132 break;
4133 case 13:
4134 blackCellsToAddMod.physCellIdRange.range = 504;
4135 break;
4136 default:
4137 blackCellsToAddMod.physCellIdRange.range = 0;
4138 }
4139 }
4140
4141 elem.measObjectEutra.blackCellsToAddModList.push_back(blackCellsToAddMod);
4142 }
4143 }
4144
4145 elem.measObjectEutra.haveCellForWhichToReportCGI = measObjectEutraOpts[0];
4146 if (measObjectEutraOpts[0])
4147 {
4148 // cellForWhichToReportCGI
4149 bIterator = DeserializeInteger(&n, 0, 503, bIterator);
4151 }
4152 }
4153 measConfig->measObjectToAddModList.push_back(elem);
4154 }
4155 }
4156
4157 if (bitset11[8])
4158 {
4159 // reportConfigToRemoveList
4160 int reportConfigToRemoveListElems;
4161 bIterator = DeserializeSequenceOf(&reportConfigToRemoveListElems,
4163 1,
4164 bIterator);
4165
4166 for (int i = 0; i < reportConfigToRemoveListElems; i++)
4167 {
4168 bIterator = DeserializeInteger(&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
4169 measConfig->reportConfigToRemoveList.push_back(n);
4170 }
4171 }
4172
4173 if (bitset11[7])
4174 {
4175 // reportConfigToAddModList
4176 int reportConfigToAddModListElems;
4177 bIterator = DeserializeSequenceOf(&reportConfigToAddModListElems,
4179 1,
4180 bIterator);
4181
4182 for (int i = 0; i < reportConfigToAddModListElems; i++)
4183 {
4185
4186 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4187 bIterator = DeserializeInteger(&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
4188 elem.reportConfigId = n;
4189
4190 // Deserialize reportConfig
4191 int reportConfigChoice;
4192 bIterator = DeserializeChoice(2, false, &reportConfigChoice, bIterator);
4193
4194 if (reportConfigChoice == 0)
4195 {
4196 // reportConfigEUTRA
4197 bIterator = DeserializeSequence(&bitset0, true, bIterator);
4198
4199 // triggerType
4200 int triggerTypeChoice;
4201 bIterator = DeserializeChoice(2, false, &triggerTypeChoice, bIterator);
4202
4203 if (triggerTypeChoice == 0)
4204 {
4205 // event
4207 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4208
4209 // eventId
4210 int eventIdChoice;
4211 bIterator = DeserializeChoice(5, true, &eventIdChoice, bIterator);
4212
4213 switch (eventIdChoice)
4214 {
4215 case 0:
4217 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4219 bIterator);
4220 break;
4221
4222 case 1:
4224 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4226 bIterator);
4227 break;
4228
4229 case 2:
4231 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4232 bIterator = DeserializeInteger(&n, -30, 30, bIterator);
4233 elem.reportConfigEutra.a3Offset = n;
4234 bIterator =
4236 break;
4237
4238 case 3:
4240 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4242 bIterator);
4243 break;
4244
4245 case 4:
4246 default:
4248 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4250 bIterator);
4252 bIterator);
4253 }
4254
4255 bIterator = DeserializeInteger(&n, 0, 30, bIterator);
4257
4258 bIterator = DeserializeEnum(16, &n, bIterator);
4259 switch (n)
4260 {
4261 case 0:
4263 break;
4264 case 1:
4266 break;
4267 case 2:
4269 break;
4270 case 3:
4272 break;
4273 case 4:
4275 break;
4276 case 5:
4278 break;
4279 case 6:
4281 break;
4282 case 7:
4284 break;
4285 case 8:
4287 break;
4288 case 9:
4290 break;
4291 case 10:
4293 break;
4294 case 11:
4296 break;
4297 case 12:
4298 elem.reportConfigEutra.timeToTrigger = 1024;
4299 break;
4300 case 13:
4301 elem.reportConfigEutra.timeToTrigger = 1280;
4302 break;
4303 case 14:
4304 elem.reportConfigEutra.timeToTrigger = 2560;
4305 break;
4306 case 15:
4307 default:
4308 elem.reportConfigEutra.timeToTrigger = 5120;
4309 break;
4310 }
4311 }
4312
4313 if (triggerTypeChoice == 1)
4314 {
4315 // periodical
4317
4318 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4319 bIterator = DeserializeEnum(2, &n, bIterator);
4320 if (n == 0)
4321 {
4324 }
4325 else
4326 {
4328 }
4329 }
4330
4331 // triggerQuantity
4332 bIterator = DeserializeEnum(2, &n, bIterator);
4333 if (n == 0)
4334 {
4336 }
4337 else
4338 {
4340 }
4341
4342 // reportQuantity
4343 bIterator = DeserializeEnum(2, &n, bIterator);
4344 if (n == 0)
4345 {
4348 }
4349 else
4350 {
4352 }
4353
4354 // maxReportCells
4355 bIterator = DeserializeInteger(&n, 1, MAX_CELL_REPORT, bIterator);
4357
4358 // reportInterval
4359 bIterator = DeserializeEnum(16, &n, bIterator);
4360 switch (n)
4361 {
4362 case 0:
4364 break;
4365 case 1:
4367 break;
4368 case 2:
4370 break;
4371 case 3:
4373 break;
4374 case 4:
4376 break;
4377 case 5:
4379 break;
4380 case 6:
4382 break;
4383 case 7:
4385 break;
4386 case 8:
4388 break;
4389 case 9:
4391 break;
4392 case 10:
4394 break;
4395 case 11:
4397 break;
4398 case 12:
4400 break;
4401 case 13:
4403 break;
4404 case 14:
4406 break;
4407 case 15:
4408 default:
4410 }
4411
4412 // reportAmount
4413 bIterator = DeserializeEnum(8, &n, bIterator);
4414 switch (n)
4415 {
4416 case 0:
4418 break;
4419 case 1:
4421 break;
4422 case 2:
4424 break;
4425 case 3:
4427 break;
4428 case 4:
4430 break;
4431 case 5:
4433 break;
4434 case 6:
4436 break;
4437 default:
4439 }
4440 }
4441
4442 if (reportConfigChoice == 1)
4443 {
4444 // ReportConfigInterRAT
4445 // ...
4446 }
4447
4448 measConfig->reportConfigToAddModList.push_back(elem);
4449 }
4450 }
4451
4452 if (bitset11[6])
4453 {
4454 // measIdToRemoveList
4455 int measIdToRemoveListElems;
4456 bIterator = DeserializeSequenceOf(&measIdToRemoveListElems, MAX_MEAS_ID, 1, bIterator);
4457
4458 for (int i = 0; i < measIdToRemoveListElems; i++)
4459 {
4460 bIterator = DeserializeInteger(&n, 1, MAX_MEAS_ID, bIterator);
4461 measConfig->measIdToRemoveList.push_back(n);
4462 }
4463 }
4464
4465 if (bitset11[5])
4466 {
4467 // measIdToAddModList
4468 int measIdToAddModListElems;
4469 bIterator = DeserializeSequenceOf(&measIdToAddModListElems, MAX_MEAS_ID, 1, bIterator);
4470
4471 for (int i = 0; i < measIdToAddModListElems; i++)
4472 {
4474
4475 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4476
4477 bIterator = DeserializeInteger(&n, 1, MAX_MEAS_ID, bIterator);
4478 elem.measId = n;
4479
4480 bIterator = DeserializeInteger(&n, 1, MAX_OBJECT_ID, bIterator);
4481 elem.measObjectId = n;
4482
4483 bIterator = DeserializeInteger(&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
4484 elem.reportConfigId = n;
4485
4486 measConfig->measIdToAddModList.push_back(elem);
4487 }
4488 }
4489
4490 measConfig->haveQuantityConfig = bitset11[4];
4491 if (measConfig->haveQuantityConfig)
4492 {
4493 // quantityConfig
4494 std::bitset<4> quantityConfigOpts;
4495 bIterator = DeserializeSequence(&quantityConfigOpts, true, bIterator);
4496
4497 if (quantityConfigOpts[3])
4498 {
4499 // quantityConfigEUTRA
4500 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4501 bIterator = DeserializeEnum(16, &n, bIterator);
4502 switch (n)
4503 {
4504 case 0:
4505 measConfig->quantityConfig.filterCoefficientRSRP = 0;
4506 break;
4507 case 1:
4508 measConfig->quantityConfig.filterCoefficientRSRP = 1;
4509 break;
4510 case 2:
4511 measConfig->quantityConfig.filterCoefficientRSRP = 2;
4512 break;
4513 case 3:
4514 measConfig->quantityConfig.filterCoefficientRSRP = 3;
4515 break;
4516 case 4:
4517 measConfig->quantityConfig.filterCoefficientRSRP = 4;
4518 break;
4519 case 5:
4520 measConfig->quantityConfig.filterCoefficientRSRP = 5;
4521 break;
4522 case 6:
4523 measConfig->quantityConfig.filterCoefficientRSRP = 6;
4524 break;
4525 case 7:
4526 measConfig->quantityConfig.filterCoefficientRSRP = 7;
4527 break;
4528 case 8:
4529 measConfig->quantityConfig.filterCoefficientRSRP = 8;
4530 break;
4531 case 9:
4532 measConfig->quantityConfig.filterCoefficientRSRP = 9;
4533 break;
4534 case 10:
4535 measConfig->quantityConfig.filterCoefficientRSRP = 11;
4536 break;
4537 case 11:
4538 measConfig->quantityConfig.filterCoefficientRSRP = 13;
4539 break;
4540 case 12:
4541 measConfig->quantityConfig.filterCoefficientRSRP = 15;
4542 break;
4543 case 13:
4544 measConfig->quantityConfig.filterCoefficientRSRP = 17;
4545 break;
4546 case 14:
4547 measConfig->quantityConfig.filterCoefficientRSRP = 19;
4548 break;
4549 case 15:
4550 measConfig->quantityConfig.filterCoefficientRSRP = 0;
4551 break;
4552 default:
4553 measConfig->quantityConfig.filterCoefficientRSRP = 4;
4554 }
4555 bIterator = DeserializeEnum(16, &n, bIterator);
4556 switch (n)
4557 {
4558 case 0:
4559 measConfig->quantityConfig.filterCoefficientRSRQ = 0;
4560 break;
4561 case 1:
4562 measConfig->quantityConfig.filterCoefficientRSRQ = 1;
4563 break;
4564 case 2:
4565 measConfig->quantityConfig.filterCoefficientRSRQ = 2;
4566 break;
4567 case 3:
4568 measConfig->quantityConfig.filterCoefficientRSRQ = 3;
4569 break;
4570 case 4:
4571 measConfig->quantityConfig.filterCoefficientRSRQ = 4;
4572 break;
4573 case 5:
4574 measConfig->quantityConfig.filterCoefficientRSRQ = 5;
4575 break;
4576 case 6:
4577 measConfig->quantityConfig.filterCoefficientRSRQ = 6;
4578 break;
4579 case 7:
4580 measConfig->quantityConfig.filterCoefficientRSRQ = 7;
4581 break;
4582 case 8:
4583 measConfig->quantityConfig.filterCoefficientRSRQ = 8;
4584 break;
4585 case 9:
4586 measConfig->quantityConfig.filterCoefficientRSRQ = 9;
4587 break;
4588 case 10:
4589 measConfig->quantityConfig.filterCoefficientRSRQ = 11;
4590 break;
4591 case 11:
4592 measConfig->quantityConfig.filterCoefficientRSRQ = 13;
4593 break;
4594 case 12:
4595 measConfig->quantityConfig.filterCoefficientRSRQ = 15;
4596 break;
4597 case 13:
4598 measConfig->quantityConfig.filterCoefficientRSRQ = 17;
4599 break;
4600 case 14:
4601 measConfig->quantityConfig.filterCoefficientRSRQ = 19;
4602 break;
4603 case 15:
4604 measConfig->quantityConfig.filterCoefficientRSRQ = 0;
4605 break;
4606 default:
4607 measConfig->quantityConfig.filterCoefficientRSRQ = 4;
4608 }
4609 }
4610 if (quantityConfigOpts[2])
4611 {
4612 // quantityConfigUTRA
4613 // ...
4614 }
4615 if (quantityConfigOpts[1])
4616 {
4617 // quantityConfigGERAN
4618 // ...
4619 }
4620 if (quantityConfigOpts[0])
4621 {
4622 // quantityConfigCDMA2000
4623 // ...
4624 }
4625 }
4626
4627 measConfig->haveMeasGapConfig = bitset11[3];
4628 if (measConfig->haveMeasGapConfig)
4629 {
4630 // measGapConfig
4631 int measGapConfigChoice;
4632 bIterator = DeserializeChoice(2, false, &measGapConfigChoice, bIterator);
4633 switch (measGapConfigChoice)
4634 {
4635 case 0:
4637 bIterator = DeserializeNull(bIterator);
4638 break;
4639 case 1:
4640 default:
4642 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4643
4644 int gapOffsetChoice;
4645 bIterator = DeserializeChoice(2, true, &gapOffsetChoice, bIterator);
4646 switch (gapOffsetChoice)
4647 {
4648 case 0:
4650 bIterator = DeserializeInteger(&n, 0, 39, bIterator);
4651 measConfig->measGapConfig.gapOffsetValue = n;
4652 break;
4653 case 1:
4654 default:
4656 bIterator = DeserializeInteger(&n, 0, 79, bIterator);
4657 measConfig->measGapConfig.gapOffsetValue = n;
4658 }
4659 }
4660 }
4661
4662 measConfig->haveSmeasure = bitset11[2];
4663 if (measConfig->haveSmeasure)
4664 {
4665 // s-Measure
4666 bIterator = DeserializeInteger(&n, 0, 97, bIterator);
4667 measConfig->sMeasure = n;
4668 }
4669
4670 if (bitset11[1])
4671 {
4672 // preRegistrationInfoHRPD
4673 // ...
4674 }
4675
4676 measConfig->haveSpeedStatePars = bitset11[0];
4677 if (measConfig->haveSpeedStatePars)
4678 {
4679 // speedStatePars
4680 int speedStateParsChoice;
4681 bIterator = DeserializeChoice(2, false, &speedStateParsChoice, bIterator);
4682 switch (speedStateParsChoice)
4683 {
4684 case 0:
4686 bIterator = DeserializeNull(bIterator);
4687 break;
4688 case 1:
4689 default:
4691 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4692
4693 // Deserialize mobilityStateParameters
4694 // Deserialize t-Evaluation
4695 bIterator = DeserializeEnum(8, &n, bIterator);
4696 switch (n)
4697 {
4698 case 0:
4700 break;
4701 case 1:
4703 break;
4704 case 2:
4706 break;
4707 case 3:
4709 break;
4710 case 4:
4712 break;
4713 default:
4715 }
4716 // Deserialize t-HystNormal
4717 bIterator = DeserializeEnum(8, &n, bIterator);
4718 switch (n)
4719 {
4720 case 0:
4722 break;
4723 case 1:
4725 break;
4726 case 2:
4728 break;
4729 case 3:
4731 break;
4732 case 4:
4734 break;
4735 default:
4737 }
4738
4739 bIterator = DeserializeInteger(&n, 1, 16, bIterator);
4741
4742 bIterator = DeserializeInteger(&n, 1, 16, bIterator);
4744
4745 // Deserialize timeToTriggerSf
4746 bIterator = DeserializeEnum(4, &n, bIterator);
4747 measConfig->speedStatePars.timeToTriggerSf.sfMedium = (n + 1) * 25;
4748 bIterator = DeserializeEnum(4, &n, bIterator);
4749 measConfig->speedStatePars.timeToTriggerSf.sfHigh = (n + 1) * 25;
4750 }
4751 }
4752 return bIterator;
4753}
4754
4755//////////////////// RrcConnectionRequest class ////////////////////////
4756
4757// Constructor
4760{
4761 m_mmec = std::bitset<8>(0UL);
4762 m_mTmsi = std::bitset<32>(0UL);
4764 m_spare = std::bitset<1>(0UL);
4765}
4766
4767// Destructor
4771
4772TypeId
4774{
4775 static TypeId tid =
4776 TypeId("ns3::RrcConnectionRequestHeader").SetParent<Header>().SetGroupName("Lte");
4777 return tid;
4778}
4779
4780void
4782{
4783 os << "MMEC:" << m_mmec << std::endl;
4784 os << "MTMSI:" << m_mTmsi << std::endl;
4785 os << "EstablishmentCause:" << m_establishmentCause << std::endl;
4786 os << "Spare: " << m_spare << std::endl;
4787}
4788
4789void
4791{
4793
4795
4796 // Serialize RRCConnectionRequest sequence:
4797 // no default or optional fields. Extension marker not present.
4798 SerializeSequence(std::bitset<0>(), false);
4799
4800 // Serialize criticalExtensions choice:
4801 // 2 options, selected: 0 (option: rrcConnectionRequest-r8)
4802 SerializeChoice(2, 0, false);
4803
4804 // Serialize RRCConnectionRequest-r8-IEs sequence:
4805 // no default or optional fields. Extension marker not present.
4806 SerializeSequence(std::bitset<0>(), false);
4807
4808 // Serialize InitialUE-Identity choice:
4809 // 2 options, selected: 0 (option: s-TMSI)
4810 SerializeChoice(2, 0, false);
4811
4812 // Serialize S-TMSI sequence:
4813 // no default or optional fields. Extension marker not present.
4814 SerializeSequence(std::bitset<0>(), false);
4815
4816 // Serialize mmec : MMEC ::= BIT STRING (SIZE (8))
4818
4819 // Serialize m-TMSI ::= BIT STRING (SIZE (32))
4821
4822 // Serialize establishmentCause : EstablishmentCause ::= ENUMERATED
4824
4825 // Serialize spare : BIT STRING (SIZE (1))
4826 SerializeBitstring(std::bitset<1>());
4827
4828 // Finish serialization
4830}
4831
4834{
4835 std::bitset<1> dummy;
4836 std::bitset<0> optionalOrDefaultMask;
4837 int selectedOption;
4838
4839 bIterator = DeserializeUlCcchMessage(bIterator);
4840
4841 // Deserialize RCConnectionRequest sequence
4842 bIterator = DeserializeSequence(&optionalOrDefaultMask, false, bIterator);
4843
4844 // Deserialize criticalExtensions choice:
4845 bIterator = DeserializeChoice(2, false, &selectedOption, bIterator);
4846
4847 // Deserialize RRCConnectionRequest-r8-IEs sequence
4848 bIterator = DeserializeSequence(&optionalOrDefaultMask, false, bIterator);
4849
4850 // Deserialize InitialUE-Identity choice
4851 bIterator = DeserializeChoice(2, false, &selectedOption, bIterator);
4852
4853 // Deserialize S-TMSI sequence
4854 bIterator = DeserializeSequence(&optionalOrDefaultMask, false, bIterator);
4855
4856 // Deserialize mmec
4857 bIterator = DeserializeBitstring(&m_mmec, bIterator);
4858
4859 // Deserialize m-TMSI
4860 bIterator = DeserializeBitstring(&m_mTmsi, bIterator);
4861
4862 // Deserialize establishmentCause
4863 bIterator = DeserializeEnum(8, &selectedOption, bIterator);
4864
4865 // Deserialize spare
4866 bIterator = DeserializeBitstring(&dummy, bIterator);
4867
4868 return GetSerializedSize();
4869}
4870
4871void
4873{
4874 m_mTmsi = std::bitset<32>((uint32_t)msg.ueIdentity);
4875 m_mmec = std::bitset<8>((uint32_t)(msg.ueIdentity >> 32));
4876 m_isDataSerialized = false;
4877}
4878
4881{
4883 msg.ueIdentity = (((uint64_t)m_mmec.to_ulong()) << 32) | (m_mTmsi.to_ulong());
4884
4885 return msg;
4886}
4887
4888std::bitset<8>
4890{
4891 return m_mmec;
4892}
4893
4894std::bitset<32>
4896{
4897 return m_mTmsi;
4898}
4899
4900//////////////////// RrcConnectionSetup class ////////////////////////
4904
4908
4909void
4910RrcConnectionSetupHeader::Print(std::ostream& os) const
4911{
4912 os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
4913 os << "radioResourceConfigDedicated:" << std::endl;
4915}
4916
4917void
4919{
4921
4923
4924 SerializeInteger(15, 0, 15);
4925
4926 // Serialize RRCConnectionSetup sequence:
4927 // no default or optional fields. Extension marker not present.
4928 SerializeSequence(std::bitset<0>(), false);
4929
4930 // Serialize rrc-TransactionIdentifier ::=INTEGER (0..3)
4932
4933 // Serialize criticalExtensions choice:
4934 // 2 options, selected: 0 (option: c1)
4935 SerializeChoice(2, 0, false);
4936
4937 // Serialize c1 choice:
4938 // 8 options, selected: 0 (option: rrcConnectionSetup-r8)
4939 SerializeChoice(8, 0, false);
4940
4941 // Serialize rrcConnectionSetup-r8 sequence
4942 // 1 optional fields (not present). Extension marker not present.
4943 SerializeSequence(std::bitset<1>(0), false);
4944
4945 // Serialize RadioResourceConfigDedicated sequence
4947
4948 // Serialize nonCriticalExtension sequence
4949 // 2 optional fields, none present. No extension marker.
4950 SerializeSequence(std::bitset<2>(0), false);
4951
4952 // Finish serialization
4954}
4955
4958{
4959 int n;
4960
4961 std::bitset<0> bitset0;
4962 std::bitset<1> bitset1;
4963 std::bitset<2> bitset2;
4964
4965 bIterator = DeserializeDlCcchMessage(bIterator);
4966
4967 bIterator = DeserializeInteger(&n, 0, 15, bIterator);
4968
4969 // Deserialize RRCConnectionSetup sequence
4970 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4971
4972 // Deserialize rrc-TransactionIdentifier ::=INTEGER (0..3)
4973 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
4975
4976 // Deserialize criticalExtensions choice
4977 int criticalExtensionChoice;
4978 bIterator = DeserializeChoice(2, false, &criticalExtensionChoice, bIterator);
4979 if (criticalExtensionChoice == 1)
4980 {
4981 // Deserialize criticalExtensionsFuture
4982 bIterator = DeserializeSequence(&bitset0, false, bIterator);
4983 }
4984 else if (criticalExtensionChoice == 0)
4985 {
4986 // Deserialize c1
4987 int c1;
4988 bIterator = DeserializeChoice(8, false, &c1, bIterator);
4989
4990 if (c1 > 0)
4991 {
4992 // Deserialize spareX , X:=7..1
4993 bIterator = DeserializeNull(bIterator);
4994 }
4995 else if (c1 == 0)
4996 {
4997 // Deserialize rrcConnectionSetup-r8
4998 // 1 optional fields, no extension marker.
4999 bIterator = DeserializeSequence(&bitset1, false, bIterator);
5000
5001 // Deserialize radioResourceConfigDedicated
5002 bIterator =
5004
5005 if (bitset1[0])
5006 {
5007 // Deserialize nonCriticalExtension
5008 // 2 optional fields, no extension marker.
5009 bIterator = DeserializeSequence(&bitset2, false, bIterator);
5010
5011 // Deserialization of lateR8NonCriticalExtension and nonCriticalExtension
5012 // ...
5013 }
5014 }
5015 }
5016 return GetSerializedSize();
5017}
5018
5019void
5026
5035
5036uint8_t
5041
5042bool
5044{
5045 return m_radioResourceConfigDedicated.havePhysicalConfigDedicated;
5046}
5047
5048std::list<LteRrcSap::SrbToAddMod>
5053
5054std::list<LteRrcSap::DrbToAddMod>
5059
5060std::list<uint8_t>
5065
5068{
5069 return m_radioResourceConfigDedicated.physicalConfigDedicated;
5070}
5071
5077
5078//////////////////// RrcConnectionSetupCompleteHeader class ////////////////////////
5079
5083
5087
5088void
5090{
5092
5093 // Serialize DCCH message
5095
5096 // Serialize RRCConnectionSetupComplete sequence:
5097 // no default or optional fields. Extension marker not present.
5098 SerializeSequence(std::bitset<0>(), false);
5099
5100 // Serialize rrc-TransactionIdentifier
5102
5103 // Serialize criticalExtensions choice
5104 // 2 options, selected 0 (c1)
5105 SerializeChoice(2, 0, false);
5106
5107 // Choose spare3 NULL
5108 SerializeChoice(4, 1, false);
5109
5110 // Serialize spare3 NULL
5111 SerializeNull();
5112
5113 // Finish serialization
5115}
5116
5119{
5120 std::bitset<0> bitset0;
5121
5122 bIterator = DeserializeUlDcchMessage(bIterator);
5123
5124 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5125
5126 int n;
5127 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
5129
5130 bIterator = DeserializeChoice(2, false, &n, bIterator);
5131
5132 if (n == 1)
5133 {
5134 // Deserialize criticalExtensionsFuture
5135 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5136 }
5137 else if (n == 0)
5138 {
5139 // Deserialize c1
5140 int c1Chosen;
5141 bIterator = DeserializeChoice(4, false, &c1Chosen, bIterator);
5142
5143 if (c1Chosen == 0)
5144 {
5145 // Deserialize rrcConnectionSetupComplete-r8
5146 // ...
5147 }
5148 else
5149 {
5150 bIterator = DeserializeNull(bIterator);
5151 }
5152 }
5153
5154 return GetSerializedSize();
5155}
5156
5157void
5159{
5160 os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
5161}
5162
5163void
5169
5170uint8_t
5175
5183
5184//////////////////// RrcConnectionReconfigurationCompleteHeader class ////////////////////////
5185
5189
5193
5194void
5196{
5198
5199 // Serialize DCCH message
5201
5202 // Serialize RRCConnectionSetupComplete sequence:
5203 // no default or optional fields. Extension marker not present.
5204 SerializeSequence(std::bitset<0>(), false);
5205
5206 // Serialize rrc-TransactionIdentifier
5208
5209 // Serialize criticalExtensions choice
5210 // 2 options, selected 1 (criticalExtensionsFuture)
5211 SerializeChoice(2, 1, false);
5212
5213 // Choose criticalExtensionsFuture
5214 SerializeSequence(std::bitset<0>(), false);
5215
5216 // Finish serialization
5218}
5219
5222{
5223 std::bitset<0> bitset0;
5224 int n;
5225
5226 bIterator = DeserializeUlDcchMessage(bIterator);
5227 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5228
5229 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
5231
5232 bIterator = DeserializeChoice(2, false, &n, bIterator);
5233
5234 if (n == 1)
5235 {
5236 // Deserialize criticalExtensionsFuture
5237 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5238 }
5239 else if (n == 0)
5240 {
5241 // Deserialize rrcConnectionReconfigurationComplete-r8
5242 // ...
5243 }
5244
5245 return GetSerializedSize();
5246}
5247
5248void
5250{
5251 os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
5252}
5253
5254void
5261
5269
5270uint8_t
5275
5276//////////////////// RrcConnectionReconfigurationHeader class ////////////////////////
5277
5281
5285
5286void
5288{
5290
5292
5293 // Serialize RRCConnectionSetupComplete sequence:
5294 // no default or optional fields. Extension marker not present.
5295 SerializeSequence(std::bitset<0>(), false);
5296
5297 // Serialize rrc-TransactionIdentifier
5299
5300 // Serialize criticalExtensions choice
5301 // 2 options, selected 0 (c1)
5302 SerializeChoice(2, 0, false);
5303
5304 // Serialize c1 choice
5305 // 8 options, selected 0 (rrcConnectionReconfiguration-r8)
5306 SerializeChoice(8, 0, false);
5307
5308 // Serialize RRCConnectionReconfiguration-r8-IEs sequence:
5309 // 6 optional fields. Extension marker not present.
5310 std::bitset<6> options;
5311 options.set(5, m_haveMeasConfig);
5312 options.set(4, m_haveMobilityControlInfo);
5313 options.set(3, false); // No dedicatedInfoNASList
5314 options.set(2, m_haveRadioResourceConfigDedicated);
5315 options.set(1, false); // No securityConfigHO
5316 options.set(0, m_haveNonCriticalExtension); // Implemented nonCriticalExtension because
5317 // compatibility with R10 - CA
5318 SerializeSequence(options, false);
5319
5320 if (m_haveMeasConfig)
5321 {
5323 }
5324
5326 {
5327 // Serialize MobilityControlInfo
5328
5329 // 4 optional fields, extension marker present.
5330 std::bitset<4> mobCtrlIntoOptional;
5331 mobCtrlIntoOptional.set(3, m_mobilityControlInfo.haveCarrierFreq);
5332 mobCtrlIntoOptional.set(2, m_mobilityControlInfo.haveCarrierBandwidth);
5333 mobCtrlIntoOptional.set(1, false); // No additionalSpectrumEmission
5334 mobCtrlIntoOptional.set(0, m_mobilityControlInfo.haveRachConfigDedicated);
5335 SerializeSequence(mobCtrlIntoOptional, true);
5336
5337 // Serialize targetPhysCellId
5338 SerializeInteger(m_mobilityControlInfo.targetPhysCellId, 0, 503);
5339
5340 if (m_mobilityControlInfo.haveCarrierFreq)
5341 {
5342 SerializeSequence(std::bitset<1>(1), false);
5343 SerializeInteger(m_mobilityControlInfo.carrierFreq.dlCarrierFreq, 0, MAX_EARFCN);
5344 SerializeInteger(m_mobilityControlInfo.carrierFreq.ulCarrierFreq, 0, MAX_EARFCN);
5345 }
5346
5347 if (m_mobilityControlInfo.haveCarrierBandwidth)
5348 {
5349 SerializeSequence(std::bitset<1>(1), false);
5350
5351 // Serialize dl-Bandwidth
5352 SerializeEnum(16, BandwidthToEnum(m_mobilityControlInfo.carrierBandwidth.dlBandwidth));
5353
5354 // Serialize ul-Bandwidth
5355 SerializeEnum(16, BandwidthToEnum(m_mobilityControlInfo.carrierBandwidth.ulBandwidth));
5356 }
5357
5358 // Serialize t304
5359 SerializeEnum(8, 0);
5360
5361 // Serialize newUE-Identity
5362 SerializeBitstring(std::bitset<16>(m_mobilityControlInfo.newUeIdentity));
5363
5364 // Serialize radioResourceConfigCommon
5366
5367 if (m_mobilityControlInfo.haveRachConfigDedicated)
5368 {
5369 SerializeSequence(std::bitset<0>(), false);
5370 SerializeInteger(m_mobilityControlInfo.rachConfigDedicated.raPreambleIndex, 0, 63);
5371 SerializeInteger(m_mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex, 0, 15);
5372 }
5373 }
5374
5376 {
5377 // Serialize RadioResourceConfigDedicated
5379 }
5380
5382 {
5383 // Serialize NonCriticalExtension RRCConnectionReconfiguration-v890-IEs sequence:
5384 // 2 optional fields. Extension marker not present.
5385 std::bitset<2> noncriticalExtension_v890;
5386 noncriticalExtension_v890.set(1, false); // No lateNonCriticalExtension
5387 noncriticalExtension_v890.set(
5388 0,
5389 m_haveNonCriticalExtension); // Implemented nonCriticalExtension because compatibility
5390 // with R10 - CA
5391 // Enable RRCCoonectionReconfiguration-v920-IEs
5392 SerializeSequence(noncriticalExtension_v890, false);
5393
5394 // Serialize NonCriticalExtension RRCConnectionReconfiguration-v920-IEs sequence:
5395 // 3 optional fields. Extension marker not present.
5396 std::bitset<3> noncriticalExtension_v920;
5397 noncriticalExtension_v920.set(1, false); // No otherConfig-r9
5398 noncriticalExtension_v920.set(1, false); // No fullConfig-r9
5399 // Enable RRCCoonectionReconfiguration-v1020-IEs
5400 noncriticalExtension_v920.set(
5401 0,
5402 m_haveNonCriticalExtension); // Implemented nonCriticalExtension because compatibility
5403 // with R10 - CA
5404 SerializeSequence(noncriticalExtension_v920, false);
5405
5407 m_nonCriticalExtension); // Serializing RRCConnectionReconfiguration-r8-IEs
5408 }
5409
5410 // Finish serialization
5412}
5413
5416{
5417 std::bitset<0> bitset0;
5418
5419 bIterator = DeserializeDlDcchMessage(bIterator);
5420
5421 // RRCConnectionReconfiguration sequence
5422 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5423
5424 // rrc-TransactionIdentifier
5425 int n;
5426 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
5428
5429 // criticalExtensions
5430 int sel;
5431 bIterator = DeserializeChoice(2, false, &sel, bIterator);
5432 if (sel == 1)
5433 {
5434 // criticalExtensionsFuture
5435 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5436 }
5437 else if (sel == 0)
5438 {
5439 // c1
5440 int c1Chosen;
5441 bIterator = DeserializeChoice(8, false, &c1Chosen, bIterator);
5442 if (c1Chosen > 0)
5443 {
5444 bIterator = DeserializeNull(bIterator);
5445 }
5446 else if (c1Chosen == 0)
5447 {
5448 // rrcConnectionReconfiguration-r8
5449 std::bitset<6> rrcConnRecOpts;
5450 bIterator = DeserializeSequence(&rrcConnRecOpts, false, bIterator);
5451
5452 m_haveMeasConfig = rrcConnRecOpts[5];
5453 if (m_haveMeasConfig)
5454 {
5455 bIterator = DeserializeMeasConfig(&m_measConfig, bIterator);
5456 }
5457
5458 m_haveMobilityControlInfo = rrcConnRecOpts[4];
5460 {
5461 // mobilityControlInfo
5462 std::bitset<4> mobCtrlOpts;
5463 bIterator = DeserializeSequence(&mobCtrlOpts, true, bIterator);
5464
5465 // PhysCellId
5466 bIterator = DeserializeInteger(&n, 0, 503, bIterator);
5467 m_mobilityControlInfo.targetPhysCellId = n;
5468
5469 // carrierFreq
5470 m_mobilityControlInfo.haveCarrierFreq = mobCtrlOpts[3];
5471 if (m_mobilityControlInfo.haveCarrierFreq)
5472 {
5473 std::bitset<1> ulCarrierFreqPresent;
5474 bIterator = DeserializeSequence(&ulCarrierFreqPresent, false, bIterator);
5475
5476 bIterator = DeserializeInteger(&n, 0, MAX_EARFCN, bIterator);
5477 m_mobilityControlInfo.carrierFreq.dlCarrierFreq = n;
5478
5479 if (ulCarrierFreqPresent[0])
5480 {
5481 bIterator = DeserializeInteger(&n, 0, MAX_EARFCN, bIterator);
5482 m_mobilityControlInfo.carrierFreq.ulCarrierFreq = n;
5483 }
5484 }
5485
5486 // carrierBandwidth
5487 m_mobilityControlInfo.haveCarrierBandwidth = mobCtrlOpts[2];
5488 if (m_mobilityControlInfo.haveCarrierBandwidth)
5489 {
5490 std::bitset<1> ulBandwidthPresent;
5491 bIterator = DeserializeSequence(&ulBandwidthPresent, false, bIterator);
5492
5493 bIterator = DeserializeEnum(16, &n, bIterator);
5494 m_mobilityControlInfo.carrierBandwidth.dlBandwidth = EnumToBandwidth(n);
5495
5496 if (ulBandwidthPresent[0])
5497 {
5498 bIterator = DeserializeEnum(16, &n, bIterator);
5499 m_mobilityControlInfo.carrierBandwidth.ulBandwidth = EnumToBandwidth(n);
5500 }
5501 }
5502
5503 // additionalSpectrumEmission
5504 if (mobCtrlOpts[1])
5505 {
5506 // ...
5507 }
5508
5509 // t304
5510 bIterator = DeserializeEnum(8, &n, bIterator);
5511
5512 // newUE-Identity
5513 std::bitset<16> cRnti;
5514 bIterator = DeserializeBitstring(&cRnti, bIterator);
5515 m_mobilityControlInfo.newUeIdentity = cRnti.to_ulong();
5516
5517 // radioResourceConfigCommon
5519 &m_mobilityControlInfo.radioResourceConfigCommon,
5520 bIterator);
5521
5522 m_mobilityControlInfo.haveRachConfigDedicated = mobCtrlOpts[0];
5523 if (m_mobilityControlInfo.haveRachConfigDedicated)
5524 {
5525 bIterator = DeserializeSequence(&bitset0, false, bIterator);
5526 bIterator = DeserializeInteger(&n, 0, 63, bIterator);
5527 m_mobilityControlInfo.rachConfigDedicated.raPreambleIndex = n;
5528 bIterator = DeserializeInteger(&n, 0, 15, bIterator);
5529 m_mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = n;
5530 }
5531 }
5532
5533 // dedicatedInfoNASList
5534 if (rrcConnRecOpts[3])
5535 {
5536 // ...
5537 }
5538
5539 // radioResourceConfigDedicated
5540 m_haveRadioResourceConfigDedicated = rrcConnRecOpts[2];
5542 {
5544 bIterator);
5545 }
5546
5547 // securityConfigHO
5548 if (rrcConnRecOpts[1])
5549 {
5550 // ...
5551 }
5552
5553 // nonCriticalExtension
5554 m_haveNonCriticalExtension = rrcConnRecOpts[0];
5556 {
5557 bIterator =
5559 // ...
5560 }
5561 }
5562 }
5563
5564 return GetSerializedSize();
5565}
5566
5567void
5569{
5570 os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
5571 os << "haveMeasConfig: " << m_haveMeasConfig << std::endl;
5572 if (m_haveMeasConfig)
5573 {
5574 if (!m_measConfig.measObjectToRemoveList.empty())
5575 {
5576 os << " measObjectToRemoveList: ";
5577 std::list<uint8_t> auxList = m_measConfig.measObjectToRemoveList;
5578 auto it = auxList.begin();
5579 for (; it != auxList.end(); it++)
5580 {
5581 os << (int)*it << ", ";
5582 }
5583 os << std::endl;
5584 }
5585 if (!m_measConfig.reportConfigToRemoveList.empty())
5586 {
5587 os << " reportConfigToRemoveList: ";
5588 std::list<uint8_t> auxList = m_measConfig.reportConfigToRemoveList;
5589 auto it = auxList.begin();
5590 for (; it != auxList.end(); it++)
5591 {
5592 os << (int)*it << ", ";
5593 }
5594 os << std::endl;
5595 }
5596 if (!m_measConfig.measIdToRemoveList.empty())
5597 {
5598 os << " measIdToRemoveList: ";
5599 std::list<uint8_t> auxList = m_measConfig.measIdToRemoveList;
5600 auto it = auxList.begin();
5601 for (; it != auxList.end(); it++)
5602 {
5603 os << (int)*it << ", ";
5604 }
5605 os << std::endl;
5606 }
5607
5608 if (!m_measConfig.measObjectToAddModList.empty())
5609 {
5610 os << " measObjectToAddMod: " << std::endl;
5611 std::list<LteRrcSap::MeasObjectToAddMod> auxList = m_measConfig.measObjectToAddModList;
5612 auto it = auxList.begin();
5613 for (; it != auxList.end(); it++)
5614 {
5615 os << " measObjectId: " << (int)it->measObjectId << std::endl;
5616 os << " carrierFreq: " << (int)it->measObjectEutra.carrierFreq << std::endl;
5617 os << " allowedMeasBandwidth: " << (int)it->measObjectEutra.allowedMeasBandwidth
5618 << std::endl;
5619 os << " presenceAntennaPort1: " << it->measObjectEutra.presenceAntennaPort1
5620 << std::endl;
5621 os << " neighCellConfig: " << (int)it->measObjectEutra.neighCellConfig
5622 << std::endl;
5623 os << " offsetFreq: " << (int)it->measObjectEutra.offsetFreq << std::endl;
5624
5625 if (!it->measObjectEutra.cellsToRemoveList.empty())
5626 {
5627 os << " cellsToRemoveList: ";
5628 std::list<uint8_t> auxList = it->measObjectEutra.cellsToRemoveList;
5629 auto it = auxList.begin();
5630 for (; it != auxList.end(); it++)
5631 {
5632 os << (int)*it << ", ";
5633 }
5634 os << std::endl;
5635 }
5636
5637 if (!it->measObjectEutra.blackCellsToRemoveList.empty())
5638 {
5639 os << " blackCellsToRemoveList: ";
5640 std::list<uint8_t> auxList = it->measObjectEutra.blackCellsToRemoveList;
5641 auto it = auxList.begin();
5642 for (; it != auxList.end(); it++)
5643 {
5644 os << (int)*it << ", ";
5645 }
5646 os << std::endl;
5647 }
5648
5649 if (!it->measObjectEutra.cellsToAddModList.empty())
5650 {
5651 os << " cellsToAddModList: " << std::endl;
5652 std::list<LteRrcSap::CellsToAddMod> auxList =
5653 it->measObjectEutra.cellsToAddModList;
5654 auto it = auxList.begin();
5655 for (; it != auxList.end(); it++)
5656 {
5657 os << " cellIndex: " << (int)it->cellIndex << std::endl;
5658 os << " physCellId: " << (int)it->physCellId << std::endl;
5659 os << " cellIndividualOffset: " << (int)it->cellIndividualOffset
5660 << std::endl;
5661 os << " ------ " << std::endl;
5662 }
5663 }
5664
5665 if (!it->measObjectEutra.blackCellsToAddModList.empty())
5666 {
5667 os << " blackCellsToAddModList: " << std::endl;
5668 std::list<LteRrcSap::BlackCellsToAddMod> auxList =
5669 it->measObjectEutra.blackCellsToAddModList;
5670 auto it = auxList.begin();
5671 for (; it != auxList.end(); it++)
5672 {
5673 os << " cellIndex: " << (int)it->cellIndex << std::endl;
5674 os << " physCellIdRange.start: " << (int)it->physCellIdRange.start
5675 << std::endl;
5676 os << " physCellIdRange.haveRange: " << it->physCellIdRange.haveRange
5677 << std::endl;
5678 os << " physCellIdRange.range: " << (int)it->physCellIdRange.range
5679 << std::endl;
5680 os << " ------ " << std::endl;
5681 }
5682 }
5683
5684 os << " haveCellForWhichToReportCGI: "
5685 << it->measObjectEutra.haveCellForWhichToReportCGI << std::endl;
5686 os << " cellForWhichToReportCGI: "
5687 << (int)it->measObjectEutra.cellForWhichToReportCGI << std::endl;
5688 os << " ------------- " << std::endl;
5689 }
5690 }
5691
5692 if (!m_measConfig.reportConfigToAddModList.empty())
5693 {
5694 os << " reportConfigToAddModList: " << std::endl;
5695 std::list<LteRrcSap::ReportConfigToAddMod> auxList =
5696 m_measConfig.reportConfigToAddModList;
5697 auto it = auxList.begin();
5698 for (; it != auxList.end(); it++)
5699 {
5700 os << " reportConfigId: " << (int)it->reportConfigId << std::endl;
5701 os << " reportConfigEutra.triggerType "
5702 << (int)it->reportConfigEutra.triggerType << std::endl;
5703 if (it->reportConfigEutra.triggerType == LteRrcSap::ReportConfigEutra::EVENT)
5704 {
5705 os << " reportConfigEutra.eventId " << (int)it->reportConfigEutra.eventId
5706 << std::endl;
5707 if (it->reportConfigEutra.eventId == LteRrcSap::ReportConfigEutra::EVENT_A3)
5708 {
5709 os << " reportConfigEutra.reportOnLeave "
5710 << (int)it->reportConfigEutra.reportOnLeave << std::endl;
5711 os << " reportConfigEutra.a3Offset "
5712 << (int)it->reportConfigEutra.a3Offset << std::endl;
5713 }
5714 else
5715 {
5716 os << " reportConfigEutra.threshold1.choice "
5717 << (int)it->reportConfigEutra.threshold1.choice << std::endl;
5718 os << " reportConfigEutra.threshold1.range "
5719 << (int)it->reportConfigEutra.threshold1.range << std::endl;
5720 if (it->reportConfigEutra.eventId == LteRrcSap::ReportConfigEutra::EVENT_A5)
5721 {
5722 os << " reportConfigEutra.threshold2.choice "
5723 << (int)it->reportConfigEutra.threshold2.choice << std::endl;
5724 os << " reportConfigEutra.threshold2.range "
5725 << (int)it->reportConfigEutra.threshold2.range << std::endl;
5726 }
5727 }
5728 os << " reportConfigEutra.hysteresis "
5729 << (int)it->reportConfigEutra.hysteresis << std::endl;
5730 os << " reportConfigEutra.timeToTrigger "
5731 << (int)it->reportConfigEutra.timeToTrigger << std::endl;
5732 }
5733 else
5734 {
5735 os << " reportConfigEutra.purpose " << (int)it->reportConfigEutra.purpose
5736 << std::endl;
5737 }
5738 os << " reportConfigEutra.triggerQuantity "
5739 << (int)it->reportConfigEutra.triggerQuantity << std::endl;
5740 os << " reportConfigEutra.reportQuantity "
5741 << (int)it->reportConfigEutra.reportQuantity << std::endl;
5742 os << " reportConfigEutra.maxReportCells "
5743 << (int)it->reportConfigEutra.maxReportCells << std::endl;
5744 os << " reportConfigEutra.reportInterval "
5745 << (int)it->reportConfigEutra.reportInterval << std::endl;
5746 os << " reportConfigEutra.reportAmount "
5747 << (int)it->reportConfigEutra.reportAmount << std::endl;
5748 }
5749 }
5750
5751 if (!m_measConfig.measIdToAddModList.empty())
5752 {
5753 os << " measIdToAddModList: " << std::endl;
5754 std::list<LteRrcSap::MeasIdToAddMod> auxList = m_measConfig.measIdToAddModList;
5755 auto it = auxList.begin();
5756 for (; it != auxList.end(); it++)
5757 {
5758 os << " measId: " << (int)it->measId << std::endl;
5759 os << " measObjectId: " << (int)it->measObjectId << std::endl;
5760 os << " reportConfigId: " << (int)it->reportConfigId << std::endl;
5761 os << " ------ " << std::endl;
5762 }
5763 }
5764
5765 os << " haveQuantityConfig: " << m_measConfig.haveQuantityConfig << std::endl;
5766 if (m_measConfig.haveQuantityConfig)
5767 {
5768 os << " filterCoefficientRSRP: "
5769 << (int)m_measConfig.quantityConfig.filterCoefficientRSRP << std::endl;
5770 os << " filterCoefficientRSRQ:"
5771 << (int)m_measConfig.quantityConfig.filterCoefficientRSRQ << std::endl;
5772 }
5773
5774 os << " haveMeasGapConfig: " << m_measConfig.haveMeasGapConfig << std::endl;
5775 if (m_measConfig.haveMeasGapConfig)
5776 {
5777 os << " measGapConfig.type: " << m_measConfig.measGapConfig.type << std::endl;
5778 os << " measGapConfig.gap (gap0/1,value): ("
5779 << m_measConfig.measGapConfig.gapOffsetChoice << ","
5780 << (int)m_measConfig.measGapConfig.gapOffsetValue << ")" << std::endl;
5781 }
5782
5783 os << " haveSmeasure: " << m_measConfig.haveSmeasure << std::endl;
5784 if (m_measConfig.haveSmeasure)
5785 {
5786 os << " sMeasure: " << (int)m_measConfig.sMeasure << std::endl;
5787 }
5788
5789 os << " haveSpeedStatePars: " << m_measConfig.haveSpeedStatePars << std::endl;
5790 if (m_measConfig.haveSpeedStatePars)
5791 {
5792 os << " speedStatePars.type: " << m_measConfig.speedStatePars.type << std::endl;
5793 os << " speedStatePars.mobilityStateParameters.tEvaluation: "
5794 << (int)m_measConfig.speedStatePars.mobilityStateParameters.tEvaluation << std::endl;
5795 os << " speedStatePars.mobilityStateParameters.tHystNormal: "
5796 << (int)m_measConfig.speedStatePars.mobilityStateParameters.tHystNormal << std::endl;
5797 os << " speedStatePars.mobilityStateParameters.nCellChangeMedium: "
5798 << (int)m_measConfig.speedStatePars.mobilityStateParameters.nCellChangeMedium
5799 << std::endl;
5800 os << " speedStatePars.mobilityStateParameters.nCellChangeHigh: "
5801 << (int)m_measConfig.speedStatePars.mobilityStateParameters.nCellChangeHigh
5802 << std::endl;
5803 os << " speedStatePars.timeToTriggerSf.sfMedium: "
5804 << (int)m_measConfig.speedStatePars.timeToTriggerSf.sfMedium << std::endl;
5805 os << " speedStatePars.timeToTriggerSf.sfHigh: "
5806 << (int)m_measConfig.speedStatePars.timeToTriggerSf.sfHigh << std::endl;
5807 }
5808 }
5809
5810 os << "haveMobilityControlInfo: " << m_haveMobilityControlInfo << std::endl;
5812 {
5813 os << "targetPhysCellId: " << (int)m_mobilityControlInfo.targetPhysCellId << std::endl;
5814 os << "haveCarrierFreq: " << m_mobilityControlInfo.haveCarrierFreq << std::endl;
5815 if (m_mobilityControlInfo.haveCarrierFreq)
5816 {
5817 os << " carrierFreq.dlCarrierFreq: "
5818 << (int)m_mobilityControlInfo.carrierFreq.dlCarrierFreq << std::endl;
5819 os << " carrierFreq.dlCarrierFreq: "
5820 << (int)m_mobilityControlInfo.carrierFreq.ulCarrierFreq << std::endl;
5821 }
5822 os << "haveCarrierBandwidth: " << m_mobilityControlInfo.haveCarrierBandwidth << std::endl;
5823 if (m_mobilityControlInfo.haveCarrierBandwidth)
5824 {
5825 os << " carrierBandwidth.dlBandwidth: "
5826 << (int)m_mobilityControlInfo.carrierBandwidth.dlBandwidth << std::endl;
5827 os << " carrierBandwidth.ulBandwidth: "
5828 << (int)m_mobilityControlInfo.carrierBandwidth.ulBandwidth << std::endl;
5829 }
5830 os << "newUeIdentity: " << (int)m_mobilityControlInfo.newUeIdentity << std::endl;
5831 os << "haveRachConfigDedicated: " << m_mobilityControlInfo.haveRachConfigDedicated
5832 << std::endl;
5833 if (m_mobilityControlInfo.haveRachConfigDedicated)
5834 {
5835 os << "raPreambleIndex: "
5836 << (int)m_mobilityControlInfo.rachConfigDedicated.raPreambleIndex << std::endl;
5837 os << "raPrachMaskIndex: "
5838 << (int)m_mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex << std::endl;
5839 }
5840 }
5841 os << "haveRadioResourceConfigDedicated: " << m_haveRadioResourceConfigDedicated << std::endl;
5843 {
5845 }
5846}
5847
5848void
5863
5866{
5868
5870 msg.haveMeasConfig = m_haveMeasConfig;
5871 msg.measConfig = m_measConfig;
5872 msg.haveMobilityControlInfo = m_haveMobilityControlInfo;
5873 msg.mobilityControlInfo = m_mobilityControlInfo;
5874 msg.haveRadioResourceConfigDedicated = m_haveRadioResourceConfigDedicated;
5875 msg.radioResourceConfigDedicated = m_radioResourceConfigDedicated;
5876 msg.haveNonCriticalExtension = m_haveNonCriticalExtension;
5877 msg.nonCriticalExtension = m_nonCriticalExtension;
5878
5879 return msg;
5880}
5881
5882uint8_t
5887
5888bool
5893
5899
5900bool
5905
5911
5912bool
5917
5923
5924bool
5929
5935
5936bool
5941
5942std::list<LteRrcSap::SrbToAddMod>
5947
5948std::list<LteRrcSap::DrbToAddMod>
5953
5954std::list<uint8_t>
5959
5965
5966//////////////////// HandoverPreparationInfoHeader class ////////////////////////
5967
5971
5972void
5974{
5976
5977 // Serialize HandoverPreparationInformation sequence:
5978 // no default or optional fields. Extension marker not present.
5979 SerializeSequence(std::bitset<0>(), false);
5980
5981 // Serialize criticalExtensions choice
5982 // 2 options, selected 0 (c1)
5983 SerializeChoice(2, 0, false);
5984
5985 // Serialize c1 choice
5986 // 8 options, selected 0 (handoverPreparationInformation-r8)
5987 SerializeChoice(8, 0, false);
5988
5989 // Serialize HandoverPreparationInformation-r8-IEs sequence
5990 // 4 optional fields, no extension marker.
5991 std::bitset<4> handoverPrepInfoOpts;
5992 handoverPrepInfoOpts.set(3, true); // as-Config present
5993 handoverPrepInfoOpts.set(2, false); // rrm-Config not present
5994 handoverPrepInfoOpts.set(1, false); // as-Context not present
5995 handoverPrepInfoOpts.set(0, false); // nonCriticalExtension not present
5996 SerializeSequence(handoverPrepInfoOpts, false);
5997
5998 // Serialize ue-RadioAccessCapabilityInfo
6000
6001 // Serialize as-Config
6002 SerializeSequence(std::bitset<0>(), true);
6003
6004 // Serialize sourceMeasConfig
6005 SerializeMeasConfig(m_asConfig.sourceMeasConfig);
6006
6007 // Serialize sourceRadioResourceConfig
6008 SerializeRadioResourceConfigDedicated(m_asConfig.sourceRadioResourceConfig);
6009
6010 // Serialize sourceSecurityAlgorithmConfig
6011 SerializeSequence(std::bitset<0>(), false);
6012 // cipheringAlgorithm
6013 SerializeEnum(8, 0);
6014 // integrityProtAlgorithm
6015 SerializeEnum(8, 0);
6016
6017 // Serialize sourceUE-Identity
6018 SerializeBitstring(std::bitset<16>(m_asConfig.sourceUeIdentity));
6019
6020 // Serialize sourceMasterInformationBlock
6021 SerializeSequence(std::bitset<0>(), false);
6023 6,
6024 BandwidthToEnum(m_asConfig.sourceMasterInformationBlock.dlBandwidth)); // dl-Bandwidth
6025 SerializeSequence(std::bitset<0>(), false); // phich-Config sequence
6026 SerializeEnum(2, 0); // phich-Duration
6027 SerializeEnum(4, 0); // phich-Resource
6028 SerializeBitstring(std::bitset<8>(
6029 m_asConfig.sourceMasterInformationBlock.systemFrameNumber)); // systemFrameNumber
6030 SerializeBitstring(std::bitset<10>(321)); // spare
6031
6032 // Serialize sourceSystemInformationBlockType1 sequence
6033 SerializeSystemInformationBlockType1(m_asConfig.sourceSystemInformationBlockType1);
6034
6035 // Serialize sourceSystemInformationBlockType2
6036 SerializeSystemInformationBlockType2(m_asConfig.sourceSystemInformationBlockType2);
6037
6038 // Serialize AntennaInfoCommon
6039 SerializeSequence(std::bitset<0>(0), false);
6040 SerializeEnum(4, 0); // antennaPortsCount
6041
6042 // Serialize sourceDlCarrierFreq
6043 SerializeInteger(m_asConfig.sourceDlCarrierFreq, 0, MAX_EARFCN);
6044
6045 // Finish serialization
6047}
6048
6051{
6052 std::bitset<0> bitset0;
6053 int n;
6054
6055 // Deserialize HandoverPreparationInformation sequence
6056 // 0 optional fields, no extension marker
6057 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6058
6059 // Deserialize criticalExtensions choice
6060 int criticalExtensionsChosen;
6061 bIterator = DeserializeChoice(2, false, &criticalExtensionsChosen, bIterator);
6062
6063 if (criticalExtensionsChosen == 1)
6064 {
6065 // Deserialize criticalExtensionsFuture
6066 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6067 }
6068 else if (criticalExtensionsChosen == 0)
6069 {
6070 // Deserialize c1 choice
6071 int c1Chosen;
6072 bIterator = DeserializeChoice(8, false, &c1Chosen, bIterator);
6073 if (c1Chosen > 0)
6074 {
6075 bIterator = DeserializeNull(bIterator);
6076 }
6077 else if (c1Chosen == 0)
6078 {
6079 // Deserialize handoverPreparationInformation-r8
6080 std::bitset<4> handoverPrepInfoOpts;
6081 bIterator = DeserializeSequence(&handoverPrepInfoOpts, false, bIterator);
6082
6083 // Deserialize ue-RadioAccessCapabilityInfo
6084 bIterator = DeserializeSequenceOf(&n, MAX_RAT_CAPABILITIES, 0, bIterator);
6085 for (int i = 0; i < n; i++)
6086 {
6087 // Deserialize UE-CapabilityRAT-Container
6088 // ...
6089 }
6090
6091 if (handoverPrepInfoOpts[3])
6092 {
6093 // Deserialize as-Config sequence
6094 bIterator = DeserializeSequence(&bitset0, true, bIterator);
6095
6096 // Deserialize sourceMeasConfig
6097 bIterator = DeserializeMeasConfig(&m_asConfig.sourceMeasConfig, bIterator);
6098
6099 // Deserialize sourceRadioResourceConfig
6100 bIterator =
6101 DeserializeRadioResourceConfigDedicated(&m_asConfig.sourceRadioResourceConfig,
6102 bIterator);
6103
6104 // Deserialize sourceSecurityAlgorithmConfig
6105 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6106 bIterator = DeserializeEnum(8, &n, bIterator); // cipheringAlgorithm
6107 bIterator = DeserializeEnum(8, &n, bIterator); // integrityProtAlgorithm
6108
6109 // Deserialize sourceUE-Identity
6110 std::bitset<16> cRnti;
6111 bIterator = DeserializeBitstring(&cRnti, bIterator);
6112 m_asConfig.sourceUeIdentity = cRnti.to_ulong();
6113
6114 // Deserialize sourceMasterInformationBlock
6115 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6116 bIterator = DeserializeEnum(6, &n, bIterator); // dl-Bandwidth
6117 m_asConfig.sourceMasterInformationBlock.dlBandwidth = EnumToBandwidth(n);
6118
6119 // phich-Config
6120 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6121 bIterator = DeserializeEnum(2, &n, bIterator); // phich-Duration
6122 bIterator = DeserializeEnum(4, &n, bIterator); // phich-Resource
6123
6124 // systemFrameNumber
6125 std::bitset<8> systemFrameNumber;
6126 bIterator = DeserializeBitstring(&systemFrameNumber, bIterator);
6127 m_asConfig.sourceMasterInformationBlock.systemFrameNumber =
6128 systemFrameNumber.to_ulong();
6129 // spare
6130 std::bitset<10> spare;
6131 bIterator = DeserializeBitstring(&spare, bIterator);
6132
6133 // Deserialize sourceSystemInformationBlockType1
6135 &m_asConfig.sourceSystemInformationBlockType1,
6136 bIterator);
6137
6138 // Deserialize sourceSystemInformationBlockType2
6140 &m_asConfig.sourceSystemInformationBlockType2,
6141 bIterator);
6142
6143 // Deserialize antennaInfoCommon
6144 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6145 bIterator = DeserializeEnum(4, &n, bIterator); // antennaPortsCount
6146
6147 // Deserialize sourceDl-CarrierFreq
6148 bIterator = DeserializeInteger(&n, 0, MAX_EARFCN, bIterator);
6149 m_asConfig.sourceDlCarrierFreq = n;
6150 }
6151 if (handoverPrepInfoOpts[2])
6152 {
6153 // Deserialize rrm-Config
6154 // ...
6155 }
6156 if (handoverPrepInfoOpts[1])
6157 {
6158 // Deserialize as-Context
6159 // ...
6160 }
6161 if (handoverPrepInfoOpts[0])
6162 {
6163 // Deserialize nonCriticalExtension
6164 // ...
6165 }
6166 }
6167 }
6168
6169 return GetSerializedSize();
6170}
6171
6172void
6174{
6175 RrcAsn1Header::Print(os, m_asConfig.sourceRadioResourceConfig);
6176 os << "sourceUeIdentity: " << m_asConfig.sourceUeIdentity << std::endl;
6177 os << "dlBandwidth: " << (int)m_asConfig.sourceMasterInformationBlock.dlBandwidth << std::endl;
6178 os << "systemFrameNumber: " << (int)m_asConfig.sourceMasterInformationBlock.systemFrameNumber
6179 << std::endl;
6180 os << "plmnIdentityInfo.plmnIdentity: "
6181 << (int)m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo
6182 .plmnIdentity
6183 << std::endl;
6184 os << "cellAccessRelatedInfo.cellIdentity "
6185 << (int)m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity
6186 << std::endl;
6187 os << "cellAccessRelatedInfo.csgIndication: "
6188 << m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication
6189 << std::endl;
6190 os << "cellAccessRelatedInfo.csgIdentity: "
6191 << (int)m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity
6192 << std::endl;
6193 os << "sourceDlCarrierFreq: " << m_asConfig.sourceDlCarrierFreq << std::endl;
6194}
6195
6196void
6202
6205{
6207 msg.asConfig = m_asConfig;
6208
6209 return msg;
6210}
6211
6217
6218//////////////////// RrcConnectionReestablishmentRequestHeader class ////////////////////////
6219
6223
6227
6228void
6230{
6232
6234
6235 // Serialize RrcConnectionReestablishmentRequest sequence:
6236 // no default or optional fields. Extension marker not present.
6237 SerializeSequence(std::bitset<0>(), false);
6238
6239 // Serialize criticalExtensions choice
6240 // chosen: rrcConnectionReestablishmentRequest-r8
6241 SerializeChoice(2, 0, false);
6242
6243 // Serialize RRCConnectionReestablishmentRequest-r8-IEs sequence
6244 // no default or optional fields. Extension marker not present.
6245 SerializeSequence(std::bitset<0>(), false);
6246
6247 // Serialize ue-Identity
6248 SerializeSequence(std::bitset<0>(), false);
6249 // Serialize c-RNTI
6250 SerializeBitstring(std::bitset<16>(m_ueIdentity.cRnti));
6251 // Serialize physCellId
6252 SerializeInteger(m_ueIdentity.physCellId, 0, 503);
6253 // Serialize shortMAC-I
6254 SerializeBitstring(std::bitset<16>(0));
6255
6256 // Serialize ReestablishmentCause
6257 switch (m_reestablishmentCause)
6258 {
6260 SerializeEnum(4, 0);
6261 break;
6263 SerializeEnum(4, 1);
6264 break;
6266 SerializeEnum(4, 2);
6267 break;
6268 default:
6269 SerializeEnum(4, 3);
6270 }
6271
6272 // Serialize spare
6273 SerializeBitstring(std::bitset<2>(0));
6274
6275 // Finish serialization
6277}
6278
6281{
6282 std::bitset<0> bitset0;
6283 int n;
6284
6285 bIterator = DeserializeUlCcchMessage(bIterator);
6286
6287 // Deserialize RrcConnectionReestablishmentRequest sequence
6288 // 0 optional fields, no extension marker
6289 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6290
6291 // Deserialize criticalExtensions choice
6292 bIterator = DeserializeChoice(2, false, &n, bIterator);
6293 if (n == 1)
6294 {
6295 // Deserialize criticalExtensionsFuture
6296 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6297 }
6298 else if (n == 0)
6299 {
6300 // Deserialize RRCConnectionReestablishmentRequest-r8-IEs
6301 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6302
6303 // Deserialize ReestabUE-Identity sequence
6304 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6305
6306 // Deserialize c-RNTI
6307 std::bitset<16> cRnti;
6308 bIterator = DeserializeBitstring(&cRnti, bIterator);
6309 m_ueIdentity.cRnti = cRnti.to_ulong();
6310
6311 // Deserialize physCellId
6312 int physCellId;
6313 bIterator = DeserializeInteger(&physCellId, 0, 503, bIterator);
6314 m_ueIdentity.physCellId = physCellId;
6315
6316 // Deserialize shortMAC-I
6317 std::bitset<16> shortMacI;
6318 bIterator = DeserializeBitstring(&shortMacI, bIterator);
6319
6320 // Deserialize ReestablishmentCause
6321 int reestCs;
6322 bIterator = DeserializeEnum(4, &reestCs, bIterator);
6323 switch (reestCs)
6324 {
6325 case 0:
6327 break;
6328 case 1:
6330 break;
6331 case 2:
6333 break;
6334 case 3:
6335 break;
6336 }
6337
6338 // Deserialize spare
6339 std::bitset<2> spare;
6340 bIterator = DeserializeBitstring(&spare, bIterator);
6341 }
6342
6343 return GetSerializedSize();
6344}
6345
6346void
6348{
6349 os << "ueIdentity.cRnti: " << (int)m_ueIdentity.cRnti << std::endl;
6350 os << "ueIdentity.physCellId: " << (int)m_ueIdentity.physCellId << std::endl;
6351 os << "m_reestablishmentCause: " << m_reestablishmentCause << std::endl;
6352}
6353
6354void
6362
6372
6378
6384
6385//////////////////// RrcConnectionReestablishmentHeader class ////////////////////////
6386
6390
6394
6395void
6397{
6399
6401
6402 // Serialize RrcConnectionReestablishment sequence:
6403 // no default or optional fields. Extension marker not present.
6404 SerializeSequence(std::bitset<0>(), false);
6405
6406 // Serialize rrc-TransactionIdentifier
6408
6409 // Serialize criticalExtensions choice
6410 SerializeChoice(2, 0, false);
6411
6412 // Serialize c1 choice
6413 SerializeChoice(8, 0, false);
6414
6415 // Serialize RRCConnectionReestablishment-r8-IEs sequence
6416 // 1 optional field, no extension marker
6417 SerializeSequence(std::bitset<1>(0), false);
6418
6419 // Serialize radioResourceConfigDedicated
6421
6422 // Serialize nextHopChainingCount
6423 SerializeInteger(0, 0, 7);
6424
6425 // Finish serialization
6427}
6428
6431{
6432 std::bitset<0> bitset0;
6433 int n;
6434
6435 bIterator = DeserializeDlCcchMessage(bIterator);
6436
6437 // Deserialize RrcConnectionReestablishment sequence
6438 // 0 optional fields, no extension marker
6439 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6440
6441 // Deserialize rrc-TransactionIdentifier
6442 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
6444
6445 // Deserialize criticalExtensions choice
6446 int criticalExtensionsChoice;
6447 bIterator = DeserializeChoice(2, false, &criticalExtensionsChoice, bIterator);
6448 if (criticalExtensionsChoice == 1)
6449 {
6450 // Deserialize criticalExtensionsFuture
6451 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6452 }
6453 else if (criticalExtensionsChoice == 0)
6454 {
6455 // Deserialize c1
6456 int c1;
6457 bIterator = DeserializeChoice(8, false, &c1, bIterator);
6458 if (c1 > 0)
6459 {
6460 bIterator = DeserializeNull(bIterator);
6461 }
6462 else if (c1 == 0)
6463 {
6464 // Deserialize rrcConnectionReestablishment-r8
6465 // 1 optional field
6466 std::bitset<1> nonCriticalExtensionPresent;
6467 bIterator = DeserializeSequence(&nonCriticalExtensionPresent, false, bIterator);
6468
6469 // Deserialize RadioResourceConfigDedicated
6470 bIterator =
6472
6473 // Deserialize nextHopChainingCount
6474 bIterator = DeserializeInteger(&n, 0, 7, bIterator);
6475 }
6476 }
6477
6478 return GetSerializedSize();
6479}
6480
6481void
6483{
6484 os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
6485 os << "RadioResourceConfigDedicated: " << std::endl;
6487}
6488
6489void
6496
6505
6506uint8_t
6511
6517
6518//////////////////// RrcConnectionReestablishmentCompleteHeader class ////////////////////////
6519
6523
6524void
6526{
6528
6529 // Serialize DCCH message
6531
6532 // Serialize RrcConnectionReestablishmentComplete sequence:
6533 // no default or optional fields. Extension marker not present.
6534 SerializeSequence(std::bitset<0>(), false);
6535
6536 // Serialize rrc-TransactionIdentifier
6538
6539 // Serialize criticalExtensions choice
6540 SerializeChoice(2, 0, false);
6541
6542 // Serialize rrcConnectionReestablishmentComplete-r8 sequence
6543 // 1 optional field (not present), no extension marker.
6544 SerializeSequence(std::bitset<1>(0), false);
6545
6546 // Finish serialization
6548}
6549
6552{
6553 std::bitset<0> bitset0;
6554 int n;
6555
6556 bIterator = DeserializeUlDcchMessage(bIterator);
6557
6558 // Deserialize RrcConnectionReestablishmentComplete sequence
6559 // 0 optional fields, no extension marker
6560 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6561
6562 // Deserialize rrc-TransactionIdentifier
6563 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
6565
6566 // Deserialize criticalExtensions choice
6567 int criticalExtensionsChoice;
6568 bIterator = DeserializeChoice(2, false, &criticalExtensionsChoice, bIterator);
6569 if (criticalExtensionsChoice == 1)
6570 {
6571 // Deserialize criticalExtensionsFuture
6572 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6573 }
6574 else if (criticalExtensionsChoice == 0)
6575 {
6576 // Deserialize rrcConnectionReestablishmentComplete-r8
6577 std::bitset<1> opts;
6578 bIterator = DeserializeSequence(&opts, false, bIterator);
6579 if (opts[0])
6580 {
6581 // Deserialize RRCConnectionReestablishmentComplete-v920-IEs
6582 // ...
6583 }
6584 }
6585
6586 return GetSerializedSize();
6587}
6588
6589void
6591{
6592 os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
6593}
6594
6595void
6602
6610
6611uint8_t
6616
6617//////////////////// RrcConnectionReestablishmentRejectHeader class ////////////////////////
6618
6622
6626
6627void
6629{
6631
6632 // Serialize CCCH message
6634
6635 // Serialize RrcConnectionReestablishmentReject sequence:
6636 // no default or optional fields. Extension marker not present.
6637 SerializeSequence(std::bitset<0>(), false);
6638
6639 // Serialize criticalExtensions choice
6640 SerializeChoice(2, 0, false);
6641
6642 // Serialize RRCConnectionReestablishmentReject-r8-IEs sequence
6643 // 1 optional field (not present), no extension marker.
6644 SerializeSequence(std::bitset<1>(0), false);
6645
6646 // Finish serialization
6648}
6649
6652{
6653 std::bitset<0> bitset0;
6654
6655 bIterator = DeserializeDlCcchMessage(bIterator);
6656
6657 // Deserialize RrcConnectionReestablishmentReject sequence
6658 // 0 optional fields, no extension marker
6659 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6660
6661 // Deserialize criticalExtensions choice
6662 int criticalExtensionsChoice;
6663 bIterator = DeserializeChoice(2, false, &criticalExtensionsChoice, bIterator);
6664 if (criticalExtensionsChoice == 1)
6665 {
6666 // Deserialize criticalExtensionsFuture
6667 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6668 }
6669 else if (criticalExtensionsChoice == 0)
6670 {
6671 // Deserialize rrcConnectionReestablishmentReject-r8
6672 std::bitset<1> opts;
6673 bIterator = DeserializeSequence(&opts, false, bIterator);
6674 if (opts[0])
6675 {
6676 // Deserialize RRCConnectionReestablishmentReject-v8a0-IEs
6677 // ...
6678 }
6679 }
6680
6681 return GetSerializedSize();
6682}
6683
6684void
6686{
6687}
6688
6689void
6696
6702
6703//////////////////// RrcConnectionReleaseHeader class ////////////////////////
6704
6708
6712
6713void
6715{
6717
6718 // Serialize DCCH message
6720
6721 // Serialize RrcConnectionRelease sequence:
6722 // no default or optional fields. Extension marker not present.
6723 SerializeSequence(std::bitset<0>(), false);
6724
6725 // Serialize rrc-TransactionIdentifier
6726 SerializeInteger(m_rrcConnectionRelease.rrcTransactionIdentifier, 0, 3);
6727
6728 // Serialize criticalExtensions choice
6729 SerializeChoice(2, 0, false);
6730
6731 // Serialize c1 choice
6732 SerializeChoice(4, 0, false);
6733
6734 // Serialize RRCConnectionRelease-r8-IEs sequence
6735 // 3 optional field (not present), no extension marker.
6736 SerializeSequence(std::bitset<3>(0), false);
6737
6738 // Serialize ReleaseCause
6739 SerializeEnum(4, 1);
6740
6741 // Finish serialization
6743}
6744
6747{
6748 std::bitset<0> bitset0;
6749 int n;
6750
6751 bIterator = DeserializeDlDcchMessage(bIterator);
6752
6753 // Deserialize RrcConnectionRelease sequence
6754 // 0 optional fields, no extension marker
6755 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6756
6757 // Deserialize rrc-TransactionIdentifier
6758 bIterator = DeserializeInteger(&n, 0, 3, bIterator);
6759 m_rrcConnectionRelease.rrcTransactionIdentifier = n;
6760
6761 // Deserialize criticalExtensions choice
6762 int criticalExtensionsChoice;
6763 bIterator = DeserializeChoice(2, false, &criticalExtensionsChoice, bIterator);
6764 if (criticalExtensionsChoice == 1)
6765 {
6766 // Deserialize criticalExtensionsFuture
6767 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6768 }
6769 else if (criticalExtensionsChoice == 0)
6770 {
6771 // Deserialize c1
6772 int c1Choice;
6773 bIterator = DeserializeChoice(4, false, &c1Choice, bIterator);
6774
6775 if (c1Choice == 0)
6776 {
6777 // Deserialize RRCConnectionRelease-r8-IEs
6778 std::bitset<3> opts;
6779 bIterator = DeserializeSequence(&opts, false, bIterator);
6780
6781 // Deserialize releaseCause
6782 bIterator = DeserializeEnum(4, &n, bIterator);
6783
6784 if (opts[2])
6785 {
6786 // Deserialize redirectedCarrierInfo
6787 // ...
6788 }
6789 if (opts[1])
6790 {
6791 // Deserialize idleModeMobilityControlInfo
6792 // ...
6793 }
6794 if (opts[0])
6795 {
6796 // Deserialize nonCriticalExtension
6797 // ...
6798 }
6799 }
6800
6801 else
6802 {
6803 bIterator = DeserializeNull(bIterator);
6804 }
6805 }
6806
6807 return GetSerializedSize();
6808}
6809
6810void
6812{
6813}
6814
6815void
6821
6827
6828//////////////////// RrcConnectionRejectHeader class ////////////////////////
6829
6833
6837
6838void
6840{
6842
6843 // Serialize CCCH message
6845
6846 // Serialize RrcConnectionReject sequence:
6847 // no default or optional fields. Extension marker not present.
6848 SerializeSequence(std::bitset<0>(), false);
6849
6850 // Serialize criticalExtensions choice
6851 SerializeChoice(2, 0, false);
6852
6853 // Serialize c1 choice
6854 SerializeChoice(4, 0, false);
6855
6856 // Serialize rrcConnectionReject-r8 sequence
6857 // 1 optional field (not present), no extension marker.
6858 SerializeSequence(std::bitset<1>(0), false);
6859
6860 // Serialize waitTime
6861 SerializeInteger(m_rrcConnectionReject.waitTime, 1, 16);
6862
6863 // Finish serialization
6865}
6866
6869{
6870 std::bitset<0> bitset0;
6871 int n;
6872
6873 bIterator = DeserializeDlCcchMessage(bIterator);
6874
6875 // Deserialize RrcConnectionReject sequence
6876 // 0 optional fields, no extension marker
6877 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6878
6879 // Deserialize criticalExtensions choice
6880 int criticalExtensionsChoice;
6881 bIterator = DeserializeChoice(2, false, &criticalExtensionsChoice, bIterator);
6882 if (criticalExtensionsChoice == 1)
6883 {
6884 // Deserialize criticalExtensionsFuture
6885 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6886 }
6887 else if (criticalExtensionsChoice == 0)
6888 {
6889 // Deserialize c1 choice
6890 int c1Choice;
6891 bIterator = DeserializeChoice(4, false, &c1Choice, bIterator);
6892
6893 if (c1Choice > 0)
6894 {
6895 bIterator = DeserializeNull(bIterator);
6896 }
6897 else if (c1Choice == 0)
6898 {
6899 // Deserialize rrcConnectionReject-r8
6900 std::bitset<1> opts;
6901 bIterator = DeserializeSequence(&opts, false, bIterator);
6902
6903 bIterator = DeserializeInteger(&n, 1, 16, bIterator);
6904 m_rrcConnectionReject.waitTime = n;
6905
6906 if (opts[0])
6907 {
6908 // Deserialize RRCConnectionReject-v8a0-IEs
6909 // ...
6910 }
6911 }
6912 }
6913
6914 return GetSerializedSize();
6915}
6916
6917void
6919{
6920 os << "wait time: " << (int)m_rrcConnectionReject.waitTime << std::endl;
6921}
6922
6923void
6929
6935
6936//////////////////// MeasurementReportHeader class ////////////////////////
6937
6941
6945
6946void
6948{
6950
6951 // Serialize DCCH message
6953
6954 // Serialize MeasurementReport sequence:
6955 // no default or optional fields. Extension marker not present.
6956 SerializeSequence(std::bitset<0>(), false);
6957
6958 // Serialize criticalExtensions choice:
6959 // c1 chosen
6960 SerializeChoice(2, 0, false);
6961
6962 // Serialize c1 choice
6963 // measurementReport-r8 chosen
6964 SerializeChoice(8, 0, false);
6965
6966 // Serialize MeasurementReport-r8-IEs sequence:
6967 // 1 optional fields, not present. Extension marker not present.
6968 SerializeSequence(std::bitset<1>(0), false);
6969
6970 // Serialize measResults
6972
6973 // Finish serialization
6975}
6976
6979{
6980 std::bitset<0> bitset0;
6981
6982 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6983
6984 bIterator = DeserializeUlDcchMessage(bIterator);
6985
6986 int criticalExtensionsChoice;
6987 bIterator = DeserializeChoice(2, false, &criticalExtensionsChoice, bIterator);
6988
6989 if (criticalExtensionsChoice == 1)
6990 {
6991 // Deserialize criticalExtensionsFuture
6992 bIterator = DeserializeSequence(&bitset0, false, bIterator);
6993 }
6994 else if (criticalExtensionsChoice == 0)
6995 {
6996 // Deserialize c1
6997 int c1Choice;
6998 bIterator = DeserializeChoice(8, false, &c1Choice, bIterator);
6999
7000 if (c1Choice > 0)
7001 {
7002 bIterator = DeserializeNull(bIterator);
7003 }
7004 else
7005 {
7006 // Deserialize measurementReport-r8
7007 std::bitset<1> isNonCriticalExtensionPresent;
7008 bIterator = DeserializeSequence(&isNonCriticalExtensionPresent, false, bIterator);
7009
7010 // Deserialize measResults
7011 bIterator = DeserializeMeasResults(&m_measurementReport.measResults, bIterator);
7012
7013 if (isNonCriticalExtensionPresent[0])
7014 {
7015 // Deserialize nonCriticalExtension MeasurementReport-v8a0-IEs
7016 // ...
7017 }
7018 }
7019 }
7020
7021 return GetSerializedSize();
7022}
7023
7024void
7025MeasurementReportHeader::Print(std::ostream& os) const
7026{
7027 os << "measId = " << (int)m_measurementReport.measResults.measId << std::endl;
7028 os << "rsrpResult = " << (int)m_measurementReport.measResults.measResultPCell.rsrpResult
7029 << std::endl;
7030 os << "rsrqResult = " << (int)m_measurementReport.measResults.measResultPCell.rsrqResult
7031 << std::endl;
7032 os << "haveMeasResultNeighCells = "
7033 << (int)m_measurementReport.measResults.haveMeasResultNeighCells << std::endl;
7034
7035 if (m_measurementReport.measResults.haveMeasResultNeighCells)
7036 {
7037 std::list<LteRrcSap::MeasResultEutra> measResultListEutra =
7038 m_measurementReport.measResults.measResultListEutra;
7039 auto it = measResultListEutra.begin();
7040 for (; it != measResultListEutra.end(); it++)
7041 {
7042 os << " physCellId =" << (int)it->physCellId << std::endl;
7043 os << " haveCgiInfo =" << it->haveCgiInfo << std::endl;
7044 if (it->haveCgiInfo)
7045 {
7046 os << " plmnIdentity = " << (int)it->cgiInfo.plmnIdentity << std::endl;
7047 os << " cellIdentity = " << (int)it->cgiInfo.cellIdentity << std::endl;
7048 os << " trackingAreaCode = " << (int)it->cgiInfo.trackingAreaCode << std::endl;
7049 os << " havePlmnIdentityList = " << !it->cgiInfo.plmnIdentityList.empty()
7050 << std::endl;
7051 if (!it->cgiInfo.plmnIdentityList.empty())
7052 {
7053 for (auto it2 = it->cgiInfo.plmnIdentityList.begin();
7054 it2 != it->cgiInfo.plmnIdentityList.end();
7055 it2++)
7056 {
7057 os << " plmnId : " << *it2 << std::endl;
7058 }
7059 }
7060 }
7061
7062 os << " haveRsrpResult =" << it->haveRsrpResult << std::endl;
7063 if (it->haveRsrpResult)
7064 {
7065 os << " rsrpResult =" << (int)it->rsrpResult << std::endl;
7066 }
7067
7068 os << " haveRsrqResult =" << it->haveRsrqResult << std::endl;
7069 if (it->haveRsrqResult)
7070 {
7071 os << " rsrqResult =" << (int)it->rsrqResult << std::endl;
7072 }
7073 }
7074 }
7075}
7076
7077void
7083
7086{
7088 msg = m_measurementReport;
7089 return msg;
7090}
7091
7092/////////////////// RrcUlDcchMessage //////////////////////////////////
7097
7101
7104{
7105 DeserializeUlDcchMessage(bIterator);
7106 return 1;
7107}
7108
7109void
7110RrcUlDcchMessage::Print(std::ostream& os) const
7111{
7112 std::cout << "UL DCCH MSG TYPE: " << m_messageType << std::endl;
7113}
7114
7115void
7120
7123{
7124 std::bitset<0> bitset0;
7125 int n;
7126
7127 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7128 bIterator = DeserializeChoice(2, false, &n, bIterator);
7129 if (n == 1)
7130 {
7131 // Deserialize messageClassExtension
7132 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7133 m_messageType = -1;
7134 }
7135 else if (n == 0)
7136 {
7137 // Deserialize c1
7138 bIterator = DeserializeChoice(16, false, &m_messageType, bIterator);
7139 }
7140
7141 return bIterator;
7142}
7143
7144void
7146{
7147 SerializeSequence(std::bitset<0>(), false);
7148 // Choose c1
7149 SerializeChoice(2, 0, false);
7150 // Choose message type
7151 SerializeChoice(16, messageType, false);
7152}
7153
7154/////////////////// RrcDlDcchMessage //////////////////////////////////
7159
7163
7166{
7167 DeserializeDlDcchMessage(bIterator);
7168 return 1;
7169}
7170
7171void
7172RrcDlDcchMessage::Print(std::ostream& os) const
7173{
7174 std::cout << "DL DCCH MSG TYPE: " << m_messageType << std::endl;
7175}
7176
7177void
7182
7185{
7186 std::bitset<0> bitset0;
7187 int n;
7188
7189 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7190 bIterator = DeserializeChoice(2, false, &n, bIterator);
7191 if (n == 1)
7192 {
7193 // Deserialize messageClassExtension
7194 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7195 m_messageType = -1;
7196 }
7197 else if (n == 0)
7198 {
7199 // Deserialize c1
7200 bIterator = DeserializeChoice(16, false, &m_messageType, bIterator);
7201 }
7202
7203 return bIterator;
7204}
7205
7206void
7208{
7209 SerializeSequence(std::bitset<0>(), false);
7210 // Choose c1
7211 SerializeChoice(2, 0, false);
7212 // Choose message type
7213 SerializeChoice(16, messageType, false);
7214}
7215
7216/////////////////// RrcUlCcchMessage //////////////////////////////////
7221
7225
7228{
7229 DeserializeUlCcchMessage(bIterator);
7230 return 1;
7231}
7232
7233void
7234RrcUlCcchMessage::Print(std::ostream& os) const
7235{
7236 std::cout << "UL CCCH MSG TYPE: " << m_messageType << std::endl;
7237}
7238
7239void
7244
7247{
7248 std::bitset<0> bitset0;
7249 int n;
7250
7251 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7252 bIterator = DeserializeChoice(2, false, &n, bIterator);
7253 if (n == 1)
7254 {
7255 // Deserialize messageClassExtension
7256 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7257 m_messageType = -1;
7258 }
7259 else if (n == 0)
7260 {
7261 // Deserialize c1
7262 bIterator = DeserializeChoice(2, false, &m_messageType, bIterator);
7263 }
7264
7265 return bIterator;
7266}
7267
7268void
7270{
7271 SerializeSequence(std::bitset<0>(), false);
7272 // Choose c1
7273 SerializeChoice(2, 0, false);
7274 // Choose message type
7275 SerializeChoice(2, messageType, false);
7276}
7277
7278/////////////////// RrcDlCcchMessage //////////////////////////////////
7283
7287
7290{
7291 DeserializeDlCcchMessage(bIterator);
7292 return 1;
7293}
7294
7295void
7296RrcDlCcchMessage::Print(std::ostream& os) const
7297{
7298 std::cout << "DL CCCH MSG TYPE: " << m_messageType << std::endl;
7299}
7300
7301void
7306
7309{
7310 std::bitset<0> bitset0;
7311 int n;
7312
7313 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7314 bIterator = DeserializeChoice(2, false, &n, bIterator);
7315 if (n == 1)
7316 {
7317 // Deserialize messageClassExtension
7318 bIterator = DeserializeSequence(&bitset0, false, bIterator);
7319 m_messageType = -1;
7320 }
7321 else if (n == 0)
7322 {
7323 // Deserialize c1
7324 bIterator = DeserializeChoice(4, false, &m_messageType, bIterator);
7325 }
7326
7327 return bIterator;
7328}
7329
7330void
7332{
7333 SerializeSequence(std::bitset<0>(), false);
7334 // Choose c1
7335 SerializeChoice(2, 0, false);
7336 // Choose message type
7337 SerializeChoice(4, messageType, false);
7338}
7339
7340} // namespace ns3
Buffer::Iterator DeserializeChoice(int numOptions, bool isExtensionMarkerPresent, int *selectedOption, Buffer::Iterator bIterator)
Deserialize a Choice (set of options)
Buffer::Iterator DeserializeSequenceOf(int *numElems, int nMax, int nMin, Buffer::Iterator bIterator)
Deserialize a Sequence.
Buffer::Iterator DeserializeNull(Buffer::Iterator bIterator)
Deserialize nothing (null op)
Buffer::Iterator DeserializeInteger(int *n, int nmin, int nmax, Buffer::Iterator bIterator)
Deserialize an integer.
void SerializeBitstring(std::bitset< N > bitstring) const
Serialize a bitstring.
Buffer::Iterator DeserializeEnum(int numElems, int *selectedElem, Buffer::Iterator bIterator)
Deserialize an Enum.
Buffer::Iterator DeserializeSequence(std::bitset< N > *optionalOrDefaultMask, bool isExtensionMarkerPresent, Buffer::Iterator bIterator)
Deserialize a sequence.
void SerializeSequence(std::bitset< N > optionalOrDefaultMask, bool isExtensionMarkerPresent) const
Serialize a sequence.
void SerializeChoice(int numOptions, int selectedOption, bool isExtensionMarkerPresent) const
Serialize a Choice (set of options)
Buffer m_serializationResult
serialization result
void FinalizeSerialization() const
Finalizes an in progress serialization.
void SerializeInteger(int n, int nmin, int nmax) const
Serialize an Integer.
Buffer::Iterator DeserializeBoolean(bool *value, Buffer::Iterator bIterator)
Deserialize a boolean.
uint32_t GetSerializedSize() const override
void SerializeBoolean(bool value) const
Serialize a bool.
Buffer::Iterator DeserializeBitstring(std::bitset< N > *bitstring, Buffer::Iterator bIterator)
Deserialize a bitstring.
void SerializeNull() const
Serialize nothing (null op)
bool m_isDataSerialized
true if data is serialized
void SerializeSequenceOf(int numElems, int nMax, int nMin) const
Serialize a Sequence.
void SerializeEnum(int numElems, int selectedElem) const
Serialize an Enum.
iterator in a Buffer instance
Definition buffer.h:89
automatically resized byte buffer
Definition buffer.h:83
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void Print(std::ostream &os) const override
void SetMessage(LteRrcSap::HandoverPreparationInfo msg)
Receives a HandoverPreparationInfo IE and stores the contents into the class attributes.
LteRrcSap::HandoverPreparationInfo GetMessage() const
Returns a HandoverPreparationInfo IE from the values in the class attributes.
LteRrcSap::AsConfig m_asConfig
AS config.
uint32_t Deserialize(Buffer::Iterator bIterator) override
LteRrcSap::AsConfig GetAsConfig() const
Getter for m_asConfig.
Protocol header serialization and deserialization.
Definition header.h:33
ReestablishmentCause
ReestablishmentCause enumeration.
void Print(std::ostream &os) const override
uint32_t Deserialize(Buffer::Iterator bIterator) override
LteRrcSap::MeasurementReport m_measurementReport
measurement report
LteRrcSap::MeasurementReport GetMessage() const
Returns a MeasurementReport IE from the values in the class attributes.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void SetMessage(LteRrcSap::MeasurementReport msg)
Receives a MeasurementReport IE and stores the contents into the class attributes.
void SerializeNonCriticalExtensionConfiguration(LteRrcSap::NonCriticalExtensionConfiguration nonCriticalExtensionConfiguration) const
Serialize non critical extension config function.
void SerializeSrbToAddModList(std::list< LteRrcSap::SrbToAddMod > srbToAddModList) const
Serialize SRB to add mod list function.
void SerializeSystemInformationBlockType2(LteRrcSap::SystemInformationBlockType2 systemInformationBlockType2) const
Serialize system information block type 2 function.
void SerializeRadioResourceConfigCommonSCell(LteRrcSap::RadioResourceConfigCommonSCell rrccsc) const
Serialize radio resource config common SCell function.
void SerializeMeasResults(LteRrcSap::MeasResults measResults) const
Serialize measure results function.
void SerializePhysicalConfigDedicated(LteRrcSap::PhysicalConfigDedicated physicalConfigDedicated) const
Serialize physical config dedicated function.
Buffer::Iterator DeserializeCellIdentification(LteRrcSap::CellIdentification *ci, Buffer::Iterator bIterator)
Deserialize cell identification function.
Buffer::Iterator DeserializeLogicalChannelConfig(LteRrcSap::LogicalChannelConfig *logicalChannelConfig, Buffer::Iterator bIterator)
Deserialize logical channel config function.
void SerializeRachConfigCommon(LteRrcSap::RachConfigCommon rachConfigCommon) const
Serialize RACH config common function.
Buffer::Iterator DeserializeMeasConfig(LteRrcSap::MeasConfig *measConfig, Buffer::Iterator bIterator)
Deserialize measure config function.
int GetMessageType() const
Get message type.
Buffer::Iterator DeserializePhysicalConfigDedicated(LteRrcSap::PhysicalConfigDedicated *physicalConfigDedicated, Buffer::Iterator bIterator)
Deserialize physical config dedicated function.
Buffer::Iterator DeserializeNonCriticalExtensionConfig(LteRrcSap::NonCriticalExtensionConfiguration *nonCriticalExtension, Buffer::Iterator bIterator)
Deserialize non critical extension config function.
void SerializeRadioResourceConfigCommonSib(LteRrcSap::RadioResourceConfigCommonSib radioResourceConfigCommonSib) const
Serialize radio resource config common SIB function.
void SerializeSystemInformationBlockType1(LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const
Serialize system information block type 1 function.
Buffer::Iterator DeserializeRachConfigCommon(LteRrcSap::RachConfigCommon *rachConfigCommon, Buffer::Iterator bIterator)
Deserialize RACH config common function.
Buffer::Iterator DeserializePlmnIdentity(uint32_t *plmnId, Buffer::Iterator bIterator)
Deserialize PLMN identity function.
uint16_t EnumToBandwidth(int n) const
Convert from ENUMERATED value to bandwidth (in RBs)
void SerializeDrbToAddModList(std::list< LteRrcSap::DrbToAddMod > drbToAddModList) const
Serialize DRB to add mod list function.
Buffer::Iterator DeserializeMeasResults(LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator)
Deserialize measure results function.
Buffer::Iterator DeserializeRadioResourceConfigCommonSCell(LteRrcSap::RadioResourceConfigCommonSCell *rrccsc, Buffer::Iterator bIterator)
Deserialize radio resource config common SCell function.
void SerializeRadioResourceDedicatedSCell(LteRrcSap::RadioResourceConfigDedicatedSCell rrcdsc) const
Serialize radio resource dedicated SCell function.
void SerializePhysicalConfigDedicatedSCell(LteRrcSap::PhysicalConfigDedicatedSCell pcdsc) const
Serialize physical config dedicated function.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
Buffer::Iterator DeserializePhysicalConfigDedicatedSCell(LteRrcSap::PhysicalConfigDedicatedSCell *pcdsc, Buffer::Iterator bIterator)
Deserialize physical config dedicated SCell function.
Buffer::Iterator DeserializeThresholdEutra(LteRrcSap::ThresholdEutra *thresholdEutra, Buffer::Iterator bIterator)
Deserialize threshold eutra function.
void SerializeRadioResourceConfigDedicated(LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
Serialize radio resource config function.
void SerializeThresholdEutra(LteRrcSap::ThresholdEutra thresholdEutra) const
Serialize threshold eutra function.
void SerializeQoffsetRange(int8_t qOffsetRange) const
Serialize Q offset range function.
Buffer::Iterator DeserializeRadioResourceConfigDedicated(LteRrcSap::RadioResourceConfigDedicated *radioResourceConfigDedicated, Buffer::Iterator bIterator)
Deserialize radio resource config dedicated function.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
int m_messageType
Stores RRC message type, according to 3GPP TS 36.331.
Buffer::Iterator DeserializeSystemInformationBlockType1(LteRrcSap::SystemInformationBlockType1 *systemInformationBlockType1, Buffer::Iterator bIterator)
Deserialize system information block type 1 function.
void SerializeLogicalChannelConfig(LteRrcSap::LogicalChannelConfig logicalChannelConfig) const
Serialize logicala channel config function.
static TypeId GetTypeId()
Get the type ID.
Buffer::Iterator DeserializeSystemInformationBlockType2(LteRrcSap::SystemInformationBlockType2 *systemInformationBlockType2, Buffer::Iterator bIterator)
Deserialize system information block type 2 function.
Buffer::Iterator DeserializeQoffsetRange(int8_t *qOffsetRange, Buffer::Iterator bIterator)
Deserialize Qoffset range function.
int BandwidthToEnum(uint16_t bandwidth) const
Convert from bandwidth (in RBs) to ENUMERATED value.
Buffer::Iterator DeserializeDrbToAddModList(std::list< LteRrcSap::DrbToAddMod > *drbToAddModLis, Buffer::Iterator bIterator)
Deserialize DRB to add mod list function.
void SerializePlmnIdentity(uint32_t plmnId) const
Serialize PLMN identity function.
Buffer::Iterator DeserializeRadioResourceConfigCommon(LteRrcSap::RadioResourceConfigCommon *radioResourceConfigCommon, Buffer::Iterator bIterator)
Deserialize radio resource config common function.
Buffer::Iterator DeserializeRadioResourceConfigDedicatedSCell(LteRrcSap::RadioResourceConfigDedicatedSCell *rrcdsc, Buffer::Iterator bIterator)
Deserialize radio resource config dedicated SCell function.
void SerializeRadioResourceConfigCommon(LteRrcSap::RadioResourceConfigCommon radioResourceConfigCommon) const
Serialize system information block type 2 function.
void SerializeMeasConfig(LteRrcSap::MeasConfig measConfig) const
Serialize measure config function.
Buffer::Iterator DeserializeSrbToAddModList(std::list< LteRrcSap::SrbToAddMod > *srbToAddModList, Buffer::Iterator bIterator)
Deserialize SRB to add mod list function.
Buffer::Iterator DeserializeRadioResourceConfigCommonSib(LteRrcSap::RadioResourceConfigCommonSib *radioResourceConfigCommonSib, Buffer::Iterator bIterator)
Deserialize radio resource config common SIB function.
uint8_t m_rrcTransactionIdentifier
RRC transaction identifier.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
LteRrcSap::RrcConnectionReconfigurationCompleted GetMessage() const
Returns a RrcConnectionReconfigurationCompleted IE from the values in the class attributes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void SetMessage(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
Receives a RrcConnectionReconfigurationCompleted IE and stores the contents into the class attributes...
uint8_t GetRrcTransactionIdentifier() const
Getter for m_rrcTransactionIdentifier.
bool m_haveNonCriticalExtension
Have non-critical extension.
std::list< LteRrcSap::SrbToAddMod > GetSrbToAddModList() const
Gets m_radioResourceConfigDedicated.srbToAddModList.
bool m_haveMeasConfig
have measure config?
std::list< LteRrcSap::DrbToAddMod > GetDrbToAddModList() const
Gets m_radioResourceConfigDedicated.drbToAddModList.
LteRrcSap::RrcConnectionReconfiguration GetMessage() const
Returns a RrcConnectionReconfiguration IE from the values in the class attributes.
LteRrcSap::NonCriticalExtensionConfiguration GetNonCriticalExtensionConfig()
Getter for m_nonCriticalExtension.
uint32_t Deserialize(Buffer::Iterator bIterator) override
LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigDedicated()
Getter for m_radioResourceConfigDedicated.
bool HavePhysicalConfigDedicated() const
Gets m_radioResourceConfigDedicated.havePhysicalConfigDedicated.
LteRrcSap::MobilityControlInfo m_mobilityControlInfo
the modility control info
LteRrcSap::MeasConfig m_measConfig
the measure config
std::list< uint8_t > GetDrbToReleaseList() const
Gets m_radioResourceConfigDedicated.drbToReleaseList.
LteRrcSap::RadioResourceConfigDedicated m_radioResourceConfigDedicated
the radio resource config dedicated
bool GetHaveNonCriticalExtensionConfig() const
Getter for m_haveNonCriticalExtension.
LteRrcSap::PhysicalConfigDedicated GetPhysicalConfigDedicated() const
Gets m_radioResourceConfigDedicated.physicalConfigDedicated.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
bool m_haveMobilityControlInfo
have mobility control info?
bool GetHaveRadioResourceConfigDedicated() const
Getter for m_haveRadioResourceConfigDedicated.
bool GetHaveMobilityControlInfo() const
Getter for m_haveMobilityControlInfo.
void SetMessage(LteRrcSap::RrcConnectionReconfiguration msg)
Receives a RrcConnectionReconfiguration IE and stores the contents into the class attributes.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
LteRrcSap::NonCriticalExtensionConfiguration m_nonCriticalExtension
the non-critical extension
uint8_t GetRrcTransactionIdentifier() const
Getter for m_rrcTransactionIdentifier.
bool m_haveRadioResourceConfigDedicated
have radio resource config dedicated?
bool GetHaveMeasConfig() const
Getter for m_haveMeasConfig.
uint8_t m_rrcTransactionIdentifier
RRC transaction identifier.
LteRrcSap::MeasConfig GetMeasConfig()
Getter for m_measConfig.
LteRrcSap::MobilityControlInfo GetMobilityControlInfo()
Getter for m_mobilityControlInfo.
void SetMessage(LteRrcSap::RrcConnectionReestablishmentComplete msg)
Receives a RrcConnectionReestablishmentComplete IE and stores the contents into the class attributes.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
uint8_t m_rrcTransactionIdentifier
RRC transaction identifier.
uint32_t Deserialize(Buffer::Iterator bIterator) override
LteRrcSap::RrcConnectionReestablishmentComplete GetMessage() const
Returns a RrcConnectionReestablishmentComplete IE from the values in the class attributes.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
uint8_t GetRrcTransactionIdentifier() const
Getter for m_rrcTransactionIdentifier attribute.
uint8_t m_rrcTransactionIdentifier
RRC transaction identifier.
LteRrcSap::RadioResourceConfigDedicated m_radioResourceConfigDedicated
radio resource config dedicated
LteRrcSap::RrcConnectionReestablishment GetMessage() const
Returns a RrcConnectionReestablishment IE from the values in the class attributes.
uint8_t GetRrcTransactionIdentifier() const
Getter for m_rrcTransactionIdentifier attribute.
LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigDedicated() const
Getter for m_radioResourceConfigDedicated attribute.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void SetMessage(LteRrcSap::RrcConnectionReestablishment msg)
Receives a RrcConnectionReestablishment IE and stores the contents into the class attributes.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void SetMessage(LteRrcSap::RrcConnectionReestablishmentReject msg)
Receives a RrcConnectionReestablishmentReject IE and stores the contents into the class attributes.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
LteRrcSap::RrcConnectionReestablishmentReject m_rrcConnectionReestablishmentReject
RRC connection reestablishmnet reject.
LteRrcSap::RrcConnectionReestablishmentReject GetMessage() const
Returns a RrcConnectionReestablishmentReject IE from the values in the class attributes.
LteRrcSap::RrcConnectionReestablishmentRequest GetMessage() const
Returns a RrcConnectionReestablishmentRequest IE from the values in the class attributes.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
LteRrcSap::ReestablishmentCause m_reestablishmentCause
reestablishment cause
LteRrcSap::ReestablishmentCause GetReestablishmentCause() const
Getter for m_reestablishmentCause.
LteRrcSap::ReestabUeIdentity m_ueIdentity
UE identity.
void SetMessage(LteRrcSap::RrcConnectionReestablishmentRequest msg)
Receives a RrcConnectionReestablishmentRequest IE and stores the contents into the class attributes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
LteRrcSap::ReestabUeIdentity GetUeIdentity() const
Getter for m_ueIdentity.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
LteRrcSap::RrcConnectionReject GetMessage() const
Returns a RrcConnectionReject IE from the values in the class attributes.
LteRrcSap::RrcConnectionReject m_rrcConnectionReject
RRC connection reject.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void SetMessage(LteRrcSap::RrcConnectionReject msg)
Receives a RrcConnectionReject IE and stores the contents into the class attributes.
LteRrcSap::RrcConnectionRelease GetMessage() const
Returns a RrcConnectionRelease IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionRelease msg)
Receives a RrcConnectionRelease IE and stores the contents into the class attributes.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
LteRrcSap::RrcConnectionRelease m_rrcConnectionRelease
RRC connection release.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
std::bitset< 8 > GetMmec() const
Get MMEC attribute.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
void SetMessage(LteRrcSap::RrcConnectionRequest msg)
Receives a RrcConnectionRequest IE and stores the contents into the class attributes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
std::bitset< 1 > m_spare
spare bit
enum ns3::RrcConnectionRequestHeader::@112154015141014352377161031066301015256105010241 m_establishmentCause
EstablishmentCause enumeration.
LteRrcSap::RrcConnectionRequest GetMessage() const
Returns a RrcConnectionRequest IE from the values in the class attributes.
static TypeId GetTypeId()
Get the type ID.
std::bitset< 32 > GetMtmsi() const
Get M-TMSI attribute.
std::bitset< 32 > m_mTmsi
TMSI.
LteRrcSap::RrcConnectionSetupCompleted GetMessage() const
Returns a RrcConnectionSetupCompleted IE from the values in the class attributes.
uint8_t m_rrcTransactionIdentifier
RRC transaction identifier.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
void SetMessage(LteRrcSap::RrcConnectionSetupCompleted msg)
Receives a RrcConnectionSetupCompleted IE and stores the contents into the class attributes.
uint8_t GetRrcTransactionIdentifier() const
Getter for m_rrcTransactionIdentifier.
uint32_t Deserialize(Buffer::Iterator bIterator) override
LteRrcSap::RadioResourceConfigDedicated m_radioResourceConfigDedicated
radio resource config dedicated
void SetMessage(LteRrcSap::RrcConnectionSetup msg)
Receives a RrcConnectionSetup IE and stores the contents into the class attributes.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
std::list< LteRrcSap::DrbToAddMod > GetDrbToAddModList() const
Gets m_radioResourceConfigDedicated.drbToAddModList.
LteRrcSap::RrcConnectionSetup GetMessage() const
Returns a RrcConnectionSetup IE from the values in the class attributes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
std::list< uint8_t > GetDrbToReleaseList() const
Gets m_radioResourceConfigDedicated.drbToReleaseList.
uint8_t m_rrcTransactionIdentifier
RRC transaction identifier.
std::list< LteRrcSap::SrbToAddMod > GetSrbToAddModList() const
Gets m_radioResourceConfigDedicated.srbToAddModList.
bool HavePhysicalConfigDedicated() const
Gets m_radioResourceConfigDedicated.havePhysicalConfigDedicated.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
LteRrcSap::PhysicalConfigDedicated GetPhysicalConfigDedicated() const
Gets m_radioResourceConfigDedicated.physicalConfigDedicated.
uint8_t GetRrcTransactionIdentifier() const
Getter for m_rrcTransactionIdentifier.
LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigDedicated() const
Getter for m_radioResourceConfigDedicated.
Buffer::Iterator DeserializeDlCcchMessage(Buffer::Iterator bIterator)
Deserialize DL CCCH message function.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void SerializeDlCcchMessage(int msgType) const
Serialize DL CCCH message function.
void SerializeDlDcchMessage(int msgType) const
Serialize DL DCCH message function.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
Buffer::Iterator DeserializeDlDcchMessage(Buffer::Iterator bIterator)
Deserialize DL DCCH message function.
void SerializeUlCcchMessage(int msgType) const
Serialize UL CCCH message function.
Buffer::Iterator DeserializeUlCcchMessage(Buffer::Iterator bIterator)
Deserialize DL CCCH message function.
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
Buffer::Iterator DeserializeUlDcchMessage(Buffer::Iterator bIterator)
Deserialize UL DCCH message function.
uint32_t Deserialize(Buffer::Iterator bIterator) override
void Print(std::ostream &os) const override
This function prints the object, for debugging purposes.
void PreSerialize() const override
This function serializes class attributes to m_serializationResult local Buffer.
void SerializeUlDcchMessage(int msgType) const
Serialize UL DCCH message function.
a unique identifier for an interface.
Definition type-id.h:49
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:1001
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition assert.h:55
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define MAX_CELL_REPORT
#define MAX_CELL_MEAS
#define MAX_DRB
#define MAX_SIB
#define MAX_EARFCN
#define MAX_SI_MESSAGE
#define MAX_MEAS_ID
#define MAX_OBJECT_ID
#define MAX_RAT_CAPABILITIES
#define MAX_REPORT_CONFIG_ID
#define MAX_SCELL_REPORT
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint16_t antennaPortsCount
antenna ports count
uint8_t transmissionMode
transmission mode
AsConfig structure.
BlackCellsToAddMod structure.
PhysCellIdRange physCellIdRange
Phy cell ID range.
CellIdentification structure.
uint32_t dlCarrierFreq
ARFCN - valueEUTRA.
uint32_t physCellId
physical cell ID
CellsToAddMod structure.
int8_t cellIndividualOffset
cell individual offset
uint8_t cellIndex
cell index
uint16_t physCellId
Phy cell ID.
uint32_t cellIdentity
cell identity
uint32_t plmnIdentity
PLMN identity.
std::list< uint32_t > plmnIdentityList
PLMN identity list.
uint16_t trackingAreaCode
tracking area code
DrbToAddMod structure.
uint8_t epsBearerIdentity
EPS bearer identity.
RlcConfig rlcConfig
RLC config.
uint8_t logicalChannelIdentity
logical channel identify
uint8_t drbIdentity
DRB identity.
LogicalChannelConfig logicalChannelConfig
logical channel config
uint32_t ulCarrierFreq
UL carrier frequency.
Definition lte-rrc-sap.h:77
uint16_t ulBandwidth
UL bandwidth.
Definition lte-rrc-sap.h:78
HandoverPreparationInfo structure.
LogicalChannelConfig structure.
Definition lte-rrc-sap.h:98
uint16_t bucketSizeDurationMs
bucket size duration ms
uint16_t prioritizedBitRateKbps
prioritized bit rate Kbps
uint8_t logicalChannelGroup
logical channel group
MeasConfig structure.
std::list< uint8_t > measIdToRemoveList
measure ID to remove list
uint8_t sMeasure
S measure.
std::list< MeasObjectToAddMod > measObjectToAddModList
measure object to add mod list
std::list< uint8_t > reportConfigToRemoveList
report config to remove list
std::list< uint8_t > measObjectToRemoveList
measure object to remove list
SpeedStatePars speedStatePars
speed state parameters
bool haveMeasGapConfig
have measure gap config?
QuantityConfig quantityConfig
quantity config
bool haveSmeasure
have S measure?
bool haveSpeedStatePars
have speed state parameters?
std::list< ReportConfigToAddMod > reportConfigToAddModList
report config to add mod list
MeasGapConfig measGapConfig
measure gap config
std::list< MeasIdToAddMod > measIdToAddModList
measure ID to add mod list
bool haveQuantityConfig
have quantity config?
uint8_t gapOffsetValue
gap offset value
MeasIdToAddMod structure.
uint8_t measObjectId
measure object ID
uint8_t reportConfigId
report config ID
std::list< uint8_t > cellsToRemoveList
cells to remove list
bool haveCellForWhichToReportCGI
have cell for which to report CGI?
std::list< CellsToAddMod > cellsToAddModList
cells to add mod list
uint16_t allowedMeasBandwidth
allowed measure bandwidth
int8_t offsetFreq
offset frequency
uint8_t neighCellConfig
neighbor cell config
uint16_t cellForWhichToReportCGI
cell for which to report CGI
bool presenceAntennaPort1
antenna port 1 present?
std::list< uint8_t > blackCellsToRemoveList
black cells to remove list
std::list< BlackCellsToAddMod > blackCellsToAddModList
black cells to add mod list
uint32_t carrierFreq
carrier frequency
MeasObjectToAddMod structure.
uint8_t measObjectId
measure object ID
MeasObjectEutra measObjectEutra
measure object eutra
uint16_t physCellId
physical cell ID
MeasResultEutra structure.
uint8_t rsrqResult
RSRQ result.
uint8_t rsrpResult
RSRP result.
bool haveRsrpResult
have RSRP result
bool haveRsrqResult
have RSRQ result?
uint16_t physCellId
Phy cell ID.
bool haveCgiInfo
have CGI info?
uint8_t rsrqResult
the RSRQ result
uint8_t rsrpResult
the RSRP result
uint8_t rsrpResult
the RSRP result
uint8_t rsrqResult
the RSRQ result
MeasResultServFreq structure.
bool haveMeasResultSCell
have measResultSCell?
MeasResultBestNeighCell measResultBestNeighCell
best neighbor cell measurement results
bool haveMeasResultBestNeighCell
have measResultBestNeighCell?
uint16_t servFreqId
serving cell index
MeasResultSCell measResultSCell
SCell measurement results.
MeasResults structure.
uint8_t measId
measure ID
bool haveMeasResultNeighCells
have measure result neighbor cells
std::list< MeasResultEutra > measResultListEutra
measure result list eutra
bool haveMeasResultServFreqList
has measResultServFreqList-r10
std::list< MeasResultServFreq > measResultServFreqList
MeasResultServFreqList-r10.
MeasResultPCell measResultPCell
measurement result primary cell
MeasurementReport structure.
MobilityControlInfo structure.
uint8_t nCellChangeHigh
cell change high
uint8_t nCellChangeMedium
cell change medium
NonCriticalExtensionConfiguration structure.
std::list< uint8_t > sCellToReleaseList
SCell to release list.
std::list< SCellToAddMod > sCellToAddModList
SCell to add mod list.
AntennaInfoCommon antennaInfoCommon
2: Physical configuration, general antennaInfoCommon-r10
PdschConfigCommon pdschConfigCommon
4: Physical configuration, physical channels pdsch-ConfigCommon-r10
uint16_t dlBandwidth
1: Cell characteristics
int8_t referenceSignalPower
INTEGER (-60..50),.
int8_t pb
INTEGER (0..3),.
uint16_t start
starting cell ID
PhysicalConfigDedicated structure.
PdschConfigDedicated pdschConfigDedicated
PDSCH config dedicated.
bool haveAntennaInfoDedicated
have antenna info dedicated?
SoundingRsUlConfigDedicated soundingRsUlConfigDedicated
sounding RS UL config dedicated
bool haveSoundingRsUlConfigDedicated
have sounding RS UL config dedicated?
bool havePdschConfigDedicated
have PDSCH config dedicated?
AntennaInfoDedicated antennaInfo
antenna info
PhysicalConfigDedicatedSCell structure.
AntennaInfoDedicated antennaInfoUl
antenna info UL
SoundingRsUlConfigDedicated soundingRsUlConfigDedicated
sounding RS UL config dedicated
PdschConfigDedicated pdschConfigDedicated
PDSCH config dedicated.
bool haveSoundingRsUlConfigDedicated
have sounding RS UL config dedicated?
bool haveUlConfiguration
have UL configuration?
bool haveAntennaInfoUlDedicated
have antenna info UL dedicated?
bool havePdschConfigDedicated
have PDSCH config dedicated?
bool haveNonUlConfiguration
have non UL configuration?
AntennaInfoDedicated antennaInfo
antenna info dedicated
bool haveAntennaInfoDedicated
have antenna info dedicated?
uint32_t plmnIdentity
PLMN identity.
Definition lte-rrc-sap.h:55
uint8_t numberOfRaPreambles
number of RA preambles
uint8_t filterCoefficientRSRQ
filter coefficient RSRQ
uint8_t filterCoefficientRSRP
filter coefficient RSRP
uint8_t raResponseWindowSize
RA response window size.
uint8_t preambleTransMax
preamble transmit maximum
RachConfigCommon structure.
TxFailParam txFailParam
txFailParams
PreambleInfo preambleInfo
preamble info
RaSupervisionInfo raSupervisionInfo
RA supervision info.
RadioResourceConfigCommon structure.
RachConfigCommon rachConfigCommon
RACH config common.
RadioResourceConfigCommonSCell.
NonUlConfiguration nonUlConfiguration
non UL configuration
bool haveUlConfiguration
have UL configuration
bool haveNonUlConfiguration
have non UL configuration?
UlConfiguration ulConfiguration
UL configuration.
RadioResourceConfigCommonSib structure.
RachConfigCommon rachConfigCommon
RACH config common.
RadioResourceConfigDedicated structure.
PhysicalConfigDedicated physicalConfigDedicated
physical config dedicated
std::list< uint8_t > drbToReleaseList
DRB to release list.
bool havePhysicalConfigDedicated
have physical config dedicated?
std::list< DrbToAddMod > drbToAddModList
DRB to add mod list.
std::list< SrbToAddMod > srbToAddModList
SRB to add mod list.
RadioResourceConfigDedicatedSCell structure.
PhysicalConfigDedicatedSCell physicalConfigDedicatedSCell
physical config dedicated SCell
ReestabUeIdentity structure.
bool reportOnLeave
Indicates whether or not the UE shall initiate the measurement reporting procedure when the leaving c...
uint8_t maxReportCells
Maximum number of cells, excluding the serving cell, to be included in the measurement report.
uint8_t hysteresis
Parameter used within the entry and leave condition of an event triggered reporting condition.
enum ns3::LteRrcSap::ReportConfigEutra::@174152020357172127004302246116267001242110156064 eventId
Event enumeration.
uint8_t reportAmount
Number of measurement reports applicable, always assumed to be infinite.
enum ns3::LteRrcSap::ReportConfigEutra::@374136270164373156154156077265266160331034212212 triggerQuantity
Trigger type enumeration.
@ EVENT_A2
Event A2: Serving becomes worse than absolute threshold.
@ EVENT_A3
Event A3: Neighbour becomes amount of offset better than PCell.
@ EVENT_A4
Event A4: Neighbour becomes better than absolute threshold.
@ EVENT_A1
Event A1: Serving becomes better than absolute threshold.
@ EVENT_A5
Event A5: PCell becomes worse than absolute threshold1 AND Neighbour becomes better than another abso...
ThresholdEutra threshold2
Threshold for event A5.
enum ns3::LteRrcSap::ReportConfigEutra::@052114161037202132004365346027213360353343030201 reportInterval
Report interval enumeration.
enum ns3::LteRrcSap::ReportConfigEutra::@347136032026324172236035053024104342310355304375 triggerType
Trigger enumeration.
ThresholdEutra threshold1
Threshold for event A1, A2, A4, and A5.
@ RSRP
Reference Signal Received Power.
@ RSRQ
Reference Signal Received Quality.
@ BOTH
Both the RSRP and RSRQ quantities are to be included in the measurement report.
enum ns3::LteRrcSap::ReportConfigEutra::@144363074020234244076040076052042351213163213352 reportQuantity
Report type enumeration.
int8_t a3Offset
Offset value for Event A3.
uint16_t timeToTrigger
Time during which specific criteria for the event needs to be met in order to trigger a measurement r...
ReportConfigToAddMod structure.
uint8_t reportConfigId
report config ID
ReportConfigEutra reportConfigEutra
report config eutra
Direction choice
direction choice
Definition lte-rrc-sap.h:93
RrcConnectionReconfigurationCompleted structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionReconfiguration structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
bool haveMobilityControlInfo
have mobility control info
NonCriticalExtensionConfiguration nonCriticalExtension
3GPP TS 36.331 v.11.10 R11 Sec.
bool haveRadioResourceConfigDedicated
have radio resource config dedicated
RadioResourceConfigDedicated radioResourceConfigDedicated
radio resource config dedicated
bool haveNonCriticalExtension
have critical extension?
MobilityControlInfo mobilityControlInfo
mobility control info
RrcConnectionReestablishmentComplete structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionReestablishment structure.
RadioResourceConfigDedicated radioResourceConfigDedicated
radio resource config dedicated
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionReestablishmentReject structure.
RrcConnectionReestablishmentRequest structure.
ReestablishmentCause reestablishmentCause
reestablishment cause
RrcConnectionReject structure.
RrcConnectionRelease structure.
RrcConnectionRequest structure.
RrcConnectionSetupCompleted structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionSetup structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RadioResourceConfigDedicated radioResourceConfigDedicated
radio resource config dedicated
SCellToAddMod structure.
RadioResourceConfigDedicatedSCell radioResourceConfigDedicatedSCell
radio resource config dedicated SCell
uint32_t sCellIndex
SCell index.
bool haveRadioResourceConfigDedicatedSCell
have radio resource config dedicated SCell?
CellIdentification cellIdentification
cell identification
RadioResourceConfigCommonSCell radioResourceConfigCommonSCell
radio resource config common SCell
uint16_t srsConfigIndex
SRS config index.
SpeedStateScaleFactors timeToTriggerSf
time to trigger scale factors
MobilityStateParameters mobilityStateParameters
mobility state parameters
uint8_t sfHigh
scale factor high
uint8_t sfMedium
scale factor medium
SrbToAddMod structure.
LogicalChannelConfig logicalChannelConfig
logical channel config
uint8_t srbIdentity
SB identity.
SystemInformationBlockType1 structure.
CellAccessRelatedInfo cellAccessRelatedInfo
cell access related info
SystemInformationBlockType2 structure.
RadioResourceConfigCommonSib radioResourceConfigCommon
radio resource config common
Threshold for event evaluation.
uint8_t range
Value range used in RSRP/RSRQ threshold.
enum ns3::LteRrcSap::ThresholdEutra::@200372075340144231162262002242030206054121013015 choice
Threshold enumeration.
@ THRESHOLD_RSRP
RSRP is used for the threshold.
@ THRESHOLD_RSRQ
RSRQ is used for the threshold.
uint8_t connEstFailCount
Number of times that the UE detects T300 expiry on the same cell.
UlPowerControlCommonSCell ulPowerControlCommonSCell
3GPP TS 36.331 v.11.10 R11 pag.223
FreqInfo ulFreqInfo
UL frequency info.
PrachConfigSCell prachConfigSCell
PRACH config SCell.