First release
[sim/ns3-o-ran-e2.git] / examples / l3-rrc-example.cc
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2022 Northeastern University
4  * Copyright (c) 2022 Sapienza, University of Rome
5  * Copyright (c) 2022 University of Padova
6  *
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;
10  *
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.
15  *
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
19  *
20  * Author: Andrea Lacava <thecave003@gmail.com>
21  *                 Tommaso Zugno <tommasozugno@gmail.com>
22  *                 Michele Polese <michele.polese@gmail.com>
23  */
24
25 #include "ns3/core-module.h"
26 #include "ns3/oran-interface.h"
27
28 using namespace ns3;
29
30 NS_LOG_COMPONENT_DEFINE ("L3RrcExample");
31
32 Ptr<L3RrcMeasurements>
33 CreateL3RrcUeSpecificSinrServing (long servingCellId, long physCellId, long sinr)
34 {
35   Ptr<L3RrcMeasurements> l3RrcMeasurement = Create<L3RrcMeasurements> (RRCEvent_b1);
36   Ptr<ServingCellMeasurementsWrap> servingCellMeasurements =
37       Create<ServingCellMeasurementsWrap> (ServingCellMeasurements_PR_nr_measResultServingMOList);
38
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;
48 }
49
50 Ptr<L3RrcMeasurements>
51 CreateL3RrcUeSpecificSinrNeigh (long neighCellId, long sinr)
52 {
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 ());
58
59   l3RrcMeasurement->AddMeasResultNRNeighCells (
60       measResultNr->GetPointer ()); // MAX 8 UE per message (standard)
61
62   return l3RrcMeasurement;
63 }
64
65
66 // The memory leaks occurring in this file are wanted because L3-RRC is usually freed after use in the Ric Indication Message
67
68 int
69 main (int argc, char *argv[])
70 {
71   LogComponentEnableAll (LOG_PREFIX_ALL);
72   LogComponentEnable ("L3RrcExample", LOG_LEVEL_ALL);
73   LogComponentEnable ("Asn1Types", LOG_LEVEL_ALL);
74
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 ());
79
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);
83
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;
87   long sinr3 = 30;
88
89   Ptr<MeasResultNr> measResultNr3 = Create<MeasResultNr> (neighCellId3);
90   Ptr<MeasQuantityResultsWrap> measQuantityResultWrap3 = Create<MeasQuantityResultsWrap> ();
91   measQuantityResultWrap3->AddSinr (sinr3);
92   measResultNr3->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap3->GetPointer ());
93
94   l3RrcMeasurement2->AddMeasResultNRNeighCells (measResultNr3->GetPointer ());
95
96   xer_fprint (stderr, &asn_DEF_L3_RRC_Measurements, l3RrcMeasurement2->GetPointer ());
97
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;
102   long sinr4 = 40;
103   Ptr<L3RrcMeasurements> l3RrcMeasurement4 =
104       CreateL3RrcUeSpecificSinrServing (servCellId4, eutraPhysCellId4, sinr4);
105   xer_fprint (stderr, &asn_DEF_L3_RRC_Measurements, l3RrcMeasurement4->GetPointer ());
106
107
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;
111   long sinr5 = 50;
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 ());
117
118
119   return 0;
120 }