A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
lte-rrc-header.cc
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Lluis Parcerisa <lparcerisa@cttc.cat>
19  */
20 
21 #include "ns3/log.h"
22 #include "ns3/lte-rrc-header.h"
23 
24 #include <stdio.h>
25 #include <sstream>
26 
27 #define MAX_DRB 11 // According to section 6.4 3GPP TS 36.331
28 #define MAX_EARFCN 65535
29 #define MAX_RAT_CAPABILITIES 8
30 #define MAX_SI_MESSAGE 32
31 #define MAX_SIB 32
32 
33 #define MAX_REPORT_CONFIG_ID 32
34 #define MAX_OBJECT_ID 32
35 #define MAX_MEAS_ID 32
36 #define MAX_CELL_MEAS 32
37 #define MAX_CELL_REPORT 8
38 
39 NS_LOG_COMPONENT_DEFINE ("RrcHeader");
40 
41 namespace ns3 {
42 
44 RrcAsn1Header::RrcAsn1Header ()
45 {
46 }
47 
48 TypeId
49 RrcAsn1Header::GetTypeId (void)
50 {
51  static TypeId tid = TypeId ("ns3::RrcAsn1Header")
52  .SetParent<Header> ()
53  ;
54  return tid;
55 }
56 
57 TypeId
59 {
60  return GetTypeId ();
61 }
62 
63 int
64 RrcAsn1Header::GetMessageType ()
65 {
66  return m_messageType;
67 }
68 
69 void
70 RrcAsn1Header::SerializeDrbToAddModList (std::list<LteRrcSap::DrbToAddMod> drbToAddModList) const
71 {
72  // Serialize DRB-ToAddModList sequence-of
73  SerializeSequenceOf (drbToAddModList.size (),MAX_DRB,1);
74 
75  // Serialize the elements in the sequence-of list
76  std::list<LteRrcSap::DrbToAddMod>::iterator it = drbToAddModList.begin ();
77  for (; it != drbToAddModList.end (); it++)
78  {
79  // Serialize DRB-ToAddMod sequence
80  // 5 otional fields. Extension marker is present.
81  std::bitset<5> drbToAddModListOptionalFieldsPresent = std::bitset<5> ();
82  drbToAddModListOptionalFieldsPresent.set (4,1); // eps-BearerIdentity present
83  drbToAddModListOptionalFieldsPresent.set (3,0); // pdcp-Config not present
84  drbToAddModListOptionalFieldsPresent.set (2,1); // rlc-Config present
85  drbToAddModListOptionalFieldsPresent.set (1,1); // logicalChannelIdentity present
86  drbToAddModListOptionalFieldsPresent.set (0,1); // logicalChannelConfig present
87  SerializeSequence (drbToAddModListOptionalFieldsPresent,true);
88 
89  // Serialize eps-BearerIdentity::=INTEGER (0..15)
90  SerializeInteger (it->epsBearerIdentity,0,15);
91 
92  // Serialize drb-Identity ::= INTEGER (1..32)
93  SerializeInteger (it->drbIdentity,1,32);
94 
95  switch (it->rlcConfig.choice)
96  {
97  case LteRrcSap::RlcConfig::UM_BI_DIRECTIONAL:
98  // Serialize rlc-Config choice
99  SerializeChoice (4,1,true);
100 
101  // Serialize UL-UM-RLC
102  SerializeSequence (std::bitset<0> (),false);
103  SerializeEnum (2,0); // sn-FieldLength
104 
105  // Serialize DL-UM-RLC
106  SerializeSequence (std::bitset<0> (),false);
107  SerializeEnum (2,0); // sn-FieldLength
108  SerializeEnum (32,0); // t-Reordering
109  break;
110 
111  case LteRrcSap::RlcConfig::UM_UNI_DIRECTIONAL_UL:
112  // Serialize rlc-Config choice
113  SerializeChoice (4,2,true);
114 
115  // Serialize UL-UM-RLC
116  SerializeSequence (std::bitset<0> (),false);
117  SerializeEnum (2,0); // sn-FieldLength
118  break;
119 
120  case LteRrcSap::RlcConfig::UM_UNI_DIRECTIONAL_DL:
121  // Serialize rlc-Config choice
122  SerializeChoice (4,3,true);
123 
124  // Serialize DL-UM-RLC
125  SerializeSequence (std::bitset<0> (),false);
126  SerializeEnum (2,0); // sn-FieldLength
127  SerializeEnum (32,0); // t-Reordering
128  break;
129 
130  case LteRrcSap::RlcConfig::AM:
131  default:
132  // Serialize rlc-Config choice
133  SerializeChoice (4,0,true);
134 
135  // Serialize UL-AM-RLC
136  SerializeSequence (std::bitset<0> (),false);
137  SerializeEnum (64,0); // t-PollRetransmit
138  SerializeEnum (8,0); // pollPDU
139  SerializeEnum (16,0); // pollByte
140  SerializeEnum (8,0); // maxRetxThreshold
141 
142  // Serialize DL-AM-RLC
143  SerializeSequence (std::bitset<0> (),false);
144  SerializeEnum (32,0); // t-Reordering
145  SerializeEnum (64,0); // t-StatusProhibit
146  break;
147  }
148 
149  // Serialize logicalChannelIdentity ::=INTEGER (3..10)
150  SerializeInteger (it->logicalChannelIdentity,3,10);
151 
152  // Serialize logicalChannelConfig
153  SerializeLogicalChannelConfig (it->logicalChannelConfig);
154  }
155 }
156 
157 void
158 RrcAsn1Header::SerializeSrbToAddModList (std::list<LteRrcSap::SrbToAddMod> srbToAddModList) const
159 {
160  // Serialize SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod
161  SerializeSequenceOf (srbToAddModList.size (),2,1);
162 
163  // Serialize the elements in the sequence-of list
164  std::list<LteRrcSap::SrbToAddMod>::iterator it = srbToAddModList.begin ();
165  for (; it != srbToAddModList.end (); it++)
166  {
167  // Serialize SRB-ToAddMod sequence
168  // 2 otional fields. Extension marker is present.
169  std::bitset<2> srbToAddModListOptionalFieldsPresent = std::bitset<2> ();
170  srbToAddModListOptionalFieldsPresent.set (1,0); // rlc-Config not present
171  srbToAddModListOptionalFieldsPresent.set (0,1); // logicalChannelConfig present
172  SerializeSequence (srbToAddModListOptionalFieldsPresent,true);
173 
174  // Serialize srb-Identity ::= INTEGER (1..2)
175  SerializeInteger (it->srbIdentity,1,2);
176 
177  // Serialize logicalChannelConfig choice
178  // 2 options, selected option 0 (var "explicitValue", of type LogicalChannelConfig)
179  SerializeChoice (2,0,false);
180 
181  // Serialize LogicalChannelConfig
182  SerializeLogicalChannelConfig (it->logicalChannelConfig);
183  }
184 }
185 
186 void
187 RrcAsn1Header::SerializeLogicalChannelConfig (LteRrcSap::LogicalChannelConfig logicalChannelConfig) const
188 {
189  // Serialize LogicalChannelConfig sequence
190  // 1 optional field (ul-SpecificParameters), which is present. Extension marker present.
191  SerializeSequence (std::bitset<1> (1),true);
192 
193  // Serialize ul-SpecificParameters sequence
194  // 1 optional field (logicalChannelGroup), which is present. No extension marker.
195  SerializeSequence (std::bitset<1> (1),false);
196 
197  // Serialize priority ::= INTEGER (1..16)
198  SerializeInteger (logicalChannelConfig.priority,1,16);
199 
200  // Serialize prioritisedBitRate
201  int prioritizedBitRate;
202  switch (logicalChannelConfig.prioritizedBitRateKbps)
203  {
204  case 0:
205  prioritizedBitRate = 0;
206  break;
207  case 8:
208  prioritizedBitRate = 1;
209  break;
210  case 16:
211  prioritizedBitRate = 2;
212  break;
213  case 32:
214  prioritizedBitRate = 3;
215  break;
216  case 64:
217  prioritizedBitRate = 4;
218  break;
219  case 128:
220  prioritizedBitRate = 5;
221  break;
222  case 256:
223  prioritizedBitRate = 6;
224  break;
225  default:
226  prioritizedBitRate = 7; // Infinity
227  }
228  SerializeEnum (16,prioritizedBitRate);
229 
230  // Serialize bucketSizeDuration
231  int bucketSizeDuration;
232  switch (logicalChannelConfig.bucketSizeDurationMs)
233  {
234  case 50:
235  bucketSizeDuration = 0;
236  break;
237  case 100:
238  bucketSizeDuration = 1;
239  break;
240  case 150:
241  bucketSizeDuration = 2;
242  break;
243  case 300:
244  bucketSizeDuration = 3;
245  break;
246  case 500:
247  bucketSizeDuration = 4;
248  break;
249  case 1000:
250  bucketSizeDuration = 5;
251  break;
252  default:
253  bucketSizeDuration = 5;
254  }
255  SerializeEnum (8,bucketSizeDuration);
256 
257  // Serialize logicalChannelGroup ::= INTEGER (0..3)
258  SerializeInteger (logicalChannelConfig.logicalChannelGroup,0,3);
259 }
260 
261 void
262 RrcAsn1Header::SerializePhysicalConfigDedicated (LteRrcSap::PhysicalConfigDedicated physicalConfigDedicated) const
263 {
264  // Serialize PhysicalConfigDedicated Sequence
265  std::bitset<10> optionalFieldsPhysicalConfigDedicated;
266  optionalFieldsPhysicalConfigDedicated.set (9,0); // pdsch-ConfigDedicated not present
267  optionalFieldsPhysicalConfigDedicated.set (8,0); // pucch-ConfigDedicated not present
268  optionalFieldsPhysicalConfigDedicated.set (7,0); // pusch-ConfigDedicated not present
269  optionalFieldsPhysicalConfigDedicated.set (6,0); // uplinkPowerControlDedicated not present
270  optionalFieldsPhysicalConfigDedicated.set (5,0); // tpc-PDCCH-ConfigPUCCH not present
271  optionalFieldsPhysicalConfigDedicated.set (4,0); // tpc-PDCCH-ConfigPUSCH not present
272  optionalFieldsPhysicalConfigDedicated.set (3,0); // cqi-ReportConfig not present
273  optionalFieldsPhysicalConfigDedicated.set (2,physicalConfigDedicated.haveSoundingRsUlConfigDedicated); // soundingRS-UL-ConfigDedicated
274  optionalFieldsPhysicalConfigDedicated.set (1,physicalConfigDedicated.haveAntennaInfoDedicated); // antennaInfo
275  optionalFieldsPhysicalConfigDedicated.set (0,0); // schedulingRequestConfig not present
276  SerializeSequence (optionalFieldsPhysicalConfigDedicated,true);
277 
278  if (physicalConfigDedicated.haveSoundingRsUlConfigDedicated)
279  {
280  // Serialize SoundingRS-UL-ConfigDedicated choice:
281  switch (physicalConfigDedicated.soundingRsUlConfigDedicated.type)
282  {
283  case LteRrcSap::SoundingRsUlConfigDedicated::RESET:
284  SerializeChoice (2,0,false);
285  SerializeNull ();
286  break;
287 
288  case LteRrcSap::SoundingRsUlConfigDedicated::SETUP:
289  default:
290  // 2 options, selected: 1 (setup)
291  SerializeChoice (2,1,false);
292 
293  // Serialize setup sequence
294  // 0 optional / default fields, no extension marker.
295  SerializeSequence (std::bitset<0> (),false);
296 
297  // Serialize srs-Bandwidth
298  SerializeEnum (4,physicalConfigDedicated.soundingRsUlConfigDedicated.srsBandwidth);
299 
300  // Serialize srs-HoppingBandwidth
301  SerializeEnum (4,0);
302 
303  // Serialize freqDomainPosition
304  SerializeInteger (0,0,23);
305 
306  // Serialize duration
307  SerializeBoolean (false);
308 
309  // Serialize srs-ConfigIndex
310  SerializeInteger (physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex,0,1023);
311 
312  // Serialize transmissionComb
313  SerializeInteger (0,0,1);
314 
315  // Serialize cyclicShift
316  SerializeEnum (8,0);
317 
318  break;
319  }
320  }
321 
322  if (physicalConfigDedicated.haveAntennaInfoDedicated)
323  {
324  // Serialize antennaInfo choice
325  // 2 options. Selected: 0 ("explicitValue" of type "AntennaInfoDedicated")
326  SerializeChoice (2,0,false);
327 
328  // Serialize AntennaInfoDedicated sequence
329  // 1 optional parameter, not present. No extension marker.
330  SerializeSequence (std::bitset<1> (0),false);
331 
332  // Serialize transmissionMode
333  // Assuming the value in the struct is the enum index
334  SerializeEnum (8,physicalConfigDedicated.antennaInfo.transmissionMode);
335 
336  // Serialize ue-TransmitAntennaSelection choice
337  SerializeChoice (2,0,false);
338 
339  // Serialize release
340  SerializeNull ();
341  }
342 }
343 
344 void
345 RrcAsn1Header::SerializeRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
346 {
347  bool isSrbToAddModListPresent = !radioResourceConfigDedicated.srbToAddModList.empty ();
348  bool isDrbToAddModListPresent = !radioResourceConfigDedicated.drbToAddModList.empty ();
349  bool isDrbToReleaseListPresent = !radioResourceConfigDedicated.drbToReleaseList.empty ();
350 
351  // 6 optional fields. Extension marker is present.
352  std::bitset<6> optionalFieldsPresent = std::bitset<6> ();
353  optionalFieldsPresent.set (5,isSrbToAddModListPresent); // srb-ToAddModList present
354  optionalFieldsPresent.set (4,isDrbToAddModListPresent); // drb-ToAddModList present
355  optionalFieldsPresent.set (3,isDrbToReleaseListPresent); // drb-ToReleaseList present
356  optionalFieldsPresent.set (2,0); // mac-MainConfig not present
357  optionalFieldsPresent.set (1,0); // sps-Config not present
358  optionalFieldsPresent.set (0,(radioResourceConfigDedicated.havePhysicalConfigDedicated) ? 1 : 0);
359  SerializeSequence (optionalFieldsPresent,true);
360 
361  // Serialize srbToAddModList
362  if (isSrbToAddModListPresent)
363  {
364  SerializeSrbToAddModList (radioResourceConfigDedicated.srbToAddModList);
365  }
366 
367  // Serialize drbToAddModList
368  if (isDrbToAddModListPresent)
369  {
370  SerializeDrbToAddModList (radioResourceConfigDedicated.drbToAddModList);
371  }
372 
373  // Serialize drbToReleaseList
374  if (isDrbToReleaseListPresent)
375  {
376  SerializeSequenceOf (radioResourceConfigDedicated.drbToReleaseList.size (),MAX_DRB,1);
377  std::list<uint8_t>::iterator it = radioResourceConfigDedicated.drbToReleaseList.begin ();
378  for (; it != radioResourceConfigDedicated.drbToReleaseList.end (); it++)
379  {
380  // DRB-Identity ::= INTEGER (1..32)
381  SerializeInteger (*it,1,32);
382  }
383  }
384 
385  if (radioResourceConfigDedicated.havePhysicalConfigDedicated)
386  {
387  SerializePhysicalConfigDedicated (radioResourceConfigDedicated.physicalConfigDedicated);
388  }
389 }
390 
391 void
392 RrcAsn1Header::SerializeSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const
393 {
394  // 3 optional fields, no extension marker.
395  std::bitset<3> sysInfoBlk1Opts;
396  sysInfoBlk1Opts.set (2,0); // p-Max absent
397  sysInfoBlk1Opts.set (1,0); // tdd-Config absent
398  sysInfoBlk1Opts.set (0,0); // nonCriticalExtension absent
399  SerializeSequence (sysInfoBlk1Opts,false);
400 
401  // Serialize cellAccessRelatedInfo
402  // 1 optional field (csgIdentity) which is present, no extension marker.
403  SerializeSequence (std::bitset<1> (1),false);
404 
405  // Serialize plmn-IdentityList
406  SerializeSequenceOf (1,6,1);
407 
408  // PLMN-IdentityInfo
409  SerializeSequence (std::bitset<0> (),false);
410 
411  SerializePlmnIdentity (systemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity);
412 
413  // Serialize trackingAreaCode
414  SerializeBitstring (std::bitset<16> (0));
415  // Serialize cellIdentity
416  SerializeBitstring (std::bitset<28> (systemInformationBlockType1.cellAccessRelatedInfo.cellIdentity));
417  // Serialize cellBarred
418  SerializeEnum (2,0);
419  // Serialize intraFreqReselection
420  SerializeEnum (2,0);
421  // Serialize csg-Indication
422  SerializeBoolean (systemInformationBlockType1.cellAccessRelatedInfo.csgIndication);
423  // Serialize csg-Identity
424  SerializeBitstring (std::bitset<27> (systemInformationBlockType1.cellAccessRelatedInfo.csgIdentity));
425 
426  // Serialize cellSelectionInfo
427  SerializeSequence (std::bitset<1> (0),false);
428  // Serialize q-RxLevMin
429  SerializeInteger (-50,-70,-22);
430 
431  // Serialize freqBandIndicator
432  SerializeInteger (1,1,64);
433 
434  // Serialize schedulingInfoList
435  SerializeSequenceOf (1,MAX_SI_MESSAGE,1);
436  // SchedulingInfo
437  SerializeSequence (std::bitset<0> (),false);
438  // si-Periodicity
439  SerializeEnum (7,0);
440  // sib-MappingInfo
441  SerializeSequenceOf (0,MAX_SIB - 1,0);
442 
443  // Serialize si-WindowLength
444  SerializeEnum (7,0);
445 
446  // Serialize systemInfoValueTag
447  SerializeInteger (0,0,31);
448 }
449 
450 void
451 RrcAsn1Header::SerializeRadioResourceConfigCommon (LteRrcSap::RadioResourceConfigCommon radioResourceConfigCommon) const
452 {
453  // 9 optional fields. Extension marker yes.
454  std::bitset<9> rrCfgCmmOpts;
455  rrCfgCmmOpts.set (8,1); // rach-ConfigCommon is present
456  rrCfgCmmOpts.set (7,0); // pdsch-ConfigCommon not present
457  rrCfgCmmOpts.set (6,0); // phich-Config not present
458  rrCfgCmmOpts.set (5,0); // pucch-ConfigCommon not present
459  rrCfgCmmOpts.set (4,0); // soundingRS-UL-ConfigCommon not present
460  rrCfgCmmOpts.set (3,0); // uplinkPowerControlCommon not present
461  rrCfgCmmOpts.set (2,0); // antennaInfoCommon not present
462  rrCfgCmmOpts.set (1,0); // p-Max not present
463  rrCfgCmmOpts.set (0,0); // tdd-Config not present
464 
465  SerializeSequence (rrCfgCmmOpts,true);
466 
467  if (rrCfgCmmOpts[8])
468  {
469  // Serialize RACH-ConfigCommon
470  SerializeRachConfigCommon (radioResourceConfigCommon.rachConfigCommon);
471  }
472 
473  // Serialize PRACH-Config
474  // 1 optional, 0 extension marker.
475  SerializeSequence (std::bitset<1> (0),false);
476 
477  // Serialize PRACH-Config rootSequenceIndex
478  SerializeInteger (0,0,1023);
479 
480  // Serialize PUSCH-ConfigCommon
481  SerializeSequence (std::bitset<0> (),false);
482 
483  // Serialize pusch-ConfigBasic
484  SerializeSequence (std::bitset<0> (),false);
485  SerializeInteger (1,1,4);
486  SerializeEnum (2,0);
487  SerializeInteger (0,0,98);
488  SerializeBoolean (false);
489 
490  // Serialize UL-ReferenceSignalsPUSCH
491  SerializeSequence (std::bitset<0> (),false);
492  SerializeBoolean (false);
493  SerializeInteger (0,0,29);
494  SerializeBoolean (false);
495  SerializeInteger (4,0,7);
496 
497  // Serialize UL-CyclicPrefixLength
498  SerializeEnum (2,0);
499 }
500 
501 void
502 RrcAsn1Header::SerializeRadioResourceConfigCommonSib (LteRrcSap::RadioResourceConfigCommonSib radioResourceConfigCommonSib) const
503 {
504  SerializeSequence (std::bitset<0> (0),true);
505 
506  // rach-ConfigCommon
507  SerializeRachConfigCommon (radioResourceConfigCommonSib.rachConfigCommon);
508 
509  // bcch-Config
510  SerializeSequence (std::bitset<0> (0),false);
511  SerializeEnum (4,0); // modificationPeriodCoeff
512  // pcch-Config
513  SerializeSequence (std::bitset<0> (0),false);
514  SerializeEnum (4,0); // defaultPagingCycle
515  SerializeEnum (8,0); // nB
516  // prach-Config
517  SerializeSequence (std::bitset<1> (0),false);
518  SerializeInteger (0,0,1023); // rootSequenceIndex
519  // pdsch-ConfigCommon
520  SerializeSequence (std::bitset<0> (0),false);
521  SerializeInteger (0,-60,50); // referenceSignalPower
522  SerializeInteger (0,0,3); // p-b
523  // pusch-ConfigCommon
524  SerializeSequence (std::bitset<0> (0),false);
525  SerializeSequence (std::bitset<0> (0),false); // pusch-ConfigBasic
526  SerializeInteger (1,1,4); // n-SB
527  SerializeEnum (2,0); // hoppingMode
528  SerializeInteger (0,0,98); // pusch-HoppingOffset
529  SerializeBoolean (false); // enable64QAM
530  SerializeSequence (std::bitset<0> (0),false); // UL-ReferenceSignalsPUSCH
531  SerializeBoolean (false); // groupHoppingEnabled
532  SerializeInteger (0,0,29); // groupAssignmentPUSCH
533  SerializeBoolean (false); // sequenceHoppingEnabled
534  SerializeInteger (0,0,7); // cyclicShift
535  // pucch-ConfigCommon
536  SerializeSequence (std::bitset<0> (0),false);
537  SerializeEnum (3,0); // deltaPUCCH-Shift
538  SerializeInteger (0,0,98); // nRB-CQI
539  SerializeInteger (0,0,7); // nCS-AN
540  SerializeInteger (0,0,2047); // n1PUCCH-AN
541  // soundingRS-UL-ConfigCommon
542  SerializeChoice (2,0,false);
543  SerializeNull (); // release
544  // uplinkPowerControlCommon
545  SerializeSequence (std::bitset<0> (0),false);
546  SerializeInteger (0,-126,24); // p0-NominalPUSCH
547  SerializeEnum (8,0); // alpha
548  SerializeInteger (-50,-127,-96); // p0-NominalPUCCH
549  SerializeSequence (std::bitset<0> (0),false); // deltaFList-PUCCH
550  SerializeEnum (3,0); // deltaF-PUCCH-Format1
551  SerializeEnum (3,0); // deltaF-PUCCH-Format1b
552  SerializeEnum (4,0); // deltaF-PUCCH-Format2
553  SerializeEnum (3,0); // deltaF-PUCCH-Format2a
554  SerializeEnum (3,0); // deltaF-PUCCH-Format2b
555  SerializeInteger (0,-1,6);
556  // ul-CyclicPrefixLength
557  SerializeEnum (2,0);
558 }
559 
560 void
561 RrcAsn1Header::SerializeSystemInformationBlockType2 (LteRrcSap::SystemInformationBlockType2 systemInformationBlockType2) const
562 {
563  SerializeSequence (std::bitset<2> (0),true);
564 
565  // RadioResourceConfigCommonSib
566  SerializeRadioResourceConfigCommonSib (systemInformationBlockType2.radioResourceConfigCommon);
567 
568  // ue-TimersAndConstants
569  SerializeSequence (std::bitset<0> (0),true);
570  SerializeEnum (8,0); // t300
571  SerializeEnum (8,0); // t301
572  SerializeEnum (7,0); // t310
573  SerializeEnum (8,0); // n310
574  SerializeEnum (7,0); // t311
575  SerializeEnum (8,0); // n311
576 
577  // freqInfo
578  SerializeSequence (std::bitset<2> (3),false);
579  SerializeInteger ((int) systemInformationBlockType2.freqInfo.ulCarrierFreq, 0, MAX_EARFCN);
580  switch (systemInformationBlockType2.freqInfo.ulBandwidth)
581  {
582  case 6:
583  SerializeEnum (6,0);
584  break;
585  case 15:
586  SerializeEnum (6,1);
587  break;
588  case 25:
589  SerializeEnum (6,2);
590  break;
591  case 50:
592  SerializeEnum (6,3);
593  break;
594  case 75:
595  SerializeEnum (6,4);
596  break;
597  case 100:
598  SerializeEnum (6,5);
599  break;
600  default:
601  SerializeEnum (6,0);
602  }
603 
604  SerializeInteger (29,1,32); // additionalSpectrumEmission
605  // timeAlignmentTimerCommon
606  SerializeEnum (8,0);
607 }
608 
609 void
610 RrcAsn1Header::SerializeMeasResults (LteRrcSap::MeasResults measResults) const
611 {
612  // Watchdog: if list has 0 elements, set boolean to false
613  if (measResults.measResultListEutra.empty ())
614  {
615  measResults.haveMeasResultNeighCells = false;
616  }
617 
618  // Serialize MeasResults sequence, 1 optional value, extension marker present
619  SerializeSequence (std::bitset<1> (measResults.haveMeasResultNeighCells),true);
620 
621  // Serialize measId
622  SerializeInteger (measResults.measId,1,MAX_MEAS_ID);
623 
624  // Serialize measResultServCell sequence
625  SerializeSequence (std::bitset<0> (0),false);
626 
627  // Serialize rsrpResult
628  SerializeInteger (measResults.rsrpResult,0,97);
629 
630  // Serialize rsrqResult
631  SerializeInteger (measResults.rsrqResult,0,34);
632 
633  if (measResults.haveMeasResultNeighCells)
634  {
635  // Serialize Choice = 0 (MeasResultListEUTRA)
636  SerializeChoice (4,0,false);
637 
638  // Serialize measResultNeighCells
639  SerializeSequenceOf (measResults.measResultListEutra.size (),MAX_CELL_REPORT,1);
640 
641  // serialize MeasResultEutra elements in the list
642  std::list<LteRrcSap::MeasResultEutra>::iterator it;
643  for (it = measResults.measResultListEutra.begin (); it != measResults.measResultListEutra.end (); it++)
644  {
645  SerializeSequence (std::bitset<1> (it->haveCgiInfo),false);
646 
647  // Serialize PhysCellId
648  SerializeInteger (it->physCellId, 0, 503);
649 
650  // Serialize CgiInfo
651  if (it->haveCgiInfo)
652  {
653  SerializeSequence (std::bitset<1> (it->cgiInfo.plmnIdentityList.size ()),false);
654 
655  // Serialize cellGlobalId
656  SerializeSequence (std::bitset<0> (0),false);
657  SerializePlmnIdentity (it->cgiInfo.plmnIdentity);
658  SerializeBitstring (std::bitset<28> (it->cgiInfo.cellIdentity));
659 
660  // Serialize trackingAreaCode
661  SerializeBitstring (std::bitset<16> (it->cgiInfo.trackingAreaCode));
662 
663  // Serialize plmn-IdentityList
664  if (!it->cgiInfo.plmnIdentityList.empty ())
665  {
666  SerializeSequenceOf (it->cgiInfo.plmnIdentityList.size (),5,1);
667  std::list<uint32_t>::iterator it2;
668  for (it2 = it->cgiInfo.plmnIdentityList.begin (); it2 != it->cgiInfo.plmnIdentityList.end (); it2++)
669  {
670  SerializePlmnIdentity (*it2);
671  }
672  }
673  }
674 
675  // Serialize measResult
676  std::bitset<2> measResultFieldsPresent;
677  measResultFieldsPresent[1] = it->haveRsrpResult;
678  measResultFieldsPresent[0] = it->haveRsrqResult;
679  SerializeSequence (measResultFieldsPresent,true);
680 
681  if (it->haveRsrpResult)
682  {
683  SerializeInteger (it->rsrpResult,0,97);
684  }
685 
686  if (it->haveRsrqResult)
687  {
688  SerializeInteger (it->rsrqResult,0,34);
689  }
690  }
691  }
692 }
693 
694 void
695 RrcAsn1Header::SerializePlmnIdentity (uint32_t plmnId) const
696 {
697  // plmn-Identity sequence, mcc is optional, no extension marker
698  SerializeSequence (std::bitset<1> (0), false);
699 
700  // Serialize mnc
701  int nDig = (plmnId > 99) ? 3 : 2;
702 
703  SerializeSequenceOf (nDig,3,2);
704  for (int i = nDig - 1; i >= 0; i--)
705  {
706  int n = floor (plmnId / pow (10,i));
707  SerializeInteger (n,0,9);
708  plmnId -= n * pow (10,i);
709  }
710 
711  // cellReservedForOperatorUse
712  SerializeEnum (2,0);
713 }
714 
715 void
716 RrcAsn1Header::SerializeRachConfigCommon (LteRrcSap::RachConfigCommon rachConfigCommon) const
717 {
718  // rach-ConfigCommon
719  SerializeSequence (std::bitset<0> (0),true);
720 
721  // preambleInfo
722  SerializeSequence (std::bitset<1> (0),false);
723 
724  // numberOfRA-Preambles
725  switch (rachConfigCommon.preambleInfo.numberOfRaPreambles)
726  {
727  case 4:
728  SerializeEnum (16,0);
729  break;
730  case 8:
731  SerializeEnum (16,1);
732  break;
733  case 12:
734  SerializeEnum (16,2);
735  break;
736  case 16:
737  SerializeEnum (16,3);
738  break;
739  case 20:
740  SerializeEnum (16,4);
741  break;
742  case 24:
743  SerializeEnum (16,5);
744  break;
745  case 28:
746  SerializeEnum (16,6);
747  break;
748  case 32:
749  SerializeEnum (16,7);
750  break;
751  case 36:
752  SerializeEnum (16,8);
753  break;
754  case 40:
755  SerializeEnum (16,9);
756  break;
757  case 44:
758  SerializeEnum (16,10);
759  break;
760  case 48:
761  SerializeEnum (16,11);
762  break;
763  case 52:
764  SerializeEnum (16,12);
765  break;
766  case 56:
767  SerializeEnum (16,13);
768  break;
769  case 60:
770  SerializeEnum (16,14);
771  break;
772  case 64:
773  SerializeEnum (16,15);
774  break;
775  default:
776  SerializeEnum (16,0);
777  }
778 
779  SerializeSequence (std::bitset<0> (0),false); // powerRampingParameters
780  SerializeEnum (4,0); // powerRampingStep
781  SerializeEnum (16,0); // preambleInitialReceivedTargetPower
782  SerializeSequence (std::bitset<0> (0),false); // ra-SupervisionInfo
783 
784  // preambleTransMax
785  switch (rachConfigCommon.raSupervisionInfo.preambleTransMax)
786  {
787  case 3:
788  SerializeEnum (11,0);
789  break;
790  case 4:
791  SerializeEnum (11,1);
792  break;
793  case 5:
794  SerializeEnum (11,2);
795  break;
796  case 6:
797  SerializeEnum (11,3);
798  break;
799  case 7:
800  SerializeEnum (11,4);
801  break;
802  case 8:
803  SerializeEnum (11,5);
804  break;
805  case 10:
806  SerializeEnum (11,6);
807  break;
808  case 20:
809  SerializeEnum (11,7);
810  break;
811  case 50:
812  SerializeEnum (11,8);
813  break;
814  case 100:
815  SerializeEnum (11,9);
816  break;
817  case 200:
818  SerializeEnum (11,10);
819  break;
820  default:
821  SerializeEnum (11,0);
822  }
823 
824  // ra-ResponseWindowSize
825  switch (rachConfigCommon.raSupervisionInfo.raResponseWindowSize)
826  {
827  case 2:
828  SerializeEnum (8,0);
829  break;
830  case 3:
831  SerializeEnum (8,1);
832  break;
833  case 4:
834  SerializeEnum (8,2);
835  break;
836  case 5:
837  SerializeEnum (8,3);
838  break;
839  case 6:
840  SerializeEnum (8,4);
841  break;
842  case 7:
843  SerializeEnum (8,5);
844  break;
845  case 8:
846  SerializeEnum (8,6);
847  break;
848  case 10:
849  SerializeEnum (8,7);
850  break;
851  default:
852  SerializeEnum (8,0);
853  }
854 
855  SerializeEnum (8,0); // mac-ContentionResolutionTimer
856  SerializeInteger (1,1,8); // maxHARQ-Msg3Tx
857 }
858 
859 void
860 RrcAsn1Header::SerializeQoffsetRange (int8_t qOffsetRange) const
861 {
862  switch (qOffsetRange)
863  {
864  case -24:
865  SerializeEnum (32,0);
866  break;
867  case -22:
868  SerializeEnum (32,1);
869  break;
870  case -20:
871  SerializeEnum (32,2);
872  break;
873  case -18:
874  SerializeEnum (32,3);
875  break;
876  case -16:
877  SerializeEnum (32,4);
878  break;
879  case -14:
880  SerializeEnum (32,5);
881  break;
882  case -12:
883  SerializeEnum (32,6);
884  break;
885  case -10:
886  SerializeEnum (32,7);
887  break;
888  case -8:
889  SerializeEnum (32,8);
890  break;
891  case -6:
892  SerializeEnum (32,9);
893  break;
894  case -5:
895  SerializeEnum (32,10);
896  break;
897  case -4:
898  SerializeEnum (32,11);
899  break;
900  case -3:
901  SerializeEnum (32,12);
902  break;
903  case -2:
904  SerializeEnum (32,13);
905  break;
906  case -1:
907  SerializeEnum (32,14);
908  break;
909  case 0:
910  SerializeEnum (32,15);
911  break;
912  case 1:
913  SerializeEnum (32,16);
914  break;
915  case 2:
916  SerializeEnum (32,17);
917  break;
918  case 3:
919  SerializeEnum (32,18);
920  break;
921  case 4:
922  SerializeEnum (32,19);
923  break;
924  case 5:
925  SerializeEnum (32,20);
926  break;
927  case 6:
928  SerializeEnum (32,21);
929  break;
930  case 8:
931  SerializeEnum (32,22);
932  break;
933  case 10:
934  SerializeEnum (32,23);
935  break;
936  case 12:
937  SerializeEnum (32,24);
938  break;
939  case 14:
940  SerializeEnum (32,25);
941  break;
942  case 16:
943  SerializeEnum (32,26);
944  break;
945  case 18:
946  SerializeEnum (32,27);
947  break;
948  case 20:
949  SerializeEnum (32,28);
950  break;
951  case 22:
952  SerializeEnum (32,29);
953  break;
954  case 24:
955  SerializeEnum (32,30);
956  break;
957  default:
958  SerializeEnum (32,15);
959  }
960 }
961 
962 void
963 RrcAsn1Header::SerializeThresholdEutra (LteRrcSap::ThresholdEutra thresholdEutra) const
964 {
965  switch (thresholdEutra.choice)
966  {
967  case LteRrcSap::ThresholdEutra::thresholdRsrp:
968  SerializeInteger (thresholdEutra.range, 0, 97);
969  break;
970  case LteRrcSap::ThresholdEutra::thresholdRsrq:
971  default:
972  SerializeInteger (thresholdEutra.range, 0, 34);
973  }
974 }
975 
976 void
977 RrcAsn1Header::SerializeMeasConfig (LteRrcSap::MeasConfig measConfig) const
978 {
979  // Serialize MeasConfig sequence
980  // 11 optional fields, extension marker present
981  std::bitset<11> measConfigOptional;
982  measConfigOptional.set (10, !measConfig.measObjectToRemoveList.empty () );
983  measConfigOptional.set (9, !measConfig.measObjectToAddModList.empty () );
984  measConfigOptional.set (8, !measConfig.reportConfigToRemoveList.empty () );
985  measConfigOptional.set (7, !measConfig.reportConfigToAddModList.empty () );
986  measConfigOptional.set (6, !measConfig.measIdToRemoveList.empty () );
987  measConfigOptional.set (5, !measConfig.measIdToAddModList.empty () );
988  measConfigOptional.set (4, measConfig.haveQuantityConfig );
989  measConfigOptional.set (3, measConfig.haveMeasGapConfig );
990  measConfigOptional.set (2, measConfig.haveSmeasure );
991  measConfigOptional.set (1, false ); // preRegistrationInfoHRPD
992  measConfigOptional.set (0, measConfig.haveSpeedStatePars );
993  SerializeSequence (measConfigOptional,true);
994 
995  if (!measConfig.measObjectToRemoveList.empty ())
996  {
997  SerializeSequenceOf (measConfig.measObjectToRemoveList.size (),MAX_OBJECT_ID,1);
998  for (std::list<uint8_t>::iterator it = measConfig.measObjectToRemoveList.begin (); it != measConfig.measObjectToRemoveList.end (); it++)
999  {
1000  SerializeInteger (*it, 1, MAX_OBJECT_ID);
1001  }
1002  }
1003 
1004  if (!measConfig.measObjectToAddModList.empty ())
1005  {
1006  SerializeSequenceOf (measConfig.measObjectToAddModList.size (),MAX_OBJECT_ID,1);
1007  for (std::list<LteRrcSap::MeasObjectToAddMod>::iterator it = measConfig.measObjectToAddModList.begin (); it != measConfig.measObjectToAddModList.end (); it++)
1008  {
1009  SerializeSequence (std::bitset<0> (), false);
1010  SerializeInteger (it->measObjectId, 1, MAX_OBJECT_ID);
1011  SerializeChoice (4, 0, true); // Select MeasObjectEUTRA
1012 
1013  // Serialize measObjectEutra
1014  std::bitset<5> measObjOpts;
1015  measObjOpts.set (4,!it->measObjectEutra.cellsToRemoveList.empty () );
1016  measObjOpts.set (3,!it->measObjectEutra.cellsToAddModList.empty () );
1017  measObjOpts.set (2,!it->measObjectEutra.blackCellsToRemoveList.empty () );
1018  measObjOpts.set (1,!it->measObjectEutra.blackCellsToAddModList.empty () );
1019  measObjOpts.set (0,it->measObjectEutra.haveCellForWhichToReportCGI);
1020  SerializeSequence (measObjOpts, true);
1021 
1022  // Serialize carrierFreq
1023  SerializeInteger (it->measObjectEutra.carrierFreq, 0, MAX_EARFCN);
1024 
1025  // Serialize allowedMeasBandwidth
1026  switch (it->measObjectEutra.allowedMeasBandwidth)
1027  {
1028  case 6:
1029  SerializeEnum (6,0);
1030  break;
1031  case 15:
1032  SerializeEnum (6,1);
1033  break;
1034  case 25:
1035  SerializeEnum (6,2);
1036  break;
1037  case 50:
1038  SerializeEnum (6,3);
1039  break;
1040  case 75:
1041  SerializeEnum (6,4);
1042  break;
1043  case 100:
1044  SerializeEnum (6,5);
1045  break;
1046  default:
1047  SerializeEnum (6,0);
1048  }
1049 
1050  SerializeBoolean (it->measObjectEutra.presenceAntennaPort1);
1051  SerializeBitstring (std::bitset<2> (it->measObjectEutra.neighCellConfig));
1052  SerializeQoffsetRange (it->measObjectEutra.offsetFreq);
1053 
1054  if (!it->measObjectEutra.cellsToRemoveList.empty ())
1055  {
1056  SerializeSequenceOf (it->measObjectEutra.cellsToRemoveList.size (),MAX_CELL_MEAS,1);
1057  for (std::list<uint8_t>::iterator it2 = it->measObjectEutra.cellsToRemoveList.begin (); it2 != it->measObjectEutra.cellsToRemoveList.end (); it2++)
1058  {
1059  SerializeInteger (*it2, 1, MAX_CELL_MEAS);
1060  }
1061  }
1062 
1063  if (!it->measObjectEutra.cellsToAddModList.empty ())
1064  {
1065  SerializeSequenceOf (it->measObjectEutra.cellsToAddModList.size (), MAX_CELL_MEAS, 1);
1066  for (std::list<LteRrcSap::CellsToAddMod>::iterator it2 = it->measObjectEutra.cellsToAddModList.begin (); it2 != it->measObjectEutra.cellsToAddModList.end (); it2++)
1067  {
1068  SerializeSequence (std::bitset<0> (), false);
1069 
1070  // Serialize cellIndex
1071  SerializeInteger (it2->cellIndex, 1, MAX_CELL_MEAS);
1072 
1073  // Serialize PhysCellIdRange
1074  // range optional and not present
1075  SerializeSequence (std::bitset<1> (0),false);
1076  SerializeInteger (it2->physCellId,0,503);
1077 
1078  // Serialize cellIndividualOffset
1079  SerializeQoffsetRange (it2->cellIndividualOffset);
1080  }
1081  }
1082 
1083  if (!it->measObjectEutra.blackCellsToRemoveList.empty () )
1084  {
1085  SerializeSequenceOf (it->measObjectEutra.blackCellsToRemoveList.size (),MAX_CELL_MEAS,1);
1086  for (std::list<uint8_t>::iterator it2 = it->measObjectEutra.blackCellsToRemoveList.begin (); it2 != it->measObjectEutra.blackCellsToRemoveList.end (); it2++)
1087  {
1088  SerializeInteger (*it2, 1, MAX_CELL_MEAS);
1089  }
1090  }
1091 
1092  if (!it->measObjectEutra.blackCellsToAddModList.empty () )
1093  {
1094  SerializeSequenceOf (it->measObjectEutra.blackCellsToAddModList.size (), MAX_CELL_MEAS, 1);
1095  for (std::list<LteRrcSap::BlackCellsToAddMod>::iterator it2 = it->measObjectEutra.blackCellsToAddModList.begin (); it2 != it->measObjectEutra.blackCellsToAddModList.end (); it2++)
1096  {
1097  SerializeSequence (std::bitset<0> (),false);
1098  SerializeInteger (it2->cellIndex, 1, MAX_CELL_MEAS);
1099 
1100  // Serialize PhysCellIdRange
1101  // range optional
1102  std::bitset<1> rangePresent = std::bitset<1> (it2->physCellIdRange.haveRange);
1103  SerializeSequence (rangePresent,false);
1104  SerializeInteger (it2->physCellIdRange.start,0,503);
1105  if (it2->physCellIdRange.haveRange)
1106  {
1107  switch (it2->physCellIdRange.range)
1108  {
1109  case 4:
1110  SerializeEnum (16, 0);
1111  break;
1112  case 8:
1113  SerializeEnum (16, 1);
1114  break;
1115  case 12:
1116  SerializeEnum (16, 2);
1117  break;
1118  case 16:
1119  SerializeEnum (16, 3);
1120  break;
1121  case 24:
1122  SerializeEnum (16, 4);
1123  break;
1124  case 32:
1125  SerializeEnum (16, 5);
1126  break;
1127  case 48:
1128  SerializeEnum (16, 6);
1129  break;
1130  case 64:
1131  SerializeEnum (16, 7);
1132  break;
1133  case 84:
1134  SerializeEnum (16, 8);
1135  break;
1136  case 96:
1137  SerializeEnum (16, 9);
1138  break;
1139  case 128:
1140  SerializeEnum (16, 10);
1141  break;
1142  case 168:
1143  SerializeEnum (16, 11);
1144  break;
1145  case 252:
1146  SerializeEnum (16, 12);
1147  break;
1148  case 504:
1149  SerializeEnum (16, 13);
1150  break;
1151  default:
1152  SerializeEnum (16, 0);
1153  }
1154  }
1155  }
1156 
1157  }
1158 
1159  if (it->measObjectEutra.haveCellForWhichToReportCGI)
1160  {
1161  SerializeInteger (it->measObjectEutra.cellForWhichToReportCGI,0,503);
1162  }
1163  }
1164  }
1165 
1166 
1167  if (!measConfig.reportConfigToRemoveList.empty () )
1168  {
1169  SerializeSequenceOf (measConfig.reportConfigToRemoveList.size (),MAX_REPORT_CONFIG_ID,1);
1170  for (std::list<uint8_t>::iterator it = measConfig.reportConfigToRemoveList.begin (); it != measConfig.reportConfigToRemoveList.end (); it++)
1171  {
1172  SerializeInteger (*it, 1,MAX_REPORT_CONFIG_ID);
1173  }
1174  }
1175 
1176  if (!measConfig.reportConfigToAddModList.empty () )
1177  {
1178  SerializeSequenceOf (measConfig.reportConfigToAddModList.size (),MAX_REPORT_CONFIG_ID,1);
1179  for (std::list<LteRrcSap::ReportConfigToAddMod>::iterator it = measConfig.reportConfigToAddModList.begin (); it != measConfig.reportConfigToAddModList.end (); it++)
1180  {
1181  SerializeSequence (std::bitset<0> (), false);
1182  SerializeInteger (it->reportConfigId,1,MAX_REPORT_CONFIG_ID);
1183  SerializeChoice (2,0,false); // reportConfigEUTRA
1184 
1185  // Serialize ReportConfigEUTRA
1186  SerializeSequence (std::bitset<0> (), true);
1187  switch (it->reportConfigEutra.triggerType)
1188  {
1189  case LteRrcSap::ReportConfigEutra::periodical:
1190  SerializeChoice (2, 1, false);
1191  SerializeSequence (std::bitset<0> (),false);
1192  switch (it->reportConfigEutra.purpose)
1193  {
1194  case LteRrcSap::ReportConfigEutra::reportCgi:
1195  SerializeEnum (2,1);
1196  break;
1197  case LteRrcSap::ReportConfigEutra::reportStrongestCells:
1198  default:
1199  SerializeEnum (2,0);
1200  }
1201  break;
1202  case LteRrcSap::ReportConfigEutra::event:
1203  default:
1204  SerializeChoice (2, 0, false);
1205  SerializeSequence (std::bitset<0> (),true);
1206  switch (it->reportConfigEutra.eventId)
1207  {
1208  case LteRrcSap::ReportConfigEutra::eventA1:
1209  SerializeChoice (5, 0, true);
1210  SerializeSequence (std::bitset<0> (),false);
1211  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
1212  break;
1213  case LteRrcSap::ReportConfigEutra::eventA2:
1214  SerializeChoice (5, 1, true);
1215  SerializeSequence (std::bitset<0> (),false);
1216  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
1217  break;
1218  case LteRrcSap::ReportConfigEutra::eventA3:
1219  SerializeChoice (5, 2, true);
1220  SerializeSequence (std::bitset<0> (),false);
1221  SerializeInteger (it->reportConfigEutra.a3Offset,-30,30);
1222  SerializeBoolean (it->reportConfigEutra.reportOnLeave);
1223  break;
1224  case LteRrcSap::ReportConfigEutra::eventA4:
1225  SerializeChoice (5, 3, true);
1226  SerializeSequence (std::bitset<0> (),false);
1227  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
1228  break;
1229  case LteRrcSap::ReportConfigEutra::eventA5:
1230  default:
1231  SerializeChoice (5, 4, true);
1232  SerializeSequence (std::bitset<0> (),false);
1233  SerializeThresholdEutra (it->reportConfigEutra.threshold1);
1234  SerializeThresholdEutra (it->reportConfigEutra.threshold2);
1235  }
1236 
1237  SerializeInteger (it->reportConfigEutra.hysteresis, 0, 30);
1238 
1239  switch (it->reportConfigEutra.timeToTrigger)
1240  {
1241  case 0:
1242  SerializeEnum (16, 0);
1243  break;
1244  case 40:
1245  SerializeEnum (16, 1);
1246  break;
1247  case 64:
1248  SerializeEnum (16, 2);
1249  break;
1250  case 80:
1251  SerializeEnum (16, 3);
1252  break;
1253  case 100:
1254  SerializeEnum (16, 4);
1255  break;
1256  case 128:
1257  SerializeEnum (16, 5);
1258  break;
1259  case 160:
1260  SerializeEnum (16, 6);
1261  break;
1262  case 256:
1263  SerializeEnum (16, 7);
1264  break;
1265  case 320:
1266  SerializeEnum (16, 8);
1267  break;
1268  case 480:
1269  SerializeEnum (16, 9);
1270  break;
1271  case 512:
1272  SerializeEnum (16, 10);
1273  break;
1274  case 640:
1275  SerializeEnum (16, 11);
1276  break;
1277  case 1024:
1278  SerializeEnum (16, 12);
1279  break;
1280  case 1280:
1281  SerializeEnum (16, 13);
1282  break;
1283  case 2560:
1284  SerializeEnum (16, 14);
1285  break;
1286  case 5120:
1287  default:
1288  SerializeEnum (16, 15);
1289  }
1290  } // end trigger type
1291 
1292  // Serialize triggerQuantity
1293  if (it->reportConfigEutra.triggerQuantity == LteRrcSap::ReportConfigEutra::rsrp)
1294  {
1295  SerializeEnum (2, 0);
1296  }
1297  else
1298  {
1299  SerializeEnum (2, 1);
1300  }
1301 
1302  // Serialize reportQuantity
1303  if (it->reportConfigEutra.reportQuantity == LteRrcSap::ReportConfigEutra::sameAsTriggerQuantity)
1304  {
1305  SerializeEnum (2, 0);
1306  }
1307  else
1308  {
1309  SerializeEnum (2, 1);
1310  }
1311 
1312  // Serialize maxReportCells
1313  SerializeInteger (it->reportConfigEutra.maxReportCells, 1, MAX_CELL_REPORT);
1314 
1315  // Serialize reportInterval
1316  switch (it->reportConfigEutra.reportInterval)
1317  {
1318  case LteRrcSap::ReportConfigEutra::ms120:
1319  SerializeEnum (16, 0);
1320  break;
1321  case LteRrcSap::ReportConfigEutra::ms240:
1322  SerializeEnum (16, 1);
1323  break;
1324  case LteRrcSap::ReportConfigEutra::ms480:
1325  SerializeEnum (16, 2);
1326  break;
1327  case LteRrcSap::ReportConfigEutra::ms640:
1328  SerializeEnum (16, 3);
1329  break;
1330  case LteRrcSap::ReportConfigEutra::ms1024:
1331  SerializeEnum (16, 4);
1332  break;
1333  case LteRrcSap::ReportConfigEutra::ms2048:
1334  SerializeEnum (16, 5);
1335  break;
1336  case LteRrcSap::ReportConfigEutra::ms5120:
1337  SerializeEnum (16, 6);
1338  break;
1339  case LteRrcSap::ReportConfigEutra::ms10240:
1340  SerializeEnum (16, 7);
1341  break;
1342  case LteRrcSap::ReportConfigEutra::min1:
1343  SerializeEnum (16, 8);
1344  break;
1345  case LteRrcSap::ReportConfigEutra::min6:
1346  SerializeEnum (16, 9);
1347  break;
1348  case LteRrcSap::ReportConfigEutra::min12:
1349  SerializeEnum (16, 10);
1350  break;
1351  case LteRrcSap::ReportConfigEutra::min30:
1352  SerializeEnum (16, 11);
1353  break;
1354  case LteRrcSap::ReportConfigEutra::min60:
1355  SerializeEnum (16, 12);
1356  break;
1357  case LteRrcSap::ReportConfigEutra::spare3:
1358  SerializeEnum (16, 13);
1359  break;
1360  case LteRrcSap::ReportConfigEutra::spare2:
1361  SerializeEnum (16, 14);
1362  break;
1363  case LteRrcSap::ReportConfigEutra::spare1:
1364  default:
1365  SerializeEnum (16, 15);
1366  }
1367 
1368  // Serialize reportAmount
1369  switch (it->reportConfigEutra.reportAmount)
1370  {
1371  case 1:
1372  SerializeEnum (8, 0);
1373  break;
1374  case 2:
1375  SerializeEnum (8, 1);
1376  break;
1377  case 4:
1378  SerializeEnum (8, 2);
1379  break;
1380  case 8:
1381  SerializeEnum (8, 3);
1382  break;
1383  case 16:
1384  SerializeEnum (8, 4);
1385  break;
1386  case 32:
1387  SerializeEnum (8, 5);
1388  break;
1389  case 64:
1390  SerializeEnum (8, 6);
1391  break;
1392  default:
1393  SerializeEnum (8, 7);
1394  }
1395  }
1396  }
1397 
1398  if (!measConfig.measIdToRemoveList.empty () )
1399  {
1400  SerializeSequenceOf (measConfig.measIdToRemoveList.size (), MAX_MEAS_ID, 1);
1401  for (std::list<uint8_t>::iterator it = measConfig.measIdToRemoveList.begin (); it != measConfig.measIdToRemoveList.end (); it++)
1402  {
1403  SerializeInteger (*it, 1, MAX_MEAS_ID);
1404  }
1405  }
1406 
1407  if (!measConfig.measIdToAddModList.empty () )
1408  {
1409  SerializeSequenceOf ( measConfig.measIdToAddModList.size (), MAX_MEAS_ID, 1);
1410  for (std::list<LteRrcSap::MeasIdToAddMod>::iterator it = measConfig.measIdToAddModList.begin (); it != measConfig.measIdToAddModList.end (); it++)
1411  {
1412  SerializeInteger (it->measId, 1, MAX_MEAS_ID);
1413  SerializeInteger (it->measObjectId, 1, MAX_OBJECT_ID);
1414  SerializeInteger (it->reportConfigId, 1, MAX_REPORT_CONFIG_ID);
1415  }
1416  }
1417 
1418  if (measConfig.haveQuantityConfig )
1419  {
1420  // QuantityConfig sequence
1421  // 4 optional fields, only first (EUTRA) present. Extension marker yes.
1422  std::bitset<4> quantityConfigOpts (0);
1423  quantityConfigOpts.set (3,1);
1424  SerializeSequence (quantityConfigOpts, true);
1425  SerializeSequence (std::bitset<0> (), false);
1426 
1427  switch (measConfig.quantityConfig.filterCoefficientRSRP)
1428  {
1429  case 0:
1430  SerializeEnum (16, 0);
1431  break;
1432  case 1:
1433  SerializeEnum (16, 1);
1434  break;
1435  case 2:
1436  SerializeEnum (16, 2);
1437  break;
1438  case 3:
1439  SerializeEnum (16, 3);
1440  break;
1441  case 4:
1442  SerializeEnum (16, 4);
1443  break;
1444  case 5:
1445  SerializeEnum (16, 5);
1446  break;
1447  case 6:
1448  SerializeEnum (16, 6);
1449  break;
1450  case 7:
1451  SerializeEnum (16, 7);
1452  break;
1453  case 8:
1454  SerializeEnum (16, 8);
1455  break;
1456  case 9:
1457  SerializeEnum (16, 9);
1458  break;
1459  case 11:
1460  SerializeEnum (16, 10);
1461  break;
1462  case 13:
1463  SerializeEnum (16, 11);
1464  break;
1465  case 15:
1466  SerializeEnum (16, 12);
1467  break;
1468  case 17:
1469  SerializeEnum (16, 13);
1470  break;
1471  case 19:
1472  SerializeEnum (16, 14);
1473  break;
1474  default:
1475  SerializeEnum (16, 4);
1476  }
1477 
1478  switch (measConfig.quantityConfig.filterCoefficientRSRQ)
1479  {
1480  case 0:
1481  SerializeEnum (16, 0);
1482  break;
1483  case 1:
1484  SerializeEnum (16, 1);
1485  break;
1486  case 2:
1487  SerializeEnum (16, 2);
1488  break;
1489  case 3:
1490  SerializeEnum (16, 3);
1491  break;
1492  case 4:
1493  SerializeEnum (16, 4);
1494  break;
1495  case 5:
1496  SerializeEnum (16, 5);
1497  break;
1498  case 6:
1499  SerializeEnum (16, 6);
1500  break;
1501  case 7:
1502  SerializeEnum (16, 7);
1503  break;
1504  case 8:
1505  SerializeEnum (16, 8);
1506  break;
1507  case 9:
1508  SerializeEnum (16, 9);
1509  break;
1510  case 11:
1511  SerializeEnum (16, 10);
1512  break;
1513  case 13:
1514  SerializeEnum (16, 11);
1515  break;
1516  case 15:
1517  SerializeEnum (16, 12);
1518  break;
1519  case 17:
1520  SerializeEnum (16, 13);
1521  break;
1522  case 19:
1523  SerializeEnum (16, 14);
1524  break;
1525  default:
1526  SerializeEnum (16, 4);
1527  }
1528  }
1529 
1530  if (measConfig.haveMeasGapConfig )
1531  {
1532  switch (measConfig.measGapConfig.type)
1533  {
1534  case LteRrcSap::MeasGapConfig::RESET:
1535  SerializeChoice (2, 0, false);
1536  SerializeNull ();
1537  break;
1538  case LteRrcSap::MeasGapConfig::SETUP:
1539  default:
1540  SerializeChoice (2, 1, false);
1541  SerializeSequence (std::bitset<0> (),false);
1542  switch (measConfig.measGapConfig.gapOffsetChoice)
1543  {
1544  case LteRrcSap::MeasGapConfig::gp0:
1545  SerializeChoice (2, 0, true);
1546  SerializeInteger (measConfig.measGapConfig.gapOffsetValue, 0, 39);
1547  break;
1548  case LteRrcSap::MeasGapConfig::gp1:
1549  default:
1550  SerializeChoice (2, 1, true);
1551  SerializeInteger (measConfig.measGapConfig.gapOffsetValue, 0, 79);
1552  }
1553  }
1554  }
1555 
1556  if (measConfig.haveSmeasure )
1557  {
1558  SerializeInteger (measConfig.sMeasure, 0, 97);
1559  }
1560 
1561  // ...Here preRegistrationInfoHRPD would be serialized
1562 
1563  if (measConfig.haveSpeedStatePars )
1564  {
1565  switch (measConfig.speedStatePars.type)
1566  {
1567  case LteRrcSap::SpeedStatePars::RESET:
1568  SerializeChoice (2, 0, false);
1569  SerializeNull ();
1570  break;
1571  case LteRrcSap::SpeedStatePars::SETUP:
1572  default:
1573  SerializeChoice (2, 1, false);
1574  SerializeSequence (std::bitset<0> (), false);
1575  switch (measConfig.speedStatePars.mobilityStateParameters.tEvaluation)
1576  {
1577  case 30:
1578  SerializeEnum (8, 0);
1579  break;
1580  case 60:
1581  SerializeEnum (8, 1);
1582  break;
1583  case 120:
1584  SerializeEnum (8, 2);
1585  break;
1586  case 180:
1587  SerializeEnum (8, 3);
1588  break;
1589  case 240:
1590  SerializeEnum (8, 4);
1591  break;
1592  default:
1593  SerializeEnum (8, 5);
1594  break;
1595  }
1596 
1597  switch (measConfig.speedStatePars.mobilityStateParameters.tHystNormal)
1598  {
1599  case 30:
1600  SerializeEnum (8, 0);
1601  break;
1602  case 60:
1603  SerializeEnum (8, 1);
1604  break;
1605  case 120:
1606  SerializeEnum (8, 2);
1607  break;
1608  case 180:
1609  SerializeEnum (8, 3);
1610  break;
1611  case 240:
1612  SerializeEnum (8, 4);
1613  break;
1614  default:
1615  SerializeEnum (8, 5);
1616  break;
1617  }
1618 
1619  SerializeInteger (measConfig.speedStatePars.mobilityStateParameters.nCellChangeMedium, 1, 16);
1620  SerializeInteger (measConfig.speedStatePars.mobilityStateParameters.nCellChangeHigh, 1, 16);
1621 
1622  SerializeSequence (std::bitset<0> (), false);
1623  switch (measConfig.speedStatePars.timeToTriggerSf.sfMedium)
1624  {
1625  case 25:
1626  SerializeEnum (4, 0);
1627  break;
1628  case 50:
1629  SerializeEnum (4, 1);
1630  break;
1631  case 75:
1632  SerializeEnum (4, 2);
1633  break;
1634  case 100:
1635  default:
1636  SerializeEnum (4, 3);
1637  }
1638 
1639  switch (measConfig.speedStatePars.timeToTriggerSf.sfHigh)
1640  {
1641  case 25:
1642  SerializeEnum (4, 0);
1643  break;
1644  case 50:
1645  SerializeEnum (4, 1);
1646  break;
1647  case 75:
1648  SerializeEnum (4, 2);
1649  break;
1650  case 100:
1651  default:
1652  SerializeEnum (4, 3);
1653  }
1654  }
1655  }
1656 }
1657 
1658 Buffer::Iterator
1659 RrcAsn1Header::DeserializeThresholdEutra (LteRrcSap::ThresholdEutra * thresholdEutra, Buffer::Iterator bIterator)
1660 {
1661  int thresholdEutraChoice, range;
1662  bIterator = DeserializeChoice (2, false, &thresholdEutraChoice, bIterator);
1663 
1664  switch (thresholdEutraChoice)
1665  {
1666  case 0:
1667  thresholdEutra->choice = LteRrcSap::ThresholdEutra::thresholdRsrp;
1668  bIterator = DeserializeInteger (&range, 0, 97, bIterator);
1669  thresholdEutra->range = range;
1670  break;
1671  case 1:
1672  default:
1673  thresholdEutra->choice = LteRrcSap::ThresholdEutra::thresholdRsrq;
1674  bIterator = DeserializeInteger (&range, 0, 34, bIterator);
1675  thresholdEutra->range = range;
1676  }
1677 
1678  return bIterator;
1679 }
1680 
1681 Buffer::Iterator
1682 RrcAsn1Header::DeserializeQoffsetRange (int8_t * qOffsetRange, Buffer::Iterator bIterator)
1683 {
1684  int n;
1685  bIterator = DeserializeEnum (31, &n, bIterator);
1686  switch (n)
1687  {
1688  case 0:
1689  *qOffsetRange = -24;
1690  break;
1691  case 1:
1692  *qOffsetRange = -22;
1693  break;
1694  case 2:
1695  *qOffsetRange = -20;
1696  break;
1697  case 3:
1698  *qOffsetRange = -18;
1699  break;
1700  case 4:
1701  *qOffsetRange = -16;
1702  break;
1703  case 5:
1704  *qOffsetRange = -14;
1705  break;
1706  case 6:
1707  *qOffsetRange = -12;
1708  break;
1709  case 7:
1710  *qOffsetRange = -10;
1711  break;
1712  case 8:
1713  *qOffsetRange = -8;
1714  break;
1715  case 9:
1716  *qOffsetRange = -6;
1717  break;
1718  case 10:
1719  *qOffsetRange = -5;
1720  break;
1721  case 11:
1722  *qOffsetRange = -4;
1723  break;
1724  case 12:
1725  *qOffsetRange = -3;
1726  break;
1727  case 13:
1728  *qOffsetRange = -2;
1729  break;
1730  case 14:
1731  *qOffsetRange = -1;
1732  break;
1733  case 15:
1734  *qOffsetRange = 0;
1735  break;
1736  case 16:
1737  *qOffsetRange = 1;
1738  break;
1739  case 17:
1740  *qOffsetRange = 2;
1741  break;
1742  case 18:
1743  *qOffsetRange = 3;
1744  break;
1745  case 19:
1746  *qOffsetRange = 4;
1747  break;
1748  case 20:
1749  *qOffsetRange = 5;
1750  break;
1751  case 21:
1752  *qOffsetRange = 6;
1753  break;
1754  case 22:
1755  *qOffsetRange = 8;
1756  break;
1757  case 23:
1758  *qOffsetRange = 10;
1759  break;
1760  case 24:
1761  *qOffsetRange = 12;
1762  break;
1763  case 25:
1764  *qOffsetRange = 14;
1765  break;
1766  case 26:
1767  *qOffsetRange = 16;
1768  break;
1769  case 27:
1770  *qOffsetRange = 18;
1771  break;
1772  case 28:
1773  *qOffsetRange = 20;
1774  break;
1775  case 29:
1776  *qOffsetRange = 22;
1777  break;
1778  case 30:
1779  default:
1780  *qOffsetRange = 24;
1781  }
1782  return bIterator;
1783 }
1784 
1785 Buffer::Iterator
1786 RrcAsn1Header::DeserializeRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated *radioResourceConfigDedicated, Buffer::Iterator bIterator)
1787 {
1788  // Deserialize RadioResourceConfigDedicated sequence
1789  std::bitset<6> optionalFieldsPresent = std::bitset<6> ();
1790  bIterator = DeserializeSequence (&optionalFieldsPresent,true,bIterator);
1791 
1792  if (optionalFieldsPresent[5])
1793  {
1794  // Deserialize srb-ToAddModList
1795  bIterator = DeserializeSrbToAddModList (&(radioResourceConfigDedicated->srbToAddModList),bIterator);
1796  }
1797 
1798  if (optionalFieldsPresent[4])
1799  {
1800  // Deserialize drb-ToAddModList
1801  bIterator = DeserializeDrbToAddModList (&(radioResourceConfigDedicated->drbToAddModList),bIterator);
1802  }
1803 
1804  if (optionalFieldsPresent[3])
1805  {
1806  // Deserialize drb-ToReleaseList
1807  int n;
1808  int val;
1809  bIterator = DeserializeSequenceOf (&n,MAX_DRB,1,bIterator);
1810  for (int i = 0; i < n; i++)
1811  {
1812  bIterator = DeserializeInteger (&val,1,32,bIterator);
1813  radioResourceConfigDedicated->drbToReleaseList.push_back (val);
1814  }
1815  }
1816 
1817  if (optionalFieldsPresent[2])
1818  {
1819  // Deserialize mac-MainConfig
1820  // ...
1821  }
1822 
1823  if (optionalFieldsPresent[1])
1824  {
1825  // Deserialize sps-Config
1826  // ...
1827  }
1828 
1829  radioResourceConfigDedicated->havePhysicalConfigDedicated = optionalFieldsPresent[0];
1830  if (optionalFieldsPresent[0])
1831  {
1832  // Deserialize physicalConfigDedicated
1833  bIterator = DeserializePhysicalConfigDedicated (&radioResourceConfigDedicated->physicalConfigDedicated,bIterator);
1834  }
1835 
1836  return bIterator;
1837 }
1838 
1839 Buffer::Iterator
1840 RrcAsn1Header::DeserializeSrbToAddModList (std::list<LteRrcSap::SrbToAddMod> *srbToAddModList, Buffer::Iterator bIterator)
1841 {
1842  int numElems;
1843  bIterator = DeserializeSequenceOf (&numElems,2,1,bIterator);
1844 
1845  srbToAddModList->clear ();
1846 
1847  // Deserialize SRB-ToAddMod elements
1848  for (int i = 0; i < numElems; i++)
1849  {
1850  LteRrcSap::SrbToAddMod srbToAddMod;
1851  // Deserialize SRB-ToAddMod sequence
1852  // 2 optional fields, extension marker present
1853  std::bitset<2> optionalFields;
1854  bIterator = DeserializeSequence (&optionalFields,true,bIterator);
1855 
1856  // Deserialize srbIdentity
1857  int n;
1858  bIterator = DeserializeInteger (&n,1,2,bIterator);
1859  srbToAddMod.srbIdentity = n;
1860 
1861  if (optionalFields[1])
1862  {
1863  // Deserialize rlcConfig choice
1864  // ...
1865  }
1866 
1867  if (optionalFields[0])
1868  {
1869  // Deserialize logicalChannelConfig choice
1870  int sel;
1871  bIterator = DeserializeChoice (2,false,&sel,bIterator);
1872 
1873  // Deserialize logicalChannelConfig defaultValue
1874  if (sel == 1)
1875  {
1876  bIterator = DeserializeNull (bIterator);
1877  }
1878 
1879  // Deserialize logicalChannelConfig explicitValue
1880  else if (sel == 0)
1881  {
1882  bIterator = DeserializeLogicalChannelConfig (&srbToAddMod.logicalChannelConfig,bIterator);
1883  }
1884  }
1885  srbToAddModList->insert (srbToAddModList->end (),srbToAddMod);
1886  }
1887 
1888  return bIterator;
1889 }
1890 
1891 Buffer::Iterator
1892 RrcAsn1Header::DeserializeDrbToAddModList (std::list<LteRrcSap::DrbToAddMod> *drbToAddModList, Buffer::Iterator bIterator)
1893 {
1894  int n;
1895  int val;
1896  bIterator = DeserializeSequenceOf (&n,MAX_DRB,1,bIterator);
1897 
1898  drbToAddModList->clear ();
1899 
1900  for (int i = 0; i < n; i++)
1901  {
1902  LteRrcSap::DrbToAddMod drbToAddMod;
1903 
1904  std::bitset<5> optionalFields;
1905  bIterator = DeserializeSequence (&optionalFields,true,bIterator);
1906 
1907  if (optionalFields[4])
1908  {
1909  // Deserialize epsBearerIdentity
1910  bIterator = DeserializeInteger (&val,0,15,bIterator);
1911  drbToAddMod.epsBearerIdentity = val;
1912  }
1913 
1914  bIterator = DeserializeInteger (&val,1,32,bIterator);
1915  drbToAddMod.drbIdentity = val;
1916 
1917  if (optionalFields[3])
1918  {
1919  // Deserialize pdcp-Config
1920  // ...
1921  }
1922 
1923  if (optionalFields[2])
1924  {
1925  // Deserialize RLC-Config
1926  int chosen;
1927  bIterator = DeserializeChoice (4,true,&chosen,bIterator);
1928 
1929  int sel;
1930  std::bitset<0> bitset0;
1931  switch (chosen)
1932  {
1933  case 0:
1934  drbToAddMod.rlcConfig.choice = LteRrcSap::RlcConfig::AM;
1935 
1936  // Deserialize UL-AM-RLC
1937  bIterator = DeserializeSequence (&bitset0,false, bIterator);
1938  bIterator = DeserializeEnum (64,&sel, bIterator); // t-PollRetransmit
1939  bIterator = DeserializeEnum (8,&sel, bIterator); // pollPDU
1940  bIterator = DeserializeEnum (16,&sel, bIterator); // pollByte
1941  bIterator = DeserializeEnum (8,&sel, bIterator); // maxRetxThreshold
1942 
1943  // Deserialize DL-AM-RLC
1944  bIterator = DeserializeSequence (&bitset0,false, bIterator);
1945  bIterator = DeserializeEnum (32,&sel, bIterator); // t-Reordering
1946  bIterator = DeserializeEnum (64,&sel, bIterator); // t-StatusProhibit
1947  break;
1948 
1949  case 1:
1950  drbToAddMod.rlcConfig.choice = LteRrcSap::RlcConfig::UM_BI_DIRECTIONAL;
1951 
1952  // Deserialize UL-UM-RLC
1953  bIterator = DeserializeSequence (&bitset0,false, bIterator);
1954  bIterator = DeserializeEnum (2,&sel, bIterator); // sn-FieldLength
1955 
1956  // Deserialize DL-UM-RLC
1957  bIterator = DeserializeSequence (&bitset0,false, bIterator);
1958  bIterator = DeserializeEnum (2,&sel, bIterator); // sn-FieldLength
1959  bIterator = DeserializeEnum (32,&sel, bIterator); // t-Reordering
1960  break;
1961 
1962  case 2:
1963  drbToAddMod.rlcConfig.choice = LteRrcSap::RlcConfig::UM_UNI_DIRECTIONAL_UL;
1964 
1965  // Deserialize UL-UM-RLC
1966  bIterator = DeserializeSequence (&bitset0,false, bIterator);
1967  bIterator = DeserializeEnum (2,&sel, bIterator); // sn-FieldLength
1968  break;
1969 
1970  case 3:
1971  drbToAddMod.rlcConfig.choice = LteRrcSap::RlcConfig::UM_UNI_DIRECTIONAL_DL;
1972 
1973  // Deserialize DL-UM-RLC
1974  bIterator = DeserializeSequence (&bitset0,false, bIterator);
1975  bIterator = DeserializeEnum (2,&sel, bIterator); // sn-FieldLength
1976  bIterator = DeserializeEnum (32,&sel, bIterator); // t-Reordering
1977  break;
1978  }
1979 
1980  }
1981 
1982  if (optionalFields[1])
1983  {
1984  bIterator = DeserializeInteger (&val,3,10,bIterator);
1985  drbToAddMod.logicalChannelIdentity = val;
1986  }
1987 
1988  if (optionalFields[0])
1989  {
1990  bIterator = DeserializeLogicalChannelConfig (&drbToAddMod.logicalChannelConfig,bIterator);
1991  }
1992 
1993  drbToAddModList->insert (drbToAddModList->end (),drbToAddMod);
1994  }
1995  return bIterator;
1996 }
1997 
1998 Buffer::Iterator
1999 RrcAsn1Header::DeserializeLogicalChannelConfig (LteRrcSap::LogicalChannelConfig *logicalChannelConfig, Buffer::Iterator bIterator)
2000 {
2001  int n;
2002 
2003  // Deserialize LogicalChannelConfig sequence
2004  // 1 optional field, extension marker is present.
2005  std::bitset<1> bitset1;
2006  bIterator = DeserializeSequence (&bitset1,true,bIterator);
2007 
2008  if (bitset1[0])
2009  {
2010  // Deserialize ul-SpecificParameters sequence
2011  bIterator = DeserializeSequence (&bitset1,false,bIterator);
2012 
2013  // Deserialize priority
2014  bIterator = DeserializeInteger (&n,1,16,bIterator);
2015  logicalChannelConfig->priority = n;
2016 
2017  // Deserialize prioritisedBitRate
2018  bIterator = DeserializeEnum (16,&n,bIterator);
2019  uint16_t prioritizedBitRateKbps;
2020 
2021  switch (n)
2022  {
2023  case 0:
2024  prioritizedBitRateKbps = 0;
2025  break;
2026  case 1:
2027  prioritizedBitRateKbps = 8;
2028  break;
2029  case 2:
2030  prioritizedBitRateKbps = 16;
2031  break;
2032  case 3:
2033  prioritizedBitRateKbps = 32;
2034  break;
2035  case 4:
2036  prioritizedBitRateKbps = 64;
2037  break;
2038  case 5:
2039  prioritizedBitRateKbps = 128;
2040  break;
2041  case 6:
2042  prioritizedBitRateKbps = 256;
2043  break;
2044  case 7:
2045  prioritizedBitRateKbps = 10000;
2046  break;
2047  default:
2048  prioritizedBitRateKbps = 10000;
2049  }
2050  logicalChannelConfig->prioritizedBitRateKbps = prioritizedBitRateKbps;
2051 
2052  // Deserialize bucketSizeDuration
2053  bIterator = DeserializeEnum (8,&n,bIterator);
2054  uint16_t bucketSizeDurationMs;
2055  switch (n)
2056  {
2057  case 0:
2058  bucketSizeDurationMs = 50;
2059  break;
2060  case 1:
2061  bucketSizeDurationMs = 100;
2062  break;
2063  case 2:
2064  bucketSizeDurationMs = 150;
2065  break;
2066  case 3:
2067  bucketSizeDurationMs = 300;
2068  break;
2069  case 4:
2070  bucketSizeDurationMs = 500;
2071  break;
2072  case 5:
2073  bucketSizeDurationMs = 1000;
2074  break;
2075  default:
2076  bucketSizeDurationMs = 1000;
2077  }
2078  logicalChannelConfig->bucketSizeDurationMs = bucketSizeDurationMs;
2079 
2080  if (bitset1[0])
2081  {
2082  // Deserialize logicalChannelGroup
2083  bIterator = DeserializeInteger (&n,0,3,bIterator);
2084  logicalChannelConfig->logicalChannelGroup = n;
2085  }
2086  }
2087  return bIterator;
2088 }
2089 
2090 Buffer::Iterator
2091 RrcAsn1Header::DeserializePhysicalConfigDedicated (LteRrcSap::PhysicalConfigDedicated *physicalConfigDedicated, Buffer::Iterator bIterator)
2092 {
2093  std::bitset<10> optionalFieldPresent;
2094  bIterator = DeserializeSequence (&optionalFieldPresent,true,bIterator);
2095 
2096  if (optionalFieldPresent[9])
2097  {
2098  // Deserialize pdsch-ConfigDedicated
2099  // ...
2100  }
2101  if (optionalFieldPresent[8])
2102  {
2103  // Deserialize pucch-ConfigDedicated
2104  // ...
2105  }
2106  if (optionalFieldPresent[7])
2107  {
2108  // Deserialize pusch-ConfigDedicated
2109  // ...
2110  }
2111  if (optionalFieldPresent[6])
2112  {
2113  // Deserialize uplinkPowerControlDedicated
2114  // ...
2115  }
2116  if (optionalFieldPresent[5])
2117  {
2118  // Deserialize tpc-PDCCH-ConfigPUCCH
2119  // ...
2120  }
2121  if (optionalFieldPresent[4])
2122  {
2123  // Deserialize tpc-PDCCH-ConfigPUSCH
2124  // ...
2125  }
2126  if (optionalFieldPresent[3])
2127  {
2128  // Deserialize cqi-ReportConfig
2129  // ...
2130  }
2131  physicalConfigDedicated->haveSoundingRsUlConfigDedicated = optionalFieldPresent[2];
2132  if (optionalFieldPresent[2])
2133  {
2134  // Deserialize soundingRS-UL-ConfigDedicated
2135  int sel;
2136  bIterator = DeserializeChoice (2,false,&sel,bIterator);
2137 
2138  if (sel == 0)
2139  {
2140  physicalConfigDedicated->soundingRsUlConfigDedicated.type = LteRrcSap::SoundingRsUlConfigDedicated::RESET;
2141 
2142  bIterator = DeserializeNull (bIterator);
2143  }
2144 
2145  else if (sel == 1)
2146  {
2147  physicalConfigDedicated->soundingRsUlConfigDedicated.type = LteRrcSap::SoundingRsUlConfigDedicated::SETUP;
2148 
2149  std::bitset<0> bitset0;
2150  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2151 
2152  int slct;
2153 
2154  // Deserialize srs-Bandwidth
2155  bIterator = DeserializeEnum (4,&slct,bIterator);
2156  physicalConfigDedicated->soundingRsUlConfigDedicated.srsBandwidth = slct;
2157 
2158  // Deserialize srs-HoppingBandwidth
2159  bIterator = DeserializeEnum (4,&slct,bIterator);
2160 
2161  // Deserialize freqDomainPosition
2162  bIterator = DeserializeInteger (&slct,0,23,bIterator);
2163 
2164  // Deserialize duration
2165  bool duration;
2166  bIterator = DeserializeBoolean (&duration,bIterator);
2167 
2168  // Deserialize srs-ConfigIndex
2169  bIterator = DeserializeInteger (&slct,0,1023,bIterator);
2170  physicalConfigDedicated->soundingRsUlConfigDedicated.srsConfigIndex = slct;
2171 
2172  // Deserialize transmissionComb
2173  bIterator = DeserializeInteger (&slct,0,1,bIterator);
2174 
2175  // Deserialize cyclicShift
2176  bIterator = DeserializeEnum (8,&slct,bIterator);
2177  }
2178  }
2179  physicalConfigDedicated->haveAntennaInfoDedicated = optionalFieldPresent[1];
2180  if (optionalFieldPresent[1])
2181  {
2182  // Deserialize antennaInfo
2183  int sel;
2184  bIterator = DeserializeChoice (2,false,&sel,bIterator);
2185  if (sel == 1)
2186  {
2187  bIterator = DeserializeNull (bIterator);
2188  }
2189  else if (sel == 0)
2190  {
2191  std::bitset<1> codebookSubsetRestrictionPresent;
2192  bIterator = DeserializeSequence (&codebookSubsetRestrictionPresent,false,bIterator);
2193 
2194  int txmode;
2195  bIterator = DeserializeEnum (8,&txmode,bIterator);
2196  physicalConfigDedicated->antennaInfo.transmissionMode = txmode;
2197 
2198  if (codebookSubsetRestrictionPresent[0])
2199  {
2200  // Deserialize codebookSubsetRestriction
2201  // ...
2202  }
2203 
2204  int txantennaselchosen;
2205  bIterator = DeserializeChoice (2,false,&txantennaselchosen,bIterator);
2206  if (txantennaselchosen == 0)
2207  {
2208  // Deserialize ue-TransmitAntennaSelection release
2209  bIterator = DeserializeNull (bIterator);
2210  }
2211  else if (txantennaselchosen == 1)
2212  {
2213  // Deserialize ue-TransmitAntennaSelection setup
2214  // ...
2215  }
2216  }
2217  }
2218  if (optionalFieldPresent[0])
2219  {
2220  // Deserialize schedulingRequestConfig
2221  // ...
2222  }
2223  return bIterator;
2224 }
2225 
2226 void
2227 RrcAsn1Header::Print (std::ostream &os, LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
2228 {
2229  os << " srbToAddModList: " << std::endl;
2230  std::list<LteRrcSap::SrbToAddMod>::iterator it = radioResourceConfigDedicated.srbToAddModList.begin ();
2231  for (; it != radioResourceConfigDedicated.srbToAddModList.end (); it++)
2232  {
2233  os << " srbIdentity: " << (int)it->srbIdentity << std::endl;
2234  os << " logicalChannelConfig: " << std::endl;
2235  os << " priority: " << (int)it->logicalChannelConfig.priority << std::endl;
2236  os << " prioritizedBitRateKbps: " << (int)it->logicalChannelConfig.prioritizedBitRateKbps << std::endl;
2237  os << " bucketSizeDurationMs: " << (int)it->logicalChannelConfig.bucketSizeDurationMs << std::endl;
2238  os << " logicalChannelGroup: " << (int)it->logicalChannelConfig.logicalChannelGroup << std::endl;
2239  }
2240  os << std::endl;
2241 
2242  os << " drbToAddModList: " << std::endl;
2243  std::list<LteRrcSap::DrbToAddMod>::iterator it2 = radioResourceConfigDedicated.drbToAddModList.begin ();
2244  for (; it2 != radioResourceConfigDedicated.drbToAddModList.end (); it2++)
2245  {
2246  os << " epsBearerIdentity: " << (int)it2->epsBearerIdentity << std::endl;
2247  os << " drbIdentity: " << (int)it2->drbIdentity << std::endl;
2248  os << " rlcConfig: " << it2->rlcConfig.choice << std::endl;
2249  os << " logicalChannelIdentity: " << (int)it2->logicalChannelIdentity << std::endl;
2250  os << " logicalChannelConfig: " << std::endl;
2251  os << " priority: " << (int)it2->logicalChannelConfig.priority << std::endl;
2252  os << " prioritizedBitRateKbps: " << (int)it2->logicalChannelConfig.prioritizedBitRateKbps << std::endl;
2253  os << " bucketSizeDurationMs: " << (int)it2->logicalChannelConfig.bucketSizeDurationMs << std::endl;
2254  os << " logicalChannelGroup: " << (int)it2->logicalChannelConfig.logicalChannelGroup << std::endl;
2255  }
2256  os << std::endl;
2257 
2258  os << " drbToReleaseList: ";
2259  std::list<uint8_t>::iterator it3 = radioResourceConfigDedicated.drbToReleaseList.begin ();
2260  for (; it3 != radioResourceConfigDedicated.drbToReleaseList.end (); it3++)
2261  {
2262  os << (int)*it3 << ", ";
2263  }
2264  os << std::endl;
2265 
2266  os << " havePhysicalConfigDedicated: " << radioResourceConfigDedicated.havePhysicalConfigDedicated << std::endl;
2267 
2268  if (radioResourceConfigDedicated.havePhysicalConfigDedicated)
2269  {
2270  os << " physicalConfigDedicated: " << std::endl;
2271 
2272  os << " haveSoundingRsUlConfigDedicated: " << radioResourceConfigDedicated.physicalConfigDedicated.haveSoundingRsUlConfigDedicated << std::endl;
2273  if (radioResourceConfigDedicated.physicalConfigDedicated.haveSoundingRsUlConfigDedicated)
2274  {
2275  os << " soundingRsUlConfigDedicated: " << std::endl;
2276  os << " type: " << radioResourceConfigDedicated.physicalConfigDedicated.soundingRsUlConfigDedicated.type << std::endl;
2277  os << " srsBandwidth: " << (int)radioResourceConfigDedicated.physicalConfigDedicated.soundingRsUlConfigDedicated.srsBandwidth << std::endl;
2278  os << " srsConfigIndex: " << (int)radioResourceConfigDedicated.physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex << std::endl;
2279  }
2280 
2281  os << " haveAntennaInfoDedicated: " << radioResourceConfigDedicated.physicalConfigDedicated.haveAntennaInfoDedicated << std::endl;
2282  if (radioResourceConfigDedicated.physicalConfigDedicated.haveAntennaInfoDedicated)
2283  {
2284  os << " antennaInfo Tx mode: " << (int)radioResourceConfigDedicated.physicalConfigDedicated.antennaInfo.transmissionMode << std::endl;
2285  }
2286  }
2287 }
2288 
2290 RrcAsn1Header::DeserializeSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 *systemInformationBlockType1, Buffer::Iterator bIterator)
2291 {
2292  std::bitset<0> bitset0;
2293  int n;
2294 
2295  std::bitset<3> sysInfoBlkT1Opts;
2296  bIterator = DeserializeSequence (&sysInfoBlkT1Opts,false,bIterator);
2297 
2298  // Deserialize cellAccessRelatedInfo
2299  std::bitset<1> cellAccessRelatedInfoOpts;
2300  bIterator = DeserializeSequence (&cellAccessRelatedInfoOpts,false,bIterator);
2301 
2302  // Deserialize plmn-IdentityList
2303  int numPlmnIdentityInfoElements;
2304  bIterator = DeserializeSequenceOf (&numPlmnIdentityInfoElements,6,1,bIterator);
2305  for (int i = 0; i < numPlmnIdentityInfoElements; i++)
2306  {
2307  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2308 
2309  // plmn-Identity
2310  bIterator = DeserializePlmnIdentity (&systemInformationBlockType1->cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity,bIterator);
2311  }
2312 
2313  // Deserialize trackingAreaCode
2314  std::bitset<16> trackingAreaCode;
2315  bIterator = DeserializeBitstring (&trackingAreaCode,bIterator);
2316 
2317  // Deserialize cellIdentity
2318  std::bitset<28> cellIdentity;
2319  bIterator = DeserializeBitstring (&cellIdentity,bIterator);
2320  systemInformationBlockType1->cellAccessRelatedInfo.cellIdentity = cellIdentity.to_ulong ();
2321 
2322  // Deserialize cellBarred
2323  bIterator = DeserializeEnum (2,&n,bIterator);
2324 
2325  // Deserialize intraFreqReselection
2326  bIterator = DeserializeEnum (2,&n,bIterator);
2327 
2328  // Deserialize csg-Indication
2329  bIterator = DeserializeBoolean (&systemInformationBlockType1->cellAccessRelatedInfo.csgIndication,bIterator);
2330 
2331  if (cellAccessRelatedInfoOpts[0])
2332  {
2333  // Deserialize csg-Identity
2334  std::bitset<27> csgIdentity;
2335  bIterator = DeserializeBitstring (&csgIdentity,bIterator);
2336  systemInformationBlockType1->cellAccessRelatedInfo.csgIdentity = csgIdentity.to_ulong ();
2337  }
2338 
2339  // Deserialize cellSelectionInfo
2340  std::bitset<1> qRxLevMinOffsetPresent;
2341  bIterator = DeserializeSequence (&qRxLevMinOffsetPresent,false,bIterator);
2342  bIterator = DeserializeInteger (&n,-70,-22,bIterator); //q-RxLevMin
2343  if (qRxLevMinOffsetPresent[0])
2344  {
2345  // Deserialize qRxLevMinOffset
2346  // ...
2347  }
2348 
2349  if (sysInfoBlkT1Opts[2])
2350  {
2351  // Deserialize p-Max
2352  // ...
2353  }
2354 
2355  // freqBandIndicator
2356  bIterator = DeserializeInteger (&n,1,64,bIterator);
2357 
2358  // schedulingInfoList
2359  int numSchedulingInfo;
2360  bIterator = DeserializeSequenceOf (&numSchedulingInfo,MAX_SI_MESSAGE,1,bIterator);
2361  for (int i = 0; i < numSchedulingInfo; i++)
2362  {
2363  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2364  bIterator = DeserializeEnum (7,&n,bIterator); // si-Periodicity
2365  int numSibType;
2366  bIterator = DeserializeSequenceOf (&numSibType,MAX_SIB - 1,0, bIterator); // sib-MappingInfo
2367  for (int j = 0; j < numSibType; j++)
2368  {
2369  bIterator = DeserializeEnum (16,&n,bIterator); // SIB-Type
2370  }
2371  }
2372 
2373  if (sysInfoBlkT1Opts[1])
2374  {
2375  // tdd-Config
2376  // ...
2377  }
2378 
2379  // si-WindowLength
2380  bIterator = DeserializeEnum (7,&n,bIterator);
2381 
2382  // systemInfoValueTag
2383  bIterator = DeserializeInteger (&n,0,31,bIterator);
2384 
2385  if (sysInfoBlkT1Opts[0])
2386  {
2387  // Deserialize nonCriticalExtension
2388  // ...
2389  }
2390  return bIterator;
2391 }
2392 
2393 Buffer::Iterator
2394 RrcAsn1Header::DeserializeSystemInformationBlockType2 (LteRrcSap::SystemInformationBlockType2 *systemInformationBlockType2, Buffer::Iterator bIterator)
2395 {
2396  std::bitset<0> bitset0;
2397  int n;
2398 
2399  std::bitset<2> sysInfoBlkT2Opts;
2400  bIterator = DeserializeSequence (&sysInfoBlkT2Opts,true,bIterator);
2401  if (sysInfoBlkT2Opts[1])
2402  {
2403  // Deserialize ac-BarringInfo
2404  // ...
2405  }
2406 
2407  // Deserialize radioResourceConfigCommon
2408  bIterator = DeserializeRadioResourceConfigCommonSib (&systemInformationBlockType2->radioResourceConfigCommon, bIterator);
2409 
2410  // Deserialize ue-TimersAndConstants
2411  bIterator = DeserializeSequence (&bitset0,true,bIterator);
2412  bIterator = DeserializeEnum (8,&n,bIterator); // t300
2413  bIterator = DeserializeEnum (8,&n,bIterator); // t301
2414  bIterator = DeserializeEnum (7,&n,bIterator); // t310
2415  bIterator = DeserializeEnum (8,&n,bIterator); // n310
2416  bIterator = DeserializeEnum (7,&n,bIterator); // t311
2417  bIterator = DeserializeEnum (8,&n,bIterator); // n311
2418 
2419  // Deserialize freqInfo
2420  std::bitset<2> freqInfoOpts;
2421  bIterator = DeserializeSequence (&freqInfoOpts,false,bIterator);
2422  if (freqInfoOpts[1])
2423  {
2424  // Deserialize ul-CarrierFreq
2425  bIterator = DeserializeInteger (&n, 0, MAX_EARFCN, bIterator);
2426  systemInformationBlockType2->freqInfo.ulCarrierFreq = n;
2427  }
2428  if (freqInfoOpts[0])
2429  {
2430  // Deserialize ul-Bandwidth
2431  bIterator = DeserializeEnum (6, &n, bIterator);
2432  switch (n)
2433  {
2434  case 0:
2435  systemInformationBlockType2->freqInfo.ulBandwidth = 6;
2436  break;
2437  case 1:
2438  systemInformationBlockType2->freqInfo.ulBandwidth = 15;
2439  break;
2440  case 2:
2441  systemInformationBlockType2->freqInfo.ulBandwidth = 25;
2442  break;
2443  case 3:
2444  systemInformationBlockType2->freqInfo.ulBandwidth = 50;
2445  break;
2446  case 4:
2447  systemInformationBlockType2->freqInfo.ulBandwidth = 75;
2448  break;
2449  case 5:
2450  systemInformationBlockType2->freqInfo.ulBandwidth = 100;
2451  break;
2452  default:
2453  systemInformationBlockType2->freqInfo.ulBandwidth = 6;
2454  }
2455  }
2456 
2457  // additionalSpectrumEmission
2458  bIterator = DeserializeInteger (&n,1,32,bIterator);
2459 
2460  if (sysInfoBlkT2Opts[0])
2461  {
2462  // Deserialize mbsfn-SubframeConfigList
2463  // ...
2464  }
2465 
2466  // Deserialize timeAlignmentTimerCommon
2467  bIterator = DeserializeEnum (8,&n,bIterator);
2468 
2469  return bIterator;
2470 }
2471 
2472 
2473 Buffer::Iterator
2474 RrcAsn1Header::DeserializeRadioResourceConfigCommon (LteRrcSap::RadioResourceConfigCommon * radioResourceConfigCommon, Buffer::Iterator bIterator)
2475 {
2476  std::bitset<0> bitset0;
2477  int n;
2478 
2479  std::bitset<9> rrCfgCommOptions;
2480  bIterator = DeserializeSequence (&rrCfgCommOptions,true,bIterator);
2481 
2482  // rach-ConfigCommon
2483  if (rrCfgCommOptions[8])
2484  {
2485  bIterator = DeserializeRachConfigCommon (&radioResourceConfigCommon->rachConfigCommon, bIterator);
2486  }
2487 
2488  // prach-Config
2489  std::bitset<1> prachConfigInfoPresent;
2490  bIterator = DeserializeSequence (&prachConfigInfoPresent,false,bIterator);
2491 
2492  // prach-Config -> rootSequenceIndex
2493  bIterator = DeserializeInteger (&n,0,1023,bIterator);
2494 
2495  // prach-Config -> prach-ConfigInfo
2496  if (prachConfigInfoPresent[0])
2497  {
2498  // ...
2499  }
2500 
2501  // pdsch-ConfigCommon
2502  if (rrCfgCommOptions[7])
2503  {
2504  // ...
2505  }
2506 
2507  // pusch-ConfigCommon
2508  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2509 
2510  // pusch-ConfigCommon -> pusch-ConfigBasic
2511  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2512 
2513  // pusch-ConfigCommon -> pusch-ConfigBasic -> n-SB
2514  bIterator = DeserializeInteger (&n,1,4,bIterator);
2515 
2516  // pusch-ConfigCommon -> pusch-ConfigBasic -> hoppingMode
2517  bIterator = DeserializeEnum (2,&n,bIterator);
2518 
2519  // pusch-ConfigCommon -> pusch-ConfigBasic -> pusch-HoppingOffset
2520  bIterator = DeserializeInteger (&n,0,98,bIterator);
2521 
2522  // pusch-ConfigCommon -> pusch-ConfigBasic -> enable64QAM
2523  bool enable64QAM;
2524  bIterator = DeserializeBoolean (&enable64QAM,bIterator);
2525 
2526  // ul-ReferenceSignalsPUSCH
2527  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2528 
2529  // groupHoppingEnabled
2530  bool dummyBool;
2531  bIterator = DeserializeBoolean (&dummyBool,bIterator);
2532 
2533  // groupAssignmentPUSCH
2534  bIterator = DeserializeInteger (&n,0,29,bIterator);
2535 
2536  // sequenceHoppingEnabled
2537  bIterator = DeserializeBoolean (&dummyBool,bIterator);
2538 
2539  // cyclicShift
2540  bIterator = DeserializeInteger (&n,0,7,bIterator);
2541 
2542  // phich-Config
2543  if (rrCfgCommOptions[6])
2544  {
2545  // ...
2546  }
2547 
2548  // pucch-ConfigCommon
2549  if (rrCfgCommOptions[5])
2550  {
2551  // ...
2552  }
2553 
2554  // soundingRS-UL-ConfigCommon
2555  if (rrCfgCommOptions[4])
2556  {
2557  // ...
2558  }
2559 
2560  // uplinkPowerControlCommon
2561  if (rrCfgCommOptions[3])
2562  {
2563  // ...
2564  }
2565 
2566  // antennaInfoCommon
2567  if (rrCfgCommOptions[2])
2568  {
2569  // ...
2570  }
2571 
2572  // p-Max
2573  if (rrCfgCommOptions[1])
2574  {
2575  // ...
2576  }
2577 
2578  // tdd-Config
2579  if (rrCfgCommOptions[0])
2580  {
2581  // ...
2582  }
2583 
2584  // ul-CyclicPrefixLength
2585  bIterator = DeserializeEnum (2,&n,bIterator);
2586 
2587  return bIterator;
2588 }
2589 
2590 Buffer::Iterator
2591 RrcAsn1Header::DeserializeRachConfigCommon (LteRrcSap::RachConfigCommon * rachConfigCommon, Buffer::Iterator bIterator)
2592 {
2593  std::bitset<0> bitset0;
2594  int n;
2595 
2596  bIterator = DeserializeSequence (&bitset0,true,bIterator);
2597 
2598  // preambleInfo
2599  std::bitset<1> preamblesGroupAConfigPresent;
2600  bIterator = DeserializeSequence (&preamblesGroupAConfigPresent,false,bIterator);
2601 
2602  // numberOfRA-Preambles
2603  bIterator = DeserializeEnum (16,&n,bIterator);
2604  switch (n)
2605  {
2606  case 0:
2607  rachConfigCommon->preambleInfo.numberOfRaPreambles = 4;
2608  break;
2609  case 1:
2610  rachConfigCommon->preambleInfo.numberOfRaPreambles = 8;
2611  break;
2612  case 2:
2613  rachConfigCommon->preambleInfo.numberOfRaPreambles = 12;
2614  break;
2615  case 3:
2616  rachConfigCommon->preambleInfo.numberOfRaPreambles = 16;
2617  break;
2618  case 4:
2619  rachConfigCommon->preambleInfo.numberOfRaPreambles = 20;
2620  break;
2621  case 5:
2622  rachConfigCommon->preambleInfo.numberOfRaPreambles = 24;
2623  break;
2624  case 6:
2625  rachConfigCommon->preambleInfo.numberOfRaPreambles = 28;
2626  break;
2627  case 7:
2628  rachConfigCommon->preambleInfo.numberOfRaPreambles = 32;
2629  break;
2630  case 8:
2631  rachConfigCommon->preambleInfo.numberOfRaPreambles = 36;
2632  break;
2633  case 9:
2634  rachConfigCommon->preambleInfo.numberOfRaPreambles = 40;
2635  break;
2636  case 10:
2637  rachConfigCommon->preambleInfo.numberOfRaPreambles = 44;
2638  break;
2639  case 11:
2640  rachConfigCommon->preambleInfo.numberOfRaPreambles = 48;
2641  break;
2642  case 12:
2643  rachConfigCommon->preambleInfo.numberOfRaPreambles = 52;
2644  break;
2645  case 13:
2646  rachConfigCommon->preambleInfo.numberOfRaPreambles = 56;
2647  break;
2648  case 14:
2649  rachConfigCommon->preambleInfo.numberOfRaPreambles = 60;
2650  break;
2651  case 15:
2652  rachConfigCommon->preambleInfo.numberOfRaPreambles = 64;
2653  break;
2654  default:
2655  rachConfigCommon->preambleInfo.numberOfRaPreambles = 0;
2656  }
2657 
2658  rachConfigCommon->preambleInfo.numberOfRaPreambles = n;
2659 
2660  if (preamblesGroupAConfigPresent[0])
2661  {
2662  // Deserialize preamblesGroupAConfig
2663  // ...
2664  }
2665 
2666  // powerRampingParameters
2667  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2668  bIterator = DeserializeEnum (4,&n,bIterator); // powerRampingStep
2669  bIterator = DeserializeEnum (16,&n,bIterator); // preambleInitialReceivedTargetPower
2670 
2671  // ra-SupervisionInfo
2672  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2673  bIterator = DeserializeEnum (11,&n,bIterator); // preambleTransMax
2674  switch (n)
2675  {
2676  case 0:
2677  rachConfigCommon->raSupervisionInfo.preambleTransMax = 3;
2678  break;
2679  case 1:
2680  rachConfigCommon->raSupervisionInfo.preambleTransMax = 4;
2681  break;
2682  case 2:
2683  rachConfigCommon->raSupervisionInfo.preambleTransMax = 5;
2684  break;
2685  case 3:
2686  rachConfigCommon->raSupervisionInfo.preambleTransMax = 6;
2687  break;
2688  case 4:
2689  rachConfigCommon->raSupervisionInfo.preambleTransMax = 7;
2690  break;
2691  case 5:
2692  rachConfigCommon->raSupervisionInfo.preambleTransMax = 8;
2693  break;
2694  case 6:
2695  rachConfigCommon->raSupervisionInfo.preambleTransMax = 10;
2696  break;
2697  case 7:
2698  rachConfigCommon->raSupervisionInfo.preambleTransMax = 20;
2699  break;
2700  case 8:
2701  rachConfigCommon->raSupervisionInfo.preambleTransMax = 50;
2702  break;
2703  case 9:
2704  rachConfigCommon->raSupervisionInfo.preambleTransMax = 100;
2705  break;
2706  case 10:
2707  rachConfigCommon->raSupervisionInfo.preambleTransMax = 200;
2708  break;
2709  default:
2710  rachConfigCommon->raSupervisionInfo.preambleTransMax = 0;
2711  }
2712 
2713  // ra-ResponseWindowSize
2714  bIterator = DeserializeEnum (8,&n,bIterator);
2715  switch (n)
2716  {
2717  case 0:
2718  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 2;
2719  break;
2720  case 1:
2721  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 3;
2722  break;
2723  case 2:
2724  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 4;
2725  break;
2726  case 3:
2727  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 5;
2728  break;
2729  case 4:
2730  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 6;
2731  break;
2732  case 5:
2733  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 7;
2734  break;
2735  case 6:
2736  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 8;
2737  break;
2738  case 7:
2739  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 10;
2740  break;
2741  default:
2742  rachConfigCommon->raSupervisionInfo.raResponseWindowSize = 0;
2743  }
2744 
2745  bIterator = DeserializeEnum (8,&n,bIterator); // mac-ContentionResolutionTimer
2746  bIterator = DeserializeInteger (&n,1,8,bIterator); //maxHARQ-Msg3Tx
2747  return bIterator;
2748 }
2749 
2750 Buffer::Iterator
2751 RrcAsn1Header::DeserializeRadioResourceConfigCommonSib (LteRrcSap::RadioResourceConfigCommonSib * radioResourceConfigCommonSib, Buffer::Iterator bIterator)
2752 {
2753  std::bitset<0> bitset0;
2754  int n;
2755 
2756  bIterator = DeserializeSequence (&bitset0,true,bIterator);
2757 
2758  // rach-ConfigCommon
2759  bIterator = DeserializeRachConfigCommon (&radioResourceConfigCommonSib->rachConfigCommon, bIterator);
2760 
2761  // bcch-Config
2762  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2763  bIterator = DeserializeEnum (4,&n,bIterator); // modificationPeriodCoeff
2764 
2765  // pcch-Config
2766  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2767  bIterator = DeserializeEnum (4,&n,bIterator); // defaultPagingCycle
2768  bIterator = DeserializeEnum (8,&n,bIterator); // nB
2769 
2770  // prach-Config
2771  std::bitset<1> prachConfigInfoPresent;
2772  bIterator = DeserializeSequence (&prachConfigInfoPresent,false,bIterator);
2773  // prach-Config -> rootSequenceIndex
2774  bIterator = DeserializeInteger (&n,0,1023,bIterator);
2775  // prach-Config -> prach-ConfigInfo
2776  if (prachConfigInfoPresent[0])
2777  {
2778  // ...
2779  }
2780 
2781  // pdsch-ConfigCommon
2782  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2783  bIterator = DeserializeInteger (&n,-60,50,bIterator); // referenceSignalPower
2784  bIterator = DeserializeInteger (&n,0,3,bIterator); // p-b
2785 
2786  // pusch-ConfigCommon
2787  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2788 
2789  // pusch-ConfigCommon -> pusch-ConfigBasic
2790  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2791 
2792  // pusch-ConfigCommon -> pusch-ConfigBasic -> n-SB
2793  bIterator = DeserializeInteger (&n,1,4,bIterator);
2794 
2795  // pusch-ConfigCommon -> pusch-ConfigBasic -> hoppingMode
2796  bIterator = DeserializeEnum (2,&n,bIterator);
2797 
2798  // pusch-ConfigCommon -> pusch-ConfigBasic -> pusch-HoppingOffset
2799  bIterator = DeserializeInteger (&n,0,98,bIterator);
2800 
2801  // pusch-ConfigCommon -> pusch-ConfigBasic -> enable64QAM
2802  bool dummyBoolean;
2803  bIterator = DeserializeBoolean (&dummyBoolean,bIterator);
2804 
2805  // ul-ReferenceSignalsPUSCH
2806  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2807 
2808  // groupHoppingEnabled
2809  bIterator = DeserializeBoolean (&dummyBoolean,bIterator);
2810 
2811  // groupAssignmentPUSCH
2812  bIterator = DeserializeInteger (&n,0,29,bIterator);
2813 
2814  // sequenceHoppingEnabled
2815  bIterator = DeserializeBoolean (&dummyBoolean,bIterator);
2816 
2817  // cyclicShift
2818  bIterator = DeserializeInteger (&n,0,7,bIterator);
2819 
2820  // pucch-ConfigCommon
2821  bIterator = DeserializeEnum (3,&n,bIterator); // deltaPUCCH-Shift
2822  bIterator = DeserializeInteger (&n,0,98,bIterator); // nRB-CQI
2823  bIterator = DeserializeInteger (&n,0,7,bIterator); // nCS-AN
2824  bIterator = DeserializeInteger (&n,0,2047,bIterator); // n1PUCCH-AN
2825 
2826  // soundingRS-UL-ConfigCommon
2827  int choice;
2828  bIterator = DeserializeChoice (2,false,&choice,bIterator);
2829  if (choice == 0)
2830  {
2831  bIterator = DeserializeNull (bIterator); // release
2832  }
2833  if (choice == 1)
2834  {
2835  // setup
2836  // ...
2837  }
2838 
2839  // uplinkPowerControlCommon
2840  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2841  bIterator = DeserializeInteger (&n,-126,24,bIterator); // p0-NominalPUSCH
2842  bIterator = DeserializeEnum (8,&n,bIterator); // alpha
2843  bIterator = DeserializeInteger (&n,-127,-96,bIterator); // p0-NominalPUCCH
2844  //deltaFList-PUCCH
2845  bIterator = DeserializeSequence (&bitset0,false,bIterator);
2846  bIterator = DeserializeEnum (3,&n,bIterator); // deltaF-PUCCH-Format1
2847  bIterator = DeserializeEnum (3,&n,bIterator); // deltaF-PUCCH-Format1b
2848  bIterator = DeserializeEnum (4,&n,bIterator); // deltaF-PUCCH-Format2
2849  bIterator = DeserializeEnum (3,&n,bIterator); // deltaF-PUCCH-Format2a
2850  bIterator = DeserializeEnum (3,&n,bIterator); // deltaF-PUCCH-Format2b
2851  bIterator = DeserializeInteger (&n,-1,6,bIterator); // deltaPreambleMsg3
2852 
2853  // ul-CyclicPrefixLength
2854  bIterator = DeserializeEnum (2,&n,bIterator);
2855 
2856  return bIterator;
2857 }
2858 
2859 Buffer::Iterator
2860 RrcAsn1Header::DeserializeMeasResults (LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator)
2861 {
2862  int n;
2863  std::bitset<0> b0;
2864  std::bitset<1> measResultNeighCellsPresent;
2865  bIterator = DeserializeSequence (&measResultNeighCellsPresent,true,bIterator);
2866 
2867  // Deserialize measId
2868  bIterator = DeserializeInteger (&n, 1, MAX_MEAS_ID, bIterator);
2869  measResults->measId = n;
2870 
2871  // Deserialize measResultServCell
2872  bIterator = DeserializeSequence (&b0,false,bIterator);
2873 
2874  // Deserialize rsrpResult
2875  bIterator = DeserializeInteger (&n, 0, 97, bIterator);
2876  measResults->rsrpResult = n;
2877 
2878  // Deserialize rsrqResult
2879  bIterator = DeserializeInteger (&n, 0, 34, bIterator);
2880  measResults->rsrqResult = n;
2881 
2882  measResults->haveMeasResultNeighCells = measResultNeighCellsPresent[0];
2883  if ( measResults->haveMeasResultNeighCells)
2884  {
2885  int measResultNeighCellsChoice;
2886 
2887  // Deserialize measResultNeighCells
2888  bIterator = DeserializeChoice (4,false,&measResultNeighCellsChoice,bIterator);
2889 
2890  if (measResultNeighCellsChoice == 0)
2891  {
2892  // Deserialize measResultListEUTRA
2893  int numElems;
2894  bIterator = DeserializeSequenceOf (&numElems,MAX_CELL_REPORT,1,bIterator);
2895 
2896  for (int i = 0; i < numElems; i++)
2897  {
2898  LteRrcSap::MeasResultEutra measResultEutra;
2899 
2900  std::bitset<1> isCgiInfoPresent;
2901  bIterator = DeserializeSequence (&isCgiInfoPresent,false,bIterator);
2902 
2903  // PhysCellId
2904  bIterator = DeserializeInteger (&n,0,503,bIterator);
2905  measResultEutra.physCellId = n;
2906 
2907  measResultEutra.haveCgiInfo = isCgiInfoPresent[0];
2908  if (isCgiInfoPresent[0])
2909  {
2910  std::bitset<1> havePlmnIdentityList;
2911  bIterator = DeserializeSequence (&havePlmnIdentityList,false,bIterator);
2912 
2913  // Deserialize cellGlobalId
2914  bIterator = DeserializeSequence (&b0,false,bIterator);
2915 
2916  // Deserialize plmn-Identity
2917  bIterator = DeserializePlmnIdentity (&measResultEutra.cgiInfo.plmnIdentity,bIterator);
2918 
2919  // Deserialize CellIdentity
2920  std::bitset<28> cellId;
2921  bIterator = DeserializeBitstring (&cellId,bIterator);
2922  measResultEutra.cgiInfo.cellIdentity = cellId.to_ulong ();
2923 
2924  // Deserialize trackingAreaCode
2925  std::bitset<16> trArCo;
2926  bIterator = DeserializeBitstring (&trArCo,bIterator);
2927  measResultEutra.cgiInfo.trackingAreaCode = trArCo.to_ulong ();
2928 
2929  // Deserialize plmn-IdentityList
2930  if (havePlmnIdentityList[0])
2931  {
2932  int numPlmnElems;
2933  bIterator = DeserializeSequenceOf (&numPlmnElems, 5, 1, bIterator);
2934 
2935  for ( int j = 0; j < numPlmnElems; j++)
2936  {
2937  uint32_t plmnId;
2938  bIterator = DeserializePlmnIdentity (&plmnId,bIterator);
2939  measResultEutra.cgiInfo.plmnIdentityList.push_back (plmnId);
2940  }
2941  }
2942  }
2943 
2944  // Deserialize measResult
2945  std::bitset<2> measResultOpts;
2946  bIterator = DeserializeSequence (&measResultOpts, true, bIterator);
2947 
2948  measResultEutra.haveRsrpResult = measResultOpts[1];
2949  if (measResultOpts[1])
2950  {
2951  // Deserialize rsrpResult
2952  bIterator = DeserializeInteger (&n,0,97,bIterator);
2953  measResultEutra.rsrpResult = n;
2954  }
2955 
2956  measResultEutra.haveRsrqResult = measResultOpts[0];
2957  if (measResultOpts[0])
2958  {
2959  // Deserialize rsrqResult
2960  bIterator = DeserializeInteger (&n,0,34,bIterator);
2961  measResultEutra.rsrqResult = n;
2962  }
2963 
2964  measResults->measResultListEutra.push_back (measResultEutra);
2965  }
2966  }
2967 
2968  if (measResultNeighCellsChoice == 1)
2969  {
2970  // Deserialize measResultListUTRA
2971  // ...
2972  }
2973 
2974  if (measResultNeighCellsChoice == 2)
2975  {
2976  // Deserialize measResultListGERAN
2977  // ...
2978  }
2979  if (measResultNeighCellsChoice == 3)
2980  {
2981  // Deserialize measResultsCDMA2000
2982  // ...
2983  }
2984  }
2985 
2986  return bIterator;
2987 }
2988 
2989 Buffer::Iterator
2990 RrcAsn1Header::DeserializePlmnIdentity (uint32_t *plmnId, Buffer::Iterator bIterator)
2991 {
2992  int n;
2993  std::bitset<1> isMccPresent;
2994  bIterator = DeserializeSequence (&isMccPresent,false,bIterator);
2995 
2996  if (isMccPresent[0])
2997  {
2998  // Deserialize mcc
2999  // ...
3000  }
3001 
3002  // Deserialize mnc
3003  int mncDigits;
3004  int mnc = 0;
3005  bIterator = DeserializeSequenceOf (&mncDigits,3,2,bIterator);
3006 
3007  for (int j = mncDigits - 1; j >= 0; j--)
3008  {
3009  bIterator = DeserializeInteger (&n,0,9,bIterator);
3010  mnc += n * pow (10,j);
3011  }
3012 
3013  *plmnId = mnc;
3014 
3015  // cellReservedForOperatorUse
3016  bIterator = DeserializeEnum (2,&n,bIterator);
3017  return bIterator;
3018 }
3019 
3020 Buffer::Iterator
3021 RrcAsn1Header::DeserializeMeasConfig (LteRrcSap::MeasConfig * measConfig, Buffer::Iterator bIterator)
3022 {
3023  std::bitset<0> bitset0;
3024  std::bitset<2> bitset2;
3025  std::bitset<11> bitset11;
3026  int n;
3027 
3028  // measConfig
3029  bIterator = DeserializeSequence (&bitset11,true,bIterator);
3030 
3031  if (bitset11[10])
3032  {
3033  // measObjectToRemoveList
3034  int measObjectToRemoveListElems;
3035  bIterator = DeserializeSequenceOf (&measObjectToRemoveListElems, MAX_OBJECT_ID, 1, bIterator);
3036 
3037  for (int i = 0; i < measObjectToRemoveListElems; i++)
3038  {
3039  bIterator = DeserializeInteger (&n, 1, MAX_OBJECT_ID, bIterator);
3040  measConfig->measObjectToRemoveList.push_back (n);
3041  }
3042  }
3043 
3044  if (bitset11[9])
3045  {
3046  // measObjectToAddModList
3047  int measObjectToAddModListElems;
3048  bIterator = DeserializeSequenceOf (&measObjectToAddModListElems, MAX_OBJECT_ID, 1, bIterator);
3049 
3050  for (int i = 0; i < measObjectToAddModListElems; i++)
3051  {
3052  LteRrcSap::MeasObjectToAddMod * elem = new LteRrcSap::MeasObjectToAddMod ();
3053 
3054  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3055 
3056  bIterator = DeserializeInteger (&n, 1, MAX_OBJECT_ID, bIterator);
3057  elem->measObjectId = n;
3058 
3059  int measObjectChoice;
3060  bIterator = DeserializeChoice (4, true, &measObjectChoice, bIterator);
3061 
3062  switch (measObjectChoice)
3063  {
3064  case 1:
3065  // Deserialize measObjectUTRA
3066  // ...
3067  break;
3068 
3069  case 2:
3070  // Deserialize measObjectGERAN
3071  // ...
3072  break;
3073 
3074  case 3:
3075  // Deserialize measObjectCDMA2000
3076  // ...
3077  break;
3078 
3079  case 0:
3080  default:
3081  // Deserialize measObjectEUTRA
3082  std::bitset<5> measObjectEutraOpts;
3083  bIterator = DeserializeSequence (&measObjectEutraOpts, true, bIterator);
3084 
3085  // carrierFreq
3086  bIterator = DeserializeInteger (&n, 0, MAX_EARFCN, bIterator);
3087  elem->measObjectEutra.carrierFreq = n;
3088 
3089  // allowedMeasBandwidth
3090  bIterator = DeserializeEnum (6, &n, bIterator);
3091  switch (n)
3092  {
3093  case 0:
3094  elem->measObjectEutra.allowedMeasBandwidth = 6;
3095  break;
3096  case 1:
3097  elem->measObjectEutra.allowedMeasBandwidth = 15;
3098  break;
3099  case 2:
3100  elem->measObjectEutra.allowedMeasBandwidth = 25;
3101  break;
3102  case 3:
3103  elem->measObjectEutra.allowedMeasBandwidth = 50;
3104  break;
3105  case 4:
3106  elem->measObjectEutra.allowedMeasBandwidth = 75;
3107  break;
3108  case 5:
3109  default:
3110  elem->measObjectEutra.allowedMeasBandwidth = 100;
3111  break;
3112  }
3113 
3114  // presenceAntennaPort1
3115  bIterator = DeserializeBoolean (&elem->measObjectEutra.presenceAntennaPort1, bIterator);
3116 
3117  // neighCellConfig
3118  bIterator = DeserializeBitstring (&bitset2, bIterator);
3119  elem->measObjectEutra.neighCellConfig = bitset2.to_ulong ();
3120 
3121  // offsetFreq
3122  DeserializeQoffsetRange (&elem->measObjectEutra.offsetFreq, bIterator);
3123 
3124  if (measObjectEutraOpts[4])
3125  {
3126  // cellsToRemoveList
3127  int numElems;
3128  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
3129 
3130  for (int i = 0; i < numElems; i++)
3131  {
3132  bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
3133  elem->measObjectEutra.cellsToRemoveList.push_back (n);
3134  }
3135  }
3136 
3137  if (measObjectEutraOpts[3])
3138  {
3139  // cellsToAddModList
3140  int numElems;
3141  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
3142 
3143  for (int i = 0; i < numElems; i++)
3144  {
3145  LteRrcSap::CellsToAddMod * cellsToAddMod = new LteRrcSap::CellsToAddMod ();
3146 
3147  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3148 
3149  // cellIndex
3150  bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
3151  cellsToAddMod->cellIndex = n;
3152 
3153  // PhysCellId
3154  bIterator = DeserializeInteger (&n, 0, 503, bIterator);
3155  cellsToAddMod->physCellId = n;
3156 
3157  // cellIndividualOffset
3158  bIterator = DeserializeQoffsetRange ( &cellsToAddMod->cellIndividualOffset, bIterator);
3159 
3160  elem->measObjectEutra.cellsToAddModList.push_back (*cellsToAddMod);
3161  }
3162  }
3163 
3164  if (measObjectEutraOpts[2])
3165  {
3166  // blackCellsToRemoveList
3167  int numElems;
3168  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
3169 
3170  for (int i = 0; i < numElems; i++)
3171  {
3172  bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
3173  elem->measObjectEutra.blackCellsToRemoveList.push_back (n);
3174  }
3175  }
3176 
3177 
3178  if (measObjectEutraOpts[1])
3179  {
3180  // blackCellsToAddModList
3181  int numElems;
3182  bIterator = DeserializeSequenceOf (&numElems, MAX_CELL_MEAS, 1, bIterator);
3183 
3184  for (int i = 0; i < numElems; i++)
3185  {
3186  LteRrcSap::BlackCellsToAddMod * blackCellsToAddMod = new LteRrcSap::BlackCellsToAddMod ();
3187  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3188 
3189  bIterator = DeserializeInteger (&n, 1, MAX_CELL_MEAS, bIterator);
3190  blackCellsToAddMod->cellIndex = n;
3191 
3192  // PhysCellIdRange
3193  std::bitset<1> isRangePresent;
3194  bIterator = DeserializeSequence (&isRangePresent, false, bIterator);
3195 
3196  // start
3197  bIterator = DeserializeInteger (&n, 0, 503, bIterator);
3198  blackCellsToAddMod->physCellIdRange.start = n;
3199 
3200  blackCellsToAddMod->physCellIdRange.haveRange = isRangePresent[0];
3201  if (blackCellsToAddMod->physCellIdRange.haveRange)
3202  {
3203  // range
3204  bIterator = DeserializeEnum (16, &n, bIterator);
3205  switch (n)
3206  {
3207  case 0:
3208  blackCellsToAddMod->physCellIdRange.range = 4;
3209  break;
3210  case 1:
3211  blackCellsToAddMod->physCellIdRange.range = 8;
3212  break;
3213  case 2:
3214  blackCellsToAddMod->physCellIdRange.range = 12;
3215  break;
3216  case 3:
3217  blackCellsToAddMod->physCellIdRange.range = 16;
3218  break;
3219  case 4:
3220  blackCellsToAddMod->physCellIdRange.range = 24;
3221  break;
3222  case 5:
3223  blackCellsToAddMod->physCellIdRange.range = 32;
3224  break;
3225  case 6:
3226  blackCellsToAddMod->physCellIdRange.range = 48;
3227  break;
3228  case 7:
3229  blackCellsToAddMod->physCellIdRange.range = 64;
3230  break;
3231  case 8:
3232  blackCellsToAddMod->physCellIdRange.range = 84;
3233  break;
3234  case 9:
3235  blackCellsToAddMod->physCellIdRange.range = 96;
3236  break;
3237  case 10:
3238  blackCellsToAddMod->physCellIdRange.range = 128;
3239  break;
3240  case 11:
3241  blackCellsToAddMod->physCellIdRange.range = 168;
3242  break;
3243  case 12:
3244  blackCellsToAddMod->physCellIdRange.range = 252;
3245  break;
3246  case 13:
3247  blackCellsToAddMod->physCellIdRange.range = 504;
3248  break;
3249  default:
3250  blackCellsToAddMod->physCellIdRange.range = 0;
3251  }
3252  }
3253 
3254  elem->measObjectEutra.blackCellsToAddModList.push_back (*blackCellsToAddMod);
3255  }
3256  }
3257 
3258  elem->measObjectEutra.haveCellForWhichToReportCGI = measObjectEutraOpts[0];
3259  if (measObjectEutraOpts[0])
3260  {
3261  // cellForWhichToReportCGI
3262  bIterator = DeserializeInteger (&n, 0, 503, bIterator);
3263  elem->measObjectEutra.cellForWhichToReportCGI = n;
3264  }
3265  }
3266  measConfig->measObjectToAddModList.push_back (*elem);
3267  }
3268  }
3269 
3270  if (bitset11[8])
3271  {
3272  // reportConfigToRemoveList
3273  int reportConfigToRemoveListElems;
3274  bIterator = DeserializeSequenceOf (&reportConfigToRemoveListElems, MAX_REPORT_CONFIG_ID, 1, bIterator);
3275 
3276  for (int i = 0; i < reportConfigToRemoveListElems; i++)
3277  {
3278  bIterator = DeserializeInteger (&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
3279  measConfig->reportConfigToRemoveList.push_back (n);
3280  }
3281  }
3282 
3283  if (bitset11[7])
3284  {
3285  // reportConfigToAddModList
3286  int reportConfigToAddModListElems;
3287  bIterator = DeserializeSequenceOf (&reportConfigToAddModListElems, MAX_REPORT_CONFIG_ID, 1, bIterator);
3288 
3289  for (int i = 0; i < reportConfigToAddModListElems; i++)
3290  {
3291  LteRrcSap::ReportConfigToAddMod * elem = new LteRrcSap::ReportConfigToAddMod ();
3292 
3293  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3294  bIterator = DeserializeInteger (&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
3295  elem->reportConfigId = n;
3296 
3297  // Deserialize reportConfig
3298  int reportConfigChoice;
3299  bIterator = DeserializeChoice (2, false, &reportConfigChoice, bIterator);
3300 
3301  if (reportConfigChoice == 0)
3302  {
3303  // reportConfigEUTRA
3304  bIterator = DeserializeSequence (&bitset0, true, bIterator);
3305 
3306  // triggerType
3307  int triggerTypeChoice;
3308  bIterator = DeserializeChoice (2, false, &triggerTypeChoice, bIterator);
3309 
3310  if (triggerTypeChoice == 0)
3311  {
3312  // event
3313  elem->reportConfigEutra.triggerType = LteRrcSap::ReportConfigEutra::event;
3314  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3315 
3316  // eventId
3317  int eventIdChoice;
3318  bIterator = DeserializeChoice (5, true, &eventIdChoice, bIterator);
3319 
3320  switch (eventIdChoice)
3321  {
3322  case 0:
3323  elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA1;
3324  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3325  bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
3326  break;
3327 
3328  case 1:
3329  elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA2;
3330  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3331  bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
3332  break;
3333 
3334  case 2:
3335  elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA3;
3336  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3337  bIterator = DeserializeInteger (&n, -30, 30, bIterator);
3338  elem->reportConfigEutra.a3Offset = n;
3339  bIterator = DeserializeBoolean (&elem->reportConfigEutra.reportOnLeave, bIterator);
3340  break;
3341 
3342  case 3:
3343  elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA4;
3344  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3345  bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
3346  break;
3347 
3348  default:
3349  elem->reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::eventA5;
3350  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3351  bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold1, bIterator);
3352  bIterator = DeserializeThresholdEutra (&elem->reportConfigEutra.threshold2, bIterator);
3353  break;
3354  }
3355 
3356  bIterator = DeserializeInteger (&n, 0, 30, bIterator);
3357  elem->reportConfigEutra.hysteresis = n;
3358 
3359  bIterator = DeserializeEnum (16, &n, bIterator);
3360  switch (n)
3361  {
3362  case 0:
3363  elem->reportConfigEutra.timeToTrigger = 0;
3364  break;
3365  case 1:
3366  elem->reportConfigEutra.timeToTrigger = 40;
3367  break;
3368  case 2:
3369  elem->reportConfigEutra.timeToTrigger = 64;
3370  break;
3371  case 3:
3372  elem->reportConfigEutra.timeToTrigger = 80;
3373  break;
3374  case 4:
3375  elem->reportConfigEutra.timeToTrigger = 100;
3376  break;
3377  case 5:
3378  elem->reportConfigEutra.timeToTrigger = 128;
3379  break;
3380  case 6:
3381  elem->reportConfigEutra.timeToTrigger = 160;
3382  break;
3383  case 7:
3384  elem->reportConfigEutra.timeToTrigger = 256;
3385  break;
3386  case 8:
3387  elem->reportConfigEutra.timeToTrigger = 320;
3388  break;
3389  case 9:
3390  elem->reportConfigEutra.timeToTrigger = 480;
3391  break;
3392  case 10:
3393  elem->reportConfigEutra.timeToTrigger = 512;
3394  break;
3395  case 11:
3396  elem->reportConfigEutra.timeToTrigger = 640;
3397  break;
3398  case 12:
3399  elem->reportConfigEutra.timeToTrigger = 1024;
3400  break;
3401  case 13:
3402  elem->reportConfigEutra.timeToTrigger = 1280;
3403  break;
3404  case 14:
3405  elem->reportConfigEutra.timeToTrigger = 2560;
3406  break;
3407  case 15:
3408  default:
3409  elem->reportConfigEutra.timeToTrigger = 5120;
3410  break;
3411  }
3412  }
3413 
3414  if (triggerTypeChoice == 1)
3415  {
3416  // periodical
3417  elem->reportConfigEutra.triggerType = LteRrcSap::ReportConfigEutra::periodical;
3418 
3419  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3420  bIterator = DeserializeEnum (2, &n, bIterator);
3421  if (n == 0)
3422  {
3423  elem->reportConfigEutra.purpose = LteRrcSap::ReportConfigEutra::reportStrongestCells;
3424  }
3425  else
3426  {
3427  elem->reportConfigEutra.purpose = LteRrcSap::ReportConfigEutra::reportCgi;
3428  }
3429  }
3430 
3431  // triggerQuantity
3432  bIterator = DeserializeEnum (2, &n, bIterator);
3433  if (n == 0)
3434  {
3435  elem->reportConfigEutra.triggerQuantity = LteRrcSap::ReportConfigEutra::rsrp;
3436  }
3437  else
3438  {
3439  elem->reportConfigEutra.triggerQuantity = LteRrcSap::ReportConfigEutra::rsrq;
3440  }
3441 
3442  // reportQuantity
3443  bIterator = DeserializeEnum (2, &n, bIterator);
3444  if (n == 0)
3445  {
3446  elem->reportConfigEutra.reportQuantity = LteRrcSap::ReportConfigEutra::sameAsTriggerQuantity;
3447  }
3448  else
3449  {
3450  elem->reportConfigEutra.reportQuantity = LteRrcSap::ReportConfigEutra::both;
3451  }
3452 
3453  // maxReportCells
3454  bIterator = DeserializeInteger (&n, 1, MAX_CELL_REPORT, bIterator);
3455  elem->reportConfigEutra.maxReportCells = n;
3456 
3457  // reportInterval
3458  bIterator = DeserializeEnum (16, &n, bIterator);
3459  switch (n)
3460  {
3461  case 0:
3462  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms120;
3463  break;
3464  case 1:
3465  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms240;
3466  break;
3467  case 2:
3468  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms480;
3469  break;
3470  case 3:
3471  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms640;
3472  break;
3473  case 4:
3474  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms1024;
3475  break;
3476  case 5:
3477  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms2048;
3478  break;
3479  case 6:
3480  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms5120;
3481  break;
3482  case 7:
3483  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::ms10240;
3484  break;
3485  case 8:
3486  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min1;
3487  break;
3488  case 9:
3489  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min6;
3490  break;
3491  case 10:
3492  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min12;
3493  break;
3494  case 11:
3495  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min30;
3496  break;
3497  case 12:
3498  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::min60;
3499  break;
3500  case 13:
3501  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::spare3;
3502  break;
3503  case 14:
3504  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::spare2;
3505  break;
3506  case 15:
3507  default:
3508  elem->reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::spare1;
3509  }
3510 
3511  // reportAmount
3512  bIterator = DeserializeEnum (8, &n, bIterator);
3513  switch (n)
3514  {
3515  case 0:
3516  elem->reportConfigEutra.reportAmount = 1;
3517  break;
3518  case 1:
3519  elem->reportConfigEutra.reportAmount = 2;
3520  break;
3521  case 2:
3522  elem->reportConfigEutra.reportAmount = 4;
3523  break;
3524  case 3:
3525  elem->reportConfigEutra.reportAmount = 8;
3526  break;
3527  case 4:
3528  elem->reportConfigEutra.reportAmount = 16;
3529  break;
3530  case 5:
3531  elem->reportConfigEutra.reportAmount = 32;
3532  break;
3533  case 6:
3534  elem->reportConfigEutra.reportAmount = 64;
3535  break;
3536  default:
3537  elem->reportConfigEutra.reportAmount = 0;
3538  }
3539  }
3540 
3541  if (reportConfigChoice == 1)
3542  {
3543  // ReportConfigInterRAT
3544  // ...
3545  }
3546 
3547  measConfig->reportConfigToAddModList.push_back (*elem);
3548  }
3549  }
3550 
3551  if (bitset11[6])
3552  {
3553  // measIdToRemoveList
3554  int measIdToRemoveListElems;
3555  bIterator = DeserializeSequenceOf (&measIdToRemoveListElems, MAX_MEAS_ID, 1, bIterator);
3556 
3557  for (int i = 0; i < measIdToRemoveListElems; i++)
3558  {
3559  bIterator = DeserializeInteger (&n, 1, MAX_MEAS_ID, bIterator);
3560  measConfig->measIdToRemoveList.push_back (n);
3561  }
3562  }
3563 
3564  if (bitset11[5])
3565  {
3566  // measIdToAddModList
3567  int measIdToAddModListElems;
3568  bIterator = DeserializeSequenceOf (&measIdToAddModListElems, MAX_MEAS_ID, 1, bIterator);
3569 
3570  for (int i = 0; i < measIdToAddModListElems; i++)
3571  {
3572  LteRrcSap::MeasIdToAddMod * elem = new LteRrcSap::MeasIdToAddMod ();
3573 
3574  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3575 
3576  bIterator = DeserializeInteger (&n, 1, MAX_MEAS_ID, bIterator);
3577  elem->measId = n;
3578 
3579  bIterator = DeserializeInteger (&n, 1, MAX_OBJECT_ID, bIterator);
3580  elem->measObjectId = n;
3581 
3582  bIterator = DeserializeInteger (&n, 1, MAX_REPORT_CONFIG_ID, bIterator);
3583  elem->reportConfigId = n;
3584 
3585  measConfig->measIdToAddModList.push_back (*elem);
3586  }
3587  }
3588 
3589  measConfig->haveQuantityConfig = bitset11[4];
3590  if (measConfig->haveQuantityConfig)
3591  {
3592  // quantityConfig
3593  std::bitset<4> quantityConfigOpts;
3594  bIterator = DeserializeSequence (&quantityConfigOpts, true, bIterator);
3595 
3596  if (quantityConfigOpts[3])
3597  {
3598  // quantityConfigEUTRA
3599  bIterator = DeserializeSequence (&bitset0,false,bIterator);
3600  bIterator = DeserializeEnum (16, &n, bIterator);
3601  switch (n)
3602  {
3603  case 0:
3604  measConfig->quantityConfig.filterCoefficientRSRP = 0;
3605  break;
3606  case 1:
3607  measConfig->quantityConfig.filterCoefficientRSRP = 1;
3608  break;
3609  case 2:
3610  measConfig->quantityConfig.filterCoefficientRSRP = 2;
3611  break;
3612  case 3:
3613  measConfig->quantityConfig.filterCoefficientRSRP = 3;
3614  break;
3615  case 4:
3616  measConfig->quantityConfig.filterCoefficientRSRP = 4;
3617  break;
3618  case 5:
3619  measConfig->quantityConfig.filterCoefficientRSRP = 5;
3620  break;
3621  case 6:
3622  measConfig->quantityConfig.filterCoefficientRSRP = 6;
3623  break;
3624  case 7:
3625  measConfig->quantityConfig.filterCoefficientRSRP = 7;
3626  break;
3627  case 8:
3628  measConfig->quantityConfig.filterCoefficientRSRP = 8;
3629  break;
3630  case 9:
3631  measConfig->quantityConfig.filterCoefficientRSRP = 9;
3632  break;
3633  case 10:
3634  measConfig->quantityConfig.filterCoefficientRSRP = 11;
3635  break;
3636  case 11:
3637  measConfig->quantityConfig.filterCoefficientRSRP = 13;
3638  break;
3639  case 12:
3640  measConfig->quantityConfig.filterCoefficientRSRP = 15;
3641  break;
3642  case 13:
3643  measConfig->quantityConfig.filterCoefficientRSRP = 17;
3644  break;
3645  case 14:
3646  measConfig->quantityConfig.filterCoefficientRSRP = 19;
3647  break;
3648  case 15:
3649  measConfig->quantityConfig.filterCoefficientRSRP = 0;
3650  break;
3651  default:
3652  measConfig->quantityConfig.filterCoefficientRSRP = 4;
3653  }
3654  bIterator = DeserializeEnum (16, &n, bIterator);
3655  switch (n)
3656  {
3657  case 0:
3658  measConfig->quantityConfig.filterCoefficientRSRQ = 0;
3659  break;
3660  case 1:
3661  measConfig->quantityConfig.filterCoefficientRSRQ = 1;
3662  break;
3663  case 2:
3664  measConfig->quantityConfig.filterCoefficientRSRQ = 2;
3665  break;
3666  case 3:
3667  measConfig->quantityConfig.filterCoefficientRSRQ = 3;
3668  break;
3669  case 4:
3670  measConfig->quantityConfig.filterCoefficientRSRQ = 4;
3671  break;
3672  case 5:
3673  measConfig->quantityConfig.filterCoefficientRSRQ = 5;
3674  break;
3675  case 6:
3676  measConfig->quantityConfig.filterCoefficientRSRQ = 6;
3677  break;
3678  case 7:
3679  measConfig->quantityConfig.filterCoefficientRSRQ = 7;
3680  break;
3681  case 8:
3682  measConfig->quantityConfig.filterCoefficientRSRQ = 8;
3683  break;
3684  case 9:
3685  measConfig->quantityConfig.filterCoefficientRSRQ = 9;
3686  break;
3687  case 10:
3688  measConfig->quantityConfig.filterCoefficientRSRQ = 11;
3689  break;
3690  case 11:
3691  measConfig->quantityConfig.filterCoefficientRSRQ = 13;
3692  break;
3693  case 12:
3694  measConfig->quantityConfig.filterCoefficientRSRQ = 15;
3695  break;
3696  case 13:
3697  measConfig->quantityConfig.filterCoefficientRSRQ = 17;
3698  break;
3699  case 14:
3700  measConfig->quantityConfig.filterCoefficientRSRQ = 19;
3701  break;
3702  case 15:
3703  measConfig->quantityConfig.filterCoefficientRSRQ = 0;
3704  break;
3705  default:
3706  measConfig->quantityConfig.filterCoefficientRSRQ = 4;
3707  }
3708  }
3709  if (quantityConfigOpts[2])
3710  {
3711  // quantityConfigUTRA
3712  // ...
3713  }
3714  if (quantityConfigOpts[1])
3715  {
3716  // quantityConfigGERAN
3717  // ...
3718  }
3719  if (quantityConfigOpts[0])
3720  {
3721  // quantityConfigCDMA2000
3722  // ...
3723  }
3724  }
3725 
3726  measConfig->haveMeasGapConfig = bitset11[3];
3727  if (measConfig->haveMeasGapConfig)
3728  {
3729  // measGapConfig
3730  int measGapConfigChoice;
3731  bIterator = DeserializeChoice (2, false, &measGapConfigChoice, bIterator);
3732  switch (measGapConfigChoice)
3733  {
3734  case 0:
3735  measConfig->measGapConfig.type = LteRrcSap::MeasGapConfig::RESET;
3736  bIterator = DeserializeNull (bIterator);
3737  break;
3738  case 1:
3739  default:
3740  measConfig->measGapConfig.type = LteRrcSap::MeasGapConfig::SETUP;
3741  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3742 
3743  int gapOffsetChoice;
3744  bIterator = DeserializeChoice (2, true, &gapOffsetChoice, bIterator);
3745  switch (gapOffsetChoice)
3746  {
3747  case 0:
3748  measConfig->measGapConfig.gapOffsetChoice = LteRrcSap::MeasGapConfig::gp0;
3749  bIterator = DeserializeInteger (&n, 0, 39, bIterator);
3750  measConfig->measGapConfig.gapOffsetValue = n;
3751  break;
3752  case 1:
3753  default:
3754  measConfig->measGapConfig.gapOffsetChoice = LteRrcSap::MeasGapConfig::gp1;
3755  bIterator = DeserializeInteger (&n, 0, 79, bIterator);
3756  measConfig->measGapConfig.gapOffsetValue = n;
3757  }
3758  }
3759  }
3760 
3761  measConfig->haveSmeasure = bitset11[2];
3762  if (measConfig->haveSmeasure)
3763  {
3764  // s-Measure
3765  bIterator = DeserializeInteger (&n, 0, 97, bIterator);
3766  measConfig->sMeasure = n;
3767  }
3768 
3769  if (bitset11[1])
3770  {
3771  // preRegistrationInfoHRPD
3772  // ...
3773  }
3774 
3775  measConfig->haveSpeedStatePars = bitset11[0];
3776  if (measConfig->haveSpeedStatePars)
3777  {
3778  // speedStatePars
3779  int speedStateParsChoice;
3780  bIterator = DeserializeChoice (2, false, &speedStateParsChoice, bIterator);
3781  switch (speedStateParsChoice)
3782  {
3783  case 0:
3784  measConfig->speedStatePars.type = LteRrcSap::SpeedStatePars::RESET;
3785  bIterator = DeserializeNull (bIterator);
3786  break;
3787  case 1:
3788  default:
3789  measConfig->speedStatePars.type = LteRrcSap::SpeedStatePars::SETUP;
3790  bIterator = DeserializeSequence (&bitset0, false, bIterator);
3791 
3792  // Deserialize mobilityStateParameters
3793  // Deserialize t-Evaluation
3794  bIterator = DeserializeEnum (8, &n, bIterator);
3795  switch (n)
3796  {
3797  case 0:
3798  measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 30;
3799  break;
3800  case 1:
3801  measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 60;
3802  break;
3803  case 2:
3804  measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 120;
3805  break;
3806  case 3:
3807  measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 180;
3808  break;
3809  case 4:
3810  measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 240;
3811  break;
3812  default:
3813  measConfig->speedStatePars.mobilityStateParameters.tEvaluation = 0;
3814  }
3815  // Deserialize t-HystNormal
3816  bIterator = DeserializeEnum (8, &n, bIterator);
3817  switch (n)
3818  {
3819  case 0:
3820  measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 30;
3821  break;
3822  case 1:
3823  measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 60;
3824  break;
3825  case 2:
3826  measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 120;
3827  break;
3828  case 3:
3829  measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 180;
3830  break;
3831  case 4:
3832  measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 240;
3833  break;
3834  default:
3835  measConfig->speedStatePars.mobilityStateParameters.tHystNormal = 0;
3836  }
3837 
3838  bIterator = DeserializeInteger (&n, 1, 16, bIterator);
3839  measConfig->speedStatePars.mobilityStateParameters.nCellChangeMedium = n;
3840 
3841  bIterator = DeserializeInteger (&n, 1, 16, bIterator);
3842  measConfig->speedStatePars.mobilityStateParameters.nCellChangeHigh = n;
3843 
3844  // Deserialize timeToTriggerSf
3845  bIterator = DeserializeEnum (4, &n, bIterator);
3846  measConfig->speedStatePars.timeToTriggerSf.sfMedium = (n + 1) * 25;
3847  bIterator = DeserializeEnum (4, &n, bIterator);
3848  measConfig->speedStatePars.timeToTriggerSf.sfHigh = (n + 1) * 25;
3849  }
3850  }
3851  return bIterator;
3852 }
3854 
3855 // Constructor
3856 RrcConnectionRequestHeader::RrcConnectionRequestHeader () : RrcUlCcchMessage ()
3857 {
3858  m_mmec = std::bitset<8> (0ul);
3859  m_mTmsi = std::bitset<32> (0ul);
3860  m_establishmentCause = MO_SIGNALLING;
3861  m_spare = std::bitset<1> (0ul);
3862 }
3863 
3864 // Destructor
3865 RrcConnectionRequestHeader::~RrcConnectionRequestHeader ()
3866 {
3867 }
3868 
3869 TypeId
3870 RrcConnectionRequestHeader::GetTypeId (void)
3871 {
3872  static TypeId tid = TypeId ("ns3::RrcConnectionRequestHeader")
3873  .SetParent<Header> ()
3874  ;
3875  return tid;
3876 }
3877 
3878 void
3879 RrcConnectionRequestHeader::Print (std::ostream &os) const
3880 {
3881  os << "MMEC:" << m_mmec << std::endl;
3882  os << "MTMSI:" << m_mTmsi << std::endl;
3883  os << "EstablishmentCause:" << m_establishmentCause << std::endl;
3884  os << "Spare: " << m_spare << std::endl;
3885 }
3886 
3887 void
3889 {
3890  m_serializationResult = Buffer ();
3891 
3892  SerializeUlCcchMessage (1);
3893 
3894  // Serialize RRCConnectionRequest sequence:
3895  // no default or optional fields. Extension marker not present.
3896  SerializeSequence (std::bitset<0> (),false);
3897 
3898  // Serialize criticalExtensions choice:
3899  // 2 options, selected: 0 (option: rrcConnectionRequest-r8)
3900  SerializeChoice (2,0,false);
3901 
3902  // Serialize RRCConnectionRequest-r8-IEs sequence:
3903  // no default or optional fields. Extension marker not present.
3904  SerializeSequence (std::bitset<0> (),false);
3905 
3906  // Serialize InitialUE-Identity choice:
3907  // 2 options, selected: 0 (option: s-TMSI)
3908  SerializeChoice (2,0,false);
3909 
3910  // Serialize S-TMSI sequence:
3911  // no default or optional fields. Extension marker not present.
3912  SerializeSequence (std::bitset<0> (),false);
3913 
3914  // Serialize mmec : MMEC ::= BIT STRING (SIZE (8))
3915  SerializeBitstring (m_mmec);
3916 
3917  // Serialize m-TMSI ::= BIT STRING (SIZE (32))
3918  SerializeBitstring (m_mTmsi);
3919 
3920  // Serialize establishmentCause : EstablishmentCause ::= ENUMERATED
3921  SerializeEnum (8,m_establishmentCause);
3922 
3923  // Serialize spare : BIT STRING (SIZE (1))
3924  SerializeBitstring (std::bitset<1> ());
3925 
3926  // Finish serialization
3927  FinalizeSerialization ();
3928 }
3929 
3930 uint32_t
3932 {
3933  std::bitset<1> dummy;
3934  std::bitset<0> optionalOrDefaultMask;
3935  int selectedOption;
3936 
3937  bIterator = DeserializeUlCcchMessage (bIterator);
3938 
3939  // Deserialize RCConnectionRequest sequence
3940  bIterator = DeserializeSequence (&optionalOrDefaultMask,false,bIterator);
3941 
3942  // Deserialize criticalExtensions choice:
3943  bIterator = DeserializeChoice (2,false,&selectedOption,bIterator);
3944 
3945  // Deserialize RRCConnectionRequest-r8-IEs sequence
3946  bIterator = DeserializeSequence (&optionalOrDefaultMask,false,bIterator);
3947 
3948  // Deserialize InitialUE-Identity choice
3949  bIterator = DeserializeChoice (2,false,&selectedOption,bIterator);
3950 
3951  // Deserialize S-TMSI sequence
3952  bIterator = DeserializeSequence (&optionalOrDefaultMask,false,bIterator);
3953 
3954  // Deserialize mmec
3955  bIterator = DeserializeBitstring (&m_mmec,bIterator);
3956 
3957  // Deserialize m-TMSI
3958  bIterator = DeserializeBitstring (&m_mTmsi,bIterator);
3959 
3960  // Deserialize establishmentCause
3961  bIterator = DeserializeEnum (8,&selectedOption,bIterator);
3962 
3963  // Deserialize spare
3964  bIterator = DeserializeBitstring (&dummy,bIterator);
3965 
3966  return GetSerializedSize ();
3967 }
3968 
3969 void
3971 {
3972  m_mTmsi = std::bitset<32> ((uint32_t)msg.ueIdentity);
3973  m_mmec = std::bitset<8> ((uint32_t)(msg.ueIdentity >> 32));
3974  m_isDataSerialized = false;
3975 }
3976 
3979 {
3981  msg.ueIdentity = (((uint64_t) m_mmec.to_ulong ()) << 32) | (m_mTmsi.to_ulong ());
3982 
3983  return msg;
3984 }
3985 
3986 std::bitset<8>
3988 {
3989  return m_mmec;
3990 }
3991 
3992 std::bitset<32>
3994 {
3995  return m_mTmsi;
3996 }
3997 
3998 
4000 RrcConnectionSetupHeader::RrcConnectionSetupHeader ()
4001 {
4002 }
4003 
4004 RrcConnectionSetupHeader::~RrcConnectionSetupHeader ()
4005 {
4006 }
4007 
4008 void
4009 RrcConnectionSetupHeader::Print (std::ostream &os) const
4010 {
4011  os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
4012  os << "radioResourceConfigDedicated:" << std::endl;
4013  RrcAsn1Header::Print (os,m_radioResourceConfigDedicated);
4014 }
4015 
4016 void
4018 {
4019  m_serializationResult = Buffer ();
4020 
4021  SerializeDlCcchMessage (3);
4022 
4023  SerializeInteger (15,0,15);
4024 
4025  // Serialize RRCConnectionSetup sequence:
4026  // no default or optional fields. Extension marker not present.
4027  SerializeSequence (std::bitset<0> (),false);
4028 
4029  // Serialize rrc-TransactionIdentifier ::=INTEGER (0..3)
4030  SerializeInteger (m_rrcTransactionIdentifier,0,3);
4031 
4032  // Serialize criticalExtensions choice:
4033  // 2 options, selected: 0 (option: c1)
4034  SerializeChoice (2,0,false);
4035 
4036  // Serialize c1 choice:
4037  // 8 options, selected: 0 (option: rrcConnectionSetup-r8)
4038  SerializeChoice (8,0,false);
4039 
4040  // Serialize rrcConnectionSetup-r8 sequence
4041  // 1 optional fields (not present). Extension marker not present.
4042  SerializeSequence (std::bitset<1> (0),false);
4043 
4044  // Serialize RadioResourceConfigDedicated sequence
4045  SerializeRadioResourceConfigDedicated (m_radioResourceConfigDedicated);
4046 
4047  // Serialize nonCriticalExtension sequence
4048  // 2 optional fields, none present. No extension marker.
4049  SerializeSequence (std::bitset<2> (0),false);
4050 
4051  // Finish serialization
4052  FinalizeSerialization ();
4053 }
4054 
4055 
4056 uint32_t
4058 {
4059  int n;
4060 
4061  std::bitset<0> bitset0;
4062  std::bitset<1> bitset1;
4063  std::bitset<2> bitset2;
4064 
4065  bIterator = DeserializeDlCcchMessage (bIterator);
4066 
4067  bIterator = DeserializeInteger (&n,0,15,bIterator);
4068 
4069  // Deserialize RRCConnectionSetup sequence
4070  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4071 
4072  // Deserialize rrc-TransactionIdentifier ::=INTEGER (0..3)
4073  bIterator = DeserializeInteger (&n,0,3,bIterator);
4074  m_rrcTransactionIdentifier = n;
4075 
4076  // Deserialize criticalExtensions choice
4077  int criticalExtensionChoice;
4078  bIterator = DeserializeChoice (2,false,&criticalExtensionChoice,bIterator);
4079  if (criticalExtensionChoice == 1)
4080  {
4081  // Deserialize criticalExtensionsFuture
4082  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4083  }
4084  else if (criticalExtensionChoice == 0)
4085  {
4086  // Deserialize c1
4087  int c1;
4088  bIterator = DeserializeChoice (8,false,&c1,bIterator);
4089 
4090  if (c1 > 0)
4091  {
4092  // Deserialize spareX , X:=7..1
4093  bIterator = DeserializeNull (bIterator);
4094  }
4095  else if (c1 == 0)
4096  {
4097  // Deserialize rrcConnectionSetup-r8
4098  // 1 optional fields, no extension marker.
4099  bIterator = DeserializeSequence (&bitset1,false,bIterator);
4100 
4101  // Deserialize radioResourceConfigDedicated
4102  bIterator = DeserializeRadioResourceConfigDedicated (&m_radioResourceConfigDedicated,bIterator);
4103 
4104  if (bitset1[0])
4105  {
4106  // Deserialize nonCriticalExtension
4107  // 2 optional fields, no extension marker.
4108  bIterator = DeserializeSequence (&bitset2,false,bIterator);
4109 
4110  // Deserialization of lateR8NonCriticalExtension and nonCriticalExtension
4111  // ...
4112  }
4113  }
4114  }
4115  return GetSerializedSize ();
4116 }
4117 
4118 void
4120 {
4121  m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
4122  m_radioResourceConfigDedicated = msg.radioResourceConfigDedicated;
4123  m_isDataSerialized = false;
4124 }
4125 
4128 {
4130  msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier;
4131  msg.radioResourceConfigDedicated = m_radioResourceConfigDedicated;
4132  return msg;
4133 }
4134 
4135 uint8_t
4137 {
4138  return m_rrcTransactionIdentifier;
4139 }
4140 
4141 bool
4143 {
4144  return m_radioResourceConfigDedicated.havePhysicalConfigDedicated;
4145 }
4146 
4147 std::list<LteRrcSap::SrbToAddMod>
4149 {
4150  return m_radioResourceConfigDedicated.srbToAddModList;
4151 }
4152 
4153 std::list<LteRrcSap::DrbToAddMod>
4155 {
4156  return m_radioResourceConfigDedicated.drbToAddModList;
4157 }
4158 
4159 std::list<uint8_t>
4161 {
4162  return m_radioResourceConfigDedicated.drbToReleaseList;
4163 }
4164 
4167 {
4168  return m_radioResourceConfigDedicated.physicalConfigDedicated;
4169 }
4170 
4173 {
4174  return m_radioResourceConfigDedicated;
4175 }
4176 
4178 
4179 RrcConnectionSetupCompleteHeader::RrcConnectionSetupCompleteHeader ()
4180 {
4181 }
4182 
4183 RrcConnectionSetupCompleteHeader::~RrcConnectionSetupCompleteHeader ()
4184 {
4185 }
4186 
4187 void
4189 {
4190  m_serializationResult = Buffer ();
4191 
4192  // Serialize DCCH message
4193  SerializeUlDcchMessage (4);
4194 
4195  // Serialize RRCConnectionSetupComplete sequence:
4196  // no default or optional fields. Extension marker not present.
4197  SerializeSequence (std::bitset<0> (),false);
4198 
4199  // Serialize rrc-TransactionIdentifier
4200  SerializeInteger (m_rrcTransactionIdentifier,0,3);
4201 
4202  // Serialize criticalExtensions choice
4203  // 2 options, selected 0 (c1)
4204  SerializeChoice (2,0,false);
4205 
4206  // Choose spare3 NULL
4207  SerializeChoice (4,1,false);
4208 
4209  // Serialize spare3 NULL
4210  SerializeNull ();
4211 
4212  // Finish serialization
4213  FinalizeSerialization ();
4214 }
4215 
4216 uint32_t
4218 {
4219  std::bitset<0> bitset0;
4220 
4221  bIterator = DeserializeUlDcchMessage (bIterator);
4222 
4223  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4224 
4225  int n;
4226  bIterator = DeserializeInteger (&n,0,3,bIterator);
4227  m_rrcTransactionIdentifier = n;
4228 
4229  bIterator = DeserializeChoice (2,false,&n,bIterator);
4230 
4231  if (n == 1)
4232  {
4233  // Deserialize criticalExtensionsFuture
4234  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4235  }
4236  else if (n == 0)
4237  {
4238  // Deserialize c1
4239  int c1Chosen;
4240  bIterator = DeserializeChoice (4,false,&c1Chosen,bIterator);
4241 
4242  if (c1Chosen == 0)
4243  {
4244  // Deserialize rrcConnectionSetupComplete-r8
4245  // ...
4246  }
4247  else
4248  {
4249  bIterator = DeserializeNull (bIterator);
4250  }
4251  }
4252 
4253  return GetSerializedSize ();
4254 }
4255 
4256 void
4258 {
4259  os << "rrcTransactionIdentifier: " << (int) m_rrcTransactionIdentifier << std::endl;
4260 }
4261 
4262 void
4264 {
4265  m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
4266  m_isDataSerialized = false;
4267 }
4268 
4269 uint8_t
4271 {
4272  return m_rrcTransactionIdentifier;
4273 }
4274 
4277 {
4279  msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier;
4280  return msg;
4281 }
4282 
4284 
4285 RrcConnectionReconfigurationCompleteHeader::RrcConnectionReconfigurationCompleteHeader ()
4286 {
4287 }
4288 
4289 RrcConnectionReconfigurationCompleteHeader::~RrcConnectionReconfigurationCompleteHeader ()
4290 {
4291 }
4292 
4293 void
4295 {
4296  m_serializationResult = Buffer ();
4297 
4298  // Serialize DCCH message
4299  SerializeUlDcchMessage (2);
4300 
4301  // Serialize RRCConnectionSetupComplete sequence:
4302  // no default or optional fields. Extension marker not present.
4303  SerializeSequence (std::bitset<0> (),false);
4304 
4305  // Serialize rrc-TransactionIdentifier
4306  SerializeInteger (m_rrcTransactionIdentifier,0,3);
4307 
4308  // Serialize criticalExtensions choice
4309  // 2 options, selected 1 (criticalExtensionsFuture)
4310  SerializeChoice (2,1,false);
4311 
4312  // Choose criticalExtensionsFuture
4313  SerializeSequence (std::bitset<0> (),false);
4314 
4315  // Finish serialization
4316  FinalizeSerialization ();
4317 }
4318 
4319 uint32_t
4321 {
4322  std::bitset<0> bitset0;
4323  int n;
4324 
4325  bIterator = DeserializeUlDcchMessage (bIterator);
4326  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4327 
4328  bIterator = DeserializeInteger (&n,0,3,bIterator);
4329  m_rrcTransactionIdentifier = n;
4330 
4331  bIterator = DeserializeChoice (2,false,&n,bIterator);
4332 
4333  if (n == 1)
4334  {
4335  // Deserialize criticalExtensionsFuture
4336  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4337  }
4338  else if (n == 0)
4339  {
4340  // Deserialize rrcConnectionReconfigurationComplete-r8
4341  // ...
4342  }
4343 
4344  return GetSerializedSize ();
4345 }
4346 
4347 void
4349 {
4350  os << "rrcTransactionIdentifier: " << (int) m_rrcTransactionIdentifier << std::endl;
4351 }
4352 
4353 void
4355 {
4356  m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
4357  m_isDataSerialized = false;
4358 }
4359 
4362 {
4364  msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier;
4365  return msg;
4366 }
4367 
4368 uint8_t
4370 {
4371  return m_rrcTransactionIdentifier;
4372 }
4373 
4375 
4376 RrcConnectionReconfigurationHeader::RrcConnectionReconfigurationHeader ()
4377 {
4378 }
4379 
4380 RrcConnectionReconfigurationHeader::~RrcConnectionReconfigurationHeader ()
4381 {
4382 }
4383 
4384 void
4386 {
4387  m_serializationResult = Buffer ();
4388 
4389  SerializeDlDcchMessage (4);
4390 
4391  // Serialize RRCConnectionSetupComplete sequence:
4392  // no default or optional fields. Extension marker not present.
4393  SerializeSequence (std::bitset<0> (),false);
4394 
4395  // Serialize rrc-TransactionIdentifier
4396  SerializeInteger (m_rrcTransactionIdentifier,0,3);
4397 
4398  // Serialize criticalExtensions choice
4399  // 2 options, selected 0 (c1)
4400  SerializeChoice (2,0,false);
4401 
4402  // Serialize c1 choice
4403  // 8 options, selected 0 (rrcConnectionReconfiguration-r8)
4404  SerializeChoice (8,0,false);
4405 
4406  // Serialize RRCConnectionReconfiguration-r8-IEs sequence:
4407  // 6 optional fields. Extension marker not present.
4408  std::bitset<6> options;
4409  options.set (5,m_haveMeasConfig);
4410  options.set (4,m_haveMobilityControlInfo);
4411  options.set (3,0); // No dedicatedInfoNASList
4412  options.set (2,m_haveRadioResourceConfigDedicated);
4413  options.set (1,0); // No securityConfigHO
4414  options.set (0,0); // No nonCriticalExtension
4415  SerializeSequence (options,false);
4416 
4417  if (m_haveMeasConfig)
4418  {
4419  SerializeMeasConfig (m_measConfig);
4420  }
4421 
4422  if (m_haveMobilityControlInfo)
4423  {
4424  // Serialize MobilityControlInfo
4425 
4426  // 4 optional fields, extension marker present.
4427  std::bitset<4> mobCtrlIntoOptional;
4428  mobCtrlIntoOptional.set (3,m_mobilityControlInfo.haveCarrierFreq);
4429  mobCtrlIntoOptional.set (2,m_mobilityControlInfo.haveCarrierBandwidth);
4430  mobCtrlIntoOptional.set (1,0); // No additionalSpectrumEmission
4431  mobCtrlIntoOptional.set (0,m_mobilityControlInfo.haveRachConfigDedicated);
4432  SerializeSequence (mobCtrlIntoOptional,true);
4433 
4434  // Serialize targetPhysCellId
4435  SerializeInteger (m_mobilityControlInfo.targetPhysCellId,0,503);
4436 
4437  if (m_mobilityControlInfo.haveCarrierFreq)
4438  {
4439  SerializeSequence (std::bitset<1> (1),false);
4440  SerializeInteger (m_mobilityControlInfo.carrierFreq.dlCarrierFreq,0,MAX_EARFCN);
4441  SerializeInteger (m_mobilityControlInfo.carrierFreq.ulCarrierFreq,0,MAX_EARFCN);
4442  }
4443 
4444  if (m_mobilityControlInfo.haveCarrierBandwidth)
4445  {
4446  SerializeSequence (std::bitset<1> (1),false);
4447 
4448  // Serialize dl-Bandwidth
4449  switch (m_mobilityControlInfo.carrierBandwidth.dlBandwidth)
4450  {
4451  case 6:
4452  SerializeEnum (16,0);
4453  break;
4454  case 15:
4455  SerializeEnum (16,1);
4456  break;
4457  case 25:
4458  SerializeEnum (16,2);
4459  break;
4460  case 50:
4461  SerializeEnum (16,3);
4462  break;
4463  case 75:
4464  SerializeEnum (16,4);
4465  break;
4466  case 100:
4467  SerializeEnum (16,5);
4468  break;
4469  default:
4470  SerializeEnum (16,6);
4471  }
4472 
4473  // Serialize ul-Bandwidth
4474  switch (m_mobilityControlInfo.carrierBandwidth.ulBandwidth)
4475  {
4476  case 6:
4477  SerializeEnum (16,0);
4478  break;
4479  case 15:
4480  SerializeEnum (16,1);
4481  break;
4482  case 25:
4483  SerializeEnum (16,2);
4484  break;
4485  case 50:
4486  SerializeEnum (16,3);
4487  break;
4488  case 75:
4489  SerializeEnum (16,4);
4490  break;
4491  case 100:
4492  SerializeEnum (16,5);
4493  break;
4494  default:
4495  SerializeEnum (16,6);
4496  }
4497  }
4498 
4499  // Serialize t304
4500  SerializeEnum (8,0);
4501 
4502  // Serialize newUE-Identitiy
4503  SerializeBitstring (std::bitset<16> (m_mobilityControlInfo.newUeIdentity));
4504 
4505  // Serialize radioResourceConfigCommon
4506  SerializeRadioResourceConfigCommon (m_mobilityControlInfo.radioResourceConfigCommon);
4507 
4508  if (m_mobilityControlInfo.haveRachConfigDedicated)
4509  {
4510  SerializeSequence (std::bitset<0> (),false);
4511  SerializeInteger (m_mobilityControlInfo.rachConfigDedicated.raPreambleIndex,0,63);
4512  SerializeInteger (m_mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex,0,15);
4513  }
4514  }
4515 
4516  if (m_haveRadioResourceConfigDedicated)
4517  {
4518  // Serialize RadioResourceConfigDedicated
4519  SerializeRadioResourceConfigDedicated (m_radioResourceConfigDedicated);
4520  }
4521 
4522  // Finish serialization
4523  FinalizeSerialization ();
4524 }
4525 
4526 uint32_t
4528 {
4529  std::bitset<0> bitset0;
4530 
4531  bIterator = DeserializeDlDcchMessage (bIterator);
4532 
4533  // RRCConnectionReconfiguration sequence
4534  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4535 
4536  // rrc-TransactionIdentifier
4537  int n;
4538  bIterator = DeserializeInteger (&n,0,3,bIterator);
4539  m_rrcTransactionIdentifier = n;
4540 
4541  // criticalExtensions
4542  int sel;
4543  bIterator = DeserializeChoice (2,false,&sel,bIterator);
4544  if (sel == 1)
4545  {
4546  // criticalExtensionsFuture
4547  bIterator = DeserializeSequence (&bitset0,false,bIterator);
4548  }
4549  else if (sel == 0)
4550  {
4551  // c1
4552  int c1Chosen;
4553  bIterator = DeserializeChoice (8,false,&c1Chosen,bIterator);
4554  if (c1Chosen > 0)
4555  {
4556  bIterator = DeserializeNull (bIterator);
4557  }
4558  else if (c1Chosen == 0)
4559  {
4560  // rrcConnectionReconfiguration-r8
4561  std::bitset<6> rrcConnRecOpts;
4562  bIterator = DeserializeSequence (&rrcConnRecOpts,false,bIterator);
4563 
4564  m_haveMeasConfig = rrcConnRecOpts[5];
4565  if (m_haveMeasConfig)
4566  {
4567  bIterator = DeserializeMeasConfig (&m_measConfig, bIterator);
4568  }
4569 
4570  m_haveMobilityControlInfo = rrcConnRecOpts[4];
4571  if (m_haveMobilityControlInfo)
4572  {
4573  // mobilityControlInfo
4574  std::bitset<4> mobCtrlOpts;
4575  bIterator = DeserializeSequence (&mobCtrlOpts,true,bIterator);
4576 
4577  // PhysCellId
4578  bIterator = DeserializeInteger (&n,0,503,bIterator);
4579  m_mobilityControlInfo.targetPhysCellId = n;
4580 
4581  // carrierFreq
4582  m_mobilityControlInfo.haveCarrierFreq = mobCtrlOpts[3];
4583  if (m_mobilityControlInfo.haveCarrierFreq)
4584  {
4585  std::bitset<1> ulCarrierFreqPresent;
4586  bIterator = DeserializeSequence (&ulCarrierFreqPresent,false,bIterator);
4587 
4588  bIterator = DeserializeInteger (&n,0,MAX_EARFCN,bIterator);
4589  m_mobilityControlInfo.carrierFreq.dlCarrierFreq = n;
4590 
4591  if (ulCarrierFreqPresent[0])
4592  {
4593  bIterator = DeserializeInteger (&n,0,MAX_EARFCN,bIterator);
4594  m_mobilityControlInfo.carrierFreq.ulCarrierFreq = n;
4595  }
4596  }
4597 
4598  // carrierBandwidth
4599  m_mobilityControlInfo.haveCarrierBandwidth = mobCtrlOpts[2];
4600  if (m_mobilityControlInfo.haveCarrierBandwidth)
4601  {
4602  std::bitset<1> ulBandwidthPresent;
4603  bIterator = DeserializeSequence (&ulBandwidthPresent,false,bIterator);
4604 
4605  bIterator = DeserializeEnum (16,&n,bIterator);
4606  switch (n)
4607  {
4608  case 0:
4609  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 6;
4610  break;
4611  case 1:
4612  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 15;
4613  break;
4614  case 2:
4615  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 25;
4616  break;
4617  case 3:
4618  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 50;
4619  break;
4620  case 4:
4621  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 75;
4622  break;
4623  case 5:
4624  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 100;
4625  break;
4626  case 6:
4627  m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 0;
4628  break;
4629  }
4630 
4631  if (ulBandwidthPresent[0])
4632  {
4633  bIterator = DeserializeEnum (16,&n,bIterator);
4634  switch (n)
4635  {
4636  case 0:
4637  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 6;
4638  break;
4639  case 1:
4640  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 15;
4641  break;
4642  case 2:
4643  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 25;
4644  break;
4645  case 3:
4646  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 50;
4647  break;
4648  case 4:
4649  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 75;
4650  break;
4651  case 5:
4652  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 100;
4653  break;
4654  case 6:
4655  m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 0;
4656  break;
4657  }
4658  }
4659  }
4660 
4661  // additionalSpectrumEmission
4662  if (mobCtrlOpts[1])
4663  {
4664  // ...
4665  }
4666 
4667  // t304
4668  bIterator = DeserializeEnum (8,&n,bIterator);
4669 
4670  // newUE-Identity
4671  std::bitset<16> cRnti;
4672  bIterator = DeserializeBitstring (&cRnti, bIterator);
4673  m_mobilityControlInfo.newUeIdentity = cRnti.to_ulong ();
4674 
4675  // radioResourceConfigCommon
4676  bIterator = DeserializeRadioResourceConfigCommon (&m_mobilityControlInfo.radioResourceConfigCommon, bIterator);
4677 
4678  m_mobilityControlInfo.haveRachConfigDedicated = mobCtrlOpts[0];
4679  if (m_mobilityControlInfo.haveRachConfigDedicated)
4680  {
4681  bIterator = DeserializeSequence (&bitset0, false, bIterator);
4682  bIterator = DeserializeInteger (&n,0,63, bIterator);
4683  m_mobilityControlInfo.rachConfigDedicated.raPreambleIndex = n;
4684  bIterator = DeserializeInteger (&n,0,15, bIterator);
4685  m_mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = n;
4686  }
4687  }
4688 
4689  // dedicatedInfoNASList
4690  if (rrcConnRecOpts[3])
4691  {
4692  // ...
4693  }
4694 
4695  // radioResourceConfigDedicated
4696  m_haveRadioResourceConfigDedicated = rrcConnRecOpts[2];
4697  if (m_haveRadioResourceConfigDedicated)
4698  {
4699  bIterator = DeserializeRadioResourceConfigDedicated (&m_radioResourceConfigDedicated,bIterator);
4700  }
4701 
4702  // securityConfigHO
4703  if (rrcConnRecOpts[1])
4704  {
4705  // ...
4706  }
4707 
4708  // nonCriticalExtension
4709  if (rrcConnRecOpts[0])
4710  {
4711  // ...
4712  }
4713  }
4714  }
4715 
4716  return GetSerializedSize ();
4717 }
4718 
4719 void
4721 {
4722  os << "rrcTransactionIdentifier: " << (int) m_rrcTransactionIdentifier << std::endl;
4723  os << "haveMeasConfig: " << m_haveMeasConfig << std::endl;
4724  if (m_haveMobilityControlInfo)
4725  {
4726  if (!m_measConfig.measObjectToRemoveList.empty ())
4727  {
4728  os << " measObjectToRemoveList: ";
4729  std::list<uint8_t> auxList = m_measConfig.measObjectToRemoveList;
4730  std::list<uint8_t>::iterator it = auxList.begin ();
4731  for (; it != auxList.end (); it++)
4732  {
4733  os << (int) *it << ", ";
4734  }
4735  os << std::endl;
4736  }
4737  if (!m_measConfig.reportConfigToRemoveList.empty ())
4738  {
4739  os << " reportConfigToRemoveList: ";
4740  std::list<uint8_t> auxList = m_measConfig.reportConfigToRemoveList;
4741  std::list<uint8_t>::iterator it = auxList.begin ();
4742  for (; it != auxList.end (); it++)
4743  {
4744  os << (int) *it << ", ";
4745  }
4746  os << std::endl;
4747  }
4748  if (!m_measConfig.measIdToRemoveList.empty ())
4749  {
4750  os << " measIdToRemoveList: ";
4751  std::list<uint8_t> auxList = m_measConfig.measIdToRemoveList;
4752  std::list<uint8_t>::iterator it = auxList.begin ();
4753  for (; it != auxList.end (); it++)
4754  {
4755  os << (int) *it << ", ";
4756  }
4757  os << std::endl;
4758  }
4759 
4760  os << " haveQuantityConfig: " << m_measConfig.haveQuantityConfig << std::endl;
4761  if (m_measConfig.haveQuantityConfig)
4762  {
4763  os << " filterCoefficientRSRP: " << (int)m_measConfig.quantityConfig.filterCoefficientRSRP << std::endl;
4764  os << " filterCoefficientRSRQ:" << (int)m_measConfig.quantityConfig.filterCoefficientRSRQ << std::endl;
4765  }
4766 
4767  os << " haveMeasGapConfig: " << m_measConfig.haveMeasGapConfig << std::endl;
4768  if (m_measConfig.haveMeasGapConfig)
4769  {
4770  os << " measGapConfig.type: " << m_measConfig.measGapConfig.type << std::endl;
4771  os << " measGapConfig.gap (gap0/1,value): (" << m_measConfig.measGapConfig.gapOffsetChoice
4772  << "," << (int) m_measConfig.measGapConfig.gapOffsetValue << ")" << std::endl;
4773  }
4774 
4775  os << " haveSmeasure: " << m_measConfig.haveSmeasure << std::endl;
4776  if (m_measConfig.haveSmeasure)
4777  {
4778  os << " sMeasure: " << (int) m_measConfig.sMeasure << std::endl;
4779  }
4780 
4781  os << " haveSpeedStatePars: " << m_measConfig.haveSpeedStatePars << std::endl;
4782  if (m_measConfig.haveSpeedStatePars)
4783  {
4784  os << " speedStatePars.type: " << m_measConfig.speedStatePars.type << std::endl;
4785  os << " speedStatePars.mobilityStateParameters.tEvaluation: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.tEvaluation << std::endl;
4786  os << " speedStatePars.mobilityStateParameters.tHystNormal: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.tHystNormal << std::endl;
4787  os << " speedStatePars.mobilityStateParameters.nCellChangeMedium: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.nCellChangeMedium << std::endl;
4788  os << " speedStatePars.mobilityStateParameters.nCellChangeHigh: " << (int)m_measConfig.speedStatePars.mobilityStateParameters.nCellChangeHigh << std::endl;
4789  os << " speedStatePars.timeToTriggerSf.sfMedium: " << (int)m_measConfig.speedStatePars.timeToTriggerSf.sfMedium << std::endl;
4790  os << " speedStatePars.timeToTriggerSf.sfHigh: " << (int)m_measConfig.speedStatePars.timeToTriggerSf.sfHigh << std::endl;
4791  }
4792  }
4793 
4794  os << "haveMobilityControlInfo: " << m_haveMobilityControlInfo << std::endl;
4795  if (m_haveMobilityControlInfo)
4796  {
4797  os << "targetPhysCellId: " << (int)m_mobilityControlInfo.targetPhysCellId << std::endl;
4798  os << "haveCarrierFreq: " << m_mobilityControlInfo.haveCarrierFreq << std::endl;
4799  if (m_mobilityControlInfo.haveCarrierFreq)
4800  {
4801  os << " carrierFreq.dlCarrierFreq: " << (int) m_mobilityControlInfo.carrierFreq.dlCarrierFreq << std::endl;
4802  os << " carrierFreq.dlCarrierFreq: " << (int) m_mobilityControlInfo.carrierFreq.ulCarrierFreq << std::endl;
4803  }
4804  os << "haveCarrierBandwidth: " << m_mobilityControlInfo.haveCarrierBandwidth << std::endl;
4805  if (m_mobilityControlInfo.haveCarrierBandwidth)
4806  {
4807  os << " carrierBandwidth.dlBandwidth: " << (int) m_mobilityControlInfo.carrierBandwidth.dlBandwidth << std::endl;
4808  os << " carrierBandwidth.ulBandwidth: " << (int) m_mobilityControlInfo.carrierBandwidth.ulBandwidth << std::endl;
4809  }
4810  os << "newUeIdentity: " << (int) m_mobilityControlInfo.newUeIdentity << std::endl;
4811  os << "haveRachConfigDedicated: " << m_mobilityControlInfo.haveRachConfigDedicated << std::endl;
4812  if (m_mobilityControlInfo.haveRachConfigDedicated)
4813  {
4814  os << "raPreambleIndex: " << (int) m_mobilityControlInfo.rachConfigDedicated.raPreambleIndex << std::endl;
4815  os << "raPrachMaskIndex: " << (int) m_mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex << std::endl;
4816  }
4817  }
4818  os << "haveRadioResourceConfigDedicated: " << m_haveRadioResourceConfigDedicated << std::endl;
4819  if (m_haveRadioResourceConfigDedicated)
4820  {
4821  RrcAsn1Header::Print (os,m_radioResourceConfigDedicated);
4822  }
4823 }
4824 
4825 void
4827 {
4828  m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
4829  m_haveMeasConfig = msg.haveMeasConfig;
4830  m_measConfig = msg.measConfig;
4831  m_haveMobilityControlInfo = msg.haveMobilityControlInfo;
4832  m_mobilityControlInfo = msg.mobilityControlInfo;
4833  m_haveRadioResourceConfigDedicated = msg.haveRadioResourceConfigDedicated;
4834  m_radioResourceConfigDedicated = msg.radioResourceConfigDedicated;
4835 
4836  m_isDataSerialized = false;
4837 }
4838 
4841 {
4843 
4844  msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier;
4845  msg.haveMeasConfig = m_haveMeasConfig;
4846  msg.measConfig = m_measConfig;
4847  msg.haveMobilityControlInfo = m_haveMobilityControlInfo;
4848  msg.mobilityControlInfo = m_mobilityControlInfo;
4849  msg.haveRadioResourceConfigDedicated = m_haveRadioResourceConfigDedicated;
4850  msg.radioResourceConfigDedicated = m_radioResourceConfigDedicated;
4851 
4852  return msg;
4853 }
4854 
4855 uint8_t
4857 {
4858  return m_rrcTransactionIdentifier;
4859 }
4860 
4861 bool
4863 {
4864  return m_haveMeasConfig;
4865 }
4866 
4869 {
4870  return m_measConfig;
4871 }
4872 
4873 bool
4875 {
4876  return m_haveMobilityControlInfo;
4877 }
4878 
4881 {
4882  return m_mobilityControlInfo;
4883 }
4884 
4885 bool
4887 {
4888  return m_haveRadioResourceConfigDedicated;
4889 }
4890 
4893 {
4894  return m_radioResourceConfigDedicated;
4895 }
4896 
4897 bool
4899 {
4900  return m_radioResourceConfigDedicated.havePhysicalConfigDedicated;
4901 }
4902 
4903 std::list<LteRrcSap::SrbToAddMod>
4905 {
4906  return m_radioResourceConfigDedicated.srbToAddModList;
4907 }
4908 
4909 std::list<LteRrcSap::DrbToAddMod>
4911 {
4912  return m_radioResourceConfigDedicated.drbToAddModList;
4913 }
4914 
4915 std::list<uint8_t>
4917 {
4918  return m_radioResourceConfigDedicated.drbToReleaseList;
4919 }
4920 
4923 {
4924  return m_radioResourceConfigDedicated.physicalConfigDedicated;
4925 }
4926 
4927 
4929 
4930 HandoverPreparationInfoHeader::HandoverPreparationInfoHeader ()
4931 {
4932 }
4933 
4934 void
4936 {
4937  m_serializationResult = Buffer ();
4938 
4939  // Serialize HandoverPreparationInformation sequence:
4940  // no default or optional fields. Extension marker not present.
4941  SerializeSequence (std::bitset<0> (),false);
4942 
4943  // Serialize criticalExtensions choice
4944  // 2 options, selected 0 (c1)
4945  SerializeChoice (2,0,false);
4946 
4947  // Serialize c1 choice
4948  // 8 options, selected 0 (handoverPreparationInformation-r8)
4949  SerializeChoice (8,0,false);
4950 
4951  // Serialize HandoverPreparationInformation-r8-IEs sequence
4952  // 4 optional fields, no extension marker.
4953  std::bitset<4> handoverPrepInfoOpts;
4954  handoverPrepInfoOpts.set (3,1); // as-Config present
4955  handoverPrepInfoOpts.set (2,0); // rrm-Config not present
4956  handoverPrepInfoOpts.set (1,0); // as-Context not present
4957  handoverPrepInfoOpts.set (0,0); // nonCriticalExtension not present
4958  SerializeSequence (handoverPrepInfoOpts,false);
4959 
4960  // Serialize ue-RadioAccessCapabilityInfo
4961  SerializeSequenceOf (0,MAX_RAT_CAPABILITIES,0);
4962 
4963  // Serialize as-Config
4964  SerializeSequence (std::bitset<0> (),true);
4965 
4966  // Serialize sourceMeasConfig
4967  SerializeMeasConfig (m_asConfig.sourceMeasConfig);
4968 
4969  // Serialize sourceRadioResourceConfig
4970  SerializeRadioResourceConfigDedicated (m_asConfig.sourceRadioResourceConfig);
4971 
4972  // Serialize sourceSecurityAlgorithmConfig
4973  SerializeSequence (std::bitset<0> (),false);
4974  // cipheringAlgorithm
4975  SerializeEnum (8,0);
4976  // integrityProtAlgorithm
4977  SerializeEnum (8,0);
4978 
4979  // Serialize sourceUE-Identity
4980  SerializeBitstring (std::bitset<16> (m_asConfig.sourceUeIdentity));
4981 
4982  // Serialize sourceMasterInformationBlock
4983  SerializeSequence (std::bitset<0> (),false);
4984  SerializeEnum (6,m_asConfig.sourceMasterInformationBlock.dlBandwidth); // dl-Bandwidth
4985  SerializeSequence (std::bitset<0> (),false); // phich-Config sequence
4986  SerializeEnum (2,0); // phich-Duration
4987  SerializeEnum (4,0); // phich-Resource
4988  SerializeBitstring (std::bitset<8> (m_asConfig.sourceMasterInformationBlock.systemFrameNumber)); // systemFrameNumber
4989  SerializeBitstring (std::bitset<10> (321)); // spare
4990 
4991  // Serialize sourceSystemInformationBlockType1 sequence
4992  SerializeSystemInformationBlockType1 (m_asConfig.sourceSystemInformationBlockType1);
4993 
4994  // Serialize sourceSystemInformationBlockType2
4995  SerializeSystemInformationBlockType2 (m_asConfig.sourceSystemInformationBlockType2);
4996 
4997  // Serialize AntennaInfoCommon
4998  SerializeSequence (std::bitset<0> (0),false);
4999  SerializeEnum (4,0); // antennaPortsCount
5000 
5001  // Serialize sourceDlCarrierFreq
5002  SerializeInteger (m_asConfig.sourceDlCarrierFreq,0,MAX_EARFCN);
5003 
5004  // Finish serialization
5005  FinalizeSerialization ();
5006 }
5007 
5008 uint32_t
5010 {
5011  std::bitset<0> bitset0;
5012  int n;
5013 
5014  // Deserialize HandoverPreparationInformation sequence
5015  // 0 optional fields, no extension marker
5016  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5017 
5018  // Deserialize criticalExtensions choice
5019  int criticalExtensionsChosen;
5020  bIterator = DeserializeChoice (2,false,&criticalExtensionsChosen,bIterator);
5021 
5022  if (criticalExtensionsChosen == 1)
5023  {
5024  // Deserialize criticalExtensionsFuture
5025  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5026  }
5027  else if (criticalExtensionsChosen == 0)
5028  {
5029  // Deserialize c1 choice
5030  int c1Chosen;
5031  bIterator = DeserializeChoice (8,false,&c1Chosen,bIterator);
5032  if (c1Chosen > 0)
5033  {
5034  bIterator = DeserializeNull (bIterator);
5035  }
5036  else if (c1Chosen == 0)
5037  {
5038  // Deserialize handoverPreparationInformation-r8
5039  std::bitset<4> handoverPrepInfoOpts;
5040  bIterator = DeserializeSequence (&handoverPrepInfoOpts,false,bIterator);
5041 
5042  // Deserialize ue-RadioAccessCapabilityInfo
5043  bIterator = DeserializeSequenceOf (&n,MAX_RAT_CAPABILITIES,0,bIterator);
5044  for (int i = 0; i < n; i++)
5045  {
5046  // Deserialize UE-CapabilityRAT-Container
5047  // ...
5048  }
5049 
5050  if (handoverPrepInfoOpts[3])
5051  {
5052  // Deserialize as-Config sequence
5053  bIterator = DeserializeSequence (&bitset0,true,bIterator);
5054 
5055  // Deserialize sourceMeasConfig
5056  bIterator = DeserializeMeasConfig (&m_asConfig.sourceMeasConfig, bIterator);
5057 
5058  // Deserialize sourceRadioResourceConfig
5059  bIterator = DeserializeRadioResourceConfigDedicated (&m_asConfig.sourceRadioResourceConfig,bIterator);
5060 
5061  // Deserialize sourceSecurityAlgorithmConfig
5062  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5063  bIterator = DeserializeEnum (8,&n,bIterator); // cipheringAlgorithm
5064  bIterator = DeserializeEnum (8,&n,bIterator); // integrityProtAlgorithm
5065 
5066  // Deserialize sourceUE-Identity
5067  std::bitset<16> cRnti;
5068  bIterator = DeserializeBitstring (&cRnti,bIterator);
5069  m_asConfig.sourceUeIdentity = cRnti.to_ulong ();
5070 
5071  // Deserialize sourceMasterInformationBlock
5072  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5073  bIterator = DeserializeEnum (6,&n,bIterator); // dl-Bandwidth
5074  m_asConfig.sourceMasterInformationBlock.dlBandwidth = n;
5075 
5076  // phich-Config
5077  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5078  bIterator = DeserializeEnum (2,&n,bIterator); // phich-Duration
5079  bIterator = DeserializeEnum (4,&n,bIterator); // phich-Resource
5080 
5081  // systemFrameNumber
5082  std::bitset<8> systemFrameNumber;
5083  bIterator = DeserializeBitstring (&systemFrameNumber,bIterator);
5084  m_asConfig.sourceMasterInformationBlock.systemFrameNumber = systemFrameNumber.to_ulong ();
5085  // spare
5086  std::bitset<10> spare;
5087  bIterator = DeserializeBitstring (&spare,bIterator);
5088 
5089  // Deserialize sourceSystemInformationBlockType1
5090  bIterator = DeserializeSystemInformationBlockType1 (&m_asConfig.sourceSystemInformationBlockType1,bIterator);
5091 
5092  // Deserialize sourceSystemInformationBlockType2
5093  bIterator = DeserializeSystemInformationBlockType2 (&m_asConfig.sourceSystemInformationBlockType2,bIterator);
5094 
5095  // Deserialize antennaInfoCommon
5096  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5097  bIterator = DeserializeEnum (4,&n,bIterator); // antennaPortsCount
5098 
5099  // Deserialize sourceDl-CarrierFreq
5100  bIterator = DeserializeInteger (&n,0,MAX_EARFCN,bIterator);
5101  m_asConfig.sourceDlCarrierFreq = n;
5102  }
5103  if (handoverPrepInfoOpts[2])
5104  {
5105  // Deserialize rrm-Config
5106  // ...
5107  }
5108  if (handoverPrepInfoOpts[1])
5109  {
5110  // Deserialize as-Context
5111  // ...
5112  }
5113  if (handoverPrepInfoOpts[0])
5114  {
5115  // Deserialize nonCriticalExtension
5116  // ...
5117  }
5118  }
5119  }
5120 
5121  return GetSerializedSize ();
5122 }
5123 
5124 void
5126 {
5127  RrcAsn1Header::Print (os,m_asConfig.sourceRadioResourceConfig);
5128  os << "sourceUeIdentity: " << m_asConfig.sourceUeIdentity << std::endl;
5129  os << "dlBandwidth: " << (int)m_asConfig.sourceMasterInformationBlock.dlBandwidth << std::endl;
5130  os << "systemFrameNumber: " << (int)m_asConfig.sourceMasterInformationBlock.systemFrameNumber << std::endl;
5131  os << "plmnIdentityInfo.plmnIdentity: " << (int) m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity << std::endl;
5132  os << "cellAccessRelatedInfo.cellIdentity " << (int)m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity << std::endl;
5133  os << "cellAccessRelatedInfo.csgIndication: " << m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication << std::endl;
5134  os << "cellAccessRelatedInfo.csgIdentity: " << (int)m_asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity << std::endl;
5135  os << "sourceDlCarrierFreq: " << m_asConfig.sourceDlCarrierFreq << std::endl;
5136 }
5137 
5138 void
5140 {
5141  m_asConfig = msg.asConfig;
5142  m_isDataSerialized = false;
5143 }
5144 
5147 {
5149  msg.asConfig = m_asConfig;
5150 
5151  return msg;
5152 }
5153 
5156 {
5157  return m_asConfig;
5158 }
5159 
5161 
5162 RrcConnectionReestablishmentRequestHeader::RrcConnectionReestablishmentRequestHeader ()
5163 {
5164 }
5165 
5166 RrcConnectionReestablishmentRequestHeader::~RrcConnectionReestablishmentRequestHeader ()
5167 {
5168 }
5169 
5170 void
5172 {
5173  m_serializationResult = Buffer ();
5174 
5175  SerializeUlCcchMessage (0);
5176 
5177  // Serialize RrcConnectionReestablishmentReques sequence:
5178  // no default or optional fields. Extension marker not present.
5179  SerializeSequence (std::bitset<0> (),false);
5180 
5181  // Serialize criticalExtensions choice
5182  // chosen: rrcConnectionReestablishmentRequest-r8
5183  SerializeChoice (2,0,false);
5184 
5185  // Serialize RRCConnectionReestablishmentRequest-r8-IEs sequence
5186  // no default or optional fields. Extension marker not present.
5187  SerializeSequence (std::bitset<0> (),false);
5188 
5189  // Serialize ue-Identity
5190  SerializeSequence (std::bitset<0> (),false);
5191  // Serialize c-RNTI
5192  SerializeBitstring (std::bitset<16> (m_ueIdentity.cRnti));
5193  // Serialize physCellId
5194  SerializeInteger (m_ueIdentity.physCellId,0,503);
5195  // Serialize shortMAC-I
5196  SerializeBitstring (std::bitset<16> (0));
5197 
5198  // Serialize ReestablishmentCause
5199  switch (m_reestablishmentCause)
5200  {
5201  case LteRrcSap::RECONFIGURATION_FAILURE:
5202  SerializeEnum (4,0);
5203  break;
5204  case LteRrcSap::HANDOVER_FAILURE:
5205  SerializeEnum (4,1);
5206  break;
5207  case LteRrcSap::OTHER_FAILURE:
5208  SerializeEnum (4,2);
5209  break;
5210  default:
5211  SerializeEnum (4,3);
5212  }
5213 
5214  // Serialize spare
5215  SerializeBitstring (std::bitset<2> (0));
5216 
5217  // Finish serialization
5218  FinalizeSerialization ();
5219 }
5220 
5221 uint32_t
5223 {
5224  std::bitset<0> bitset0;
5225  int n;
5226 
5227  bIterator = DeserializeUlCcchMessage (bIterator);
5228 
5229  // Deserialize RrcConnectionReestablishmentRequest sequence
5230  // 0 optional fields, no extension marker
5231  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5232 
5233  // Deserialize criticalExtensions choice
5234  bIterator = DeserializeChoice (2,false,&n,bIterator);
5235  if ( n == 1)
5236  {
5237  // Deserialize criticalExtensionsFuture
5238  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5239  }
5240  else if ( n == 0)
5241  {
5242  // Deserialize RRCConnectionReestablishmentRequest-r8-IEs
5243  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5244 
5245  // Deserialize ReestabUE-Identity sequence
5246  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5247 
5248  // Deserialize c-RNTI
5249  std::bitset<16> cRnti;
5250  bIterator = DeserializeBitstring (&cRnti,bIterator);
5251  m_ueIdentity.cRnti = cRnti.to_ulong ();
5252 
5253  // Deserialize physCellId
5254  int physCellId;
5255  bIterator = DeserializeInteger (&physCellId,0,503,bIterator);
5256  m_ueIdentity.physCellId = physCellId;
5257 
5258  // Deserialize shortMAC-I
5259  std::bitset<16> shortMacI;
5260  bIterator = DeserializeBitstring (&shortMacI,bIterator);
5261 
5262  // Deserialize ReestablishmentCause
5263  int reestCs;
5264  bIterator = DeserializeEnum (4,&reestCs,bIterator);
5265  switch (reestCs)
5266  {
5267  case 0:
5268  m_reestablishmentCause = LteRrcSap::RECONFIGURATION_FAILURE;
5269  break;
5270  case 1:
5271  m_reestablishmentCause = LteRrcSap::HANDOVER_FAILURE;
5272  break;
5273  case 2:
5274  m_reestablishmentCause = LteRrcSap::OTHER_FAILURE;
5275  break;
5276  case 3:
5277  break;
5278  }
5279 
5280  // Deserialize spare
5281  std::bitset<2> spare;
5282  bIterator = DeserializeBitstring (&spare,bIterator);
5283  }
5284 
5285  return GetSerializedSize ();
5286 }
5287 
5288 void
5290 {
5291  os << "ueIdentity.cRnti: " << (int)m_ueIdentity.cRnti << std::endl;
5292  os << "ueIdentity.physCellId: " << (int)m_ueIdentity.physCellId << std::endl;
5293  os << "m_reestablishmentCause: " << m_reestablishmentCause << std::endl;
5294 }
5295 
5296 void
5298 {
5299  m_ueIdentity = msg.ueIdentity;
5300  m_reestablishmentCause = msg.reestablishmentCause;
5301  m_isDataSerialized = false;
5302 }
5303 
5306 {
5308  msg.ueIdentity = m_ueIdentity;
5309  msg.reestablishmentCause = m_reestablishmentCause;
5310 
5311  return msg;
5312 }
5313 
5316 {
5317  return m_ueIdentity;
5318 }
5319 
5320 LteRrcSap::ReestablishmentCause
5322 {
5323  return m_reestablishmentCause;
5324 }
5325 
5327 
5328 RrcConnectionReestablishmentHeader::RrcConnectionReestablishmentHeader ()
5329 {
5330 }
5331 
5332 RrcConnectionReestablishmentHeader::~RrcConnectionReestablishmentHeader ()
5333 {
5334 }
5335 
5336 void
5338 {
5339  m_serializationResult = Buffer ();
5340 
5341  SerializeDlCcchMessage (0);
5342 
5343  // Serialize RrcConnectionReestablishment sequence:
5344  // no default or optional fields. Extension marker not present.
5345  SerializeSequence (std::bitset<0> (),false);
5346 
5347  // Serialize rrc-TransactionIdentifier
5348  SerializeInteger (m_rrcTransactionIdentifier,0,3);
5349 
5350  // Serialize criticalExtensions choice
5351  SerializeChoice (2,0,false);
5352 
5353  // Serialize c1 choice
5354  SerializeChoice (8,0,false);
5355 
5356  // Serialize RRCConnectionReestablishment-r8-IEs sequence
5357  // 1 optional field, no extension marker
5358  SerializeSequence (std::bitset<1> (0),false);
5359 
5360  // Serialize radioResourceConfigDedicated
5361  SerializeRadioResourceConfigDedicated (m_radioResourceConfigDedicated);
5362 
5363  // Serialize nextHopChainingCount
5364  SerializeInteger (0,0,7);
5365 
5366  // Finish serialization
5367  FinalizeSerialization ();
5368 }
5369 
5370 uint32_t
5372 {
5373  std::bitset<0> bitset0;
5374  int n;
5375 
5376  bIterator = DeserializeDlCcchMessage (bIterator);
5377 
5378  // Deserialize RrcConnectionReestablishment sequence
5379  // 0 optional fields, no extension marker
5380  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5381 
5382  // Deserialize rrc-TransactionIdentifier
5383  bIterator = DeserializeInteger (&n,0,3,bIterator);
5384  m_rrcTransactionIdentifier = n;
5385 
5386  // Deserialize criticalExtensions choice
5387  int criticalExtensionsChoice;
5388  bIterator = DeserializeChoice (2,false,&criticalExtensionsChoice,bIterator);
5389  if (criticalExtensionsChoice == 1)
5390  {
5391  // Deserialize criticalExtensionsFuture
5392  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5393  }
5394  else if (criticalExtensionsChoice == 0)
5395  {
5396  // Deserialize c1
5397  int c1;
5398  bIterator = DeserializeChoice (8,false,&c1,bIterator);
5399  if (c1 > 0)
5400  {
5401  bIterator = DeserializeNull (bIterator);
5402  }
5403  else if (c1 == 0)
5404  {
5405  // Deserialize rrcConnectionReestablishment-r8
5406  // 1 optional field
5407  std::bitset<1> nonCriticalExtensionPresent;
5408  bIterator = DeserializeSequence (&nonCriticalExtensionPresent,false,bIterator);
5409 
5410  // Deserialize RadioResourceConfigDedicated
5411  bIterator = DeserializeRadioResourceConfigDedicated (&m_radioResourceConfigDedicated,bIterator);
5412 
5413  // Deserialize nextHopChainingCount
5414  bIterator = DeserializeInteger (&n,0,7,bIterator);
5415  }
5416  }
5417 
5418  return GetSerializedSize ();
5419 }
5420 
5421 void
5423 {
5424  os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
5425  os << "RadioResourceConfigDedicated: " << std::endl;
5426  RrcAsn1Header::Print (os,m_radioResourceConfigDedicated);
5427 }
5428 
5429 void
5431 {
5432  m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
5433  m_radioResourceConfigDedicated = msg.radioResourceConfigDedicated;
5434  m_isDataSerialized = false;
5435 }
5436 
5439 {
5441  msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier;
5442  msg.radioResourceConfigDedicated = m_radioResourceConfigDedicated;
5443  return msg;
5444 }
5445 
5446 uint8_t
5448 {
5449  return m_rrcTransactionIdentifier;
5450 }
5451 
5454 {
5455  return m_radioResourceConfigDedicated;
5456 }
5457 
5459 
5460 RrcConnectionReestablishmentCompleteHeader::RrcConnectionReestablishmentCompleteHeader ()
5461 {
5462 }
5463 
5464 void
5466 {
5467  m_serializationResult = Buffer ();
5468 
5469  // Serialize DCCH message
5470  SerializeUlDcchMessage (3);
5471 
5472  // Serialize RrcConnectionReestablishmentComplete sequence:
5473  // no default or optional fields. Extension marker not present.
5474  SerializeSequence (std::bitset<0> (),false);
5475 
5476  // Serialize rrc-TransactionIdentifier
5477  SerializeInteger (m_rrcTransactionIdentifier,0,3);
5478 
5479  // Serialize criticalExtensions choice
5480  SerializeChoice (2,0,false);
5481 
5482  // Serialize rrcConnectionReestablishmentComplete-r8 sequence
5483  // 1 optional field (not present), no extension marker.
5484  SerializeSequence (std::bitset<1> (0),false);
5485 
5486  // Finish serialization
5487  FinalizeSerialization ();
5488 }
5489 
5490 uint32_t
5492 {
5493  std::bitset<0> bitset0;
5494  int n;
5495 
5496  bIterator = DeserializeUlDcchMessage (bIterator);
5497 
5498  // Deserialize RrcConnectionReestablishmentComplete sequence
5499  // 0 optional fields, no extension marker
5500  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5501 
5502  // Deserialize rrc-TransactionIdentifier
5503  bIterator = DeserializeInteger (&n,0,3,bIterator);
5504  m_rrcTransactionIdentifier = n;
5505 
5506  // Deserialize criticalExtensions choice
5507  int criticalExtensionsChoice;
5508  bIterator = DeserializeChoice (2,false,&criticalExtensionsChoice,bIterator);
5509  if (criticalExtensionsChoice == 1)
5510  {
5511  // Deserialize criticalExtensionsFuture
5512  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5513  }
5514  else if (criticalExtensionsChoice == 0)
5515  {
5516  // Deserialize rrcConnectionReestablishmentComplete-r8
5517  std::bitset<1> opts;
5518  bIterator = DeserializeSequence (&opts,false,bIterator);
5519  if (opts[0])
5520  {
5521  // Deserialize RRCConnectionReestablishmentComplete-v920-IEs
5522  // ...
5523  }
5524  }
5525 
5526  return GetSerializedSize ();
5527 }
5528 
5529 void
5531 {
5532  os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl;
5533 }
5534 
5535 void
5537 {
5538  m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
5539  m_isDataSerialized = false;
5540 }
5541 
5544 {
5546  msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier;
5547  return msg;
5548 }
5549 
5550 uint8_t
5552 {
5553  return m_rrcTransactionIdentifier;
5554 }
5555 
5557 
5558 RrcConnectionReestablishmentRejectHeader::RrcConnectionReestablishmentRejectHeader ()
5559 {
5560 }
5561 
5562 RrcConnectionReestablishmentRejectHeader::~RrcConnectionReestablishmentRejectHeader ()
5563 {
5564 }
5565 
5566 void
5568 {
5569  m_serializationResult = Buffer ();
5570 
5571  // Serialize CCCH message
5572  SerializeDlCcchMessage (1);
5573 
5574  // Serialize RrcConnectionReestablishmentReject sequence:
5575  // no default or optional fields. Extension marker not present.
5576  SerializeSequence (std::bitset<0> (),false);
5577 
5578  // Serialize criticalExtensions choice
5579  SerializeChoice (2,0,false);
5580 
5581  // Serialize RRCConnectionReestablishmentReject-r8-IEs sequence
5582  // 1 optional field (not present), no extension marker.
5583  SerializeSequence (std::bitset<1> (0),false);
5584 
5585  // Finish serialization
5586  FinalizeSerialization ();
5587 }
5588 
5589 uint32_t
5591 {
5592  std::bitset<0> bitset0;
5593 
5594  bIterator = DeserializeDlCcchMessage (bIterator);
5595 
5596  // Deserialize RrcConnectionReestablishmentReject sequence
5597  // 0 optional fields, no extension marker
5598  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5599 
5600  // Deserialize criticalExtensions choice
5601  int criticalExtensionsChoice;
5602  bIterator = DeserializeChoice (2,false,&criticalExtensionsChoice,bIterator);
5603  if (criticalExtensionsChoice == 1)
5604  {
5605  // Deserialize criticalExtensionsFuture
5606  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5607  }
5608  else if (criticalExtensionsChoice == 0)
5609  {
5610  // Deserialize rrcConnectionReestablishmentReject-r8
5611  std::bitset<1> opts;
5612  bIterator = DeserializeSequence (&opts,false,bIterator);
5613  if (opts[0])
5614  {
5615  // Deserialize RRCConnectionReestablishmentReject-v8a0-IEs
5616  // ...
5617  }
5618  }
5619 
5620  return GetSerializedSize ();
5621 }
5622 
5623 void
5625 {
5626 }
5627 
5628 void
5630 {
5631  m_rrcConnectionReestablishmentReject = msg;
5632  m_isDataSerialized = false;
5633 }
5634 
5637 {
5638  return m_rrcConnectionReestablishmentReject;
5639 }
5640 
5642 
5643 RrcConnectionReleaseHeader::RrcConnectionReleaseHeader ()
5644 {
5645 }
5646 
5647 RrcConnectionReleaseHeader::~RrcConnectionReleaseHeader ()
5648 {
5649 }
5650 
5651 void
5653 {
5654  m_serializationResult = Buffer ();
5655 
5656  // Serialize DCCH message
5657  SerializeDlDcchMessage (5);
5658 
5659  // Serialize RrcConnectionRelease sequence:
5660  // no default or optional fields. Extension marker not present.
5661  SerializeSequence (std::bitset<0> (),false);
5662 
5663  // Serialize rrc-TransactionIdentifier
5664  SerializeInteger (m_rrcConnectionRelease.rrcTransactionIdentifier,0,3);
5665 
5666  // Serialize criticalExtensions choice
5667  SerializeChoice (2,0,false);
5668 
5669  // Serialize c1 choice
5670  SerializeChoice (4,0,false);
5671 
5672  // Serialize RRCConnectionRelease-r8-IEs sequence
5673  // 3 optional field (not present), no extension marker.
5674  SerializeSequence (std::bitset<3> (0),false);
5675 
5676  // Serialize ReleaseCause
5677  SerializeEnum (4,1);
5678 
5679  // Finish serialization
5680  FinalizeSerialization ();
5681 }
5682 
5683 uint32_t
5685 {
5686  std::bitset<0> bitset0;
5687  int n;
5688 
5689  bIterator = DeserializeDlDcchMessage (bIterator);
5690 
5691  // Deserialize RrcConnectionRelease sequence
5692  // 0 optional fields, no extension marker
5693  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5694 
5695  // Deserialize rrc-TransactionIdentifier
5696  bIterator = DeserializeInteger (&n,0,3,bIterator);
5697  m_rrcConnectionRelease.rrcTransactionIdentifier = n;
5698 
5699  // Deserialize criticalExtensions choice
5700  int criticalExtensionsChoice;
5701  bIterator = DeserializeChoice (2,false,&criticalExtensionsChoice,bIterator);
5702  if (criticalExtensionsChoice == 1)
5703  {
5704  // Deserialize criticalExtensionsFuture
5705  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5706  }
5707  else if (criticalExtensionsChoice == 0)
5708  {
5709  // Deserialize c1
5710  int c1Choice;
5711  bIterator = DeserializeChoice (4,false,&c1Choice,bIterator);
5712 
5713  if (c1Choice == 0)
5714  {
5715  // Deserialize RRCConnectionRelease-r8-IEs
5716  std::bitset<3> opts;
5717  bIterator = DeserializeSequence (&opts,false,bIterator);
5718 
5719  // Deserialize releaseCause
5720  bIterator = DeserializeEnum (4,&n,bIterator);
5721 
5722  if (opts[2])
5723  {
5724  // Deserialize redirectedCarrierInfo
5725  // ...
5726  }
5727  if (opts[1])
5728  {
5729  // Deserialize idleModeMobilityControlInfo
5730  // ...
5731  }
5732  if (opts[0])
5733  {
5734  // Deserialize nonCriticalExtension
5735  // ...
5736  }
5737  }
5738 
5739  else
5740  {
5741  bIterator = DeserializeNull (bIterator);
5742  }
5743  }
5744 
5745  return GetSerializedSize ();
5746 }
5747 
5748 void
5749 RrcConnectionReleaseHeader::Print (std::ostream &os) const
5750 {
5751 }
5752 
5753 void
5755 {
5756  m_rrcConnectionRelease = msg;
5757  m_isDataSerialized = false;
5758 }
5759 
5762 {
5763  return m_rrcConnectionRelease;
5764 }
5765 
5767 
5768 RrcConnectionRejectHeader::RrcConnectionRejectHeader ()
5769 {
5770 }
5771 
5772 RrcConnectionRejectHeader::~RrcConnectionRejectHeader ()
5773 {
5774 }
5775 
5776 void
5778 {
5779  m_serializationResult = Buffer ();
5780 
5781  // Serialize CCCH message
5782  SerializeDlCcchMessage (2);
5783 
5784  // Serialize RrcConnectionReject sequence:
5785  // no default or optional fields. Extension marker not present.
5786  SerializeSequence (std::bitset<0> (),false);
5787 
5788  // Serialize criticalExtensions choice
5789  SerializeChoice (2,0,false);
5790 
5791  // Serialize c1 choice
5792  SerializeChoice (4,0,false);
5793 
5794  // Serialize rrcConnectionReject-r8 sequence
5795  // 1 optional field (not present), no extension marker.
5796  SerializeSequence (std::bitset<1> (0),false);
5797 
5798  // Serialize waitTime
5799  SerializeInteger (m_rrcConnectionReject.waitTime, 1, 16);
5800 
5801  // Finish serialization
5802  FinalizeSerialization ();
5803 }
5804 
5805 uint32_t
5807 {
5808  std::bitset<0> bitset0;
5809  int n;
5810 
5811  bIterator = DeserializeDlCcchMessage (bIterator);
5812 
5813  // Deserialize RrcConnectionReject sequence
5814  // 0 optional fields, no extension marker
5815  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5816 
5817  // Deserialize criticalExtensions choice
5818  int criticalExtensionsChoice;
5819  bIterator = DeserializeChoice (2,false,&criticalExtensionsChoice,bIterator);
5820  if (criticalExtensionsChoice == 1)
5821  {
5822  // Deserialize criticalExtensionsFuture
5823  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5824  }
5825  else if (criticalExtensionsChoice == 0)
5826  {
5827  // Deserialize c1 choice
5828  int c1Choice;
5829  bIterator = DeserializeChoice (4,false,&c1Choice,bIterator);
5830 
5831  if (c1Choice > 0)
5832  {
5833  bIterator = DeserializeNull (bIterator);
5834  }
5835  else if (c1Choice == 0)
5836  {
5837  // Deserialize rrcConnectionReject-r8
5838  std::bitset<1> opts;
5839  bIterator = DeserializeSequence (&opts,false,bIterator);
5840 
5841  bIterator = DeserializeInteger (&n,1,16,bIterator);
5842  m_rrcConnectionReject.waitTime = n;
5843 
5844  if (opts[0])
5845  {
5846  // Deserialize RRCConnectionReject-v8a0-IEs
5847  // ...
5848  }
5849  }
5850  }
5851 
5852  return GetSerializedSize ();
5853 }
5854 
5855 void
5856 RrcConnectionRejectHeader::Print (std::ostream &os) const
5857 {
5858  os << "wait time: " << (int)m_rrcConnectionReject.waitTime << std::endl;
5859 }
5860 
5861 void
5863 {
5864  m_rrcConnectionReject = msg;
5865  m_isDataSerialized = false;
5866 }
5867 
5870 {
5871  return m_rrcConnectionReject;
5872 }
5873 
5875 
5876 MeasurementReportHeader::MeasurementReportHeader ()
5877 {
5878 }
5879 
5880 MeasurementReportHeader::~MeasurementReportHeader ()
5881 {
5882 }
5883 
5884 void
5886 {
5887  m_serializationResult = Buffer ();
5888 
5889  // Serialize DCCH message
5890  SerializeUlDcchMessage (1);
5891 
5892  // Serialize MeasurementReport sequence:
5893  // no default or optional fields. Extension marker not present.
5894  SerializeSequence (std::bitset<0> (),false);
5895 
5896  // Serialize criticalExtensions choice:
5897  // c1 chosen
5898  SerializeChoice (2,0,false);
5899 
5900  // Serialize c1 choice
5901  // measurementReport-r8 chosen
5902  SerializeChoice (8,0,false);
5903 
5904  // Serialize MeasurementReport-r8-IEs sequence:
5905  // 1 optional fields, not present. Extension marker not present.
5906  SerializeSequence (std::bitset<1> (0),false);
5907 
5908  // Serialize measResults
5909  SerializeMeasResults (m_measurementReport.measResults);
5910 
5911  // Finish serialization
5912  FinalizeSerialization ();
5913 }
5914 
5915 uint32_t
5917 {
5918  std::bitset<0> bitset0;
5919 
5920  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5921 
5922  bIterator = DeserializeUlDcchMessage (bIterator);
5923 
5924  int criticalExtensionsChoice;
5925  bIterator = DeserializeChoice (2,false,&criticalExtensionsChoice,bIterator);
5926 
5927  if (criticalExtensionsChoice == 1)
5928  {
5929  // Deserialize criticalExtensionsFuture
5930  bIterator = DeserializeSequence (&bitset0,false,bIterator);
5931  }
5932  else if (criticalExtensionsChoice == 0)
5933  {
5934  // Deserialize c1
5935  int c1Choice;
5936  bIterator = DeserializeChoice (8,false,&c1Choice,bIterator);
5937 
5938  if (c1Choice > 0)
5939  {
5940  bIterator = DeserializeNull (bIterator);
5941  }
5942  else
5943  {
5944  // Deserialize measurementReport-r8
5945  std::bitset<1> isNonCriticalExtensionPresent;
5946  bIterator = DeserializeSequence (&isNonCriticalExtensionPresent,false,bIterator);
5947 
5948  // Deserialize measResults
5949  bIterator = DeserializeMeasResults (&m_measurementReport.measResults, bIterator);
5950 
5951  if (isNonCriticalExtensionPresent[0])
5952  {
5953  // Deserialize nonCriticalExtension MeasurementReport-v8a0-IEs
5954  // ...
5955  }
5956 
5957  }
5958  }
5959 
5960  return GetSerializedSize ();
5961 }
5962 
5963 void
5964 MeasurementReportHeader::Print (std::ostream &os) const
5965 {
5966  os << "measId = " << (int)m_measurementReport.measResults.measId << std::endl;
5967  os << "rsrpResult = " << (int)m_measurementReport.measResults.rsrpResult << std::endl;
5968  os << "rsrqResult = " << (int)m_measurementReport.measResults.rsrqResult << std::endl;
5969  os << "haveMeasResultNeighCells = " << (int)m_measurementReport.measResults.haveMeasResultNeighCells << std::endl;
5970 
5971  if (m_measurementReport.measResults.haveMeasResultNeighCells)
5972  {
5973  std::list<LteRrcSap::MeasResultEutra> measResultListEutra = m_measurementReport.measResults.measResultListEutra;
5974  std::list<LteRrcSap::MeasResultEutra>::iterator it = measResultListEutra.begin ();
5975  for (; it != measResultListEutra.end (); it++)
5976  {
5977  os << " physCellId =" << (int) it->physCellId << std::endl;
5978  os << " haveCgiInfo =" << it->haveCgiInfo << std::endl;
5979  if (it->haveCgiInfo)
5980  {
5981  os << " plmnIdentity = " << (int) it->cgiInfo.plmnIdentity << std::endl;
5982  os << " cellIdentity = " << (int) it->cgiInfo.cellIdentity << std::endl;
5983  os << " trackingAreaCode = " << (int) it->cgiInfo.trackingAreaCode << std::endl;
5984  os << " havePlmnIdentityList = " << !it->cgiInfo.plmnIdentityList.empty () << std::endl;
5985  if (!it->cgiInfo.plmnIdentityList.empty ())
5986  {
5987  for (std::list<uint32_t>::iterator it2 = it->cgiInfo.plmnIdentityList.begin (); it2 != it->cgiInfo.plmnIdentityList.begin (); it2++)
5988  {
5989  os << " plmnId : " << *it2 << std::endl;
5990  }
5991  }
5992  }
5993 
5994  os << " haveRsrpResult =" << it->haveRsrpResult << std::endl;
5995  if (it->haveRsrpResult)
5996  {
5997  os << " rsrpResult =" << (int) it->rsrpResult << std::endl;
5998  }
5999 
6000  os << " haveRsrqResult =" << it->haveRsrqResult << std::endl;
6001  if (it->haveRsrqResult)
6002  {
6003  os << " rsrqResult =" << (int) it->rsrqResult << std::endl;
6004  }
6005 
6006  }
6007  }
6008 }
6009 
6010 void
6012 {
6013  m_measurementReport = msg;
6014  m_isDataSerialized = false;
6015 }
6016 
6019 {
6021  msg = m_measurementReport;
6022  return msg;
6023 }
6024 
6026 RrcUlDcchMessage::RrcUlDcchMessage () : RrcAsn1Header ()
6027 {
6028 }
6029 
6030 RrcUlDcchMessage::~RrcUlDcchMessage ()
6031 {
6032 }
6033 
6034 uint32_t
6036 {
6037  DeserializeUlDcchMessage (bIterator);
6038  return 1;
6039 }
6040 
6041 void
6042 RrcUlDcchMessage::Print (std::ostream &os) const
6043 {
6044  std::cout << "UL DCCH MSG TYPE: " << m_messageType << std::endl;
6045 }
6046 
6047 void
6049 {
6050  SerializeUlDcchMessage (m_messageType);
6051 }
6052 
6054 RrcUlDcchMessage::DeserializeUlDcchMessage (Buffer::Iterator bIterator)
6055 {
6056  std::bitset<0> bitset0;
6057  int n;
6058 
6059  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6060  bIterator = DeserializeChoice (2,false,&n,bIterator);
6061  if (n == 1)
6062  {
6063  // Deserialize messageClassExtension
6064  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6065  m_messageType = -1;
6066  }
6067  else if (n == 0)
6068  {
6069  // Deserialize c1
6070  bIterator = DeserializeChoice (16,false,&m_messageType,bIterator);
6071  }
6072 
6073  return bIterator;
6074 }
6075 
6076 void
6077 RrcUlDcchMessage::SerializeUlDcchMessage (int messageType) const
6078 {
6079  SerializeSequence (std::bitset<0> (),false);
6080  // Choose c1
6081  SerializeChoice (2,0,false);
6082  // Choose message type
6083  SerializeChoice (16,messageType,false);
6084 }
6085 
6087 RrcDlDcchMessage::RrcDlDcchMessage () : RrcAsn1Header ()
6088 {
6089 }
6090 
6091 RrcDlDcchMessage::~RrcDlDcchMessage ()
6092 {
6093 }
6094 
6095 uint32_t
6097 {
6098  DeserializeDlDcchMessage (bIterator);
6099  return 1;
6100 }
6101 
6102 void
6103 RrcDlDcchMessage::Print (std::ostream &os) const
6104 {
6105  std::cout << "DL DCCH MSG TYPE: " << m_messageType << std::endl;
6106 }
6107 
6108 void
6110 {
6111  SerializeDlDcchMessage (m_messageType);
6112 }
6113 
6115 RrcDlDcchMessage::DeserializeDlDcchMessage (Buffer::Iterator bIterator)
6116 {
6117  std::bitset<0> bitset0;
6118  int n;
6119 
6120  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6121  bIterator = DeserializeChoice (2,false,&n,bIterator);
6122  if (n == 1)
6123  {
6124  // Deserialize messageClassExtension
6125  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6126  m_messageType = -1;
6127  }
6128  else if (n == 0)
6129  {
6130  // Deserialize c1
6131  bIterator = DeserializeChoice (16,false,&m_messageType,bIterator);
6132  }
6133 
6134  return bIterator;
6135 }
6136 
6137 void
6138 RrcDlDcchMessage::SerializeDlDcchMessage (int messageType) const
6139 {
6140  SerializeSequence (std::bitset<0> (),false);
6141  // Choose c1
6142  SerializeChoice (2,0,false);
6143  // Choose message type
6144  SerializeChoice (16,messageType,false);
6145 }
6146 
6148 RrcUlCcchMessage::RrcUlCcchMessage () : RrcAsn1Header ()
6149 {
6150 }
6151 
6152 RrcUlCcchMessage::~RrcUlCcchMessage ()
6153 {
6154 }
6155 
6156 uint32_t
6158 {
6159  DeserializeUlCcchMessage (bIterator);
6160  return 1;
6161 }
6162 
6163 void
6164 RrcUlCcchMessage::Print (std::ostream &os) const
6165 {
6166  std::cout << "UL CCCH MSG TYPE: " << m_messageType << std::endl;
6167 }
6168 
6169 void
6171 {
6172  SerializeUlCcchMessage (m_messageType);
6173 }
6174 
6176 RrcUlCcchMessage::DeserializeUlCcchMessage (Buffer::Iterator bIterator)
6177 {
6178  std::bitset<0> bitset0;
6179  int n;
6180 
6181  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6182  bIterator = DeserializeChoice (2,false,&n,bIterator);
6183  if (n == 1)
6184  {
6185  // Deserialize messageClassExtension
6186  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6187  m_messageType = -1;
6188  }
6189  else if (n == 0)
6190  {
6191  // Deserialize c1
6192  bIterator = DeserializeChoice (2,false,&m_messageType,bIterator);
6193  }
6194 
6195  return bIterator;
6196 }
6197 
6198 void
6199 RrcUlCcchMessage::SerializeUlCcchMessage (int messageType) const
6200 {
6201  SerializeSequence (std::bitset<0> (),false);
6202  // Choose c1
6203  SerializeChoice (2,0,false);
6204  // Choose message type
6205  SerializeChoice (2,messageType,false);
6206 }
6207 
6209 RrcDlCcchMessage::RrcDlCcchMessage () : RrcAsn1Header ()
6210 {
6211 }
6212 
6213 RrcDlCcchMessage::~RrcDlCcchMessage ()
6214 {
6215 }
6216 
6217 uint32_t
6219 {
6220  DeserializeDlCcchMessage (bIterator);
6221  return 1;
6222 }
6223 
6224 void
6225 RrcDlCcchMessage::Print (std::ostream &os) const
6226 {
6227  std::cout << "DL CCCH MSG TYPE: " << m_messageType << std::endl;
6228 }
6229 
6230 void
6232 {
6233  SerializeDlCcchMessage (m_messageType);
6234 }
6235 
6237 RrcDlCcchMessage::DeserializeDlCcchMessage (Buffer::Iterator bIterator)
6238 {
6239  std::bitset<0> bitset0;
6240  int n;
6241 
6242  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6243  bIterator = DeserializeChoice (2,false,&n,bIterator);
6244  if (n == 1)
6245  {
6246  // Deserialize messageClassExtension
6247  bIterator = DeserializeSequence (&bitset0,false,bIterator);
6248  m_messageType = -1;
6249  }
6250  else if (n == 0)
6251  {
6252  // Deserialize c1
6253  bIterator = DeserializeChoice (4,false,&m_messageType,bIterator);
6254  }
6255 
6256  return bIterator;
6257 }
6258 
6259 void
6260 RrcDlCcchMessage::SerializeDlCcchMessage (int messageType) const
6261 {
6262  SerializeSequence (std::bitset<0> (),false);
6263  // Choose c1
6264  SerializeChoice (2,0,false);
6265  // Choose message type
6266  SerializeChoice (4,messageType,false);
6267 }
6268 
6269 } // namespace ns3
6270 
LteRrcSap::ReestablishmentCause GetReestablishmentCause() const
void Print(std::ostream &os) const
uint32_t Deserialize(Buffer::Iterator bIterator)
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigDedicated()
automatically resized byte buffer
Definition: buffer.h:92
void SetMessage(LteRrcSap::RrcConnectionRequest msg)
void SetMessage(LteRrcSap::RrcConnectionSetupCompleted msg)
std::list< uint8_t > GetDrbToReleaseList() const
void SetMessage(LteRrcSap::RrcConnectionReestablishmentRequest msg)
uint8_t GetRrcTransactionIdentifier() const
uint32_t Deserialize(Buffer::Iterator bIterator)
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
void Print(std::ostream &os) const
uint32_t Deserialize(Buffer::Iterator bIterator)
void SetMessage(LteRrcSap::RrcConnectionReestablishmentComplete msg)
void SetMessage(LteRrcSap::RrcConnectionReestablishment msg)
std::list< LteRrcSap::SrbToAddMod > GetSrbToAddModList() const
LteRrcSap::RrcConnectionReestablishment GetMessage() const
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RrcConnectionRelease GetMessage() const
LteRrcSap::RrcConnectionReestablishmentRequest GetMessage() const
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::HandoverPreparationInfo GetMessage() const
iterator in a Buffer instance
Definition: buffer.h:98
virtual TypeId GetInstanceTypeId(void) const
void SetMessage(LteRrcSap::RrcConnectionRelease msg)
uint32_t Deserialize(Buffer::Iterator bIterator)
void Print(std::ostream &os) const
void SetMessage(LteRrcSap::RrcConnectionReestablishmentReject msg)
uint32_t Deserialize(Buffer::Iterator bIterator)
std::list< LteRrcSap::DrbToAddMod > GetDrbToAddModList() const
uint32_t GetSerializedSize(void) const
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RrcConnectionReestablishmentReject GetMessage() const
void Print(std::ostream &os) const
void SetMessage(LteRrcSap::RrcConnectionReject msg)
void Print(std::ostream &os) const
uint32_t Deserialize(Buffer::Iterator bIterator)
void Print(std::ostream &os) const
LteRrcSap::PhysicalConfigDedicated GetPhysicalConfigDedicated() const
LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigDedicated() const
void PreSerialize() const
void PreSerialize() const
void SetMessage(LteRrcSap::MeasurementReport msg)
void Print(std::ostream &os) const
void SetMessage(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RrcConnectionRequest GetMessage() const
void Print(std::ostream &os) const
void Print(std::ostream &os) const
uint32_t Deserialize(Buffer::Iterator bIterator)
void Print(std::ostream &os) const
std::list< uint8_t > GetDrbToReleaseList() const
LteRrcSap::MeasurementReport GetMessage() const
void PreSerialize() const
LteRrcSap::RrcConnectionSetup GetMessage() const
void PreSerialize() const
void SetMessage(LteRrcSap::HandoverPreparationInfo msg)
LteRrcSap::AsConfig GetAsConfig() const
std::list< LteRrcSap::DrbToAddMod > GetDrbToAddModList() const
LteRrcSap::RrcConnectionReconfigurationCompleted GetMessage() const
LteRrcSap::ReestabUeIdentity GetUeIdentity() const
LteRrcSap::RrcConnectionReconfiguration GetMessage() const
void SetMessage(LteRrcSap::RrcConnectionSetup msg)
uint32_t Deserialize(Buffer::Iterator bIterator)
void Print(std::ostream &os) const
int m_messageType
Stores RRC message type, according to 3GPP TS 36.331.
LteRrcSap::PhysicalConfigDedicated GetPhysicalConfigDedicated() const
void Print(std::ostream &os) const
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RrcConnectionReestablishmentComplete GetMessage() const
void SetMessage(LteRrcSap::RrcConnectionReconfiguration msg)
void Print(std::ostream &os) const
void Print(std::ostream &os, LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const
LteRrcSap::RadioResourceConfigDedicated GetRadioResourceConfigDedicated() const
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RrcConnectionReject GetMessage() const
LteRrcSap::MobilityControlInfo GetMobilityControlInfo()
uint32_t Deserialize(Buffer::Iterator bIterator)
LteRrcSap::RrcConnectionSetupCompleted GetMessage() const
std::bitset< 32 > GetMtmsi() const
std::list< LteRrcSap::SrbToAddMod > GetSrbToAddModList() const
std::bitset< 8 > GetMmec() const
uint32_t Deserialize(Buffer::Iterator bIterator)