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"
32 * Create and encode RIC Indication messages.
33 * Prints the encoded messages in XML format.
36 main (int argc, char *argv[])
38 // LogComponentEnable ("Asn1Types", LOG_LEVEL_ALL);
39 LogComponentEnable ("KpmIndication", LOG_LEVEL_INFO);
40 LogComponentEnable ("KpmFunctionDescription", LOG_LEVEL_INFO);
42 std::string plmId = "111";
43 std::string gnbId = "1";
44 uint16_t nrCellId = 5;
46 uint64_t timestamp = 1630068655325;
48 uint64_t timestamp2 = 1630068679511;
50 uint64_t timestamp3 = 1630068680196;
52 uint64_t timestamp4 = 1630068681372;
55 NS_LOG_UNCOND ("----------- Begin of Kpm Indication header -----------");
57 KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues;
58 headerValues.m_plmId = plmId;
59 headerValues.m_gnbId = gnbId;
60 headerValues.m_nrCellId = nrCellId;
61 headerValues.m_timestamp = timestamp;
63 KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues2;
64 headerValues2.m_plmId = plmId;
65 headerValues2.m_gnbId = gnbId;
66 headerValues2.m_nrCellId = nrCellId;
67 headerValues2.m_timestamp = timestamp2;
69 KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues3;
70 headerValues3.m_plmId = plmId;
71 headerValues3.m_gnbId = gnbId;
72 headerValues3.m_nrCellId = nrCellId;
73 headerValues3.m_timestamp = timestamp3;
75 KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues4;
76 headerValues4.m_plmId = plmId;
77 headerValues4.m_gnbId = gnbId;
78 headerValues4.m_nrCellId = nrCellId;
79 headerValues4.m_timestamp = timestamp4;
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);
86 NS_LOG_UNCOND ("----------- End of the Kpm Indication header -----------");
89 KpmIndicationMessage::KpmIndicationMessageValues msgValues1;
91 NS_LOG_UNCOND ("----------- Begin of the CU-UP message -----------");
93 // Begin example CU-UP
94 // uncomment this to test CU-UP
96 Ptr<OCuUpContainerValues> cuUpValues = Create<OCuUpContainerValues> ();
97 cuUpValues->m_plmId = plmId;
98 cuUpValues->m_pDCPBytesUL = 100;
99 cuUpValues->m_pDCPBytesDL = 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);
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;
120 Ptr<KpmIndicationMessage> msg = Create<KpmIndicationMessage> (msgValues1);
122 NS_LOG_UNCOND ("----------- End of the CU-UP message -----------");
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;
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);
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);
142 Ptr<MeasurementItemList> ue4DummyValues =
143 Create<MeasurementItemList> ("UE-4");
145 Ptr<L3RrcMeasurements> l3RrcMeasurement = Create<L3RrcMeasurements> (RRCEvent_b1);
146 Ptr<ServingCellMeasurementsWrap> servingCellMeasurements =
147 Create<ServingCellMeasurementsWrap> (ServingCellMeasurements_PR_nr_measResultServingMOList);
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 ());
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;
163 Ptr<KpmIndicationMessage> msg2 = Create<KpmIndicationMessage> (msgValues2);
164 NS_LOG_UNCOND ("----------- End of the CU-CP message -----------");
166 NS_LOG_UNCOND ("----------- Begin test of the DU message -----------");
167 KpmIndicationMessage::KpmIndicationMessageValues msgValues3;
168 msgValues3.m_cellObjectId = "NRCellCU";
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;
179 Ptr<CellResourceReport> cellResRep2 = Create<CellResourceReport> ();
180 cellResRep2->m_plmId = "444";
181 cellResRep2->m_nrCellId = 3;
182 cellResRep2->dlAvailablePrbs = 5;
183 cellResRep2->ulAvailablePrbs = 5;
185 Ptr<ServedPlmnPerCell> servedPlmnPerCell = Create<ServedPlmnPerCell> ();
186 servedPlmnPerCell->m_plmId = "121";
187 servedPlmnPerCell->m_nrCellId = 3;
189 Ptr<ServedPlmnPerCell> servedPlmnPerCell2 = Create<ServedPlmnPerCell> ();
190 servedPlmnPerCell2->m_plmId = "121";
191 servedPlmnPerCell2->m_nrCellId = 2;
193 Ptr<EpcDuPmContainer> epcDuVal = Create<EpcDuPmContainer> ();
195 epcDuVal->m_dlPrbUsage = 1;
196 epcDuVal->m_ulPrbUsage = 2;
198 Ptr<EpcDuPmContainer> epcDuVal2 = Create<EpcDuPmContainer> ();
199 epcDuVal2->m_qci = 1;
200 epcDuVal2->m_dlPrbUsage = 3;
201 epcDuVal2->m_ulPrbUsage = 4;
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);
212 oDuContainerVal->m_cellResourceReportItems.insert (cellResRep);
213 oDuContainerVal->m_cellResourceReportItems.insert (cellResRep2);
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);
220 msgValues3.m_pmContainerValues = oDuContainerVal;
221 Ptr<KpmIndicationMessage> msg3 = Create<KpmIndicationMessage> (msgValues3);
223 NS_LOG_UNCOND ("----------- End test of the DU message -----------");
225 NS_LOG_UNCOND ("----------- Begin test of the KpmFunctionDescription -----------");
226 Ptr<KpmFunctionDescription> fd = Create<KpmFunctionDescription> ();
227 NS_LOG_UNCOND ("----------- End test of the KpmFunctionDescription -----------");