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/core-module.h"
26 #include "ns3/oran-interface.h"
30 NS_LOG_COMPONENT_DEFINE ("L3RrcExample");
32 Ptr<L3RrcMeasurements>
33 CreateL3RrcUeSpecificSinrServing (long servingCellId, long physCellId, long sinr)
35 Ptr<L3RrcMeasurements> l3RrcMeasurement = Create<L3RrcMeasurements> (RRCEvent_b1);
36 Ptr<ServingCellMeasurementsWrap> servingCellMeasurements =
37 Create<ServingCellMeasurementsWrap> (ServingCellMeasurements_PR_nr_measResultServingMOList);
39 Ptr<MeasResultNr> measResultNr = Create<MeasResultNr> (physCellId);
40 Ptr<MeasQuantityResultsWrap> measQuantityResultWrap = Create<MeasQuantityResultsWrap> ();
41 measQuantityResultWrap->AddSinr (sinr);
42 measResultNr->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap->GetPointer ());
43 Ptr<MeasResultServMo> measResultServMo =
44 Create<MeasResultServMo> (servingCellId, measResultNr->GetValue ());
45 servingCellMeasurements->AddMeasResultServMo (measResultServMo->GetPointer ());
46 l3RrcMeasurement->AddServingCellMeasurement (servingCellMeasurements->GetPointer ());
47 return l3RrcMeasurement;
50 Ptr<L3RrcMeasurements>
51 CreateL3RrcUeSpecificSinrNeigh (long neighCellId, long sinr)
53 Ptr<L3RrcMeasurements> l3RrcMeasurement = Create<L3RrcMeasurements> (RRCEvent_b1);
54 Ptr<MeasResultNr> measResultNr = Create<MeasResultNr> (neighCellId);
55 Ptr<MeasQuantityResultsWrap> measQuantityResultWrap = Create<MeasQuantityResultsWrap> ();
56 measQuantityResultWrap->AddSinr (sinr);
57 measResultNr->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap->GetPointer ());
59 l3RrcMeasurement->AddMeasResultNRNeighCells (
60 measResultNr->GetPointer ()); // MAX 8 UE per message (standard)
62 return l3RrcMeasurement;
66 // The memory leaks occurring in this file are wanted because L3-RRC is usually freed after use in the Ric Indication Message
69 main (int argc, char *argv[])
71 LogComponentEnableAll (LOG_PREFIX_ALL);
72 LogComponentEnable ("L3RrcExample", LOG_LEVEL_ALL);
73 LogComponentEnable ("Asn1Types", LOG_LEVEL_ALL);
75 // 1 UE-specific (L3) SINR from NR serving cells
76 NS_LOG_INFO ("1 UE-specific (L3) SINR from NR serving cells");
77 Ptr<L3RrcMeasurements> l3RrcMeasurement1 = CreateL3RrcUeSpecificSinrServing (1, 1, 10);
78 xer_fprint (stderr, &asn_DEF_L3_RRC_Measurements, l3RrcMeasurement1->GetPointer ());
80 // 2 UE-specific (L3) SINR from NR neighboring cells
81 NS_LOG_INFO ("2 UE-specific (L3) SINR from NR neighboring cells");
82 Ptr<L3RrcMeasurements> l3RrcMeasurement2 = CreateL3RrcUeSpecificSinrNeigh (2, 20);
84 // 3 UE-specific (L3) SINR report from NR neighboring cells
85 NS_LOG_INFO ("3 UE-specific (L3) SINR report from NR neighboring cells");
86 long neighCellId3 = 3;
89 Ptr<MeasResultNr> measResultNr3 = Create<MeasResultNr> (neighCellId3);
90 Ptr<MeasQuantityResultsWrap> measQuantityResultWrap3 = Create<MeasQuantityResultsWrap> ();
91 measQuantityResultWrap3->AddSinr (sinr3);
92 measResultNr3->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap3->GetPointer ());
94 l3RrcMeasurement2->AddMeasResultNRNeighCells (measResultNr3->GetPointer ());
96 xer_fprint (stderr, &asn_DEF_L3_RRC_Measurements, l3RrcMeasurement2->GetPointer ());
98 // 4 UE-specific (L3) SINR from LTE serving cells
99 NS_LOG_INFO ("4 UE-specific (L3) SINR from LTE serving cells");
100 long eutraPhysCellId4 = 4;
101 long servCellId4 = 4;
103 Ptr<L3RrcMeasurements> l3RrcMeasurement4 =
104 CreateL3RrcUeSpecificSinrServing (servCellId4, eutraPhysCellId4, sinr4);
105 xer_fprint (stderr, &asn_DEF_L3_RRC_Measurements, l3RrcMeasurement4->GetPointer ());
108 // 5 UE-specific (L3) SINR from LTE neighboring cells
109 NS_LOG_INFO ("5 UE-specific (L3) SINR from LTE neighboring cells");
110 long neighCellId5 = 5;
112 Ptr<L3RrcMeasurements> l3RrcMeasurement3 = Create<L3RrcMeasurements> (RRCEvent_a5);
113 Ptr<MeasResultEutra> measResultEutra5 = Create<MeasResultEutra> (neighCellId5);
114 measResultEutra5->AddSinr (sinr5);
115 l3RrcMeasurement3->AddMeasResultEUTRANeighCells (measResultEutra5->GetPointer ());
116 xer_fprint (stderr, &asn_DEF_L3_RRC_Measurements, l3RrcMeasurement3->GetPointer ());