Serialize RRC MeasResults IE

This commit is contained in:
Lluis Parcerisa
2012-12-20 16:25:30 +01:00
parent 72c7e17ee8
commit 2aaa84294a
3 changed files with 206 additions and 55 deletions

View File

@@ -389,23 +389,11 @@ RrcAsn1Header::SerializeSystemInformationBlockType1 (LteRrcSap::SystemInformatio
// Serialize plmn-IdentityList
SerializeSequenceOf (1,6,1);
// PLMN-IdentityInfo
SerializeSequence (std::bitset<0> (),false);
// plmn-Identity sequence, mcc is optional, no extension marker
SerializeSequence (std::bitset<1> (0), false);
// Serialize mnc
int x = systemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity;
int nDig = (x > 99) ? 3 : 2;
SerializeSequenceOf (nDig,3,2);
for (int i = nDig - 1; i >= 0; i--)
{
int n = floor (x / pow (10,i));
SerializeInteger (n,0,9);
x -= n * pow (10,i);
}
// cellReservedForOperatorUse
SerializeEnum (2,0);
SerializePlmnIdentity (systemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity);
// Serialize trackingAreaCode
SerializeBitstring (std::bitset<16> (0));
@@ -534,6 +522,112 @@ RrcAsn1Header::SerializeSystemInformationBlockType2 () const
SerializeEnum (8,0);
}
void
RrcAsn1Header::SerializeMeasResults (LteRrcSap::MeasResults measResults) const
{
// Watchdog: if list has 0 elements, set boolean to false
if(measResults.measResultListEutra.empty())
{
measResults.haveMeasResultNeighCells = false;
}
// Serialize MeasResults sequence, 1 optional value, extension marker present
SerializeSequence(std::bitset<1>(measResults.haveMeasResultNeighCells),true);
// Serialize measId
SerializeInteger(measResults.measId,1,MAX_MEAS_ID);
// Serialize measResultServCell sequence
SerializeSequence(std::bitset<0>(0),false);
// Serialize rsrpResult
SerializeInteger(measResults.rsrpResult,0,97);
// Serialize rsrqResult
SerializeInteger(measResults.rsrqResult,0,34);
if(measResults.haveMeasResultNeighCells)
{
// Serialize Choice = 0 (MeasResultListEUTRA)
SerializeChoice (4,0);
// Serialize measResultNeighCells
SerializeSequenceOf(measResults.measResultListEutra.size(),MAX_CELL_REPORT,1);
// serialize MeasResultEutra elements in the list
std::list<LteRrcSap::MeasResultEutra>::iterator it;
for (it = measResults.measResultListEutra.begin(); it != measResults.measResultListEutra.end(); it++)
{
SerializeSequence (std::bitset<1> (it->haveCgiInfo),false);
// Serialize PhysCellId
SerializeInteger (it->physCellId, 0, 503);
// Serialize CgiInfo
if(it->haveCgiInfo)
{
SerializeSequence (std::bitset<1>(it->cgiInfo.plmnIdentityList.size()),false);
// Serialize cellGlobalId
SerializeSequence (std::bitset<0>(0),false);
SerializePlmnIdentity(it->cgiInfo.plmnIdentity);
SerializeBitstring (std::bitset<28>(it->cgiInfo.cellIdentity));
// Serialize trackingAreaCode
SerializeBitstring (std::bitset<16>(it->cgiInfo.trackingAreaCode));
// Serialize plmn-IdentityList
if(!it->cgiInfo.plmnIdentityList.empty())
{
SerializeSequenceOf(it->cgiInfo.plmnIdentityList.size(),5,1);
std::list<uint32_t>::iterator it2;
for (it2 = it->cgiInfo.plmnIdentityList.begin(); it2 != it->cgiInfo.plmnIdentityList.end(); it2++)
{
SerializePlmnIdentity(*it2);
}
}
}
// Serialize measResult
std::bitset<2> measResultFieldsPresent;
measResultFieldsPresent[1] = it->haveRsrpResult;
measResultFieldsPresent[0] = it->haveRsrqResult;
SerializeSequence(measResultFieldsPresent,true);
if(it->haveRsrpResult)
{
SerializeInteger (it->rsrpResult,0,97);
}
if(it->haveRsrqResult)
{
SerializeInteger (it->rsrqResult,0,34);
}
}
}
}
void
RrcAsn1Header::SerializePlmnIdentity (uint32_t plmnId) const
{
// plmn-Identity sequence, mcc is optional, no extension marker
SerializeSequence (std::bitset<1> (0), false);
// Serialize mnc
int nDig = (plmnId > 99) ? 3 : 2;
SerializeSequenceOf (nDig,3,2);
for (int i = nDig - 1; i >= 0; i--)
{
int n = floor (plmnId / pow (10,i));
SerializeInteger (n,0,9);
plmnId -= n * pow (10,i);
}
// cellReservedForOperatorUse
SerializeEnum (2,0);
}
Buffer::Iterator
RrcAsn1Header::DeserializeRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated *radioResourceConfigDedicated, Buffer::Iterator bIterator)
{
@@ -1053,27 +1147,7 @@ RrcAsn1Header::DeserializeSystemInformationBlockType1 (LteRrcSap::SystemInformat
bIterator = DeserializeSequence (&bitset0,false,bIterator);
// plmn-Identity
std::bitset<1> isMccPresent;
bIterator = DeserializeSequence (&isMccPresent,false,bIterator);
if (isMccPresent[0])
{
// Deserialize mcc
// ...
}
// Deserialize mnc
int mncDigits;
int mnc = 0;
bIterator = DeserializeSequenceOf (&mncDigits,3,2,bIterator);
for (int j = mncDigits - 1; j >= 0; j--)
{
bIterator = DeserializeInteger (&n,0,9,bIterator);
mnc += n * pow (10,j);
}
systemInformationBlockType1->cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = mnc;
// cellReservedForOperatorUse
bIterator = DeserializeEnum (2,&n,bIterator);
bIterator = DeserializePlmnIdentity(&systemInformationBlockType1->cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity,bIterator);
}
// Deserialize trackingAreaCode
@@ -1456,6 +1530,44 @@ RrcAsn1Header::DeserializeRadioResourceConfigCommonSib (Buffer::Iterator bIterat
return bIterator;
}
Buffer::Iterator
RrcAsn1Header::DeserializeMeasResults (LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator)
{
// TODO
return bIterator;
}
Buffer::Iterator
RrcAsn1Header::DeserializePlmnIdentity (uint32_t *plmnId, Buffer::Iterator bIterator)
{
int n;
std::bitset<1> isMccPresent;
bIterator = DeserializeSequence (&isMccPresent,false,bIterator);
if (isMccPresent[0])
{
// Deserialize mcc
// ...
}
// Deserialize mnc
int mncDigits;
int mnc = 0;
bIterator = DeserializeSequenceOf (&mncDigits,3,2,bIterator);
for (int j = mncDigits - 1; j >= 0; j--)
{
bIterator = DeserializeInteger (&n,0,9,bIterator);
mnc += n * pow (10,j);
}
*plmnId = mnc;
// cellReservedForOperatorUse
bIterator = DeserializeEnum (2,&n,bIterator);
return bIterator;
}
//////////////////// RrcConnectionRequest class ////////////////////////
// Constructor
@@ -1900,11 +2012,10 @@ uint32_t
RrcConnectionReconfigurationCompleteHeader::Deserialize (Buffer::Iterator bIterator)
{
std::bitset<0> bitset0;
bIterator = DeserializeSequence (&bitset0,false,bIterator);
int n;
bIterator = DeserializeUlDcchMessage (bIterator);
bIterator = DeserializeSequence (&bitset0,false,bIterator);
bIterator = DeserializeInteger (&n,0,3,bIterator);
m_rrcTransactionIdentifier = n;
@@ -3500,12 +3611,25 @@ MeasurementReportHeader::PreSerialize () const
// Serialize DCCH message
SerializeUlDcchMessage (1);
// Serialize RRCConnectionSetupComplete sequence:
// Serialize MeasurementReport sequence:
// no default or optional fields. Extension marker not present.
SerializeSequence<0> (std::bitset<0> (),false);
// Serialize criticalExtensions choice:
// c1 chosen
SerializeChoice (2,0);
// Serialize c1 choice
// measurementReport-r8 chosen
SerializeChoice (8,0);
// Serialize MeasurementReport-r8-IEs sequence:
// 1 optional fields, not present. Extension marker not present.
SerializeSequence<1> (std::bitset<1> (0),false);
// Serialize measResults
SerializeMeasResults (m_measurementReport.measResults);
// Finish serialization
FinalizeSerialization ();
}
@@ -3513,28 +3637,47 @@ MeasurementReportHeader::PreSerialize () const
uint32_t
MeasurementReportHeader::Deserialize (Buffer::Iterator bIterator)
{
/*std::bitset<0> bitset0;
bIterator = DeserializeSequence (&bitset0,false,bIterator);
std::bitset<0> bitset0;
int n;
bIterator = DeserializeSequence (&bitset0,false,bIterator);
bIterator = DeserializeUlDcchMessage (bIterator);
bIterator = DeserializeInteger (&n,0,3,bIterator);
m_rrcTransactionIdentifier = n;
int criticalExtensionsChoice;
bIterator = DeserializeChoice (2,&criticalExtensionsChoice,bIterator);
bIterator = DeserializeChoice (2,&n,bIterator);
if (n == 1)
if (criticalExtensionsChoice == 1)
{
// Deserialize criticalExtensionsFuture
bIterator = DeserializeSequence (&bitset0,false,bIterator);
}
else if (n == 0)
else if (criticalExtensionsChoice == 0)
{
// Deserialize rrcConnectionReconfigurationComplete-r8
// ...
}*/
// Deserialize c1
int c1Choice;
bIterator = DeserializeChoice (8,&c1Choice,bIterator);
if(c1Choice>0)
{
bIterator = DeserializeNull(bIterator);
}
else
{
// Deserialize measurementReport-r8
std::bitset<1> isNonCriticalExtensionPresent;
bIterator = DeserializeSequence(&isNonCriticalExtensionPresent,false,bIterator);
// Deserialize measResults
bIterator = DeserializeMeasResults (&m_measurementReport.measResults, bIterator);
if(isNonCriticalExtensionPresent[0])
{
// Deserialize nonCriticalExtension MeasurementReport-v8a0-IEs
// ...
}
}
}
return GetSerializedSize ();
}

