21 #include <ns3/fatal-error.h>
24 #include "epc-s1ap-sap.h"
25 #include "epc-s11-sap.h"
36 NS_OBJECT_ENSURE_REGISTERED (EpcMme);
61 EpcMme::GetTypeId (
void)
65 .AddConstructor<EpcMme> ()
94 enbInfo->s1uAddr = enbS1uAddr;
95 enbInfo->s1apSapEnb = enbS1apSap;
105 ueInfo->mmeUeS1Id = imsi;
107 ueInfo->bearerCounter = 0;
114 std::map<uint64_t, Ptr<UeInfo> >::iterator it =
m_ueInfoMap.find (imsi);
116 NS_ASSERT_MSG (it->second->bearerCounter < 11,
"too many bearers already! " << it->second->bearerCounter);
118 bearerInfo.bearerId = ++(it->second->bearerCounter);
119 bearerInfo.tft = tft;
120 bearerInfo.bearer = bearer;
121 it->second->bearersToBeActivated.push_back (bearerInfo);
128 EpcMme::DoInitialUeMessage (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t imsi, uint16_t gci)
131 std::map<uint64_t, Ptr<UeInfo> >::iterator it =
m_ueInfoMap.find (imsi);
133 it->second->cellId = gci;
137 for (std::list<BearerInfo>::iterator bit = it->second->bearersToBeActivated.begin ();
138 bit != it->second->bearersToBeActivated.end ();
142 bearerContext.epsBearerId = bit->bearerId;
143 bearerContext.bearerLevelQos = bit->bearer;
144 bearerContext.tft = bit->tft;
145 msg.bearerContextsToBeCreated.push_back (bearerContext);
151 EpcMme::DoInitialContextSetupResponse (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<EpcS1apSapMme::ErabSetupItem> erabSetupList)
158 EpcMme::DoPathSwitchRequest (uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<EpcS1apSapMme::ErabSwitchedInDownlinkItem> erabToBeSwitchedInDownlinkList)
162 uint64_t imsi = mmeUeS1Id;
163 std::map<uint64_t, Ptr<UeInfo> >::iterator it =
m_ueInfoMap.find (imsi);
165 NS_LOG_INFO (
"IMSI " << imsi <<
" old eNB: " << it->second->cellId <<
", new eNB: " << gci);
166 it->second->cellId = gci;
167 it->second->enbUeS1Id = enbUeS1Id;
169 EpcS11SapSgw::ModifyBearerRequestMessage msg;
180 EpcMme::DoCreateSessionResponse (EpcS11SapMme::CreateSessionResponseMessage msg)
183 uint64_t imsi = msg.teid;
184 std::list<EpcS1apSapEnb::ErabToBeSetupItem> erabToBeSetupList;
185 for (std::list<EpcS11SapMme::BearerContextCreated>::iterator bit = msg.bearerContextsCreated.begin ();
186 bit != msg.bearerContextsCreated.end ();
189 EpcS1apSapEnb::ErabToBeSetupItem erab;
190 erab.erabId = bit->epsBearerId;
191 erab.erabLevelQosParameters = bit->bearerLevelQos;
192 erab.transportLayerAddress = bit->sgwFteid.address;
193 erab.sgwTeid = bit->sgwFteid.teid;
194 erabToBeSetupList.push_back (erab);
196 std::map<uint64_t, Ptr<UeInfo> >::iterator it =
m_ueInfoMap.find (imsi);
198 uint16_t cellId = it->second->cellId;
199 uint16_t enbUeS1Id = it->second->enbUeS1Id;
200 uint64_t mmeUeS1Id = it->second->mmeUeS1Id;
201 std::map<uint16_t, Ptr<EnbInfo> >::iterator jt =
m_enbInfoMap.find (cellId);
203 jt->second->s1apSapEnb->InitialContextSetupRequest (mmeUeS1Id, enbUeS1Id, erabToBeSetupList);
208 EpcMme::DoModifyBearerResponse (EpcS11SapMme::ModifyBearerResponseMessage msg)
211 NS_ASSERT (msg.cause == EpcS11SapMme::ModifyBearerResponseMessage::REQUEST_ACCEPTED);
212 uint64_t imsi = msg.teid;
213 std::map<uint64_t, Ptr<UeInfo> >::iterator it =
m_ueInfoMap.find (imsi);
215 uint64_t enbUeS1Id = it->second->enbUeS1Id;
216 uint64_t mmeUeS1Id = it->second->mmeUeS1Id;
217 uint16_t cgi = it->second->cellId;
218 std::list<EpcS1apSapEnb::ErabSwitchedInUplinkItem> erabToBeSwitchedInUplinkList;
219 std::map<uint16_t, Ptr<EnbInfo> >::iterator jt =
m_enbInfoMap.find (it->second->cellId);
221 jt->second->s1apSapEnb->PathSwitchRequestAcknowledge (enbUeS1Id, mmeUeS1Id, cgi, erabToBeSwitchedInUplinkList);
void AddUe(uint64_t imsi)
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
std::map< uint16_t, Ptr< EnbInfo > > m_enbInfoMap
EpcS1apSapMme * GetS1apSapMme()
void AddBearer(uint64_t imsi, Ptr< EpcTft > tft, EpsBearer bearer)
#define NS_FATAL_ERROR(msg)
fatal error handling
EpcS11SapMme * GetS11SapMme()
virtual void ModifyBearerRequest(ModifyBearerRequestMessage msg)=0
void AddEnb(uint16_t egci, Ipv4Address enbS1UAddr, EpcS1apSapEnb *enbS1apSap)
virtual void CreateSessionRequest(CreateSessionRequestMessage msg)=0
#define NS_ASSERT_MSG(condition, message)
Ipv4 addresses are stored in host order in this class.
std::map< uint64_t, Ptr< UeInfo > > m_ueInfoMap
a base class which provides memory management and object aggregation
void SetS11SapSgw(EpcS11SapSgw *s)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)