lte: (fixes #2754) Incorrect arguments passed to Asn1Header::SerializeInteger

(partial patch provided by A.Krotov)
This commit is contained in:
Manuel Requena
2018-02-21 16:32:20 +01:00
parent e49a4ed64b
commit 90b08ad3c7
7 changed files with 76 additions and 199 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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;