diff --git a/src/lte/helper/lte-helper.cc b/src/lte/helper/lte-helper.cc index 5530be39d..1e01a618e 100644 --- a/src/lte/helper/lte-helper.cc +++ b/src/lte/helper/lte-helper.cc @@ -634,6 +634,7 @@ LteHelper::ActivateDataRadioBearer (Ptr ueDevice, EpsBearer bearer) EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params; params.rnti = rnti; params.bearer = bearer; + params.bearerId = 0; params.gtpTeid = 0; // don't care enbRrc->GetS1SapUser ()->DataRadioBearerSetupRequest (params); done = true; diff --git a/src/lte/model/epc-enb-application.cc b/src/lte/model/epc-enb-application.cc index 9348ad5eb..04d3b3e0f 100644 --- a/src/lte/model/epc-enb-application.cc +++ b/src/lte/model/epc-enb-application.cc @@ -127,31 +127,6 @@ EpcEnbApplication::GetS1apSapEnb () return m_s1apSapEnb; } -void -EpcEnbApplication::ErabSetupRequest (uint32_t teid, uint64_t imsi, EpsBearer bearer) -{ - NS_LOG_FUNCTION (this << teid << imsi); - // request the RRC to setup a radio bearer - struct EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params; - params.bearer = bearer; - params.gtpTeid = teid; - std::map::iterator it = m_imsiRntiMap.find (imsi); - NS_ASSERT_MSG (it != m_imsiRntiMap.end (), "unknown IMSI"); - params.rnti = it->second; - m_s1SapUser->DataRadioBearerSetupRequest (params); -} - -void -EpcEnbApplication::DoS1BearerSetupRequest (EpcEnbS1SapProvider::S1BearerSetupRequestParameters params) -{ - NS_LOG_FUNCTION (this << params.rnti << params.bid); - EpsFlowId_t rbid (params.rnti, params.bid); - // side effect: create entries if not exist - m_rbidTeidMap[rbid] = params.gtpTeid; - m_teidRbidMap[params.gtpTeid] = rbid; -} - - void EpcEnbApplication::DoInitialUeMessage (uint64_t imsi, uint16_t rnti) { @@ -167,11 +142,29 @@ EpcEnbApplication::DoInitialContextSetupRequest (uint64_t mmeUeS1Id, uint16_t en { NS_LOG_FUNCTION (this); - for (std::list::iterator it = erabToBeSetupList.begin (); - it != erabToBeSetupList.end (); - ++it) + for (std::list::iterator erabIt = erabToBeSetupList.begin (); + erabIt != erabToBeSetupList.end (); + ++erabIt) { - ErabSetupRequest (it->sgwTeid, mmeUeS1Id, it->erabLevelQosParameters); + // request the RRC to setup a radio bearer + + uint64_t imsi = mmeUeS1Id; + std::map::iterator imsiIt = m_imsiRntiMap.find (imsi); + NS_ASSERT_MSG (imsiIt != m_imsiRntiMap.end (), "unknown IMSI"); + uint16_t rnti = imsiIt->second; + + struct EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params; + params.rnti = rnti; + params.bearer = erabIt->erabLevelQosParameters; + params.bearerId = erabIt->erabId; + params.gtpTeid = erabIt->sgwTeid; + m_s1SapUser->DataRadioBearerSetupRequest (params); + + EpsFlowId_t rbid (rnti, erabIt->erabId); + // side effect: create entries if not exist + m_rbidTeidMap[rbid] = params.gtpTeid; + m_teidRbidMap[params.gtpTeid] = rbid; + } } diff --git a/src/lte/model/epc-enb-application.h b/src/lte/model/epc-enb-application.h index b5b9f33c4..2c9c43d39 100644 --- a/src/lte/model/epc-enb-application.h +++ b/src/lte/model/epc-enb-application.h @@ -106,18 +106,7 @@ public: * \return the ENB side of the S1-AP SAP */ EpcS1apSapEnb* GetS1apSapEnb (); - - /** - * This method is triggered after the eNB received - * a S1-AP message of type E-RAB Setup Request by the MME and will - * trigger the corresponding RadioBearer creation - * - * \param teid the Tunnel Endpoint IDentifier of the S1-bearer to be setup. - * \param imsi the unique ID of the UE - * \param bearer the specification of the corresponding EPS bearer - */ - void ErabSetupRequest (uint32_t teid, uint64_t imsi, EpsBearer bearer); - + /** * Method to be assigned to the recv callback of the LTE socket. It is called when the eNB receives a data packet from the radio interface that is to be forwarded to the SGW. * @@ -151,7 +140,6 @@ public: private: // ENB S1 SAP provider methods - void DoS1BearerSetupRequest (EpcEnbS1SapProvider::S1BearerSetupRequestParameters params); void DoInitialUeMessage (uint64_t imsi, uint16_t rnti); // S1-AP SAP ENB methods diff --git a/src/lte/model/epc-enb-s1-sap.h b/src/lte/model/epc-enb-s1-sap.h index 02110a9c5..469d9917c 100644 --- a/src/lte/model/epc-enb-s1-sap.h +++ b/src/lte/model/epc-enb-s1-sap.h @@ -53,12 +53,6 @@ public: uint32_t gtpTeid; /**< S1-bearer GTP tunnel endpoint identifier, see 36.423 9.2.1 */ }; - /** - * Request the setup of a S1 bearer - * - */ - virtual void S1BearerSetupRequest (S1BearerSetupRequestParameters params) = 0; - /** * * @@ -92,6 +86,7 @@ public: DataRadioBearer is to be created */ EpsBearer bearer; /**< the characteristics of the bearer to be set up */ + uint8_t bearerId; /**< the EPS Bearer Identifier */ uint32_t gtpTeid; /**< S1-bearer GTP tunnel endpoint identifier, see 36.423 9.2.1 */ Ipv4Address transportLayerAddress; /**< IP Address of the SGW, see 36.423 9.2.1 */ }; @@ -119,7 +114,6 @@ public: MemberEpcEnbS1SapProvider (C* owner); // inherited from EpcEnbS1SapProvider - virtual void S1BearerSetupRequest (S1BearerSetupRequestParameters params); virtual void InitialUeMessage (uint64_t imsi, uint16_t rnti); private: @@ -138,12 +132,6 @@ MemberEpcEnbS1SapProvider::MemberEpcEnbS1SapProvider () { } -template -void MemberEpcEnbS1SapProvider::S1BearerSetupRequest (S1BearerSetupRequestParameters params) -{ - m_owner->DoS1BearerSetupRequest (params); -} - template void MemberEpcEnbS1SapProvider::InitialUeMessage (uint64_t imsi, uint16_t rnti) diff --git a/src/lte/model/epc-s1ap-sap.h b/src/lte/model/epc-s1ap-sap.h index 7943f846b..ba9322055 100644 --- a/src/lte/model/epc-s1ap-sap.h +++ b/src/lte/model/epc-s1ap-sap.h @@ -110,7 +110,7 @@ public: struct ErabToBeSetupItem { - uint16_t erabId; + uint8_t erabId; EpsBearer erabLevelQosParameters; Ipv4Address transportLayerAddress; uint32_t sgwTeid; @@ -133,7 +133,7 @@ public: */ struct ErabSwitchedInUplinkItem { - uint16_t erabId; + uint8_t erabId; Ipv4Address transportLayerAddress; uint32_t enbTeid; }; diff --git a/src/lte/model/lte-enb-rrc.cc b/src/lte/model/lte-enb-rrc.cc index cab161a09..089c430ad 100644 --- a/src/lte/model/lte-enb-rrc.cc +++ b/src/lte/model/lte-enb-rrc.cc @@ -1101,15 +1101,10 @@ LteEnbRrc::DoRecvRrcConnectionReestablishmentComplete (uint16_t rnti, LteRrcSap: void LteEnbRrc::DoDataRadioBearerSetupRequest (EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters request) { - EpcEnbS1SapProvider::S1BearerSetupRequestParameters response; + Ptr ueManager = GetUeManager (request.rnti); - response.rnti = request.rnti; - response.bid = ueManager->SetupDataRadioBearer (request.bearer, request.gtpTeid, request.transportLayerAddress); - response.gtpTeid = request.gtpTeid; - if (m_s1SapProvider) - { - m_s1SapProvider->S1BearerSetupRequest (response); - } + uint8_t bid = ueManager->SetupDataRadioBearer (request.bearer, request.gtpTeid, request.transportLayerAddress); + NS_ASSERT_MSG ( request.bearerId == 0 || bid == request.bearerId, "bearer ID mismatch (" << (uint32_t) bid << " != " << (uint32_t) request.bearerId << ", the assumption that ID are allocated in the same way by MME and RRC is not valid any more"); ueManager->ScheduleRrcConnectionReconfiguration (); } diff --git a/src/lte/test/lte-test-entities.cc b/src/lte/test/lte-test-entities.cc index 35c294026..dddd861ee 100644 --- a/src/lte/test/lte-test-entities.cc +++ b/src/lte/test/lte-test-entities.cc @@ -657,11 +657,7 @@ EpcTestRrc::GetS1SapUser () void EpcTestRrc::DoDataRadioBearerSetupRequest (EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters request) { - EpcEnbS1SapProvider::S1BearerSetupRequestParameters response; - response.rnti = request.rnti; - response.bid = 1; - response.gtpTeid = request.gtpTeid; - m_s1SapProvider->S1BearerSetupRequest (response); + }