Left: | ||
Right: |
OLD | NEW |
---|---|
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC) | 3 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC) |
4 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
58 * \brief Class for forwarding CMAC SAP User functions. | 58 * \brief Class for forwarding CMAC SAP User functions. |
59 */ | 59 */ |
60 class EnbRrcMemberLteEnbCmacSapUser : public LteEnbCmacSapUser | 60 class EnbRrcMemberLteEnbCmacSapUser : public LteEnbCmacSapUser |
61 { | 61 { |
62 public: | 62 public: |
63 /** | 63 /** |
64 * Constructor | 64 * Constructor |
65 * | 65 * |
66 * \param rrc ENB RRC | 66 * \param rrc ENB RRC |
67 */ | 67 */ |
68 EnbRrcMemberLteEnbCmacSapUser (LteEnbRrc* rrc); | 68 EnbRrcMemberLteEnbCmacSapUser (LteEnbRrc* rrc, uint8_t componentCarrierId); |
69 | 69 |
70 virtual uint16_t AllocateTemporaryCellRnti (); | 70 virtual uint16_t AllocateTemporaryCellRnti (); |
71 virtual void NotifyLcConfigResult (uint16_t rnti, uint8_t lcid, bool success); | 71 virtual void NotifyLcConfigResult (uint16_t rnti, uint8_t lcid, bool success); |
72 virtual void RrcConfigurationUpdateInd (UeConfig params); | 72 virtual void RrcConfigurationUpdateInd (UeConfig params); |
73 | 73 |
74 private: | 74 private: |
75 LteEnbRrc* m_rrc; ///< the RRC | 75 LteEnbRrc* m_rrc; ///< the RRC |
76 uint8_t m_componentCarrierId; ///< Component carrier ID | |
76 }; | 77 }; |
77 | 78 |
78 EnbRrcMemberLteEnbCmacSapUser::EnbRrcMemberLteEnbCmacSapUser (LteEnbRrc* rrc) | 79 EnbRrcMemberLteEnbCmacSapUser::EnbRrcMemberLteEnbCmacSapUser (LteEnbRrc* rrc, ui nt8_t componentCarrierId) |
79 : m_rrc (rrc) | 80 : m_rrc (rrc) |
81 , m_componentCarrierId {componentCarrierId} | |
80 { | 82 { |
81 } | 83 } |
82 | 84 |
83 uint16_t | 85 uint16_t |
84 EnbRrcMemberLteEnbCmacSapUser::AllocateTemporaryCellRnti () | 86 EnbRrcMemberLteEnbCmacSapUser::AllocateTemporaryCellRnti () |
85 { | 87 { |
86 return m_rrc->DoAllocateTemporaryCellRnti (); | 88 return m_rrc->DoAllocateTemporaryCellRnti (m_componentCarrierId); |
87 } | 89 } |
88 | 90 |
89 void | 91 void |
90 EnbRrcMemberLteEnbCmacSapUser::NotifyLcConfigResult (uint16_t rnti, uint8_t lcid , bool success) | 92 EnbRrcMemberLteEnbCmacSapUser::NotifyLcConfigResult (uint16_t rnti, uint8_t lcid , bool success) |
91 { | 93 { |
92 m_rrc->DoNotifyLcConfigResult (rnti, lcid, success); | 94 m_rrc->DoNotifyLcConfigResult (rnti, lcid, success); |
93 } | 95 } |
94 | 96 |
95 void | 97 void |
96 EnbRrcMemberLteEnbCmacSapUser::RrcConfigurationUpdateInd (UeConfig params) | 98 EnbRrcMemberLteEnbCmacSapUser::RrcConfigurationUpdateInd (UeConfig params) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
132 | 134 |
133 NS_OBJECT_ENSURE_REGISTERED (UeManager); | 135 NS_OBJECT_ENSURE_REGISTERED (UeManager); |
134 | 136 |
135 | 137 |
136 UeManager::UeManager () | 138 UeManager::UeManager () |
137 { | 139 { |
138 NS_FATAL_ERROR ("this constructor is not expected to be used"); | 140 NS_FATAL_ERROR ("this constructor is not expected to be used"); |
139 } | 141 } |
140 | 142 |
141 | 143 |
142 UeManager::UeManager (Ptr<LteEnbRrc> rrc, uint16_t rnti, State s) | 144 UeManager::UeManager (Ptr<LteEnbRrc> rrc, uint16_t rnti, State s, uint8_t compon entCarrierId) |
143 : m_lastAllocatedDrbid (0), | 145 : m_lastAllocatedDrbid (0), |
144 m_rnti (rnti), | 146 m_rnti (rnti), |
145 m_imsi (0), | 147 m_imsi (0), |
148 m_componentCarrierId (componentCarrierId), | |
146 m_lastRrcTransactionIdentifier (0), | 149 m_lastRrcTransactionIdentifier (0), |
147 m_rrc (rrc), | 150 m_rrc (rrc), |
148 m_state (s), | 151 m_state (s), |
149 m_pendingRrcConnectionReconfiguration (false), | 152 m_pendingRrcConnectionReconfiguration (false), |
150 m_sourceX2apId (0), | 153 m_sourceX2apId (0), |
151 m_sourceCellId (0), | 154 m_sourceCellId (0), |
152 m_needPhyMacConfiguration (false), | 155 m_needPhyMacConfiguration (false), |
153 m_caSupportConfigured (false), | 156 m_caSupportConfigured (false), |
154 m_pendingStartDataRadioBearers (false) | 157 m_pendingStartDataRadioBearers (false) |
155 {· | 158 {· |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
201 lcinfo.qci = 0; | 204 lcinfo.qci = 0; |
202 lcinfo.isGbr = false; | 205 lcinfo.isGbr = false; |
203 lcinfo.mbrUl = 0; | 206 lcinfo.mbrUl = 0; |
204 lcinfo.mbrDl = 0; | 207 lcinfo.mbrDl = 0; |
205 lcinfo.gbrUl = 0; | 208 lcinfo.gbrUl = 0; |
206 lcinfo.gbrDl = 0; | 209 lcinfo.gbrDl = 0; |
207 | 210 |
208 // MacSapUserForRlc in the ComponentCarrierManager MacSapUser | 211 // MacSapUserForRlc in the ComponentCarrierManager MacSapUser |
209 LteMacSapUser* lteMacSapUser = m_rrc->m_ccmRrcSapProvider->ConfigureSignalBe arer(lcinfo, rlc->GetLteMacSapUser ());· | 212 LteMacSapUser* lteMacSapUser = m_rrc->m_ccmRrcSapProvider->ConfigureSignalBe arer(lcinfo, rlc->GetLteMacSapUser ());· |
210 // Signal Channel are only on Primary Carrier | 213 // Signal Channel are only on Primary Carrier |
211 m_rrc->m_cmacSapProvider.at (0)->AddLc (lcinfo, lteMacSapUser); | 214 m_rrc->m_cmacSapProvider.at (m_componentCarrierId)->AddLc (lcinfo, lteMacSap User); |
212 m_rrc->m_ccmRrcSapProvider->AddLc (lcinfo, lteMacSapUser); | 215 m_rrc->m_ccmRrcSapProvider->AddLc (lcinfo, lteMacSapUser); |
213 } | 216 } |
214 | 217 |
215 // setup the eNB side of SRB1; the UE side will be set up upon RRC connection establishment | 218 // setup the eNB side of SRB1; the UE side will be set up upon RRC connection establishment |
216 { | 219 { |
217 uint8_t lcid = 1; | 220 uint8_t lcid = 1; |
218 | 221 |
219 Ptr<LteRlc> rlc = CreateObject<LteRlcAm> ()->GetObject<LteRlc> (); | 222 Ptr<LteRlc> rlc = CreateObject<LteRlcAm> ()->GetObject<LteRlc> (); |
220 rlc->SetLteMacSapProvider (m_rrc->m_macSapProvider); | 223 rlc->SetLteMacSapProvider (m_rrc->m_macSapProvider); |
221 rlc->SetRnti (m_rnti); | 224 rlc->SetRnti (m_rnti); |
(...skipping 21 matching lines...) Expand all Loading... | |
243 lcinfo.lcGroup = 0; // all SRBs always mapped to LCG 0 | 246 lcinfo.lcGroup = 0; // all SRBs always mapped to LCG 0 |
244 lcinfo.qci = EpsBearer::GBR_CONV_VOICE; // not sure why the FF API requires a CQI even for SRBs... | 247 lcinfo.qci = EpsBearer::GBR_CONV_VOICE; // not sure why the FF API requires a CQI even for SRBs... |
245 lcinfo.isGbr = true; | 248 lcinfo.isGbr = true; |
246 lcinfo.mbrUl = 1e6; | 249 lcinfo.mbrUl = 1e6; |
247 lcinfo.mbrDl = 1e6; | 250 lcinfo.mbrDl = 1e6; |
248 lcinfo.gbrUl = 1e4; | 251 lcinfo.gbrUl = 1e4; |
249 lcinfo.gbrDl = 1e4; | 252 lcinfo.gbrDl = 1e4; |
250 // MacSapUserForRlc in the ComponentCarrierManager MacSapUser | 253 // MacSapUserForRlc in the ComponentCarrierManager MacSapUser |
251 LteMacSapUser* MacSapUserForRlc = m_rrc->m_ccmRrcSapProvider->ConfigureSigna lBearer(lcinfo, rlc->GetLteMacSapUser ());· | 254 LteMacSapUser* MacSapUserForRlc = m_rrc->m_ccmRrcSapProvider->ConfigureSigna lBearer(lcinfo, rlc->GetLteMacSapUser ());· |
252 // Signal Channel are only on Primary Carrier | 255 // Signal Channel are only on Primary Carrier |
253 m_rrc->m_cmacSapProvider.at (0)->AddLc (lcinfo, MacSapUserForRlc); | 256 m_rrc->m_cmacSapProvider.at (m_componentCarrierId)->AddLc (lcinfo, MacSapUse rForRlc); |
254 m_rrc->m_ccmRrcSapProvider->AddLc (lcinfo, MacSapUserForRlc); | 257 m_rrc->m_ccmRrcSapProvider->AddLc (lcinfo, MacSapUserForRlc); |
255 } | 258 } |
256 | 259 |
257 LteEnbRrcSapUser::SetupUeParameters ueParams; | 260 LteEnbRrcSapUser::SetupUeParameters ueParams; |
258 ueParams.srb0SapProvider = m_srb0->m_rlc->GetLteRlcSapProvider (); | 261 ueParams.srb0SapProvider = m_srb0->m_rlc->GetLteRlcSapProvider (); |
259 ueParams.srb1SapProvider = m_srb1->m_pdcp->GetLtePdcpSapProvider (); | 262 ueParams.srb1SapProvider = m_srb1->m_pdcp->GetLtePdcpSapProvider (); |
260 m_rrc->m_rrcSapUser->SetupUe (m_rnti, ueParams); | 263 m_rrc->m_rrcSapUser->SetupUe (m_rnti, ueParams); |
261 | 264 |
262 // configure MAC (and scheduler) | 265 // configure MAC (and scheduler) |
263 LteEnbCmacSapProvider::UeConfig req; | 266 LteEnbCmacSapProvider::UeConfig req; |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
579 { | 582 { |
580 NS_LOG_FUNCTION (this << cellId); | 583 NS_LOG_FUNCTION (this << cellId); |
581 switch (m_state) | 584 switch (m_state) |
582 { | 585 { |
583 case CONNECTED_NORMALLY: | 586 case CONNECTED_NORMALLY: |
584 { | 587 { |
585 m_targetCellId = cellId; | 588 m_targetCellId = cellId; |
586 EpcX2SapProvider::HandoverRequestParams params; | 589 EpcX2SapProvider::HandoverRequestParams params; |
587 params.oldEnbUeX2apId = m_rnti; | 590 params.oldEnbUeX2apId = m_rnti; |
588 params.cause = EpcX2SapProvider::HandoverDesirableForRadioReaso n; | 591 params.cause = EpcX2SapProvider::HandoverDesirableForRadioReaso n; |
589 params.sourceCellId = m_rrc->m_cellId; | 592 params.sourceCellId = m_rrc->ComponentCarrierToCellId (m_componentCarr ierId); |
590 params.targetCellId = cellId; | 593 params.targetCellId = cellId; |
591 params.mmeUeS1apId = m_imsi; | 594 params.mmeUeS1apId = m_imsi; |
592 params.ueAggregateMaxBitRateDownlink = 200 * 1000; | 595 params.ueAggregateMaxBitRateDownlink = 200 * 1000; |
593 params.ueAggregateMaxBitRateUplink = 100 * 1000; | 596 params.ueAggregateMaxBitRateUplink = 100 * 1000; |
594 params.bearers = GetErabList (); | 597 params.bearers = GetErabList (); |
595 | 598 |
596 LteRrcSap::HandoverPreparationInfo hpi; | 599 LteRrcSap::HandoverPreparationInfo hpi; |
597 hpi.asConfig.sourceUeIdentity = m_rnti; | 600 hpi.asConfig.sourceUeIdentity = m_rnti; |
598 hpi.asConfig.sourceDlCarrierFreq = m_rrc->m_dlEarfcn; | 601 hpi.asConfig.sourceDlCarrierFreq = m_rrc->m_dlEarfcn; |
599 hpi.asConfig.sourceMeasConfig = m_rrc->m_ueMeasConfig; | 602 hpi.asConfig.sourceMeasConfig = m_rrc->m_ueMeasConfig; |
600 hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandov erPreparationInfo (); | 603 hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandov erPreparationInfo (); |
601 hpi.asConfig.sourceMasterInformationBlock.dlBandwidth = m_rrc->m_dlBandw idth; | 604 hpi.asConfig.sourceMasterInformationBlock.dlBandwidth = m_rrc->m_dlBandw idth; |
602 hpi.asConfig.sourceMasterInformationBlock.systemFrameNumber = 0; | 605 hpi.asConfig.sourceMasterInformationBlock.systemFrameNumber = 0; |
603 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plm nIdentityInfo.plmnIdentity = m_rrc->m_sib1.cellAccessRelatedInfo.plmnIdentityInf o.plmnIdentity; | 606 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plm nIdentityInfo.plmnIdentity = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessR elatedInfo.plmnIdentityInfo.plmnIdentity; |
604 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cel lIdentity = m_rrc->m_cellId; | 607 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cel lIdentity = m_rrc->ComponentCarrierToCellId (m_componentCarrierId); |
605 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csg Indication = m_rrc->m_sib1.cellAccessRelatedInfo.csgIndication; | 608 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csg Indication = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.csgIn dication; |
606 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csg Identity = m_rrc->m_sib1.cellAccessRelatedInfo.csgIdentity; | 609 hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csg Identity = m_rrc->m_sib1.at (m_componentCarrierId).cellAccessRelatedInfo.csgIden tity; |
607 LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider.at (0)-> GetRachConfig (); | 610 LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider.at (m_co mponentCarrierId)->GetRachConfig (); |
608 hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon .rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles; | 611 hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon .rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles; |
609 hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon .rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax; | 612 hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon .rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax; |
610 hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon .rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSi ze; | 613 hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon .rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowSi ze; |
611 hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq = m_rrc->m_ulEarfcn; | 614 hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulCarrierFreq = m_rrc->m_ulEarfcn; |
612 hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth = m_ rrc->m_ulBandwidth; | 615 hpi.asConfig.sourceSystemInformationBlockType2.freqInfo.ulBandwidth = m_ rrc->m_ulBandwidth; |
613 params.rrcContext = m_rrc->m_rrcSapUser->EncodeHandoverPreparationInform ation (hpi); | 616 params.rrcContext = m_rrc->m_rrcSapUser->EncodeHandoverPreparationInform ation (hpi); |
614 | 617 |
615 NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); | 618 NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
616 NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); | 619 NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); |
617 NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); | 620 NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
(...skipping 27 matching lines...) Expand all Loading... | |
645 // without actual RRC protocol encoding.· | 648 // without actual RRC protocol encoding.· |
646 | 649 |
647 Ptr<Packet> encodedHandoverCommand = params.rrcContext; | 650 Ptr<Packet> encodedHandoverCommand = params.rrcContext; |
648 LteRrcSap::RrcConnectionReconfiguration handoverCommand = m_rrc->m_rrcSapUser- >DecodeHandoverCommand (encodedHandoverCommand); | 651 LteRrcSap::RrcConnectionReconfiguration handoverCommand = m_rrc->m_rrcSapUser- >DecodeHandoverCommand (encodedHandoverCommand); |
649 m_rrc->m_rrcSapUser->SendRrcConnectionReconfiguration (m_rnti, handoverCommand ); | 652 m_rrc->m_rrcSapUser->SendRrcConnectionReconfiguration (m_rnti, handoverCommand ); |
650 SwitchToState (HANDOVER_LEAVING); | 653 SwitchToState (HANDOVER_LEAVING); |
651 m_handoverLeavingTimeout = Simulator::Schedule (m_rrc->m_handoverLeavingTimeou tDuration,· | 654 m_handoverLeavingTimeout = Simulator::Schedule (m_rrc->m_handoverLeavingTimeou tDuration,· |
652 &LteEnbRrc::HandoverLeavingTim eout,· | 655 &LteEnbRrc::HandoverLeavingTim eout,· |
653 m_rrc, m_rnti); | 656 m_rrc, m_rnti); |
654 NS_ASSERT (handoverCommand.haveMobilityControlInfo); | 657 NS_ASSERT (handoverCommand.haveMobilityControlInfo); |
655 m_rrc->m_handoverStartTrace (m_imsi, m_rrc->m_cellId, m_rnti, handoverCommand. mobilityControlInfo.targetPhysCellId); | 658 m_rrc->m_handoverStartTrace (m_imsi, m_rrc->ComponentCarrierToCellId (m_compon entCarrierId), m_rnti, handoverCommand.mobilityControlInfo.targetPhysCellId); |
656 | 659 |
657 EpcX2SapProvider::SnStatusTransferParams sst; | 660 EpcX2SapProvider::SnStatusTransferParams sst; |
658 sst.oldEnbUeX2apId = params.oldEnbUeX2apId; | 661 sst.oldEnbUeX2apId = params.oldEnbUeX2apId; |
659 sst.newEnbUeX2apId = params.newEnbUeX2apId; | 662 sst.newEnbUeX2apId = params.newEnbUeX2apId; |
660 sst.sourceCellId = params.sourceCellId; | 663 sst.sourceCellId = params.sourceCellId; |
661 sst.targetCellId = params.targetCellId; | 664 sst.targetCellId = params.targetCellId; |
662 for ( std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator drbIt = m_drb Map.begin (); | 665 for ( std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator drbIt = m_drb Map.begin (); |
663 drbIt != m_drbMap.end (); | 666 drbIt != m_drbMap.end (); |
664 ++drbIt) | 667 ++drbIt) |
665 { | 668 { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
728 } | 731 } |
729 } | 732 } |
730 } | 733 } |
731 break; | 734 break; |
732 | 735 |
733 case HANDOVER_LEAVING: | 736 case HANDOVER_LEAVING: |
734 { | 737 { |
735 NS_LOG_LOGIC ("forwarding data to target eNB over X2-U"); | 738 NS_LOG_LOGIC ("forwarding data to target eNB over X2-U"); |
736 uint8_t drbid = Bid2Drbid (bid); | 739 uint8_t drbid = Bid2Drbid (bid); |
737 EpcX2Sap::UeDataParams params; | 740 EpcX2Sap::UeDataParams params; |
738 params.sourceCellId = m_rrc->m_cellId; | 741 params.sourceCellId = m_rrc->ComponentCarrierToCellId (m_componentCarrie rId); |
739 params.targetCellId = m_targetCellId; | 742 params.targetCellId = m_targetCellId; |
740 params.gtpTeid = GetDataRadioBearerInfo (drbid)->m_gtpTeid; | 743 params.gtpTeid = GetDataRadioBearerInfo (drbid)->m_gtpTeid; |
741 params.ueData = p; | 744 params.ueData = p; |
742 m_rrc->m_x2SapProvider->SendUeData (params); | 745 m_rrc->m_x2SapProvider->SendUeData (params); |
743 } | 746 } |
744 break; | 747 break; |
745 | 748 |
746 default: | 749 default: |
747 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); | 750 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
748 break; | 751 break; |
(...skipping 28 matching lines...) Expand all Loading... | |
777 { | 780 { |
778 case HANDOVER_PATH_SWITCH: | 781 case HANDOVER_PATH_SWITCH: |
779 NS_LOG_INFO ("Send UE CONTEXT RELEASE from target eNB to source eNB"); | 782 NS_LOG_INFO ("Send UE CONTEXT RELEASE from target eNB to source eNB"); |
780 EpcX2SapProvider::UeContextReleaseParams ueCtxReleaseParams; | 783 EpcX2SapProvider::UeContextReleaseParams ueCtxReleaseParams; |
781 ueCtxReleaseParams.oldEnbUeX2apId = m_sourceX2apId; | 784 ueCtxReleaseParams.oldEnbUeX2apId = m_sourceX2apId; |
782 ueCtxReleaseParams.newEnbUeX2apId = m_rnti; | 785 ueCtxReleaseParams.newEnbUeX2apId = m_rnti; |
783 ueCtxReleaseParams.sourceCellId = m_sourceCellId; | 786 ueCtxReleaseParams.sourceCellId = m_sourceCellId; |
784 ueCtxReleaseParams.targetCellId = m_targetCellId; | 787 ueCtxReleaseParams.targetCellId = m_targetCellId; |
785 m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams); | 788 m_rrc->m_x2SapProvider->SendUeContextRelease (ueCtxReleaseParams); |
786 SwitchToState (CONNECTED_NORMALLY); | 789 SwitchToState (CONNECTED_NORMALLY); |
787 m_rrc->m_handoverEndOkTrace (m_imsi, m_rrc->m_cellId, m_rnti); | 790 m_rrc->m_handoverEndOkTrace (m_imsi, m_rrc->ComponentCarrierToCellId (m_co mponentCarrierId), m_rnti); |
788 break; | 791 break; |
789 | 792 |
790 default: | 793 default: |
791 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); | 794 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
792 break; | 795 break; |
793 } | 796 } |
794 } | 797 } |
795 | 798 |
796 void· | 799 void· |
797 UeManager::RecvHandoverPreparationFailure (uint16_t cellId) | 800 UeManager::RecvHandoverPreparationFailure (uint16_t cellId) |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
914 { | 917 { |
915 m_pendingRrcConnectionReconfiguration = true; // Force Reconfiguration | 918 m_pendingRrcConnectionReconfiguration = true; // Force Reconfiguration |
916 m_pendingStartDataRadioBearers = true; | 919 m_pendingStartDataRadioBearers = true; |
917 } | 920 } |
918 else | 921 else |
919 { | 922 { |
920 m_pendingStartDataRadioBearers = false; | 923 m_pendingStartDataRadioBearers = false; |
921 StartDataRadioBearers (); | 924 StartDataRadioBearers (); |
922 } | 925 } |
923 SwitchToState (CONNECTED_NORMALLY); | 926 SwitchToState (CONNECTED_NORMALLY); |
924 m_rrc->m_connectionEstablishedTrace (m_imsi, m_rrc->m_cellId, m_rnti); | 927 m_rrc->m_connectionEstablishedTrace (m_imsi, m_rrc->ComponentCarrierToCell Id (m_componentCarrierId), m_rnti); |
925 break; | 928 break; |
926 | 929 |
927 default: | 930 default: |
928 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); | 931 NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state)); |
929 break; | 932 break; |
930 } | 933 } |
931 } | 934 } |
932 | 935 |
933 void | 936 void |
934 UeManager::RecvRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionRe configurationCompleted msg) | 937 UeManager::RecvRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionRe configurationCompleted msg) |
(...skipping 15 matching lines...) Expand all Loading... | |
950 | 953 |
951 // configure PHY | 954 // configure PHY |
952 m_rrc->m_cphySapProvider.at (i)->SetTransmissionMode (req.m_rnti, req.m_transmissionMode); | 955 m_rrc->m_cphySapProvider.at (i)->SetTransmissionMode (req.m_rnti, req.m_transmissionMode); |
953 double paDouble = LteRrcSap::ConvertPdschConfigDedicated2Double (m _physicalConfigDedicated.pdschConfigDedicated); | 956 double paDouble = LteRrcSap::ConvertPdschConfigDedicated2Double (m _physicalConfigDedicated.pdschConfigDedicated); |
954 m_rrc->m_cphySapProvider.at (i)->SetPa (m_rnti, paDouble); | 957 m_rrc->m_cphySapProvider.at (i)->SetPa (m_rnti, paDouble); |
955 } | 958 } |
956 | 959 |
957 m_needPhyMacConfiguration = false; | 960 m_needPhyMacConfiguration = false; |
958 } | 961 } |
959 SwitchToState (CONNECTED_NORMALLY); | 962 SwitchToState (CONNECTED_NORMALLY); |
960 m_rrc->m_connectionReconfigurationTrace (m_imsi, m_rrc->m_cellId, m_rnti); | 963 m_rrc->m_connectionReconfigurationTrace (m_imsi, m_rrc->ComponentCarrierTo CellId (m_componentCarrierId), m_rnti); |
961 break; | 964 break; |
962 | 965 |
963 // This case is added to NS-3 in order to handle bearer de-activation scenar io for CONNECTED state UE | 966 // This case is added to NS-3 in order to handle bearer de-activation scenar io for CONNECTED state UE |
964 case CONNECTED_NORMALLY: | 967 case CONNECTED_NORMALLY: |
965 NS_LOG_INFO ("ignoring RecvRrcConnectionReconfigurationCompleted in state " << ToString (m_state)); | 968 NS_LOG_INFO ("ignoring RecvRrcConnectionReconfigurationCompleted in state " << ToString (m_state)); |
966 break; | 969 break; |
967 | 970 |
968 case HANDOVER_LEAVING: | 971 case HANDOVER_LEAVING: |
969 NS_LOG_INFO ("ignoring RecvRrcConnectionReconfigurationCompleted in state " << ToString (m_state)); | 972 NS_LOG_INFO ("ignoring RecvRrcConnectionReconfigurationCompleted in state " << ToString (m_state)); |
970 break; | 973 break; |
971 | 974 |
972 case HANDOVER_JOINING: | 975 case HANDOVER_JOINING: |
973 { | 976 { |
974 m_handoverJoiningTimeout.Cancel (); | 977 m_handoverJoiningTimeout.Cancel (); |
975 NS_LOG_INFO ("Send PATH SWITCH REQUEST to the MME"); | 978 NS_LOG_INFO ("Send PATH SWITCH REQUEST to the MME"); |
976 EpcEnbS1SapProvider::PathSwitchRequestParameters params; | 979 EpcEnbS1SapProvider::PathSwitchRequestParameters params; |
977 params.rnti = m_rnti; | 980 params.rnti = m_rnti; |
978 params.cellId = m_rrc->m_cellId; | 981 params.cellId = m_rrc->ComponentCarrierToCellId (m_componentCarrierId); |
979 params.mmeUeS1Id = m_imsi; | 982 params.mmeUeS1Id = m_imsi; |
980 SwitchToState (HANDOVER_PATH_SWITCH); | 983 SwitchToState (HANDOVER_PATH_SWITCH); |
981 for (std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it = m_ drbMap.begin (); | 984 for (std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it = m_ drbMap.begin (); |
982 it != m_drbMap.end (); | 985 it != m_drbMap.end (); |
983 ++it) | 986 ++it) |
984 { | 987 { |
985 EpcEnbS1SapProvider::BearerToBeSwitched b; | 988 EpcEnbS1SapProvider::BearerToBeSwitched b; |
986 b.epsBearerId = it->second->m_epsBearerIdentity; | 989 b.epsBearerId = it->second->m_epsBearerIdentity; |
987 b.teid = it->second->m_gtpTeid; | 990 b.teid = it->second->m_gtpTeid; |
988 params.bearersToBeSwitched.push_back (b); | 991 params.bearersToBeSwitched.push_back (b); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1032 void· | 1035 void· |
1033 UeManager::RecvMeasurementReport (LteRrcSap::MeasurementReport msg) | 1036 UeManager::RecvMeasurementReport (LteRrcSap::MeasurementReport msg) |
1034 { | 1037 { |
1035 uint8_t measId = msg.measResults.measId; | 1038 uint8_t measId = msg.measResults.measId; |
1036 NS_LOG_FUNCTION (this << (uint16_t) measId); | 1039 NS_LOG_FUNCTION (this << (uint16_t) measId); |
1037 NS_LOG_LOGIC ("measId " << (uint16_t) measId | 1040 NS_LOG_LOGIC ("measId " << (uint16_t) measId |
1038 << " haveMeasResultNeighCells " << msg.measResults.hav eMeasResultNeighCells | 1041 << " haveMeasResultNeighCells " << msg.measResults.hav eMeasResultNeighCells |
1039 << " measResultListEutra " << msg.measResults.measResu ltListEutra.size () | 1042 << " measResultListEutra " << msg.measResults.measResu ltListEutra.size () |
1040 << " haveScellsMeas " << msg.measResults.haveScellsMea s | 1043 << " haveScellsMeas " << msg.measResults.haveScellsMea s |
1041 << " measScellResultList " << msg.measResults.measScel lResultList.measResultScell.size ()); | 1044 << " measScellResultList " << msg.measResults.measScel lResultList.measResultScell.size ()); |
1042 NS_LOG_LOGIC ("serving cellId " << m_rrc->m_cellId | 1045 NS_LOG_LOGIC ("serving cellId " << m_rrc->ComponentCarrierToCellId (m_componen tCarrierId) |
1043 << " RSRP " << (uint16_t) msg.measResults.rsrp Result | 1046 << " RSRP " << (uint16_t) msg.measResults.rsrp Result |
1044 << " RSRQ " << (uint16_t) msg.measResults.rsrq Result); | 1047 << " RSRQ " << (uint16_t) msg.measResults.rsrq Result); |
1045 | 1048 |
1046 for (std::list <LteRrcSap::MeasResultEutra>::iterator it = msg.measResults.mea sResultListEutra.begin (); | 1049 for (std::list <LteRrcSap::MeasResultEutra>::iterator it = msg.measResults.mea sResultListEutra.begin (); |
1047 it != msg.measResults.measResultListEutra.end (); | 1050 it != msg.measResults.measResultListEutra.end (); |
1048 ++it) | 1051 ++it) |
1049 { | 1052 { |
1050 NS_LOG_LOGIC ("neighbour cellId " << it->physCellId | 1053 NS_LOG_LOGIC ("neighbour cellId " << it->physCellId |
1051 << " RSRP " << (it->haveRsrpResult ? (ui nt16_t) it->rsrpResult : 255) | 1054 << " RSRP " << (it->haveRsrpResult ? (ui nt16_t) it->rsrpResult : 255) |
1052 << " RSRQ " << (it->haveRsrqResult ? (ui nt16_t) it->rsrqResult : 255)); | 1055 << " RSRQ " << (it->haveRsrqResult ? (ui nt16_t) it->rsrqResult : 255)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1089 { | 1092 { |
1090 m_rrc->m_ffrRrcSapProvider.at (it->servFreqId)->ReportUeMeas (m_rnti, msg.measResults); | 1093 m_rrc->m_ffrRrcSapProvider.at (it->servFreqId)->ReportUeMeas (m_rnti, msg.measResults); |
1091 /// ToDo: implement on Ffr algorithm the code to properly parsing the new measResults message format | 1094 /// ToDo: implement on Ffr algorithm the code to properly parsing the new measResults message format |
1092 /// alternatevely it is needed to 'repack' properly the measResults me ssage before sending to Ffr· | 1095 /// alternatevely it is needed to 'repack' properly the measResults me ssage before sending to Ffr· |
1093 } | 1096 } |
1094 } | 1097 } |
1095 | 1098 |
1096 ///Report any measurements to ComponentCarrierManager, so it can react to any change or activate the SCC | 1099 ///Report any measurements to ComponentCarrierManager, so it can react to any change or activate the SCC |
1097 m_rrc->m_ccmRrcSapProvider->ReportUeMeas (m_rnti, msg.measResults); | 1100 m_rrc->m_ccmRrcSapProvider->ReportUeMeas (m_rnti, msg.measResults); |
1098 // fire a trace source | 1101 // fire a trace source |
1099 m_rrc->m_recvMeasurementReportTrace (m_imsi, m_rrc->m_cellId, m_rnti, msg); | 1102 m_rrc->m_recvMeasurementReportTrace (m_imsi, m_rrc->ComponentCarrierToCellId ( m_componentCarrierId), m_rnti, msg); |
1100 | 1103 |
1101 } // end of UeManager::RecvMeasurementReport | 1104 } // end of UeManager::RecvMeasurementReport |
1102 | 1105 |
1103 | 1106 |
1104 // methods forwarded from CMAC SAP | 1107 // methods forwarded from CMAC SAP |
1105 | 1108 |
1106 void | 1109 void |
1107 UeManager::CmacUeConfigUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams) | 1110 UeManager::CmacUeConfigUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams) |
1108 { | 1111 { |
1109 NS_LOG_FUNCTION (this << m_rnti); | 1112 NS_LOG_FUNCTION (this << m_rnti); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1141 { | 1144 { |
1142 return m_rnti; | 1145 return m_rnti; |
1143 } | 1146 } |
1144 | 1147 |
1145 uint64_t | 1148 uint64_t |
1146 UeManager::GetImsi (void) const | 1149 UeManager::GetImsi (void) const |
1147 { | 1150 { |
1148 return m_imsi; | 1151 return m_imsi; |
1149 } | 1152 } |
1150 | 1153 |
1154 uint8_t | |
1155 UeManager::GetComponentCarrierId () const | |
1156 { | |
1157 return m_componentCarrierId; | |
1158 } | |
1159 | |
1151 uint16_t | 1160 uint16_t |
1152 UeManager::GetSrsConfigurationIndex (void) const | 1161 UeManager::GetSrsConfigurationIndex (void) const |
1153 { | 1162 { |
1154 return m_physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex; | 1163 return m_physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex; |
1155 } | 1164 } |
1156 | 1165 |
1157 void | 1166 void |
1158 UeManager::SetSrsConfigurationIndex (uint16_t srsConfIndex) | 1167 UeManager::SetSrsConfigurationIndex (uint16_t srsConfIndex) |
1159 { | 1168 { |
1160 NS_LOG_FUNCTION (this); | 1169 NS_LOG_FUNCTION (this); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1342 | 1351 |
1343 | 1352 |
1344 void· | 1353 void· |
1345 UeManager::SwitchToState (State newState) | 1354 UeManager::SwitchToState (State newState) |
1346 { | 1355 { |
1347 NS_LOG_FUNCTION (this << ToString (newState)); | 1356 NS_LOG_FUNCTION (this << ToString (newState)); |
1348 State oldState = m_state; | 1357 State oldState = m_state; |
1349 m_state = newState; | 1358 m_state = newState; |
1350 NS_LOG_INFO (this << " IMSI " << m_imsi << " RNTI " << m_rnti << " UeManager " | 1359 NS_LOG_INFO (this << " IMSI " << m_imsi << " RNTI " << m_rnti << " UeManager " |
1351 << ToString (oldState) << " --> " << ToString (newState)); | 1360 << ToString (oldState) << " --> " << ToString (newState)); |
1352 m_stateTransitionTrace (m_imsi, m_rrc->m_cellId, m_rnti, oldState, newState); | 1361 m_stateTransitionTrace (m_imsi, m_rrc->ComponentCarrierToCellId (m_componentCa rrierId), m_rnti, oldState, newState); |
1353 | 1362 |
1354 switch (newState) | 1363 switch (newState) |
1355 { | 1364 { |
1356 case INITIAL_RANDOM_ACCESS: | 1365 case INITIAL_RANDOM_ACCESS: |
1357 case HANDOVER_JOINING: | 1366 case HANDOVER_JOINING: |
1358 NS_FATAL_ERROR ("cannot switch to an initial state"); | 1367 NS_FATAL_ERROR ("cannot switch to an initial state"); |
1359 break; | 1368 break; |
1360 | 1369 |
1361 case CONNECTION_SETUP: | 1370 case CONNECTION_SETUP: |
1362 break; | 1371 break; |
(...skipping 28 matching lines...) Expand all Loading... | |
1391 LteRrcSap::NonCriticalExtensionConfiguration | 1400 LteRrcSap::NonCriticalExtensionConfiguration |
1392 UeManager::BuildNonCriticalExtentionConfigurationCa () | 1401 UeManager::BuildNonCriticalExtentionConfigurationCa () |
1393 { | 1402 { |
1394 NS_LOG_FUNCTION ( this ); | 1403 NS_LOG_FUNCTION ( this ); |
1395 LteRrcSap::NonCriticalExtensionConfiguration ncec; | 1404 LteRrcSap::NonCriticalExtensionConfiguration ncec; |
1396 ·· | 1405 ·· |
1397 // LteRrcSap::SCellToAddMod scell; | 1406 // LteRrcSap::SCellToAddMod scell; |
1398 std::list<LteRrcSap::SCellToAddMod> SccCon; | 1407 std::list<LteRrcSap::SCellToAddMod> SccCon; |
1399 | 1408 |
1400 // sCellToReleaseList is always empty since no Scc is released | 1409 // sCellToReleaseList is always empty since no Scc is released |
1401 std::map<uint8_t, ComponentCarrier >::iterator it = m_rrc->m_componentCarrierP hyConf.begin(); | |
1402 | 1410 |
1403 it++; | 1411 for (auto &it: m_rrc->m_componentCarrierPhyConf) |
1404 for (;it!=m_rrc->m_componentCarrierPhyConf.end(); it++) | |
1405 { | 1412 { |
1413 uint8_t ccId = it.first; | |
1406 | 1414 |
1407 uint8_t ccId = it->first; | 1415 if (ccId == m_componentCarrierId) |
1408 ComponentCarrier eNbCcm = it->second; | 1416 { |
1417 // Skip primary CC. | |
1418 continue; | |
1419 } | |
1420 else if (ccId < m_componentCarrierId) | |
1421 { | |
1422 // Shift all IDs below PCC forward so PCC can use CC ID 1. | |
1423 ccId++; | |
1424 } | |
1425 | |
1426 Ptr<ComponentCarrierEnb> eNbCcm = it.second; | |
1409 LteRrcSap::SCellToAddMod component; | 1427 LteRrcSap::SCellToAddMod component; |
1410 component.sCellIndex = ccId; | 1428 component.sCellIndex = ccId; |
1411 component.cellIdentification.physCellId = m_rrc->m_cellId; | 1429 component.cellIdentification.physCellId = eNbCcm->GetCellId (); |
1412 component.cellIdentification.dlCarrierFreq = eNbCcm.m_dlEarfcn; | 1430 component.cellIdentification.dlCarrierFreq = eNbCcm->GetDlEarfcn (); |
1413 component.radioResourceConfigCommonSCell.haveNonUlConfiguration = true; | 1431 component.radioResourceConfigCommonSCell.haveNonUlConfiguration = true; |
1414 component.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth = eNbCcm.m_dlBandwidth; | 1432 component.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth = eNbCcm->GetDlBandwidth (); |
1415 component.radioResourceConfigCommonSCell.nonUlConfiguration.antennaInfoCom mon.antennaPortsCount = 0; | 1433 component.radioResourceConfigCommonSCell.nonUlConfiguration.antennaInfoCom mon.antennaPortsCount = 0; |
1416 component.radioResourceConfigCommonSCell.nonUlConfiguration.pdschConfigCom mon.referenceSignalPower = m_rrc->m_cphySapProvider.at (0)->GetReferenceSignalPo wer (); | 1434 component.radioResourceConfigCommonSCell.nonUlConfiguration.pdschConfigCom mon.referenceSignalPower = m_rrc->m_cphySapProvider.at (0)->GetReferenceSignalPo wer (); |
1417 component.radioResourceConfigCommonSCell.nonUlConfiguration.pdschConfigCom mon.pb = 0; | 1435 component.radioResourceConfigCommonSCell.nonUlConfiguration.pdschConfigCom mon.pb = 0; |
1418 component.radioResourceConfigCommonSCell.haveUlConfiguration = true; | 1436 component.radioResourceConfigCommonSCell.haveUlConfiguration = true; |
1419 component.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarr ierFreq = eNbCcm.m_ulEarfcn; | 1437 component.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarr ierFreq = eNbCcm->GetUlEarfcn (); |
1420 component.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBand width = eNbCcm.m_ulBandwidth; | 1438 component.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBand width = eNbCcm->GetUlBandwidth (); |
1421 component.radioResourceConfigCommonSCell.ulConfiguration.ulPowerControlCom monSCell.alpha = 0; | 1439 component.radioResourceConfigCommonSCell.ulConfiguration.ulPowerControlCom monSCell.alpha = 0; |
1422 //component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlCon figCommon.type = LteRrcSap::SoundingRsUlConfigDedicated::SETUP; | 1440 //component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlCon figCommon.type = LteRrcSap::SoundingRsUlConfigDedicated::SETUP; |
1423 component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlConfi gCommon.srsBandwidthConfig = 0; | 1441 component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlConfi gCommon.srsBandwidthConfig = 0; |
1424 component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlConfi gCommon.srsSubframeConfig = 0; | 1442 component.radioResourceConfigCommonSCell.ulConfiguration.soundingRsUlConfi gCommon.srsSubframeConfig = 0; |
1425 component.radioResourceConfigCommonSCell.ulConfiguration.prachConfigSCell. index = 0; | 1443 component.radioResourceConfigCommonSCell.ulConfiguration.prachConfigSCell. index = 0; |
1426 ···· | 1444 ···· |
1427 if (true) | 1445 if (true) |
1428 { | 1446 { |
1429 component.haveRadioResourceConfigDedicatedSCell = true; | 1447 component.haveRadioResourceConfigDedicatedSCell = true; |
1430 component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCel l.haveNonUlConfiguration = true; | 1448 component.radioResourceConfigDedicateSCell.physicalConfigDedicatedSCel l.haveNonUlConfiguration = true; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1474 m_cphySapProvider (0), | 1492 m_cphySapProvider (0), |
1475 m_configured (false), | 1493 m_configured (false), |
1476 m_lastAllocatedRnti (0), | 1494 m_lastAllocatedRnti (0), |
1477 m_srsCurrentPeriodicityId (0), | 1495 m_srsCurrentPeriodicityId (0), |
1478 m_lastAllocatedConfigurationIndex (0), | 1496 m_lastAllocatedConfigurationIndex (0), |
1479 m_reconfigureUes (false), | 1497 m_reconfigureUes (false), |
1480 m_numberOfComponentCarriers (0), | 1498 m_numberOfComponentCarriers (0), |
1481 m_carriersConfigured (false) | 1499 m_carriersConfigured (false) |
1482 { | 1500 { |
1483 NS_LOG_FUNCTION (this); | 1501 NS_LOG_FUNCTION (this); |
1484 m_cmacSapUser.push_back (new EnbRrcMemberLteEnbCmacSapUser (this)); | 1502 m_cmacSapUser.push_back (new EnbRrcMemberLteEnbCmacSapUser (this, 0)); |
1485 m_handoverManagementSapUser = new MemberLteHandoverManagementSapUser<LteEnbRrc > (this); | 1503 m_handoverManagementSapUser = new MemberLteHandoverManagementSapUser<LteEnbRrc > (this); |
1486 m_anrSapUser = new MemberLteAnrSapUser<LteEnbRrc> (this); | 1504 m_anrSapUser = new MemberLteAnrSapUser<LteEnbRrc> (this); |
1487 m_ffrRrcSapUser.push_back (new MemberLteFfrRrcSapUser<LteEnbRrc> (this)); | 1505 m_ffrRrcSapUser.push_back (new MemberLteFfrRrcSapUser<LteEnbRrc> (this)); |
1488 m_rrcSapProvider = new MemberLteEnbRrcSapProvider<LteEnbRrc> (this); | 1506 m_rrcSapProvider = new MemberLteEnbRrcSapProvider<LteEnbRrc> (this); |
1489 m_x2SapUser = new EpcX2SpecificEpcX2SapUser<LteEnbRrc> (this); | 1507 m_x2SapUser = new EpcX2SpecificEpcX2SapUser<LteEnbRrc> (this); |
1490 m_s1SapUser = new MemberEpcEnbS1SapUser<LteEnbRrc> (this); | 1508 m_s1SapUser = new MemberEpcEnbS1SapUser<LteEnbRrc> (this); |
1491 m_cphySapUser.push_back (new MemberLteEnbCphySapUser<LteEnbRrc> (this)); | 1509 m_cphySapUser.push_back (new MemberLteEnbCphySapUser<LteEnbRrc> (this)); |
1492 m_ccmRrcSapUser = new MemberLteCcmRrcSapUser <LteEnbRrc>(this); | 1510 m_ccmRrcSapUser = new MemberLteCcmRrcSapUser <LteEnbRrc>(this); |
1493 m_cphySapProvider.push_back (0); | 1511 m_cphySapProvider.push_back (0); |
1494 m_cmacSapProvider.push_back (0); | 1512 m_cmacSapProvider.push_back (0); |
1495 m_ffrRrcSapProvider.push_back (0); | 1513 m_ffrRrcSapProvider.push_back (0); |
1496 } | 1514 } |
1497 | 1515 |
1498 void LteEnbRrc::ConfigureCarriers(std::map<uint8_t, ComponentCarrier > ccPhyConf , uint16_t numberOfComponentCarriers) | 1516 void |
1517 LteEnbRrc::ConfigureCarriers (std::map<uint8_t, Ptr<ComponentCarrierEnb>> ccPhyC onf) | |
1499 { | 1518 { |
1500 NS_ASSERT_MSG (!m_carriersConfigured, "Secondary carriers can be configured on ly once."); | 1519 NS_ASSERT_MSG (!m_carriersConfigured, "Secondary carriers can be configured on ly once."); |
1501 m_componentCarrierPhyConf = ccPhyConf; | 1520 m_componentCarrierPhyConf = ccPhyConf; |
1502 m_numberOfComponentCarriers = numberOfComponentCarriers; | 1521 m_numberOfComponentCarriers = ccPhyConf.size (); |
1503 | 1522 |
1504 if (m_numberOfComponentCarriers < MIN_NO_CC || m_numberOfComponentCarriers > M AX_NO_CC) | 1523 NS_ASSERT (m_numberOfComponentCarriers >= MIN_NO_CC && m_numberOfComponentCarr iers <= MAX_NO_CC); |
1524 | |
1525 for (uint8_t i = 1; i < m_numberOfComponentCarriers; i++) | |
1505 { | 1526 { |
1506 // this check is neede in order to maintain backward compatibility with sc ripts and tests | 1527 m_cphySapUser.push_back (new MemberLteEnbCphySapUser<LteEnbRrc> (this)); |
1507 // if case lte-helper is not used (like in several tests) the m_numberOfCo mponentCarriers | 1528 m_cmacSapUser.push_back (new EnbRrcMemberLteEnbCmacSapUser (this, i)); |
1508 // is not set and then an error is rised | 1529 m_ffrRrcSapUser.push_back (new MemberLteFfrRrcSapUser<LteEnbRrc> (this)); |
1509 // In this case m_numberOfComponentCarriers is set to 1 | 1530 m_cphySapProvider.push_back (0); |
1510 m_numberOfComponentCarriers = MIN_NO_CC; | 1531 m_cmacSapProvider.push_back (0); |
1532 m_ffrRrcSapProvider.push_back (0); | |
1511 } | 1533 } |
1512 ···· | |
1513 if (m_numberOfComponentCarriers > MIN_NO_CC) | |
1514 { | |
1515 for ( uint8_t i = 1; i < m_numberOfComponentCarriers ; i++) | |
1516 { | |
1517 m_cphySapUser.push_back (new MemberLteEnbCphySapUser<LteEnbRrc> (th is)); | |
1518 m_cmacSapUser.push_back (new EnbRrcMemberLteEnbCmacSapUser (this)); | |
1519 m_ffrRrcSapUser.push_back (new MemberLteFfrRrcSapUser<LteEnbRrc> (t his)); | |
1520 m_cphySapProvider.push_back (0); | |
1521 m_cmacSapProvider.push_back (0); | |
1522 m_ffrRrcSapProvider.push_back (0); | |
1523 }· | |
1524 } | |
1525 m_carriersConfigured = true; | 1534 m_carriersConfigured = true; |
1526 Object::DoInitialize (); | 1535 Object::DoInitialize (); |
1527 } | 1536 } |
1528 | 1537 |
1529 LteEnbRrc::~LteEnbRrc () | 1538 LteEnbRrc::~LteEnbRrc () |
1530 { | 1539 { |
1531 NS_LOG_FUNCTION (this); | 1540 NS_LOG_FUNCTION (this); |
1532 } | 1541 } |
1533 | 1542 |
1534 | 1543 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1652 "3GPP TS 36.133. This restriction, however, only applies to " | 1661 "3GPP TS 36.133. This restriction, however, only applies to " |
1653 "initial cell selection and EPC-enabled simulation.", | 1662 "initial cell selection and EPC-enabled simulation.", |
1654 TypeId::ATTR_GET | TypeId::ATTR_CONSTRUCT, | 1663 TypeId::ATTR_GET | TypeId::ATTR_CONSTRUCT, |
1655 IntegerValue (-70), | 1664 IntegerValue (-70), |
1656 MakeIntegerAccessor (&LteEnbRrc::m_qRxLevMin), | 1665 MakeIntegerAccessor (&LteEnbRrc::m_qRxLevMin), |
1657 MakeIntegerChecker<int8_t> (-70, -22)) | 1666 MakeIntegerChecker<int8_t> (-70, -22)) |
1658 .AddAttribute ("NumberOfComponentCarriers", | 1667 .AddAttribute ("NumberOfComponentCarriers", |
1659 "Number of Component Carriers ", | 1668 "Number of Component Carriers ", |
1660 UintegerValue (1), | 1669 UintegerValue (1), |
1661 MakeIntegerAccessor (&LteEnbRrc::m_numberOfComponentCarriers) , | 1670 MakeIntegerAccessor (&LteEnbRrc::m_numberOfComponentCarriers) , |
1662 MakeIntegerChecker<int16_t> (MIN_NO_CC, 2)) // to change, cur rently the CC number is liited to 2 | 1671 MakeIntegerChecker<int16_t> (MIN_NO_CC, MAX_NO_CC)) |
1663 | 1672 |
1664 // Handover related attributes | 1673 // Handover related attributes |
1665 .AddAttribute ("AdmitHandoverRequest", | 1674 .AddAttribute ("AdmitHandoverRequest", |
1666 "Whether to admit an X2 handover request from another eNB", | 1675 "Whether to admit an X2 handover request from another eNB", |
1667 BooleanValue (true), | 1676 BooleanValue (true), |
1668 MakeBooleanAccessor (&LteEnbRrc::m_admitHandoverRequest), | 1677 MakeBooleanAccessor (&LteEnbRrc::m_admitHandoverRequest), |
1669 MakeBooleanChecker ()) | 1678 MakeBooleanChecker ()) |
1670 .AddAttribute ("AdmitRrcConnectionRequest", | 1679 .AddAttribute ("AdmitRrcConnectionRequest", |
1671 "Whether to admit a connection request from a UE", | 1680 "Whether to admit a connection request from a UE", |
1672 BooleanValue (true), | 1681 BooleanValue (true), |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1902 std::map<uint16_t, Ptr<UeManager> >::const_iterator it = m_ueMap.find (rnti); | 1911 std::map<uint16_t, Ptr<UeManager> >::const_iterator it = m_ueMap.find (rnti); |
1903 return (it != m_ueMap.end ()); | 1912 return (it != m_ueMap.end ()); |
1904 } | 1913 } |
1905 | 1914 |
1906 Ptr<UeManager> | 1915 Ptr<UeManager> |
1907 LteEnbRrc::GetUeManager (uint16_t rnti) | 1916 LteEnbRrc::GetUeManager (uint16_t rnti) |
1908 { | 1917 { |
1909 NS_LOG_FUNCTION (this << (uint32_t) rnti); | 1918 NS_LOG_FUNCTION (this << (uint32_t) rnti); |
1910 NS_ASSERT (0 != rnti); | 1919 NS_ASSERT (0 != rnti); |
1911 std::map<uint16_t, Ptr<UeManager> >::iterator it = m_ueMap.find (rnti); | 1920 std::map<uint16_t, Ptr<UeManager> >::iterator it = m_ueMap.find (rnti); |
1912 NS_ASSERT_MSG (it != m_ueMap.end (), "RNTI " << rnti << " not found in eNB wit h cellId " << m_cellId); | 1921 NS_ASSERT_MSG (it != m_ueMap.end (), "UE manager for RNTI " << rnti << " not f ound"); |
1913 return it->second; | 1922 return it->second; |
1914 } | 1923 } |
1915 | 1924 |
1916 uint8_t | 1925 uint8_t |
1917 LteEnbRrc::AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config) | 1926 LteEnbRrc::AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config) |
1918 { | 1927 { |
1919 NS_LOG_FUNCTION (this); | 1928 NS_LOG_FUNCTION (this); |
1920 | 1929 |
1921 // SANITY CHECK | 1930 // SANITY CHECK |
1922 | 1931 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1995 measId.reportConfigId = nextId; | 2004 measId.reportConfigId = nextId; |
1996 | 2005 |
1997 // add both to the list of UE measurement configuration | 2006 // add both to the list of UE measurement configuration |
1998 m_ueMeasConfig.reportConfigToAddModList.push_back (reportConfig); | 2007 m_ueMeasConfig.reportConfigToAddModList.push_back (reportConfig); |
1999 m_ueMeasConfig.measIdToAddModList.push_back (measId); | 2008 m_ueMeasConfig.measIdToAddModList.push_back (measId); |
2000 | 2009 |
2001 return nextId; | 2010 return nextId; |
2002 } | 2011 } |
2003 | 2012 |
2004 void | 2013 void |
2005 LteEnbRrc::ConfigureCell (uint16_t cellId) | 2014 LteEnbRrc::ConfigureCell (std::map<uint8_t, Ptr<ComponentCarrierEnb>> ccPhyConf) |
2006 { | 2015 { |
2007 std::map<uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyConf. begin (); | 2016 auto it = ccPhyConf.begin (); |
2008 uint8_t ulBandwidth = it->second.m_ulBandwidth; | 2017 NS_ASSERT (it != ccPhyConf.end ()); |
2009 uint8_t dlBandwidth = it->second.m_dlBandwidth; | 2018 uint8_t ulBandwidth = it->second->GetUlBandwidth (); |
2010 uint32_t ulEarfcn = it->second.m_ulEarfcn; | 2019 uint8_t dlBandwidth = it->second->GetDlBandwidth (); |
2011 uint32_t dlEarfcn = it->second.m_dlEarfcn; | 2020 uint32_t ulEarfcn = it->second->GetUlEarfcn (); |
2021 uint32_t dlEarfcn = it->second->GetDlEarfcn (); | |
2012 NS_LOG_FUNCTION (this << (uint16_t) ulBandwidth << (uint16_t) dlBandwidth | 2022 NS_LOG_FUNCTION (this << (uint16_t) ulBandwidth << (uint16_t) dlBandwidth |
2013 << ulEarfcn << dlEarfcn << cellId); | 2023 << ulEarfcn << dlEarfcn); |
2014 NS_ASSERT (!m_configured); | 2024 NS_ASSERT (!m_configured); |
2015 | 2025 |
2016 for (it = m_componentCarrierPhyConf.begin (); it != m_componentCarrierPhyConf. end (); ++it) | 2026 for (const auto &it: ccPhyConf) |
2017 { | 2027 { |
2018 m_cphySapProvider[it->first]->SetBandwidth (it->second.m_ulBandwidth, it-> second.m_dlBandwidth); | 2028 m_cphySapProvider.at (it.first)->SetBandwidth (it.second->GetUlBandwidth ( ), it.second->GetDlBandwidth ()); |
2019 m_cphySapProvider[it->first]->SetEarfcn (it->second.m_ulEarfcn, it->second .m_dlEarfcn); | 2029 m_cphySapProvider.at (it.first)->SetEarfcn (it.second->GetUlEarfcn (), it. second->GetDlEarfcn ()); |
2020 m_cphySapProvider[it->first]->SetCellId (cellId); | 2030 m_cphySapProvider.at (it.first)->SetCellId (it.second->GetCellId ()); |
2021 m_cmacSapProvider[it->first]->ConfigureMac (it->second.m_ulBandwidth, it-> second.m_dlBandwidth); | 2031 m_cmacSapProvider.at (it.first)->ConfigureMac (it.second->GetUlBandwidth ( ), it.second->GetDlBandwidth ()); |
2022 m_ffrRrcSapProvider[it->first]->SetCellId (cellId); | 2032 m_ffrRrcSapProvider.at (it.first)->SetCellId (it.second->GetCellId ()); |
2023 m_ffrRrcSapProvider[it->first]->SetBandwidth (it->second.m_ulBandwidth, it ->second.m_dlBandwidth); | 2033 m_ffrRrcSapProvider.at (it.first)->SetBandwidth (it.second->GetUlBandwidth (), it.second->GetDlBandwidth ()); |
2024 } | 2034 } |
2025 | 2035 |
2026 m_dlEarfcn = dlEarfcn; | 2036 m_dlEarfcn = dlEarfcn; |
2027 m_ulEarfcn = ulEarfcn; | 2037 m_ulEarfcn = ulEarfcn; |
2028 m_dlBandwidth = dlBandwidth; | 2038 m_dlBandwidth = dlBandwidth; |
2029 m_ulBandwidth = ulBandwidth; | 2039 m_ulBandwidth = ulBandwidth; |
2030 m_cellId = cellId; | |
2031 | 2040 |
2032 /* | 2041 /* |
2033 * Initializing the list of UE measurement configuration (m_ueMeasConfig). | 2042 * Initializing the list of UE measurement configuration (m_ueMeasConfig). |
2034 * Only intra-frequency measurements are supported, so only one measurement | 2043 * Only intra-frequency measurements are supported, so only one measurement |
2035 * object is created. | 2044 * object is created. |
2036 */ | 2045 */ |
2037 | 2046 |
2038 LteRrcSap::MeasObjectToAddMod measObject; | 2047 LteRrcSap::MeasObjectToAddMod measObject; |
2039 measObject.measObjectId = 1; | 2048 measObject.measObjectId = 1; |
2040 measObject.measObjectEutra.carrierFreq = m_dlEarfcn; | 2049 measObject.measObjectEutra.carrierFreq = m_dlEarfcn; |
2041 measObject.measObjectEutra.allowedMeasBandwidth = m_dlBandwidth; | 2050 measObject.measObjectEutra.allowedMeasBandwidth = m_dlBandwidth; |
2042 measObject.measObjectEutra.presenceAntennaPort1 = false; | 2051 measObject.measObjectEutra.presenceAntennaPort1 = false; |
2043 measObject.measObjectEutra.neighCellConfig = 0; | 2052 measObject.measObjectEutra.neighCellConfig = 0; |
2044 measObject.measObjectEutra.offsetFreq = 0; | 2053 measObject.measObjectEutra.offsetFreq = 0; |
2045 measObject.measObjectEutra.haveCellForWhichToReportCGI = false; | 2054 measObject.measObjectEutra.haveCellForWhichToReportCGI = false; |
2046 | 2055 |
2047 m_ueMeasConfig.measObjectToAddModList.push_back (measObject); | 2056 m_ueMeasConfig.measObjectToAddModList.push_back (measObject); |
2048 m_ueMeasConfig.haveQuantityConfig = true; | 2057 m_ueMeasConfig.haveQuantityConfig = true; |
2049 m_ueMeasConfig.quantityConfig.filterCoefficientRSRP = m_rsrpFilterCoefficient; | 2058 m_ueMeasConfig.quantityConfig.filterCoefficientRSRP = m_rsrpFilterCoefficient; |
2050 m_ueMeasConfig.quantityConfig.filterCoefficientRSRQ = m_rsrqFilterCoefficient; | 2059 m_ueMeasConfig.quantityConfig.filterCoefficientRSRQ = m_rsrqFilterCoefficient; |
2051 m_ueMeasConfig.haveMeasGapConfig = false; | 2060 m_ueMeasConfig.haveMeasGapConfig = false; |
2052 m_ueMeasConfig.haveSmeasure = false; | 2061 m_ueMeasConfig.haveSmeasure = false; |
2053 m_ueMeasConfig.haveSpeedStatePars = false; | 2062 m_ueMeasConfig.haveSpeedStatePars = false; |
2054 | 2063 |
2055 // Enabling MIB transmission | 2064 m_sib1.clear (); |
2056 LteRrcSap::MasterInformationBlock mib; | 2065 m_sib1.reserve (ccPhyConf.size ()); |
2057 mib.dlBandwidth = m_dlBandwidth; | 2066 for (const auto &it: ccPhyConf) |
2058 mib.systemFrameNumber = 0; | 2067 { |
2059 // Enabling SIB1 transmission with default values | 2068 // Enabling MIB transmission |
2060 m_sib1.cellAccessRelatedInfo.cellIdentity = cellId; | 2069 LteRrcSap::MasterInformationBlock mib; |
2061 m_sib1.cellAccessRelatedInfo.csgIndication = false; | 2070 mib.dlBandwidth = it.second->GetDlBandwidth (); |
2062 m_sib1.cellAccessRelatedInfo.csgIdentity = 0; | 2071 mib.systemFrameNumber = 0; |
2063 m_sib1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = 0; // not used | 2072 m_cphySapProvider.at (it.first)->SetMasterInformationBlock (mib); |
2064 m_sib1.cellSelectionInfo.qQualMin = -34; // not used, set as minimum value | |
2065 m_sib1.cellSelectionInfo.qRxLevMin = m_qRxLevMin; // set as minimum value | |
2066 | 2073 |
2067 for (it = m_componentCarrierPhyConf.begin (); it != m_componentCarrierPhyConf. end (); ++it) | 2074 // Enabling SIB1 transmission with default values |
2068 { | 2075 LteRrcSap::SystemInformationBlockType1 sib1; |
2069 m_cphySapProvider.at (it->first)->SetMasterInformationBlock (mib); | 2076 sib1.cellAccessRelatedInfo.cellIdentity = it.second->GetCellId (); |
2070 m_cphySapProvider.at (it->first)->SetSystemInformationBlockType1 (m_sib1); | 2077 sib1.cellAccessRelatedInfo.csgIndication = false; |
2078 sib1.cellAccessRelatedInfo.csgIdentity = 0; | |
2079 sib1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = 0; // not used | |
2080 sib1.cellSelectionInfo.qQualMin = -34; // not used, set as minimum value | |
2081 sib1.cellSelectionInfo.qRxLevMin = m_qRxLevMin; // set as minimum value | |
2082 m_sib1.push_back (sib1); | |
2083 m_cphySapProvider.at (it.first)->SetSystemInformationBlockType1 (sib1); | |
2071 } | 2084 } |
2072 /* | 2085 /* |
2073 * Enabling transmission of other SIB. The first time System Information is | 2086 * Enabling transmission of other SIB. The first time System Information is |
2074 * transmitted is arbitrarily assumed to be at +0.016s, and then it will be | 2087 * transmitted is arbitrarily assumed to be at +0.016s, and then it will be |
2075 * regularly transmitted every 80 ms by default (set the | 2088 * regularly transmitted every 80 ms by default (set the |
2076 * SystemInformationPeriodicity attribute to configure this). | 2089 * SystemInformationPeriodicity attribute to configure this). |
2077 */ | 2090 */ |
2078 Simulator::Schedule (MilliSeconds (16), &LteEnbRrc::SendSystemInformation, thi s); | 2091 Simulator::Schedule (MilliSeconds (16), &LteEnbRrc::SendSystemInformation, thi s); |
2079 | 2092 |
2080 m_configured = true; | 2093 m_configured = true; |
2081 | 2094 |
2082 } | 2095 } |
2083 | 2096 |
2084 | 2097 |
2085 void | 2098 void |
2086 LteEnbRrc::SetCellId (uint16_t cellId) | 2099 LteEnbRrc::SetCellId (uint16_t cellId) |
2087 { | 2100 { |
2088 m_cellId = cellId; | 2101 // update SIB1 |
2089 | 2102 m_sib1.at (0).cellAccessRelatedInfo.cellIdentity = cellId; |
2090 // update SIB1 too | 2103 m_cphySapProvider.at (0)->SetSystemInformationBlockType1 (m_sib1.at (0)); |
2091 m_sib1.cellAccessRelatedInfo.cellIdentity = cellId; | |
2092 m_cphySapProvider.at (0)->SetSystemInformationBlockType1 (m_sib1); | |
2093 } | 2104 } |
2094 | 2105 |
2095 void | 2106 void |
2096 LteEnbRrc::SetCellId (uint16_t cellId, uint8_t ccIndex) | 2107 LteEnbRrc::SetCellId (uint16_t cellId, uint8_t ccIndex) |
2097 { | 2108 { |
2098 m_cellId = cellId; | 2109 // update SIB1 |
2099 // update SIB1 too | 2110 m_sib1.at (ccIndex).cellAccessRelatedInfo.cellIdentity = cellId; |
2100 m_sib1.cellAccessRelatedInfo.cellIdentity = cellId; | 2111 m_cphySapProvider.at (ccIndex)->SetSystemInformationBlockType1 (m_sib1.at (ccI ndex)); |
2101 m_cphySapProvider[ccIndex]->SetSystemInformationBlockType1 (m_sib1); | 2112 } |
2113 | |
2114 uint8_t | |
2115 LteEnbRrc::CellToComponentCarrierId (uint16_t cellId) | |
2116 { | |
2117 NS_LOG_FUNCTION (this << cellId); | |
2118 for (auto &it: m_componentCarrierPhyConf) | |
2119 { | |
2120 if (it.second->GetCellId () == cellId) | |
2121 { | |
2122 return it.first; | |
2123 } | |
2124 } | |
2125 NS_FATAL_ERROR ("Cell " << cellId << " not found in CC map"); | |
2126 } | |
2127 | |
2128 uint16_t | |
2129 LteEnbRrc::ComponentCarrierToCellId (uint8_t componentCarrierId) | |
2130 { | |
2131 NS_LOG_FUNCTION (this << componentCarrierId); | |
Tom Henderson
2017/06/29 15:46:30
whenever logging a uint8_t, cast it to uint16_t to
ilabdsf
2017/06/30 12:25:33
I will change it to "+componentCarrierId".
| |
2132 return m_componentCarrierPhyConf.at (componentCarrierId)->GetCellId (); | |
2102 } | 2133 } |
2103 | 2134 |
2104 bool | 2135 bool |
2105 LteEnbRrc::SendData (Ptr<Packet> packet) | 2136 LteEnbRrc::SendData (Ptr<Packet> packet) |
2106 { | 2137 { |
2107 NS_LOG_FUNCTION (this << packet); | 2138 NS_LOG_FUNCTION (this << packet); |
2108 | 2139 |
2109 EpsBearerTag tag; | 2140 EpsBearerTag tag; |
2110 bool found = packet->RemovePacketTag (tag); | 2141 bool found = packet->RemovePacketTag (tag); |
2111 NS_ASSERT_MSG (found, "no EpsBearerTag found in packet to be sent"); | 2142 NS_ASSERT_MSG (found, "no EpsBearerTag found in packet to be sent"); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2246 { | 2277 { |
2247 NS_LOG_FUNCTION (this); | 2278 NS_LOG_FUNCTION (this); |
2248 | 2279 |
2249 NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST"); | 2280 NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST"); |
2250 | 2281 |
2251 NS_LOG_LOGIC ("oldEnbUeX2apId = " << req.oldEnbUeX2apId); | 2282 NS_LOG_LOGIC ("oldEnbUeX2apId = " << req.oldEnbUeX2apId); |
2252 NS_LOG_LOGIC ("sourceCellId = " << req.sourceCellId); | 2283 NS_LOG_LOGIC ("sourceCellId = " << req.sourceCellId); |
2253 NS_LOG_LOGIC ("targetCellId = " << req.targetCellId); | 2284 NS_LOG_LOGIC ("targetCellId = " << req.targetCellId); |
2254 NS_LOG_LOGIC ("mmeUeS1apId = " << req.mmeUeS1apId); | 2285 NS_LOG_LOGIC ("mmeUeS1apId = " << req.mmeUeS1apId); |
2255 | 2286 |
2256 NS_ASSERT (req.targetCellId == m_cellId); | |
2257 | |
2258 if (m_admitHandoverRequest == false) | 2287 if (m_admitHandoverRequest == false) |
2259 { | 2288 { |
2260 NS_LOG_INFO ("rejecting handover request from cellId " << req.sourceCellId ); | 2289 NS_LOG_INFO ("rejecting handover request from cellId " << req.sourceCellId ); |
2261 EpcX2Sap::HandoverPreparationFailureParams res; | 2290 EpcX2Sap::HandoverPreparationFailureParams res; |
2262 res.oldEnbUeX2apId = req.oldEnbUeX2apId; | 2291 res.oldEnbUeX2apId = req.oldEnbUeX2apId; |
2263 res.sourceCellId = req.sourceCellId; | 2292 res.sourceCellId = req.sourceCellId; |
2264 res.targetCellId = req.targetCellId; | 2293 res.targetCellId = req.targetCellId; |
2265 res.cause = 0; | 2294 res.cause = 0; |
2266 res.criticalityDiagnostics = 0; | 2295 res.criticalityDiagnostics = 0; |
2267 m_x2SapProvider->SendHandoverPreparationFailure (res); | 2296 m_x2SapProvider->SendHandoverPreparationFailure (res); |
2268 return; | 2297 return; |
2269 } | 2298 } |
2270 | 2299 |
2271 uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING); | 2300 uint16_t rnti = AddUe (UeManager::HANDOVER_JOINING, CellToComponentCarrierId ( req.targetCellId)); |
2272 LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvi der.at (0)->AllocateNcRaPreamble (rnti); | 2301 LteEnbCmacSapProvider::AllocateNcRaPreambleReturnValue anrcrv = m_cmacSapProvi der.at (0)->AllocateNcRaPreamble (rnti); |
2273 if (anrcrv.valid == false) | 2302 if (anrcrv.valid == false) |
2274 { | 2303 { |
2275 NS_LOG_INFO (this << " failed to allocate a preamble for non-contention ba sed RA => cannot accept HO"); | 2304 NS_LOG_INFO (this << " failed to allocate a preamble for non-contention ba sed RA => cannot accept HO"); |
2276 RemoveUe (rnti); | 2305 RemoveUe (rnti); |
2277 NS_FATAL_ERROR ("should trigger HO Preparation Failure, but it is not impl emented"); | 2306 NS_FATAL_ERROR ("should trigger HO Preparation Failure, but it is not impl emented"); |
2278 return; | 2307 return; |
2279 } | 2308 } |
2280 | 2309 |
2281 Ptr<UeManager> ueManager = GetUeManager (rnti); | 2310 Ptr<UeManager> ueManager = GetUeManager (rnti); |
(...skipping 11 matching lines...) Expand all Loading... | |
2293 ++it) | 2322 ++it) |
2294 { | 2323 { |
2295 ueManager->SetupDataRadioBearer (it->erabLevelQosParameters, it->erabId, i t->gtpTeid, it->transportLayerAddress); | 2324 ueManager->SetupDataRadioBearer (it->erabLevelQosParameters, it->erabId, i t->gtpTeid, it->transportLayerAddress); |
2296 EpcX2Sap::ErabAdmittedItem i; | 2325 EpcX2Sap::ErabAdmittedItem i; |
2297 i.erabId = it->erabId; | 2326 i.erabId = it->erabId; |
2298 ackParams.admittedBearers.push_back (i); | 2327 ackParams.admittedBearers.push_back (i); |
2299 } | 2328 } |
2300 | 2329 |
2301 LteRrcSap::RrcConnectionReconfiguration handoverCommand = ueManager->GetRrcCon nectionReconfigurationForHandover (); | 2330 LteRrcSap::RrcConnectionReconfiguration handoverCommand = ueManager->GetRrcCon nectionReconfigurationForHandover (); |
2302 handoverCommand.haveMobilityControlInfo = true; | 2331 handoverCommand.haveMobilityControlInfo = true; |
2303 handoverCommand.mobilityControlInfo.targetPhysCellId = m_cellId; | 2332 handoverCommand.mobilityControlInfo.targetPhysCellId = req.targetCellId; |
2304 handoverCommand.mobilityControlInfo.haveCarrierFreq = true; | 2333 handoverCommand.mobilityControlInfo.haveCarrierFreq = true; |
2305 handoverCommand.mobilityControlInfo.carrierFreq.dlCarrierFreq = m_dlEarfcn; | 2334 handoverCommand.mobilityControlInfo.carrierFreq.dlCarrierFreq = m_dlEarfcn; |
2306 handoverCommand.mobilityControlInfo.carrierFreq.ulCarrierFreq = m_ulEarfcn; | 2335 handoverCommand.mobilityControlInfo.carrierFreq.ulCarrierFreq = m_ulEarfcn; |
2307 handoverCommand.mobilityControlInfo.haveCarrierBandwidth = true; | 2336 handoverCommand.mobilityControlInfo.haveCarrierBandwidth = true; |
2308 handoverCommand.mobilityControlInfo.carrierBandwidth.dlBandwidth = m_dlBandwid th; | 2337 handoverCommand.mobilityControlInfo.carrierBandwidth.dlBandwidth = m_dlBandwid th; |
2309 handoverCommand.mobilityControlInfo.carrierBandwidth.ulBandwidth = m_ulBandwid th; | 2338 handoverCommand.mobilityControlInfo.carrierBandwidth.ulBandwidth = m_ulBandwid th; |
2310 handoverCommand.mobilityControlInfo.newUeIdentity = rnti; | 2339 handoverCommand.mobilityControlInfo.newUeIdentity = rnti; |
2311 handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true; | 2340 handoverCommand.mobilityControlInfo.haveRachConfigDedicated = true; |
2312 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrc rv.raPreambleId; | 2341 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPreambleIndex = anrc rv.raPreambleId; |
2313 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anr crv.raPrachMaskIndex; | 2342 handoverCommand.mobilityControlInfo.rachConfigDedicated.raPrachMaskIndex = anr crv.raPrachMaskIndex; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2441 GetUeManager (teidInfoIt->second.rnti)->SendData (teidInfoIt->second.drbid , params.ueData); | 2470 GetUeManager (teidInfoIt->second.rnti)->SendData (teidInfoIt->second.drbid , params.ueData); |
2442 } | 2471 } |
2443 else | 2472 else |
2444 { | 2473 { |
2445 NS_FATAL_ERROR ("X2-U data received but no X2uTeidInfo found"); | 2474 NS_FATAL_ERROR ("X2-U data received but no X2uTeidInfo found"); |
2446 } | 2475 } |
2447 } | 2476 } |
2448 | 2477 |
2449 | 2478 |
2450 uint16_t· | 2479 uint16_t· |
2451 LteEnbRrc::DoAllocateTemporaryCellRnti () | 2480 LteEnbRrc::DoAllocateTemporaryCellRnti (uint8_t componentCarrierId) |
2452 { | 2481 { |
2453 NS_LOG_FUNCTION (this); | 2482 NS_LOG_FUNCTION (this << +componentCarrierId); |
2454 return AddUe (UeManager::INITIAL_RANDOM_ACCESS); | 2483 return AddUe (UeManager::INITIAL_RANDOM_ACCESS, componentCarrierId); |
2455 } | 2484 } |
2456 | 2485 |
2457 void | 2486 void |
2458 LteEnbRrc::DoRrcConfigurationUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams) | 2487 LteEnbRrc::DoRrcConfigurationUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams) |
2459 { | 2488 { |
2460 Ptr<UeManager> ueManager = GetUeManager (cmacParams.m_rnti); | 2489 Ptr<UeManager> ueManager = GetUeManager (cmacParams.m_rnti); |
2461 ueManager->CmacUeConfigUpdateInd (cmacParams); | 2490 ueManager->CmacUeConfigUpdateInd (cmacParams); |
2462 } | 2491 } |
2463 | 2492 |
2464 void | 2493 void |
(...skipping 22 matching lines...) Expand all Loading... | |
2487 return measId; | 2516 return measId; |
2488 } | 2517 } |
2489 | 2518 |
2490 void | 2519 void |
2491 LteEnbRrc::DoTriggerHandover (uint16_t rnti, uint16_t targetCellId) | 2520 LteEnbRrc::DoTriggerHandover (uint16_t rnti, uint16_t targetCellId) |
2492 { | 2521 { |
2493 NS_LOG_FUNCTION (this << rnti << targetCellId); | 2522 NS_LOG_FUNCTION (this << rnti << targetCellId); |
2494 | 2523 |
2495 bool isHandoverAllowed = true; | 2524 bool isHandoverAllowed = true; |
2496 | 2525 |
2526 Ptr<UeManager> ueManager = GetUeManager (rnti); | |
2527 NS_ASSERT_MSG (ueManager != 0, "Cannot find UE context with RNTI " << rnti); | |
2528 | |
2497 if (m_anrSapProvider != 0) | 2529 if (m_anrSapProvider != 0) |
2498 { | 2530 { |
2499 // ensure that proper neighbour relationship exists between source and tar get cells | 2531 // ensure that proper neighbour relationship exists between source and tar get cells |
2500 bool noHo = m_anrSapProvider->GetNoHo (targetCellId); | 2532 bool noHo = m_anrSapProvider->GetNoHo (targetCellId); |
2501 bool noX2 = m_anrSapProvider->GetNoX2 (targetCellId); | 2533 bool noX2 = m_anrSapProvider->GetNoX2 (targetCellId); |
2502 NS_LOG_DEBUG (this << " cellId=" << m_cellId | 2534 NS_LOG_DEBUG (this << " cellId=" << ComponentCarrierToCellId (ueManager->G etComponentCarrierId ()) |
2503 << " targetCellId=" << targetCellId | 2535 << " targetCellId=" << targetCellId |
2504 << " NRT.NoHo=" << noHo << " NRT.NoX2=" << noX2); | 2536 << " NRT.NoHo=" << noHo << " NRT.NoX2=" << noX2); |
2505 | 2537 |
2506 if (noHo || noX2) | 2538 if (noHo || noX2) |
2507 { | 2539 { |
2508 isHandoverAllowed = false; | 2540 isHandoverAllowed = false; |
2509 NS_LOG_LOGIC (this << " handover to cell " << targetCellId | 2541 NS_LOG_LOGIC (this << " handover to cell " << targetCellId |
2510 << " is not allowed by ANR"); | 2542 << " is not allowed by ANR"); |
2511 } | 2543 } |
2512 } | 2544 } |
2513 | 2545 |
2514 Ptr<UeManager> ueManager = GetUeManager (rnti); | |
2515 NS_ASSERT_MSG (ueManager != 0, "Cannot find UE context with RNTI " << rnti); | |
2516 | |
2517 if (ueManager->GetState () != UeManager::CONNECTED_NORMALLY) | 2546 if (ueManager->GetState () != UeManager::CONNECTED_NORMALLY) |
2518 { | 2547 { |
2519 isHandoverAllowed = false; | 2548 isHandoverAllowed = false; |
2520 NS_LOG_LOGIC (this << " handover is not allowed because the UE" | 2549 NS_LOG_LOGIC (this << " handover is not allowed because the UE" |
2521 << " rnti=" << rnti << " is in " | 2550 << " rnti=" << rnti << " is in " |
2522 << ToString (ueManager->GetState ()) << " state"); | 2551 << ToString (ueManager->GetState ()) << " state"); |
2523 } | 2552 } |
2524 | 2553 |
2525 if (isHandoverAllowed) | 2554 if (isHandoverAllowed) |
2526 { | 2555 { |
(...skipping 30 matching lines...) Expand all Loading... | |
2557 | 2586 |
2558 void | 2587 void |
2559 LteEnbRrc::DoSendLoadInformation (EpcX2Sap::LoadInformationParams params) | 2588 LteEnbRrc::DoSendLoadInformation (EpcX2Sap::LoadInformationParams params) |
2560 { | 2589 { |
2561 NS_LOG_FUNCTION (this); | 2590 NS_LOG_FUNCTION (this); |
2562 | 2591 |
2563 m_x2SapProvider->SendLoadInformation(params); | 2592 m_x2SapProvider->SendLoadInformation(params); |
2564 } | 2593 } |
2565 | 2594 |
2566 uint16_t | 2595 uint16_t |
2567 LteEnbRrc::AddUe (UeManager::State state) | 2596 LteEnbRrc::AddUe (UeManager::State state, uint8_t componentCarrierId) |
2568 { | 2597 { |
2569 NS_LOG_FUNCTION (this); | 2598 NS_LOG_FUNCTION (this); |
2570 bool found = false; | 2599 bool found = false; |
2571 uint16_t rnti; | 2600 uint16_t rnti; |
2572 for (rnti = m_lastAllocatedRnti + 1;· | 2601 for (rnti = m_lastAllocatedRnti + 1;· |
2573 (rnti != m_lastAllocatedRnti - 1) && (!found); | 2602 (rnti != m_lastAllocatedRnti - 1) && (!found); |
2574 ++rnti) | 2603 ++rnti) |
2575 { | 2604 { |
2576 if ((rnti != 0) && (m_ueMap.find (rnti) == m_ueMap.end ())) | 2605 if ((rnti != 0) && (m_ueMap.find (rnti) == m_ueMap.end ())) |
2577 { | 2606 { |
2578 found = true; | 2607 found = true; |
2579 break; | 2608 break; |
2580 } | 2609 } |
2581 } | 2610 } |
2582 | 2611 |
2583 NS_ASSERT_MSG (found, "no more RNTIs available (do you have more than 65535 UE s in a cell?)"); | 2612 NS_ASSERT_MSG (found, "no more RNTIs available (do you have more than 65535 UE s in a cell?)"); |
2584 m_lastAllocatedRnti = rnti; | 2613 m_lastAllocatedRnti = rnti; |
2585 Ptr<UeManager> ueManager = CreateObject<UeManager> (this, rnti, state); | 2614 Ptr<UeManager> ueManager = CreateObject<UeManager> (this, rnti, state, compone ntCarrierId); |
2586 m_ccmRrcSapProvider-> AddUe (rnti, (uint8_t)state); | 2615 m_ccmRrcSapProvider-> AddUe (rnti, (uint8_t)state); |
2587 m_ueMap.insert (std::pair<uint16_t, Ptr<UeManager> > (rnti, ueManager)); | 2616 m_ueMap.insert (std::pair<uint16_t, Ptr<UeManager> > (rnti, ueManager)); |
2588 ueManager->Initialize (); | 2617 ueManager->Initialize (); |
2589 NS_LOG_DEBUG (this << " New UE RNTI " << rnti << " cellId " << m_cellId << " s rs CI " << ueManager->GetSrsConfigurationIndex ()); | 2618 const uint16_t cellId = ComponentCarrierToCellId (componentCarrierId); |
2590 m_newUeContextTrace (m_cellId, rnti); | 2619 NS_LOG_DEBUG (this << " New UE RNTI " << rnti << " cellId " << cellId << " srs CI " << ueManager->GetSrsConfigurationIndex ()); |
2620 m_newUeContextTrace (cellId, rnti); | |
2591 return rnti; | 2621 return rnti; |
2592 } | 2622 } |
2593 | 2623 |
2594 void | 2624 void |
2595 LteEnbRrc::RemoveUe (uint16_t rnti) | 2625 LteEnbRrc::RemoveUe (uint16_t rnti) |
2596 { | 2626 { |
2597 NS_LOG_FUNCTION (this << (uint32_t) rnti); | 2627 NS_LOG_FUNCTION (this << (uint32_t) rnti); |
2598 std::map <uint16_t, Ptr<UeManager> >::iterator it = m_ueMap.find (rnti); | 2628 std::map <uint16_t, Ptr<UeManager> >::iterator it = m_ueMap.find (rnti); |
2599 NS_ASSERT_MSG (it != m_ueMap.end (), "request to remove UE info with unknown r nti " << rnti); | 2629 NS_ASSERT_MSG (it != m_ueMap.end (), "request to remove UE info with unknown r nti " << rnti); |
2600 uint16_t srsCi = (*it).second->GetSrsConfigurationIndex (); | 2630 uint16_t srsCi = (*it).second->GetSrsConfigurationIndex (); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2656 if (m_anrSapProvider != 0) | 2686 if (m_anrSapProvider != 0) |
2657 { | 2687 { |
2658 m_anrSapProvider->AddNeighbourRelation (cellId); | 2688 m_anrSapProvider->AddNeighbourRelation (cellId); |
2659 } | 2689 } |
2660 } | 2690 } |
2661 | 2691 |
2662 void | 2692 void |
2663 LteEnbRrc::SetCsgId (uint32_t csgId, bool csgIndication) | 2693 LteEnbRrc::SetCsgId (uint32_t csgId, bool csgIndication) |
2664 { | 2694 { |
2665 NS_LOG_FUNCTION (this << csgId << csgIndication); | 2695 NS_LOG_FUNCTION (this << csgId << csgIndication); |
2666 m_sib1.cellAccessRelatedInfo.csgIdentity = csgId; | 2696 for (uint8_t componentCarrierId = 0; componentCarrierId < m_sib1.size (); comp onentCarrierId++) |
2667 m_sib1.cellAccessRelatedInfo.csgIndication = csgIndication; | 2697 { |
2668 m_cphySapProvider.at (0)->SetSystemInformationBlockType1 (m_sib1); | 2698 m_sib1.at (componentCarrierId).cellAccessRelatedInfo.csgIdentity = csgId; |
2699 m_sib1.at (componentCarrierId).cellAccessRelatedInfo.csgIndication = csgIn dication; | |
2700 m_cphySapProvider.at (componentCarrierId)->SetSystemInformationBlockType1 (m_sib1.at (componentCarrierId)); | |
2701 } | |
2669 } | 2702 } |
2670 | 2703 |
2671 void | 2704 void |
2672 LteEnbRrc::SetNumberOfComponentCarriers(uint16_t numberOfComponentCarriers) | 2705 LteEnbRrc::SetNumberOfComponentCarriers(uint16_t numberOfComponentCarriers) |
2673 { | 2706 { |
2674 m_numberOfComponentCarriers = numberOfComponentCarriers; | 2707 m_numberOfComponentCarriers = numberOfComponentCarriers; |
2675 } | 2708 } |
2676 | 2709 |
2677 /// Number of distinct SRS periodicity plus one. | 2710 /// Number of distinct SRS periodicity plus one. |
2678 static const uint8_t SRS_ENTRIES = 9; | 2711 static const uint8_t SRS_ENTRIES = 9; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2805 LteEnbRrc::GetLogicalChannelPriority (EpsBearer bearer) | 2838 LteEnbRrc::GetLogicalChannelPriority (EpsBearer bearer) |
2806 { | 2839 { |
2807 return bearer.qci; | 2840 return bearer.qci; |
2808 } | 2841 } |
2809 | 2842 |
2810 void | 2843 void |
2811 LteEnbRrc::SendSystemInformation () | 2844 LteEnbRrc::SendSystemInformation () |
2812 { | 2845 { |
2813 // NS_LOG_FUNCTION (this); | 2846 // NS_LOG_FUNCTION (this); |
2814 | 2847 |
2848 for (auto &it: m_componentCarrierPhyConf) | |
2849 { | |
2850 uint8_t ccId = it.first; | |
2851 | |
2852 LteRrcSap::SystemInformation si; | |
2853 si.haveSib2 = true; | |
2854 si.sib2.freqInfo.ulCarrierFreq = it.second->GetUlEarfcn (); | |
2855 si.sib2.freqInfo.ulBandwidth = it.second->GetUlBandwidth (); | |
2856 si.sib2.radioResourceConfigCommon.pdschConfigCommon.referenceSignalPower = m_cphySapProvider.at (ccId)->GetReferenceSignalPower (); | |
2857 si.sib2.radioResourceConfigCommon.pdschConfigCommon.pb = 0; | |
2858 | |
2859 LteEnbCmacSapProvider::RachConfig rc = m_cmacSapProvider.at (ccId)->GetRac hConfig (); | |
2860 LteRrcSap::RachConfigCommon rachConfigCommon; | |
2861 rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles ; | |
2862 rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax; | |
2863 rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWin dowSize; | |
2864 si.sib2.radioResourceConfigCommon.rachConfigCommon = rachConfigCommon; | |
2865 | |
2866 m_rrcSapUser->SendSystemInformation (it.second->GetCellId (), si); | |
2867 } | |
2868 | |
2815 /* | 2869 /* |
2816 * For simplicity, we use the same periodicity for all SIBs. Note that in real | 2870 * For simplicity, we use the same periodicity for all SIBs. Note that in real |
2817 * systems the periodicy of each SIBs could be different. | 2871 * systems the periodicy of each SIBs could be different. |
2818 */ | 2872 */ |
2819 LteRrcSap::SystemInformation si; | |
2820 si.haveSib2 = true; | |
2821 si.sib2.freqInfo.ulCarrierFreq = m_ulEarfcn; | |
2822 si.sib2.freqInfo.ulBandwidth = m_ulBandwidth; | |
2823 si.sib2.radioResourceConfigCommon.pdschConfigCommon.referenceSignalPower = m_c phySapProvider.at (0)->GetReferenceSignalPower (); | |
2824 si.sib2.radioResourceConfigCommon.pdschConfigCommon.pb = 0; | |
2825 | |
2826 LteEnbCmacSapProvider::RachConfig rc = m_cmacSapProvider.at (0)->GetRachConfig (); | |
2827 LteRrcSap::RachConfigCommon rachConfigCommon; | |
2828 rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles; | |
2829 rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax; | |
2830 rachConfigCommon.raSupervisionInfo.raResponseWindowSize = rc.raResponseWindowS ize; | |
2831 si.sib2.radioResourceConfigCommon.rachConfigCommon = rachConfigCommon; | |
2832 | |
2833 m_rrcSapUser->SendSystemInformation (si); | |
2834 Simulator::Schedule (m_systemInformationPeriodicity, &LteEnbRrc::SendSystemInf ormation, this); | 2873 Simulator::Schedule (m_systemInformationPeriodicity, &LteEnbRrc::SendSystemInf ormation, this); |
2835 } | 2874 } |
2836 | 2875 |
2837 | 2876 |
2838 } // namespace ns3 | 2877 } // namespace ns3 |
2839 | 2878 |
OLD | NEW |