/* -*- 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 namespace ns3 { MmWaveIndicationMessageHelper::MmWaveIndicationMessageHelper (IndicationMessageType type, bool isOffline, bool reducedPmValues) : IndicationMessageHelper (type, isOffline, reducedPmValues) { } void MmWaveIndicationMessageHelper::AddCuUpUePmItem (std::string ueImsiComplete, long txPdcpPduBytesNrRlc, long txPdcpPduNrRlc) { Ptr ueVal = Create (ueImsiComplete); if (!m_reducedPmValues) { // UE-specific PDCP PDU volume transmitted to NR gNB (Unit is Kbits) ueVal->AddItem ("QosFlow.PdcpPduVolumeDL_Filter.UEID", txPdcpPduBytesNrRlc); // UE-specific number of PDCP PDUs split with NR gNB ueVal->AddItem ("DRB.PdcpPduNbrDl.Qos.UEID", txPdcpPduNrRlc); } m_msgValues.m_ueIndications.insert (ueVal); } void MmWaveIndicationMessageHelper::FillCuUpValues (std::string plmId) { FillBaseCuUpValues (plmId); } void MmWaveIndicationMessageHelper::FillCuCpValues (uint16_t numActiveUes) { FillBaseCuCpValues (numActiveUes); } void MmWaveIndicationMessageHelper::FillDuValues (std::string cellObjectId) { m_msgValues.m_cellObjectId = cellObjectId; m_msgValues.m_pmContainerValues = m_duValues; } void MmWaveIndicationMessageHelper::AddDuUePmItem ( std::string ueImsiComplete, long macPduUe, long macPduInitialUe, long macQpsk, long mac16Qam, long mac64Qam, long macRetx, long macVolume, long macPrb, long macMac04, long macMac59, long macMac1014, long macMac1519, long macMac2024, long macMac2529, long macSinrBin1, long macSinrBin2, long macSinrBin3, long macSinrBin4, long macSinrBin5, long macSinrBin6, long macSinrBin7, long rlcBufferOccup, double drbThrDlUeid) { Ptr ueVal = Create (ueImsiComplete); if (!m_reducedPmValues) { ueVal->AddItem ("TB.TotNbrDl.1.UEID", macPduUe); ueVal->AddItem ("TB.TotNbrDlInitial.UEID", macPduInitialUe); ueVal->AddItem ("TB.TotNbrDlInitial.Qpsk.UEID", macQpsk); ueVal->AddItem ("TB.TotNbrDlInitial.16Qam.UEID", mac16Qam); ueVal->AddItem ("TB.TotNbrDlInitial.64Qam.UEID", mac64Qam); ueVal->AddItem ("TB.ErrTotalNbrDl.1.UEID", macRetx); ueVal->AddItem ("QosFlow.PdcpPduVolumeDL_Filter.UEID", macVolume); ueVal->AddItem ("RRU.PrbUsedDl.UEID", (long) std::ceil (macPrb)); ueVal->AddItem ("CARR.PDSCHMCSDist.Bin1.UEID", macMac04); ueVal->AddItem ("CARR.PDSCHMCSDist.Bin2.UEID", macMac59); ueVal->AddItem ("CARR.PDSCHMCSDist.Bin3.UEID", macMac1014); ueVal->AddItem ("CARR.PDSCHMCSDist.Bin4.UEID", macMac1519); ueVal->AddItem ("CARR.PDSCHMCSDist.Bin5.UEID", macMac2024); ueVal->AddItem ("CARR.PDSCHMCSDist.Bin6.UEID", macMac2529); ueVal->AddItem ("L1M.RS-SINR.Bin34.UEID", macSinrBin1); ueVal->AddItem ("L1M.RS-SINR.Bin46.UEID", macSinrBin2); ueVal->AddItem ("L1M.RS-SINR.Bin58.UEID", macSinrBin3); ueVal->AddItem ("L1M.RS-SINR.Bin70.UEID", macSinrBin4); ueVal->AddItem ("L1M.RS-SINR.Bin82.UEID", macSinrBin5); ueVal->AddItem ("L1M.RS-SINR.Bin94.UEID", macSinrBin6); ueVal->AddItem ("L1M.RS-SINR.Bin127.UEID", macSinrBin7); ueVal->AddItem ("DRB.BufferSize.Qos.UEID", rlcBufferOccup); } // This value is not requested anymore, so it has been removed from the delivery, but it will be still logged; // ueVal->AddItem ("DRB.UEThpDlPdcpBased.UEID", drbThrDlPdcpBasedUeid); ueVal->AddItem ("DRB.UEThpDl.UEID", drbThrDlUeid); m_msgValues.m_ueIndications.insert (ueVal); } void MmWaveIndicationMessageHelper::AddDuCellPmItem ( long macPduCellSpecific, long macPduInitialCellSpecific, long macQpskCellSpecific, long mac16QamCellSpecific, long mac64QamCellSpecific, double prbUtilizationDl, long macRetxCellSpecific, long macVolumeCellSpecific, long macMac04CellSpecific, long macMac59CellSpecific, long macMac1014CellSpecific, long macMac1519CellSpecific, long macMac2024CellSpecific, long macMac2529CellSpecific, long macSinrBin1CellSpecific, long macSinrBin2CellSpecific, long macSinrBin3CellSpecific, long macSinrBin4CellSpecific, long macSinrBin5CellSpecific, long macSinrBin6CellSpecific, long macSinrBin7CellSpecific, long rlcBufferOccupCellSpecific, long activeUeDl) { Ptr cellVal = Create (); if (!m_reducedPmValues) { cellVal->AddItem ("TB.TotNbrDl.1", macPduCellSpecific); cellVal->AddItem ("TB.TotNbrDlInitial", macPduInitialCellSpecific); } cellVal->AddItem ("TB.TotNbrDlInitial.Qpsk", macQpskCellSpecific); cellVal->AddItem ("TB.TotNbrDlInitial.16Qam", mac16QamCellSpecific); cellVal->AddItem ("TB.TotNbrDlInitial.64Qam", mac64QamCellSpecific); cellVal->AddItem ("RRU.PrbUsedDl", (long) std::ceil (prbUtilizationDl)); if (!m_reducedPmValues) { cellVal->AddItem ("TB.ErrTotalNbrDl.1", macRetxCellSpecific); cellVal->AddItem ("QosFlow.PdcpPduVolumeDL_Filter", macVolumeCellSpecific); cellVal->AddItem ("CARR.PDSCHMCSDist.Bin1", macMac04CellSpecific); cellVal->AddItem ("CARR.PDSCHMCSDist.Bin2", macMac59CellSpecific); cellVal->AddItem ("CARR.PDSCHMCSDist.Bin3", macMac1014CellSpecific); cellVal->AddItem ("CARR.PDSCHMCSDist.Bin4", macMac1519CellSpecific); cellVal->AddItem ("CARR.PDSCHMCSDist.Bin5", macMac2024CellSpecific); cellVal->AddItem ("CARR.PDSCHMCSDist.Bin6", macMac2529CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin34", macSinrBin1CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin46", macSinrBin2CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin58", macSinrBin3CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin70", macSinrBin4CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin82", macSinrBin5CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin94", macSinrBin6CellSpecific); cellVal->AddItem ("L1M.RS-SINR.Bin127", macSinrBin7CellSpecific); cellVal->AddItem ("DRB.BufferSize.Qos", rlcBufferOccupCellSpecific); } cellVal->AddItem ("DRB.MeanActiveUeDl",activeUeDl); m_msgValues.m_cellMeasurementItems = cellVal; } void MmWaveIndicationMessageHelper::AddDuCellResRepPmItem (Ptr cellResRep) { m_duValues->m_cellResourceReportItems.insert (cellResRep); } void MmWaveIndicationMessageHelper::AddCuCpUePmItem (std::string ueImsiComplete, long numDrb, long drbRelAct, Ptr l3RrcMeasurementServing, Ptr l3RrcMeasurementNeigh) { Ptr ueVal = Create (ueImsiComplete); if (!m_reducedPmValues) { ueVal->AddItem ("DRB.EstabSucc.5QI.UEID", numDrb); ueVal->AddItem ("DRB.RelActNbr.5QI.UEID", drbRelAct); // not modeled in the simulator } ueVal->AddItem> ("HO.SrcCellQual.RS-SINR.UEID", l3RrcMeasurementServing); ueVal->AddItem> ("HO.TrgtCellQual.RS-SINR.UEID", l3RrcMeasurementNeigh); m_msgValues.m_ueIndications.insert (ueVal); } MmWaveIndicationMessageHelper::~MmWaveIndicationMessageHelper () { } } // namespace ns3