First release
[sim/ns3-o-ran-e2.git] / examples / ric-indication-messages.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 #include <errno.h>
28
29 using namespace ns3;
30
31 /**
32 * Create and encode RIC Indication messages.
33 * Prints the encoded messages in XML format. 
34 */
35 int 
36 main (int argc, char *argv[])
37 {
38   // LogComponentEnable ("Asn1Types", LOG_LEVEL_ALL);
39   LogComponentEnable ("KpmIndication", LOG_LEVEL_INFO);
40   LogComponentEnable ("KpmFunctionDescription", LOG_LEVEL_INFO);
41   
42   std::string plmId = "111";
43   std::string gnbId = "1";
44   uint16_t nrCellId = 5;
45
46   uint64_t timestamp = 1630068655325;
47   // "12:58:04.123456";
48   uint64_t timestamp2 = 1630068679511;
49   // "12:58:05.123457";
50   uint64_t timestamp3 = 1630068680196;
51   // "12:58:06.123458";
52   uint64_t timestamp4 = 1630068681372;
53   // "12:58:07.123459";
54
55   NS_LOG_UNCOND ("----------- Begin of Kpm Indication header -----------");
56
57   KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues; 
58   headerValues.m_plmId = plmId;
59   headerValues.m_gnbId = gnbId;
60   headerValues.m_nrCellId = nrCellId;
61   headerValues.m_timestamp = timestamp;
62
63 KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues2; 
64   headerValues2.m_plmId = plmId;
65   headerValues2.m_gnbId = gnbId;
66   headerValues2.m_nrCellId = nrCellId;
67   headerValues2.m_timestamp = timestamp2;
68
69   KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues3; 
70   headerValues3.m_plmId = plmId;
71   headerValues3.m_gnbId = gnbId;
72   headerValues3.m_nrCellId = nrCellId;
73   headerValues3.m_timestamp = timestamp3;
74
75   KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues4; 
76   headerValues4.m_plmId = plmId;
77   headerValues4.m_gnbId = gnbId;
78   headerValues4.m_nrCellId = nrCellId;
79   headerValues4.m_timestamp = timestamp4;
80
81   Ptr<KpmIndicationHeader> header = Create<KpmIndicationHeader> (KpmIndicationHeader::GlobalE2nodeType::eNB, headerValues);
82   Ptr<KpmIndicationHeader> header2 = Create<KpmIndicationHeader> (KpmIndicationHeader::GlobalE2nodeType::gNB, headerValues2);
83   Ptr<KpmIndicationHeader> header3 = Create<KpmIndicationHeader> (KpmIndicationHeader::GlobalE2nodeType::ng_eNB, headerValues3);
84   Ptr<KpmIndicationHeader> header4 = Create<KpmIndicationHeader> (KpmIndicationHeader::GlobalE2nodeType::en_gNB, headerValues4);
85
86   NS_LOG_UNCOND ("----------- End of the Kpm Indication header -----------");
87   return 0;
88
89   KpmIndicationMessage::KpmIndicationMessageValues msgValues1;
90
91   NS_LOG_UNCOND ("----------- Begin of the CU-UP message -----------");
92
93   // Begin example CU-UP
94   // uncomment this to test CU-UP
95
96   Ptr<OCuUpContainerValues> cuUpValues = Create<OCuUpContainerValues> ();
97   cuUpValues->m_plmId = plmId;
98   cuUpValues->m_pDCPBytesUL = 100;
99   cuUpValues->m_pDCPBytesDL = 100;
100
101   Ptr<MeasurementItemList> ue0DummyValues = Create<MeasurementItemList> ("UE-0");
102   ue0DummyValues->AddItem<long> ("DRB.PdcpSduVolumeDl_Filter.UEID", 6);
103   ue0DummyValues->AddItem<long> ("QosFlow.PdcpPduVolumeDL_Filter.UEID", 7);
104   ue0DummyValues->AddItem<long> ("Tot.PdcpSduNbrDl.UEID", 8);
105   ue0DummyValues->AddItem<long> ("DRB.PdcpPduNbrDl.Qos.UEID", 9);
106   ue0DummyValues->AddItem<double> ("DRB.IPThpDl.UEID", 10.0);
107   ue0DummyValues->AddItem<double> ("DRB.IPLateDl.UEID", 11.0);
108   msgValues1.m_ueIndications.insert (ue0DummyValues);
109  
110   Ptr<MeasurementItemList> ue1DummyValues = Create<MeasurementItemList> ("UE-1");
111   ue1DummyValues->AddItem<long> ("DRB.PdcpSduVolumeDl_Filter.UEID", 6);
112   ue1DummyValues->AddItem<long> ("QosFlow.PdcpPduVolumeDL_Filter.UEID", 7);
113   ue1DummyValues->AddItem<long> ("Tot.PdcpSduNbrDl.UEID", 8);
114   ue1DummyValues->AddItem<long> ("DRB.PdcpPduNbrDl.Qos.UEID", 9);
115   ue1DummyValues->AddItem<double> ("DRB.IPThpDl.UEID", 10.0);
116   ue1DummyValues->AddItem<double> ("DRB.IPLateDl.UEID", 11.0);
117   msgValues1.m_ueIndications.insert(ue1DummyValues);
118   msgValues1.m_pmContainerValues = cuUpValues; 
119
120   Ptr<KpmIndicationMessage> msg = Create<KpmIndicationMessage> (msgValues1);
121
122   NS_LOG_UNCOND ("----------- End of the CU-UP message -----------");
123
124   NS_LOG_UNCOND ("----------- Begin of the CU-CP message -----------");
125   KpmIndicationMessage::KpmIndicationMessageValues msgValues2;
126   msgValues2.m_cellObjectId = "NRCellCU";
127   Ptr<OCuCpContainerValues> cuCpValues = Create<OCuCpContainerValues> ();
128   cuCpValues->m_numActiveUes = 100;
129
130   Ptr<MeasurementItemList> ue2DummyValues =
131       Create<MeasurementItemList> ("UE-2");
132   ue2DummyValues->AddItem<long> ("DRB.EstabSucc.5QI.UEID", 6);
133   ue2DummyValues->AddItem<long> ("DRB.RelActNbr.5QI.UEID", 7);
134   msgValues2.m_ueIndications.insert (ue2DummyValues);
135
136    Ptr<MeasurementItemList> ue3DummyValues =
137       Create<MeasurementItemList> ("UE-3");
138   ue3DummyValues->AddItem<long> ("DRB.EstabSucc.5QI.UEID", 6);
139   ue3DummyValues->AddItem<long> ("DRB.RelActNbr.5QI.UEID", 7);
140   msgValues2.m_ueIndications.insert (ue3DummyValues);
141
142   Ptr<MeasurementItemList> ue4DummyValues =
143       Create<MeasurementItemList> ("UE-4");
144
145   Ptr<L3RrcMeasurements> l3RrcMeasurement = Create<L3RrcMeasurements> (RRCEvent_b1);
146   Ptr<ServingCellMeasurementsWrap> servingCellMeasurements =
147       Create<ServingCellMeasurementsWrap> (ServingCellMeasurements_PR_nr_measResultServingMOList);
148
149   Ptr<MeasResultNr> measResultNr = Create<MeasResultNr> (39);
150   Ptr<MeasQuantityResultsWrap> measQuantityResultWrap = Create<MeasQuantityResultsWrap> ();
151   measQuantityResultWrap->AddSinr (20);
152   measResultNr->AddCellResults (MeasResultNr::SSB, measQuantityResultWrap->GetPointer ());
153   Ptr<MeasResultServMo> measResultServMo =
154       Create<MeasResultServMo> (10, measResultNr->GetValue ());
155   servingCellMeasurements->AddMeasResultServMo (measResultServMo->GetPointer ());
156   l3RrcMeasurement->AddServingCellMeasurement (servingCellMeasurements->GetPointer ());
157
158   ue4DummyValues->AddItem<Ptr<L3RrcMeasurements>> ("calla",l3RrcMeasurement);
159   ue4DummyValues->AddItem<long> ("DRB.RelActNbr.5QI.UEID", 7);
160   msgValues2.m_ueIndications.insert (ue4DummyValues);
161   msgValues2.m_pmContainerValues = cuCpValues;
162
163   Ptr<KpmIndicationMessage> msg2 = Create<KpmIndicationMessage> (msgValues2);
164   NS_LOG_UNCOND ("----------- End of the CU-CP message -----------");
165   
166   NS_LOG_UNCOND ("----------- Begin test of the DU message -----------");
167   KpmIndicationMessage::KpmIndicationMessageValues msgValues3;
168   msgValues3.m_cellObjectId = "NRCellCU";
169
170   Ptr<ODuContainerValues> oDuContainerVal = Create<ODuContainerValues> ();
171   Ptr<CellResourceReport> cellResRep = Create<CellResourceReport> ();
172   cellResRep->m_plmId = "111";
173   // std::stringstream ss;
174   // ss << std::hex << 1340012;
175   cellResRep->m_nrCellId = 2;
176   cellResRep->dlAvailablePrbs = 6;
177   cellResRep->ulAvailablePrbs = 6;
178
179     Ptr<CellResourceReport> cellResRep2 = Create<CellResourceReport> ();
180   cellResRep2->m_plmId = "444";
181   cellResRep2->m_nrCellId = 3;
182   cellResRep2->dlAvailablePrbs = 5;
183   cellResRep2->ulAvailablePrbs = 5;
184
185   Ptr<ServedPlmnPerCell> servedPlmnPerCell = Create<ServedPlmnPerCell> ();
186   servedPlmnPerCell->m_plmId = "121";
187   servedPlmnPerCell->m_nrCellId = 3;
188
189   Ptr<ServedPlmnPerCell> servedPlmnPerCell2 = Create<ServedPlmnPerCell> ();
190   servedPlmnPerCell2->m_plmId = "121";
191   servedPlmnPerCell2->m_nrCellId = 2;
192
193   Ptr<EpcDuPmContainer> epcDuVal = Create<EpcDuPmContainer> ();
194   epcDuVal->m_qci = 1;
195   epcDuVal->m_dlPrbUsage = 1;
196   epcDuVal->m_ulPrbUsage = 2;
197
198   Ptr<EpcDuPmContainer> epcDuVal2 = Create<EpcDuPmContainer> ();
199   epcDuVal2->m_qci = 1;
200   epcDuVal2->m_dlPrbUsage = 3;
201   epcDuVal2->m_ulPrbUsage = 4;
202
203   servedPlmnPerCell->m_perQciReportItems.insert (epcDuVal);
204   servedPlmnPerCell->m_perQciReportItems.insert (epcDuVal2);
205   servedPlmnPerCell2->m_perQciReportItems.insert (epcDuVal);
206   servedPlmnPerCell2->m_perQciReportItems.insert (epcDuVal2);
207   cellResRep->m_servedPlmnPerCellItems.insert (servedPlmnPerCell2);
208   cellResRep->m_servedPlmnPerCellItems.insert (servedPlmnPerCell);
209   cellResRep2->m_servedPlmnPerCellItems.insert (servedPlmnPerCell2);
210   cellResRep2->m_servedPlmnPerCellItems.insert (servedPlmnPerCell);
211   
212   oDuContainerVal->m_cellResourceReportItems.insert (cellResRep);
213   oDuContainerVal->m_cellResourceReportItems.insert (cellResRep2);
214
215   Ptr<MeasurementItemList> ue5DummyValues = Create<MeasurementItemList> ("UE-5");
216   ue5DummyValues->AddItem<long> ("DRB.EstabSucc.5QI.UEID", 6);
217   ue5DummyValues->AddItem<long> ("DRB.RelActNbr.5QI.UEID", 7);
218   msgValues3.m_ueIndications.insert (ue5DummyValues);
219
220   msgValues3.m_pmContainerValues = oDuContainerVal;
221   Ptr<KpmIndicationMessage> msg3 = Create<KpmIndicationMessage> (msgValues3);
222   
223   NS_LOG_UNCOND ("----------- End test of the DU message -----------");
224
225   NS_LOG_UNCOND ("----------- Begin test of the KpmFunctionDescription -----------");
226   Ptr<KpmFunctionDescription> fd = Create<KpmFunctionDescription> ();
227   NS_LOG_UNCOND ("----------- End test of the KpmFunctionDescription -----------");
228
229   return 0;
230 }