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