View File

@@ -51,6 +51,8 @@ protected:
void SerializeSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const;
void SerializeSystemInformationBlockType2 () const;
void SerializeRadioResourceConfigCommonSIB () const;
void SerializeMeasResults (LteRrcSap::MeasResults measResults) const;
void SerializePlmnIdentity (uint32_t plmnId) const;
// Deserialization functions
Buffer::Iterator DeserializeDrbToAddModList (std::list<LteRrcSap::DrbToAddMod> *drbToAddModLis, Buffer::Iterator bIterator);
@@ -62,6 +64,8 @@ protected:
Buffer::Iterator DeserializeSystemInformationBlockType2 (Buffer::Iterator bIterator);
Buffer::Iterator DeserializeRadioResourceConfigCommon (Buffer::Iterator bIterator);
Buffer::Iterator DeserializeRadioResourceConfigCommonSib (Buffer::Iterator bIterator);
Buffer::Iterator DeserializeMeasResults (LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator);
Buffer::Iterator DeserializePlmnIdentity (uint32_t *plmnId, Buffer::Iterator bIterator);
void Print (std::ostream &os, LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const;

View File

@@ -383,19 +383,22 @@ public:
uint16_t sourceDlCarrierFreq;
};
struct CellGlobalIdEutra
struct CgiInfo
{
uint32_t plmnIdentity;
uint32_t cellIdentity;
uint16_t trackingAreaCode;
std::list<uint32_t> plmnIdentityList;
};
struct MeasResultEutra
{
uint16_t physCellId;
CellGlobalIdEutra cellGlobalId;
uint16_t trackingAreaCode;
std::list<uint32_t> plmnIdentityList;
bool haveCgiInfo;
CgiInfo cgiInfo;
bool haveRsrpResult;
uint8_t rsrpResult;
bool haveRsrqResult;
uint8_t rsrqResult;
};
@@ -404,7 +407,8 @@ public:
uint8_t measId;
uint8_t rsrpResult;
uint8_t rsrqResult;
std::list<MeasResultEutra> MeasResultListEutra;
bool haveMeasResultNeighCells;
std::list<MeasResultEutra> measResultListEutra;
};