/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * Copyright (c) 2022 Northeastern University * Copyright (c) 2022 Sapienza, University of Rome * Copyright (c) 2022 University of Padova * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Andrea Lacava * Tommaso Zugno * Michele Polese */ #include "ns3/core-module.h" #include "ns3/oran-interface.h" #include "encode_e2apv1.hpp" #include using namespace ns3; Ptr e2Term; // TODO create getters for these parameters in e2Term std::string plmId = "111"; uint16_t cellId = 1; const std::string gnb = std::to_string (cellId); /** * Creates an empty RIC Report message and send it to the RIC * * \param params the RIC Subscription Request parameters */ static void BuildAndSendReportMessage (E2Termination::RicSubscriptionRequest_rval_s params) { KpmIndicationHeader::KpmRicIndicationHeaderValues headerValues; headerValues.m_plmId = plmId; headerValues.m_gnbId = cellId; headerValues.m_nrCellId = cellId; Ptr header = Create (KpmIndicationHeader::GlobalE2nodeType::gNB, headerValues); KpmIndicationMessage::KpmIndicationMessageValues msgValues; Ptr cuUpValues = Create (); cuUpValues->m_plmId = plmId; cuUpValues->m_pDCPBytesUL = 100; cuUpValues->m_pDCPBytesDL = 100; msgValues.m_pmContainerValues = cuUpValues; Ptr ue0DummyValues = Create ("UE-0"); ue0DummyValues->AddItem ("DRB.PdcpSduVolumeDl_Filter.UEID", 6); ue0DummyValues->AddItem ("QosFlow.PdcpPduVolumeDL_Filter.UEID", 7); ue0DummyValues->AddItem ("Tot.PdcpSduNbrDl.UEID", 8); ue0DummyValues->AddItem ("DRB.PdcpPduNbrDl.Qos.UEID", 9); ue0DummyValues->AddItem ("DRB.IPThpDl.UEID", 10.0); ue0DummyValues->AddItem ("DRB.IPLateDl.UEID", 11.0); msgValues.m_ueIndications.insert (ue0DummyValues); Ptr ue1DummyValues = Create ("UE-1");; ue1DummyValues->AddItem ("DRB.PdcpSduVolumeDl_Filter.UEID", 6); ue1DummyValues->AddItem ("QosFlow.PdcpPduVolumeDL_Filter.UEID", 7); ue1DummyValues->AddItem ("Tot.PdcpSduNbrDl.UEID", 8); ue1DummyValues->AddItem ("DRB.PdcpPduNbrDl.Qos.UEID", 9); ue1DummyValues->AddItem ("DRB.IPThpDl.UEID", 10.0); ue1DummyValues->AddItem ("DRB.IPLateDl.UEID", 11.0); msgValues.m_ueIndications.insert (ue1DummyValues); Ptr msg = Create (msgValues); E2AP_PDU *pdu_cuup_ue = new E2AP_PDU; encoding::generate_e2apv1_indication_request_parameterized(pdu_cuup_ue, params.requestorId, params.instanceId, params.ranFuncionId, params.actionId, 1, // TODO sequence number (uint8_t*) header->m_buffer, // buffer containing the encoded header header->m_size, // size of the encoded header (uint8_t*) msg->m_buffer, // buffer containing the encoded message msg->m_size); // size of the encoded message e2Term->SendE2Message (pdu_cuup_ue); delete pdu_cuup_ue; } /** * KPM Subscription Request callback. * This function is triggered whenever a RIC Subscription Request for * the KPM RAN Function is received. * * \param pdu request message */ static void KpmSubscriptionCallback (E2AP_PDU_t* sub_req_pdu) { NS_LOG_UNCOND ("\n\nReceived RIC Subscription Request"); E2Termination::RicSubscriptionRequest_rval_s params = e2Term->ProcessRicSubscriptionRequest (sub_req_pdu); NS_LOG_UNCOND ("requestorId " << +params.requestorId << ", instanceId " << +params.instanceId << ", ranFuncionId " << +params.ranFuncionId << ", actionId " << +params.actionId); BuildAndSendReportMessage (params); } /** * RIC Control Message callback. * This function is triggered whenever a RIC Control Message is received. * * \param pdu request message */ static void RicControlMessageCallback (E2AP_PDU_t *ric_ctrl_pdu) { NS_LOG_UNCOND ("\n\nReceived RIC Control Message"); RicControlMessage msg = RicControlMessage (ric_ctrl_pdu); // TODO log something } int main (int argc, char *argv[]) { LogComponentEnable ("Asn1Types", LOG_LEVEL_ALL); LogComponentEnable ("RicControlMessage", LOG_LEVEL_ALL); e2Term = CreateObject ("10.244.0.191", 36422, 38472, gnb, plmId); Ptr kpmFd = Create (); e2Term->RegisterKpmCallbackToE2Sm (200, kpmFd, &KpmSubscriptionCallback); Ptr rcFd = Create (); e2Term->RegisterSmCallbackToE2Sm (300, rcFd, &RicControlMessageCallback); return 0; }