lte: (fixes #2754) Incorrect arguments passed to Asn1Header::SerializeInteger
(partial patch provided by A.Krotov)
This commit is contained in:
@@ -38,6 +38,7 @@ Bugs fixed
|
||||
- Bug 2505 - network: Avoid asserts in Header/Trailer deserialization
|
||||
- Bug 2656 - wifi: Minstrel and MinstrelHt provide different results for 802.11a/b/g
|
||||
- Bug 2653 - tcp: Avoid saving smaller TS in case of packet reordering
|
||||
- Bug 2754 - lte: Incorrect arguments passed to Asn1Header::SerializeInteger
|
||||
- Bug 2764 - wifi: WifiSpectrumModelId doesn't distinguish 11ax from legacy
|
||||
- Bug 2766 - core: Modify logging for int64x64 to avoid stack overflow
|
||||
- Bug 2768 - lte: LteUeNetDevice has a null MAC address
|
||||
|
||||
@@ -321,13 +321,8 @@ void Asn1Header::SerializeChoice (int numOptions, int selectedOption, bool isExt
|
||||
|
||||
void Asn1Header::SerializeInteger (int n, int nmin, int nmax) const
|
||||
{
|
||||
// Misusage check: Ensure nmax>nmin ...
|
||||
if (nmin > nmax)
|
||||
{
|
||||
int aux = nmin;
|
||||
nmin = nmax;
|
||||
nmax = aux;
|
||||
}
|
||||
NS_ASSERT_MSG (nmin <= n && n <= nmax,
|
||||
"Integer " << n << " is outside range [" << nmin << ", " << nmax << "]");
|
||||
|
||||
// Clause 11.5.3 ITU-T X.691
|
||||
int range = nmax - nmin + 1;
|
||||
|
||||
@@ -235,7 +235,7 @@ UeManager::DoInitialize ()
|
||||
m_srb1->m_rlc = rlc;
|
||||
m_srb1->m_pdcp = pdcp;
|
||||
m_srb1->m_srbIdentity = 1;
|
||||
m_srb1->m_logicalChannelConfig.priority = 0;
|
||||
m_srb1->m_logicalChannelConfig.priority = 1;
|
||||
m_srb1->m_logicalChannelConfig.prioritizedBitRateKbps = 100;
|
||||
m_srb1->m_logicalChannelConfig.bucketSizeDurationMs = 100;
|
||||
m_srb1->m_logicalChannelConfig.logicalChannelGroup = 0;
|
||||
@@ -1310,7 +1310,9 @@ UeManager::BuildRadioResourceConfigDedicated ()
|
||||
uint8_t
|
||||
UeManager::GetNewRrcTransactionIdentifier ()
|
||||
{
|
||||
return ++m_lastRrcTransactionIdentifier;
|
||||
++m_lastRrcTransactionIdentifier;
|
||||
m_lastRrcTransactionIdentifier %= 4;
|
||||
return m_lastRrcTransactionIdentifier;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
|
||||
@@ -45,6 +45,7 @@ namespace ns3 {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("RrcHeader");
|
||||
|
||||
|
||||
//////////////////// RrcAsn1Header class ///////////////////////////////
|
||||
RrcAsn1Header::RrcAsn1Header ()
|
||||
{
|
||||
@@ -72,6 +73,42 @@ RrcAsn1Header::GetMessageType ()
|
||||
return m_messageType;
|
||||
}
|
||||
|
||||
int
|
||||
RrcAsn1Header::BandwidthToEnum (uint8_t bandwidth) const
|
||||
{
|
||||
int n;
|
||||
switch (bandwidth)
|
||||
{
|
||||
case 6: n = 0; break;
|
||||
case 15: n = 1; break;
|
||||
case 25: n = 2; break;
|
||||
case 50: n = 3; break;
|
||||
case 75: n = 4; break;
|
||||
case 100: n = 5; break;
|
||||
default:
|
||||
NS_FATAL_ERROR ("Wrong bandwidth: " << (uint16_t) bandwidth);
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
RrcAsn1Header::EnumToBandwidth (int n) const
|
||||
{
|
||||
uint8_t bw;
|
||||
switch (n)
|
||||
{
|
||||
case 0: bw = 6; break;
|
||||
case 1: bw = 15; break;
|
||||
case 2: bw = 25; break;
|
||||
case 3: bw = 50; break;
|
||||
case 4: bw = 75; break;
|
||||
case 5: bw = 100; break;
|
||||
default:
|
||||
NS_FATAL_ERROR ("Wrong enum value for bandwidth: " << n);
|
||||
}
|
||||
return bw;
|
||||
}
|
||||
|
||||
void
|
||||
RrcAsn1Header::SerializeDrbToAddModList (std::list<LteRrcSap::DrbToAddMod> drbToAddModList) const
|
||||
{
|
||||
@@ -565,7 +602,7 @@ RrcAsn1Header::SerializeRadioResourceConfigCommonSib (LteRrcSap::RadioResourceCo
|
||||
SerializeSequence (std::bitset<0> (0),false);
|
||||
SerializeInteger (0,-126,24); // p0-NominalPUSCH
|
||||
SerializeEnum (8,0); // alpha
|
||||
SerializeInteger (-50,-127,-96); // p0-NominalPUCCH
|
||||
SerializeInteger (-110,-127,-96); // p0-NominalPUCCH
|
||||
SerializeSequence (std::bitset<0> (0),false); // deltaFList-PUCCH
|
||||
SerializeEnum (3,0); // deltaF-PUCCH-Format1
|
||||
SerializeEnum (3,0); // deltaF-PUCCH-Format1b
|
||||
@@ -597,29 +634,7 @@ RrcAsn1Header::SerializeSystemInformationBlockType2 (LteRrcSap::SystemInformatio
|
||||
// freqInfo
|
||||
SerializeSequence (std::bitset<2> (3),false);
|
||||
SerializeInteger ((int) systemInformationBlockType2.freqInfo.ulCarrierFreq, 0, MAX_EARFCN);
|
||||
switch (systemInformationBlockType2.freqInfo.ulBandwidth)
|
||||
{
|
||||
case 6:
|
||||
SerializeEnum (6,0);
|
||||
break;
|
||||
case 15:
|
||||
SerializeEnum (6,1);
|
||||
break;
|
||||
case 25:
|
||||
SerializeEnum (6,2);
|
||||
break;
|
||||
case 50:
|
||||
SerializeEnum (6,3);
|
||||
break;
|
||||
case 75:
|
||||
SerializeEnum (6,4);
|
||||
break;
|
||||
case 100:
|
||||
SerializeEnum (6,5);
|
||||
break;
|
||||
default:
|
||||
SerializeEnum (6,0);
|
||||
}
|
||||
SerializeEnum (6, BandwidthToEnum (systemInformationBlockType2.freqInfo.ulBandwidth));
|
||||
|
||||
SerializeInteger (29,1,32); // additionalSpectrumEmission
|
||||
// timeAlignmentTimerCommon
|
||||
@@ -1083,29 +1098,7 @@ RrcAsn1Header::SerializeMeasConfig (LteRrcSap::MeasConfig measConfig) const
|
||||
SerializeInteger (it->measObjectEutra.carrierFreq, 0, MAX_EARFCN);
|
||||
|
||||
// Serialize allowedMeasBandwidth
|
||||
switch (it->measObjectEutra.allowedMeasBandwidth)
|
||||
{
|
||||
case 6:
|
||||
SerializeEnum (6,0);
|
||||
break;
|
||||
case 15:
|
||||
SerializeEnum (6,1);
|
||||
break;
|
||||
case 25:
|
||||
SerializeEnum (6,2);
|
||||
break;
|
||||
case 50:
|
||||
SerializeEnum (6,3);
|
||||
break;
|
||||
case 75:
|
||||
SerializeEnum (6,4);
|
||||
break;
|
||||
case 100:
|
||||
SerializeEnum (6,5);
|
||||
break;
|
||||
default:
|
||||
SerializeEnum (6,0);
|
||||
}
|
||||
SerializeEnum (6, BandwidthToEnum (it->measObjectEutra.allowedMeasBandwidth));
|
||||
|
||||
SerializeBoolean (it->measObjectEutra.presenceAntennaPort1);
|
||||
SerializeBitstring (std::bitset<2> (it->measObjectEutra.neighCellConfig));
|
||||
@@ -3100,29 +3093,7 @@ RrcAsn1Header::DeserializeSystemInformationBlockType2 (LteRrcSap::SystemInformat
|
||||
{
|
||||
// Deserialize ul-Bandwidth
|
||||
bIterator = DeserializeEnum (6, &n, bIterator);
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 6;
|
||||
break;
|
||||
case 1:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 15;
|
||||
break;
|
||||
case 2:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 25;
|
||||
break;
|
||||
case 3:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 50;
|
||||
break;
|
||||
case 4:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 75;
|
||||
break;
|
||||
case 5:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 100;
|
||||
break;
|
||||
default:
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = 6;
|
||||
}
|
||||
systemInformationBlockType2->freqInfo.ulBandwidth = EnumToBandwidth (n);
|
||||
}
|
||||
|
||||
// additionalSpectrumEmission
|
||||
@@ -3806,28 +3777,7 @@ RrcAsn1Header::DeserializeMeasConfig (LteRrcSap::MeasConfig * measConfig, Buffer
|
||||
|
||||
// allowedMeasBandwidth
|
||||
bIterator = DeserializeEnum (6, &n, bIterator);
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
elem.measObjectEutra.allowedMeasBandwidth = 6;
|
||||
break;
|
||||
case 1:
|
||||
elem.measObjectEutra.allowedMeasBandwidth = 15;
|
||||
break;
|
||||
case 2:
|
||||
elem.measObjectEutra.allowedMeasBandwidth = 25;
|
||||
break;
|
||||
case 3:
|
||||
elem.measObjectEutra.allowedMeasBandwidth = 50;
|
||||
break;
|
||||
case 4:
|
||||
elem.measObjectEutra.allowedMeasBandwidth = 75;
|
||||
break;
|
||||
case 5:
|
||||
default:
|
||||
elem.measObjectEutra.allowedMeasBandwidth = 100;
|
||||
break;
|
||||
}
|
||||
elem.measObjectEutra.allowedMeasBandwidth = EnumToBandwidth (n);
|
||||
|
||||
// presenceAntennaPort1
|
||||
bIterator = DeserializeBoolean (&elem.measObjectEutra.presenceAntennaPort1, bIterator);
|
||||
@@ -4570,6 +4520,7 @@ RrcAsn1Header::DeserializeMeasConfig (LteRrcSap::MeasConfig * measConfig, Buffer
|
||||
}
|
||||
return bIterator;
|
||||
}
|
||||
|
||||
//////////////////// RrcConnectionRequest class ////////////////////////
|
||||
|
||||
// Constructor
|
||||
@@ -5167,54 +5118,10 @@ RrcConnectionReconfigurationHeader::PreSerialize () const
|
||||
SerializeSequence (std::bitset<1> (1),false);
|
||||
|
||||
// Serialize dl-Bandwidth
|
||||
switch (m_mobilityControlInfo.carrierBandwidth.dlBandwidth)
|
||||
{
|
||||
case 6:
|
||||
SerializeEnum (16,0);
|
||||
break;
|
||||
case 15:
|
||||
SerializeEnum (16,1);
|
||||
break;
|
||||
case 25:
|
||||
SerializeEnum (16,2);
|
||||
break;
|
||||
case 50:
|
||||
SerializeEnum (16,3);
|
||||
break;
|
||||
case 75:
|
||||
SerializeEnum (16,4);
|
||||
break;
|
||||
case 100:
|
||||
SerializeEnum (16,5);
|
||||
break;
|
||||
default:
|
||||
SerializeEnum (16,6);
|
||||
}
|
||||
SerializeEnum (16, BandwidthToEnum (m_mobilityControlInfo.carrierBandwidth.dlBandwidth));
|
||||
|
||||
// Serialize ul-Bandwidth
|
||||
switch (m_mobilityControlInfo.carrierBandwidth.ulBandwidth)
|
||||
{
|
||||
case 6:
|
||||
SerializeEnum (16,0);
|
||||
break;
|
||||
case 15:
|
||||
SerializeEnum (16,1);
|
||||
break;
|
||||
case 25:
|
||||
SerializeEnum (16,2);
|
||||
break;
|
||||
case 50:
|
||||
SerializeEnum (16,3);
|
||||
break;
|
||||
case 75:
|
||||
SerializeEnum (16,4);
|
||||
break;
|
||||
case 100:
|
||||
SerializeEnum (16,5);
|
||||
break;
|
||||
default:
|
||||
SerializeEnum (16,6);
|
||||
}
|
||||
SerializeEnum (16, BandwidthToEnum (m_mobilityControlInfo.carrierBandwidth.ulBandwidth));
|
||||
}
|
||||
|
||||
// Serialize t304
|
||||
@@ -5346,58 +5253,12 @@ RrcConnectionReconfigurationHeader::Deserialize (Buffer::Iterator bIterator)
|
||||
bIterator = DeserializeSequence (&ulBandwidthPresent,false,bIterator);
|
||||
|
||||
bIterator = DeserializeEnum (16,&n,bIterator);
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 6;
|
||||
break;
|
||||
case 1:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 15;
|
||||
break;
|
||||
case 2:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 25;
|
||||
break;
|
||||
case 3:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 50;
|
||||
break;
|
||||
case 4:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 75;
|
||||
break;
|
||||
case 5:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 100;
|
||||
break;
|
||||
case 6:
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = 0;
|
||||
break;
|
||||
}
|
||||
m_mobilityControlInfo.carrierBandwidth.dlBandwidth = EnumToBandwidth (n);
|
||||
|
||||
if (ulBandwidthPresent[0])
|
||||
{
|
||||
bIterator = DeserializeEnum (16,&n,bIterator);
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 6;
|
||||
break;
|
||||
case 1:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 15;
|
||||
break;
|
||||
case 2:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 25;
|
||||
break;
|
||||
case 3:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 50;
|
||||
break;
|
||||
case 4:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 75;
|
||||
break;
|
||||
case 5:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 100;
|
||||
break;
|
||||
case 6:
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = 0;
|
||||
break;
|
||||
}
|
||||
m_mobilityControlInfo.carrierBandwidth.ulBandwidth = EnumToBandwidth (n);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5873,7 +5734,7 @@ HandoverPreparationInfoHeader::PreSerialize () const
|
||||
|
||||
// Serialize sourceMasterInformationBlock
|
||||
SerializeSequence (std::bitset<0> (),false);
|
||||
SerializeEnum (6,m_asConfig.sourceMasterInformationBlock.dlBandwidth); // dl-Bandwidth
|
||||
SerializeEnum (6, BandwidthToEnum (m_asConfig.sourceMasterInformationBlock.dlBandwidth)); // dl-Bandwidth
|
||||
SerializeSequence (std::bitset<0> (),false); // phich-Config sequence
|
||||
SerializeEnum (2,0); // phich-Duration
|
||||
SerializeEnum (4,0); // phich-Resource
|
||||
@@ -5963,7 +5824,7 @@ HandoverPreparationInfoHeader::Deserialize (Buffer::Iterator bIterator)
|
||||
// Deserialize sourceMasterInformationBlock
|
||||
bIterator = DeserializeSequence (&bitset0,false,bIterator);
|
||||
bIterator = DeserializeEnum (6,&n,bIterator); // dl-Bandwidth
|
||||
m_asConfig.sourceMasterInformationBlock.dlBandwidth = n;
|
||||
m_asConfig.sourceMasterInformationBlock.dlBandwidth = EnumToBandwidth (n);
|
||||
|
||||
// phich-Config
|
||||
bIterator = DeserializeSequence (&bitset0,false,bIterator);
|
||||
|
||||
@@ -64,6 +64,24 @@ protected:
|
||||
uint32_t Deserialize (Buffer::Iterator bIterator) = 0;
|
||||
virtual void PreSerialize (void) const = 0;
|
||||
|
||||
|
||||
// Auxiliary functions
|
||||
/**
|
||||
* Convert from bandwidth (in RBs) to ENUMERATED value
|
||||
*
|
||||
* \param bandwidth Bandwith in RBs: 6, 15, 25, 50, 75, 100
|
||||
* \returns ENUMERATED value: 0, 1, 2, 3, 4, 5
|
||||
*/
|
||||
int BandwidthToEnum (uint8_t bandwidth) const;
|
||||
/**
|
||||
* Convert from ENUMERATED value to bandwidth (in RBs)
|
||||
*
|
||||
* \param n ENUMERATED value: 0, 1, 2, 3, 4, 5
|
||||
* \returns bandwidth Bandwith in RBs: 6, 15, 25, 50, 75, 100
|
||||
*/
|
||||
uint8_t EnumToBandwidth (int n) const;
|
||||
|
||||
|
||||
// Serialization functions
|
||||
/**
|
||||
* Serialize SRB to add mod list function
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
virtual ~LteRrcSap ();
|
||||
|
||||
/// Constraint values
|
||||
static const uint8_t MaxReportCells = 255;
|
||||
static const uint8_t MaxReportCells = 8;
|
||||
|
||||
// Information Elements
|
||||
/// PlmnIdentityInfo structure
|
||||
|
||||
@@ -737,7 +737,7 @@ HandoverPreparationInfoTestCase::DoRun (void)
|
||||
msg.asConfig.sourceDlCarrierFreq = 3;
|
||||
msg.asConfig.sourceUeIdentity = 11;
|
||||
msg.asConfig.sourceRadioResourceConfig = CreateRadioResourceConfigDedicated ();
|
||||
msg.asConfig.sourceMasterInformationBlock.dlBandwidth = 3;
|
||||
msg.asConfig.sourceMasterInformationBlock.dlBandwidth = 50;
|
||||
msg.asConfig.sourceMasterInformationBlock.systemFrameNumber = 1;
|
||||
|
||||
msg.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication = true;
|
||||
|
||||
Reference in New Issue
Block a user