1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
3 * Copyright (c) 2022 Northeastern University
4 * Copyright (c) 2022 Sapienza, University of Rome
5 * Copyright (c) 2022 University of Padova
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation;
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * Author: Andrea Lacava <thecave003@gmail.com>
21 * Tommaso Zugno <tommasozugno@gmail.com>
22 * Michele Polese <michele.polese@gmail.com>
25 #include <ns3/asn1c-types.h>
28 NS_LOG_COMPONENT_DEFINE ("Asn1Types");
32 OctetString::OctetString (std::string value, size_t size)
34 NS_LOG_FUNCTION (this);
35 CreateBaseOctetString (size);
36 memcpy (m_octetString->buf, value.c_str (), size);
39 void OctetString::CreateBaseOctetString (size_t size)
41 NS_LOG_FUNCTION (this);
42 m_octetString = (OCTET_STRING_t *) calloc (1, sizeof (OCTET_STRING_t));
43 m_octetString->buf = (uint8_t *) calloc (1, size);
44 m_octetString->size = size;
47 OctetString::OctetString (void *value, size_t size)
49 NS_LOG_FUNCTION (this);
50 CreateBaseOctetString (size);
51 memcpy (m_octetString->buf, value, size);
54 OctetString::~OctetString ()
56 NS_LOG_FUNCTION (this);
57 // if (m_octetString->buf != NULL)
58 // free (m_octetString->buf);
63 OctetString::GetPointer ()
69 OctetString::GetValue ()
71 return *m_octetString;
74 std::string OctetString::DecodeContent(){
75 int size = this->GetValue ().size;
77 std::memcpy (out, this->GetValue ().buf, size);
80 return std::string (out);
83 BitString::BitString (std::string value, size_t size)
86 NS_LOG_FUNCTION (this);
87 m_bitString = (BIT_STRING_t *) calloc (1, sizeof (BIT_STRING_t));
88 m_bitString->buf = (uint8_t *) calloc (1, size);
89 m_bitString->size = size;
90 memcpy (m_bitString->buf, value.c_str(), size);
93 BitString::BitString (std::string value, size_t size, size_t bits_unused)
94 : BitString::BitString (value, size)
96 NS_LOG_FUNCTION (this);
97 m_bitString->bits_unused = bits_unused;
100 BitString::~BitString ()
102 NS_LOG_FUNCTION (this);
107 BitString::GetPointer ()
113 BitString::GetValue ()
118 NrCellId::NrCellId (uint16_t value)
120 NS_LOG_FUNCTION (this);
122 // TODO check why with more than 15 cells is not working
125 // NS_FATAL_ERROR ("TODO: update the encoding to support more than 15 cells");
128 // convert value to a char array
130 // ar [4] = value * 16; // multiply by 16 to obtain a left shift of 4 bits
131 uint16_t shifted = value * 16;
132 std::string str_shift = std::to_string (shifted);
133 m_bitString = Create<BitString> (str_shift, 5, 4);
136 NrCellId::~NrCellId ()
141 NrCellId::GetValue ()
143 return m_bitString->GetValue ();
147 NrCellId::GetPointer ()
149 return m_bitString->GetPointer ();
152 Snssai::Snssai (std::string sst)
154 m_sNssai = (SNSSAI_t *) calloc (1, sizeof (SNSSAI_t));
155 m_sst = (OCTET_STRING_t *) calloc (1, sizeof (OCTET_STRING_t));
156 m_sst->buf = (uint8_t *) calloc (1, sst.size ());
157 m_sst->size = sst.size ();
158 memcpy (m_sst->buf, sst.c_str (), sst.size ());
159 m_sNssai->sST = *m_sst;
161 Snssai::Snssai (std::string sst, std::string sd) : Snssai (sst)
163 m_sd = (OCTET_STRING_t *) calloc (1, sizeof (OCTET_STRING_t));
164 m_sd->buf = (uint8_t *) calloc (1, sst.size ());
165 m_sd->size = sd.size ();
166 memcpy (m_sd->buf, sd.c_str (), sd.size ());
172 if (m_sNssai != NULL)
173 ASN_STRUCT_FREE (asn_DEF_SNSSAI, m_sNssai);
175 // if (m_sst != NULL)
176 // ASN_STRUCT_FREE (asn_DEF_OCTET_STRING, m_sst);
178 // ASN_STRUCT_FREE (asn_DEF_OCTET_STRING, m_sd);
182 Snssai::GetPointer ()
194 MeasQuantityResultsWrap::AddRsrp (long rsrp)
197 m_measQuantityResults->rsrp = (RSRP_Range_t *) calloc (1, sizeof (RSRP_Range_t));
198 *m_measQuantityResults->rsrp = rsrp;
202 MeasQuantityResultsWrap::AddRsrq (long rsrq)
204 m_measQuantityResults->rsrq = (RSRQ_Range_t *) calloc (1, sizeof (RSRQ_Range_t));
205 *m_measQuantityResults->rsrq = rsrq;
209 MeasQuantityResultsWrap::AddSinr (long sinr)
211 m_measQuantityResults->sinr = (SINR_Range_t *) calloc (1, sizeof (SINR_Range_t));
212 *m_measQuantityResults->sinr = sinr;
215 MeasQuantityResultsWrap::MeasQuantityResultsWrap ()
217 m_measQuantityResults = (MeasQuantityResults_t *) calloc (1, sizeof (MeasQuantityResults_t));
220 MeasQuantityResultsWrap::~MeasQuantityResultsWrap ()
222 // if (m_measQuantityResults->sinr != NULL)
223 // ASN_STRUCT_FREE (asn_DEF_SINR_Range, m_measQuantityResults->sinr);
225 // if (m_measQuantityResults->rsrp != NULL)
226 // ASN_STRUCT_FREE (asn_DEF_RSRP_Range, m_measQuantityResults->rsrp);
228 // if (m_measQuantityResults->rsrq != NULL)
229 // ASN_STRUCT_FREE (asn_DEF_RSRQ_Range, m_measQuantityResults->rsrq);
231 // if (m_measQuantityResults != NULL){
232 // free (m_measQuantityResults);
236 MeasQuantityResults_t *
237 MeasQuantityResultsWrap::GetPointer ()
239 return m_measQuantityResults;
242 MeasQuantityResults_t
243 MeasQuantityResultsWrap::GetValue ()
245 return *m_measQuantityResults;
248 ResultsPerCsiRsIndex::ResultsPerCsiRsIndex (long csiRsIndex, MeasQuantityResults_t *csiRsResults)
249 : ResultsPerCsiRsIndex (csiRsIndex)
251 m_resultsPerCsiRsIndex->csi_RS_Results = csiRsResults;
254 ResultsPerCsiRsIndex::ResultsPerCsiRsIndex (long csiRsIndex)
256 m_resultsPerCsiRsIndex =
257 (ResultsPerCSI_RS_Index_t *) calloc (1, sizeof (ResultsPerCSI_RS_Index_t));
258 m_resultsPerCsiRsIndex->csi_RS_Index = csiRsIndex;
261 ResultsPerCSI_RS_Index_t *
262 ResultsPerCsiRsIndex::GetPointer ()
264 return m_resultsPerCsiRsIndex;
267 ResultsPerCSI_RS_Index_t
268 ResultsPerCsiRsIndex::GetValue ()
270 return *m_resultsPerCsiRsIndex;
273 ResultsPerSSBIndex::ResultsPerSSBIndex (long ssbIndex, MeasQuantityResults_t *ssbResults)
274 : ResultsPerSSBIndex (ssbIndex)
276 m_resultsPerSSBIndex->ssb_Results = ssbResults;
279 ResultsPerSSBIndex::ResultsPerSSBIndex (long ssbIndex)
281 m_resultsPerSSBIndex = (ResultsPerSSB_Index_t *) calloc (1, sizeof (ResultsPerSSB_Index_t));
282 m_resultsPerSSBIndex->ssb_Index = ssbIndex;
285 ResultsPerSSB_Index_t *
286 ResultsPerSSBIndex::GetPointer ()
288 return m_resultsPerSSBIndex;
291 ResultsPerSSB_Index_t
292 ResultsPerSSBIndex::GetValue ()
294 return *m_resultsPerSSBIndex;
298 MeasResultNr::AddCellResults (MeasResultNr::ResultCell cell, MeasQuantityResults_t *results)
302 case MeasResultNr::ResultCell::SSB:
304 m_measResultNr->measResult.cellResults.resultsSSB_Cell = results;
307 case MeasResultNr::ResultCell::CSI_RS:
309 m_measResultNr->measResult.cellResults.resultsCSI_RS_Cell = results;
313 NS_LOG_ERROR ("Unrecognized cell identifier.");
319 MeasResultNr::AddPerSsbIndexResults (ResultsPerSSB_Index_t *resultsSSB_Index)
321 ASN_SEQUENCE_ADD (m_measResultNr->measResult.rsIndexResults->resultsSSB_Indexes,
326 MeasResultNr::AddPerCsiRsIndexResults (ResultsPerCSI_RS_Index_t *resultsCSI_RS_Index)
328 ASN_SEQUENCE_ADD (m_measResultNr->measResult.rsIndexResults->resultsCSI_RS_Indexes,
329 resultsCSI_RS_Index);
332 void MeasResultNr::AddPhyCellId (long physCellId)
334 PhysCellId_t *s_physCellId = (PhysCellId_t *) calloc (1, sizeof (PhysCellId_t));
335 *s_physCellId = physCellId;
336 m_measResultNr->physCellId = s_physCellId;
339 MeasResultNr::MeasResultNr (long physCellId) : MeasResultNr ()
341 AddPhyCellId (physCellId);
344 MeasResultNr::MeasResultNr ()
346 m_measResultNr = (MeasResultNR_t *) calloc (1, sizeof (MeasResultNR_t));
347 m_shouldFree = false;
350 MeasResultNr::~MeasResultNr ()
354 free (m_measResultNr);
359 MeasResultNr::GetPointer ()
361 // Fallback procedure, this should not happen if correctly used;
362 m_shouldFree = false;
363 return m_measResultNr;
367 MeasResultNr::GetValue ()
370 return *m_measResultNr;
373 MeasResultEutra::MeasResultEutra (long eutraPhysCellId, long rsrp, long rsrq, long sinr)
374 : MeasResultEutra (eutraPhysCellId)
381 MeasResultEutra::MeasResultEutra (long eutraPhysCellId)
383 m_measResultEutra = (MeasResultEUTRA_t *) calloc (1, sizeof (MeasResultEUTRA_t));
384 m_measResultEutra->eutra_PhysCellId = eutraPhysCellId;
388 MeasResultEutra::AddRsrp (long rsrp)
390 m_measResultEutra->measResult.rsrp =
391 (RSRP_RangeEUTRA_t *) calloc (1, sizeof (RSRP_RangeEUTRA_t));
392 *m_measResultEutra->measResult.rsrp = rsrp;
395 MeasResultEutra::AddRsrq (long rsrq)
397 m_measResultEutra->measResult.rsrq =
398 (RSRQ_RangeEUTRA_t *) calloc (1, sizeof (RSRQ_RangeEUTRA_t));
399 *m_measResultEutra->measResult.rsrq = rsrq;
402 MeasResultEutra::AddSinr (long sinr)
404 m_measResultEutra->measResult.sinr =
405 (SINR_RangeEUTRA_t *) calloc (1, sizeof (SINR_RangeEUTRA_t));
406 *m_measResultEutra->measResult.sinr = sinr;
410 MeasResultEutra::GetPointer ()
412 return m_measResultEutra;
416 MeasResultEutra::GetValue ()
418 return *m_measResultEutra;
421 MeasResultPCellWrap::MeasResultPCellWrap (long eutraPhysCellId, long rsrpResult, long rsrqResult)
422 : MeasResultPCellWrap (eutraPhysCellId)
424 AddRsrpResult (rsrpResult);
425 AddRsrqResult (rsrqResult);
428 MeasResultPCellWrap::MeasResultPCellWrap (long eutraPhysCellId)
430 m_measResultPCell = (MeasResultPCell_t *) calloc (1, sizeof (MeasResultPCell_t));
431 m_measResultPCell->eutra_PhysCellId = eutraPhysCellId;
435 MeasResultPCellWrap::AddRsrpResult (long rsrpResult)
437 m_measResultPCell->rsrpResult = rsrpResult;
441 MeasResultPCellWrap::AddRsrqResult (long rsrqResult)
443 m_measResultPCell->rsrqResult = rsrqResult;
447 MeasResultPCellWrap::GetPointer ()
449 return m_measResultPCell;
453 MeasResultPCellWrap::GetValue ()
455 return *m_measResultPCell;
458 MeasResultServMo::MeasResultServMo (long servCellId, MeasResultNR_t measResultServingCell,
459 MeasResultNR_t *measResultBestNeighCell)
460 : MeasResultServMo (servCellId, measResultServingCell)
462 m_measResultServMo->measResultBestNeighCell = measResultBestNeighCell;
465 MeasResultServMo::MeasResultServMo (long servCellId, MeasResultNR_t measResultServingCell)
467 m_measResultServMo = (MeasResultServMO_t *) calloc (1, sizeof (MeasResultServMO_t));
468 m_measResultServMo->servCellId = servCellId;
469 m_measResultServMo->measResultServingCell = measResultServingCell;
473 MeasResultServMo::GetPointer ()
475 return m_measResultServMo;
479 MeasResultServMo::GetValue ()
481 return *m_measResultServMo;
485 ServingCellMeasurementsWrap::AddMeasResultPCell (MeasResultPCell_t *measResultPCell)
487 if (m_servingCellMeasurements->present != ServingCellMeasurements_PR_eutra_measResultPCell)
489 NS_LOG_ERROR ("Wrong measurement item for this present, it will not be added.");
491 m_servingCellMeasurements->choice.eutra_measResultPCell = measResultPCell;
495 ServingCellMeasurementsWrap::AddMeasResultServMo (MeasResultServMO_t *measResultServMO)
497 if (m_servingCellMeasurements->present != ServingCellMeasurements_PR_nr_measResultServingMOList)
499 NS_LOG_ERROR ("Wrong measurement item for this present, it will not be added.");
502 ASN_SEQUENCE_ADD (&m_nr_measResultServingMOList->list, measResultServMO);
505 ServingCellMeasurementsWrap::ServingCellMeasurementsWrap (ServingCellMeasurements_PR present)
507 m_servingCellMeasurements =
508 (ServingCellMeasurements_t *) calloc (1, sizeof (ServingCellMeasurements_t));
509 m_servingCellMeasurements->present = present;
511 if (m_servingCellMeasurements->present == ServingCellMeasurements_PR_nr_measResultServingMOList)
513 m_nr_measResultServingMOList =
514 (MeasResultServMOList_t *) calloc (1, sizeof (MeasResultServMOList_t));
515 m_servingCellMeasurements->choice.nr_measResultServingMOList = m_nr_measResultServingMOList;
519 ServingCellMeasurements_t *
520 ServingCellMeasurementsWrap::GetPointer ()
522 return m_servingCellMeasurements;
525 ServingCellMeasurements_t
526 ServingCellMeasurementsWrap::GetValue ()
528 return *m_servingCellMeasurements;
531 Ptr<L3RrcMeasurements>
532 L3RrcMeasurements::CreateL3RrcUeSpecificSinrServing (long servingCellId, long physCellId, long sinr)
534 Ptr<L3RrcMeasurements> l3RrcMeasurement = Create<L3RrcMeasurements> (RRCEvent_b1);
535 Ptr<ServingCellMeasurementsWrap> servingCellMeasurements =
536 Create<ServingCellMeasurementsWrap> (ServingCellMeasurements_PR_nr_measResultServingMOList);
538 Ptr<MeasResultNr> measResultNr = Create<MeasResultNr> (physCellId);
539 Ptr<MeasQuantityResultsWrap> measQuantityResultWrap = Create<MeasQuantityResultsWrap> ();
540 measQuantityResultWrap->AddSinr (sinr);
541 measResultNr->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap->GetPointer ());
542 Ptr<MeasResultServMo> measResultServMo =
543 Create<MeasResultServMo> (servingCellId, measResultNr->GetValue ());
544 servingCellMeasurements->AddMeasResultServMo (measResultServMo->GetPointer ());
545 l3RrcMeasurement->AddServingCellMeasurement (servingCellMeasurements->GetPointer ());
546 return l3RrcMeasurement;
549 Ptr<L3RrcMeasurements>
550 L3RrcMeasurements::CreateL3RrcUeSpecificSinrNeigh ()
552 return Create<L3RrcMeasurements> (RRCEvent_b1);
556 L3RrcMeasurements::AddNeighbourCellMeasurement (long neighCellId, long sinr)
558 Ptr<MeasResultNr> measResultNr = Create<MeasResultNr> (neighCellId);
559 Ptr<MeasQuantityResultsWrap> measQuantityResultWrap = Create<MeasQuantityResultsWrap> ();
560 measQuantityResultWrap->AddSinr (sinr);
561 measResultNr->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap->GetPointer ());
563 this->AddMeasResultNRNeighCells (measResultNr->GetPointer ()); // MAX 8 UE per message (standard)
567 L3RrcMeasurements::AddServingCellMeasurement (ServingCellMeasurements_t *servingCellMeasurements)
569 m_l3RrcMeasurements->servingCellMeasurements = servingCellMeasurements;
573 L3RrcMeasurements::AddMeasResultEUTRANeighCells (MeasResultEUTRA_t *measResultItemEUTRA)
575 if (m_measItemsCounter == L3RrcMeasurements::MAX_MEAS_RESULTS_ITEMS)
577 NS_LOG_ERROR ("Maximum number of items ("
578 << L3RrcMeasurements::MAX_MEAS_RESULTS_ITEMS
579 << ")for the standard reached. This item will not be "
580 "inserted in the list");
584 if (m_l3RrcMeasurements->measResultNeighCells == NULL)
586 addMeasResultNeighCells (MeasResultNeighCells_PR_measResultListEUTRA);
589 if (m_l3RrcMeasurements->measResultNeighCells->present !=
590 MeasResultNeighCells_PR_measResultListEUTRA)
592 NS_LOG_ERROR ("Wrong measurement item for this list, it will not be added.");
596 m_measItemsCounter++;
597 ASN_SEQUENCE_ADD (&m_measResultListEUTRA->list, measResultItemEUTRA);
601 L3RrcMeasurements::AddMeasResultNRNeighCells (MeasResultNR_t *measResultItemNR)
603 if (m_measItemsCounter == L3RrcMeasurements::MAX_MEAS_RESULTS_ITEMS)
605 NS_LOG_ERROR ("Maximum number of items ("
606 << L3RrcMeasurements::MAX_MEAS_RESULTS_ITEMS
607 << ")for the standard reached. This item will not be "
608 "inserted in the list");
612 if (m_l3RrcMeasurements->measResultNeighCells == NULL)
614 addMeasResultNeighCells (MeasResultNeighCells_PR_measResultListNR);
617 if (m_l3RrcMeasurements->measResultNeighCells->present !=
618 MeasResultNeighCells_PR_measResultListNR)
620 NS_LOG_ERROR ("Wrong measurement item for this list, it will not be added.");
624 m_measItemsCounter++;
625 ASN_SEQUENCE_ADD (&m_measResultListNR->list, measResultItemNR);
629 L3RrcMeasurements::addMeasResultNeighCells (MeasResultNeighCells_PR present)
631 m_l3RrcMeasurements->measResultNeighCells =
632 (MeasResultNeighCells_t *) calloc (1, sizeof (MeasResultNeighCells_t));
633 m_l3RrcMeasurements->measResultNeighCells->present = present;
637 case MeasResultNeighCells_PR_measResultListEUTRA: {
638 m_measResultListEUTRA =
639 (MeasResultListEUTRA_t *) calloc (1, sizeof (MeasResultListEUTRA_t));
640 m_l3RrcMeasurements->measResultNeighCells->choice.measResultListEUTRA =
641 m_measResultListEUTRA;
645 case MeasResultNeighCells_PR_measResultListNR: {
646 m_measResultListNR = (MeasResultListNR_t *) calloc (1, sizeof (MeasResultListNR_t));
647 m_l3RrcMeasurements->measResultNeighCells->choice.measResultListNR = m_measResultListNR;
652 NS_LOG_ERROR ("Unrecognized present for Measurment result.");
658 L3RrcMeasurements::L3RrcMeasurements (RRCEvent_t rrcEvent)
660 m_l3RrcMeasurements = (L3_RRC_Measurements_t *) calloc (1, sizeof (L3_RRC_Measurements_t));
661 m_l3RrcMeasurements->rrcEvent = rrcEvent;
662 m_measItemsCounter = 0;
665 L3RrcMeasurements::L3RrcMeasurements (L3_RRC_Measurements_t *l3RrcMeasurements)
667 m_l3RrcMeasurements = l3RrcMeasurements;
670 L3RrcMeasurements::~L3RrcMeasurements ()
672 // Memory deallocation is handled by RIC Indication Message
673 // if (m_l3RrcMeasurements != NULL)
675 // ASN_STRUCT_FREE (asn_DEF_L3_RRC_Measurements, m_l3RrcMeasurements);
679 L3_RRC_Measurements *
680 L3RrcMeasurements::GetPointer ()
682 return m_l3RrcMeasurements;
686 L3RrcMeasurements::GetValue ()
688 return *m_l3RrcMeasurements;
691 // TODO change definition and return the values
692 // this function shall be finished for decoding
694 L3RrcMeasurements::ExtractMeasurementsFromL3RrcMeas (L3_RRC_Measurements_t *l3RrcMeasurements)
696 RRCEvent_t rrcEvent = l3RrcMeasurements->rrcEvent; // Mandatory
700 NS_LOG_DEBUG ("RRCEvent_b1");
705 NS_LOG_DEBUG ("RRCEvent_a3");
709 NS_LOG_DEBUG ("RRCEvent_a5");
712 case RRCEvent_periodic: {
713 NS_LOG_DEBUG ("RRCEvent_periodic");
718 NS_LOG_ERROR ("Rrc event unrecognised");
723 if (l3RrcMeasurements->measResultNeighCells)
725 MeasResultNeighCells_t *measResultNeighCells = l3RrcMeasurements->measResultNeighCells;
726 switch (measResultNeighCells->present)
728 case MeasResultNeighCells_PR_NOTHING: { /* No components present */
729 NS_LOG_DEBUG ("No components present");
732 case MeasResultNeighCells_PR_measResultListNR: {
733 NS_LOG_DEBUG ("MeasResultNeighCells_PR_measResultListNR");
734 // measResultNeighCells->choice.measResultListNR
737 case MeasResultNeighCells_PR_measResultListEUTRA: {
738 NS_LOG_DEBUG ("MeasResultNeighCells_PR_measResultListEUTRA");
742 NS_LOG_ERROR ("measResultNeighCells present unrecognised");
746 if (l3RrcMeasurements->servingCellMeasurements)
748 ServingCellMeasurements_t *servingCellMeasurements =
749 l3RrcMeasurements->servingCellMeasurements;
750 switch (servingCellMeasurements->present)
752 case ServingCellMeasurements_PR_NOTHING: { /* No components present */
753 NS_LOG_DEBUG ("No components present");
756 case ServingCellMeasurements_PR_nr_measResultServingMOList: {
757 NS_LOG_DEBUG ("ServingCellMeasurements_PR_nr_measResultServingMOList");
760 case ServingCellMeasurements_PR_eutra_measResultPCell: {
761 NS_LOG_DEBUG ("ServingCellMeasurements_PR_eutra_measResultPCell");
765 NS_LOG_ERROR ("servingCellMeasurements present unrecognised");
772 L3RrcMeasurements::ThreeGppMapSinr (double sinr)
774 double inputEnd = 40;
775 double inputStart = -23;
776 double outputStart = 0;
777 double outputEnd = 127;
779 double slope = (outputEnd - outputStart) / (inputEnd - inputStart);
781 if (sinr < inputStart)
783 outputSinr = outputStart;
785 else if (sinr > inputEnd)
787 outputSinr = outputEnd;
791 outputSinr = outputStart + std::round (slope * (sinr - inputStart));
794 NS_LOG_DEBUG ("input sinr" << sinr << " output sinr" << outputSinr);
799 MeasurementItem::MeasurementItem (std::string name)
802 m_measurementItem = (PM_Info_Item_t *) calloc (1, sizeof (PM_Info_Item_t));
803 m_pmType = (MeasurementType_t *) calloc (1, sizeof (MeasurementType_t));
804 m_measurementItem->pmType = *m_pmType;
807 (MeasurementTypeName_t *) calloc (1, sizeof (MeasurementTypeName_t));
808 m_measName->buf = (uint8_t *) calloc (1, sizeof (OCTET_STRING));
809 m_measName->size = name.length ();
810 memcpy (m_measName->buf, name.c_str (), m_measName->size);
812 m_measurementItem->pmType.choice.measName = *m_measName;
813 m_measurementItem->pmType.present = MeasurementType_PR_measName;
816 MeasurementItem::MeasurementItem (std::string name, long value) : MeasurementItem (name)
818 NS_LOG_FUNCTION (this << name << "long" << value);
819 this->CreateMeasurementValue (MeasurementValue_PR_valueInt);
820 m_measurementItem->pmVal.choice.valueInt = value;
823 MeasurementItem::MeasurementItem (std::string name, double value) : MeasurementItem (name)
825 NS_LOG_FUNCTION (this << name << "double" << value);
826 this->CreateMeasurementValue (MeasurementValue_PR_valueReal);
827 m_measurementItem->pmVal.choice.valueReal = value;
830 MeasurementItem::MeasurementItem (std::string name, Ptr<L3RrcMeasurements>value)
831 : MeasurementItem (name)
833 NS_LOG_FUNCTION (this << name << "L3 RRC" << value);
834 this->CreateMeasurementValue (MeasurementValue_PR_valueRRC);
835 m_measurementItem->pmVal.choice.valueRRC = value->GetPointer ();
839 MeasurementItem::CreateMeasurementValue (MeasurementValue_PR measurementValue_PR)
841 m_pmVal = ((MeasurementValue_t *) calloc (1, sizeof (MeasurementValue_t)));
842 m_measurementItem->pmVal = *m_pmVal;
843 m_measurementItem->pmVal.present = measurementValue_PR;
846 MeasurementItem::~MeasurementItem ()
848 NS_LOG_FUNCTION (this);
850 ASN_STRUCT_FREE (asn_DEF_MeasurementValue, m_pmVal);
852 if (m_measName != NULL)
857 if (m_pmType != NULL)
858 ASN_STRUCT_FREE (asn_DEF_MeasurementType, m_pmType);
862 MeasurementItem::GetPointer ()
864 return m_measurementItem;
868 MeasurementItem::GetValue ()
870 return *m_measurementItem;
873 RANParameterItem::RANParameterItem (RANParameter_Item_t *ranParameterItem)
875 m_ranParameterItem = ranParameterItem;
878 RANParameterItem::~RANParameterItem ()
880 if (m_ranParameterItem != NULL)
881 ASN_STRUCT_FREE (asn_DEF_RANParameter_Item, m_ranParameterItem);
884 std::vector<RANParameterItem>
885 RANParameterItem::ExtractRANParametersFromRANParameter (RANParameter_Item_t *ranParameterItem)
887 std::vector<RANParameterItem> ranParameterList;
889 // NS_LOG_DEBUG ("RAN Parameter examined:");
890 // xer_fprint (stderr, &asn_DEF_RANParameter_Item, ranParameterItem);
891 // NS_LOG_DEBUG ("----");
892 // NS_LOG_DEBUG (" ID " << ranParameterItem->ranParameterItem_ID);
894 switch (ranParameterItem->ranParameterItem_valueType->present)
896 case RANParameter_ValueType_PR_NOTHING: {
897 NS_LOG_DEBUG ("[E2SM] RANParameter_ValueType_PR_NOTHING");
900 case RANParameter_ValueType_PR_ranParameter_Element: {
901 RANParameterItem newItem =
902 RANParameterItem (ranParameterItem);
903 NS_LOG_DEBUG ("[E2SM] RANParameter_ValueType_PR_ranParameter_Element");
904 RANParameter_ELEMENT_t *ranParameterElement =
905 ranParameterItem->ranParameterItem_valueType->choice.ranParameter_Element;
906 newItem.m_keyFlag = &ranParameterElement->keyFlag;
907 switch (ranParameterElement->ranParameter_Value.present)
909 case RANParameter_Value_PR_NOTHING: {
910 NS_LOG_DEBUG ("[E2SM] RANParameter_Value_PR_NOTHING");
911 newItem.m_valueType = ValueType::Nothing;
914 case RANParameter_Value_PR_valueInt: {
915 NS_LOG_DEBUG ("[E2SM] RANParameter_Value_PR_valueInt");
916 newItem.m_valueInt = ranParameterElement->ranParameter_Value.choice.valueInt;
917 newItem.m_valueType = ValueType::Int;
918 NS_LOG_DEBUG ("[E2SM] Value: " << newItem.m_valueInt);
921 case RANParameter_Value_PR_valueOctS: {
922 NS_LOG_DEBUG ("[E2SM] RANParameter_Value_PR_valueOctS");
923 newItem.m_valueStr = Create<OctetString> (
924 (void *) ranParameterElement->ranParameter_Value.choice.valueOctS.buf,
925 ranParameterElement->ranParameter_Value.choice.valueOctS.size);
926 newItem.m_valueType = ValueType::OctectString;
927 NS_LOG_DEBUG ("[E2SM] Value: OctectString");
931 ranParameterList.push_back (newItem);
934 case RANParameter_ValueType_PR_ranParameter_Structure: {
935 NS_LOG_DEBUG ("[E2SM] RANParameter_ValueType_PR_ranParameter_Structure");
936 RANParameter_STRUCTURE_t *ranParameterStructure =
937 ranParameterItem->ranParameterItem_valueType->choice.ranParameter_Structure;
938 int count = ranParameterStructure->sequence_of_ranParameters.list.count;
939 for (int i = 0; i < count; i++)
941 RANParameter_Item_t *childRanItem =
942 ranParameterStructure->sequence_of_ranParameters.list.array[i];
944 for (RANParameterItem extractedParameter : ExtractRANParametersFromRANParameter (childRanItem))
946 ranParameterList.push_back (extractedParameter);
951 case RANParameter_ValueType_PR_ranParameter_List: {
952 NS_LOG_DEBUG ("[E2SM] RANParameter_ValueType_PR_ranParameter_List");
953 // No list passed for the moment from RIC, thus no parsed as case
954 // ranParameterItem->ranParameterItem_valueType->choice.ranParameter_List;
959 return ranParameterList;