21 #include <ns3/fatal-error.h>
23 #include <ns3/nstime.h>
24 #include <ns3/node-list.h>
26 #include <ns3/simulator.h>
28 #include "lte-rrc-protocol-ideal.h"
29 #include "lte-ue-rrc.h"
30 #include "lte-enb-rrc.h"
31 #include "lte-enb-net-device.h"
32 #include "lte-ue-net-device.h"
42 NS_OBJECT_ENSURE_REGISTERED (LteUeRrcProtocolIdeal);
44 LteUeRrcProtocolIdeal::LteUeRrcProtocolIdeal ()
45 : m_ueRrcSapProvider (0),
46 m_enbRrcSapProvider (0)
48 m_ueRrcSapUser =
new MemberLteUeRrcSapUser<LteUeRrcProtocolIdeal> (
this);
51 LteUeRrcProtocolIdeal::~LteUeRrcProtocolIdeal ()
59 delete m_ueRrcSapUser;
64 LteUeRrcProtocolIdeal::GetTypeId (
void)
66 static TypeId tid =
TypeId (
"ns3::LteUeRrcProtocolIdeal")
68 .AddConstructor<LteUeRrcProtocolIdeal> ()
74 LteUeRrcProtocolIdeal::SetLteUeRrcSapProvider (LteUeRrcSapProvider* p)
76 m_ueRrcSapProvider = p;
80 LteUeRrcProtocolIdeal::GetLteUeRrcSapUser ()
82 return m_ueRrcSapUser;
86 LteUeRrcProtocolIdeal::SetUeRrc (Ptr<LteUeRrc> rrc)
92 LteUeRrcProtocolIdeal::DoSetup (LteUeRrcSapUser::SetupParameters params)
99 LteUeRrcProtocolIdeal::DoSendRrcConnectionRequest (LteRrcSap::RrcConnectionRequest msg)
103 m_rnti = m_rrc->GetRnti ();
104 SetEnbRrcSapProvider ();
107 &LteEnbRrcSapProvider::RecvRrcConnectionRequest,
114 LteUeRrcProtocolIdeal::DoSendRrcConnectionSetupCompleted (LteRrcSap::RrcConnectionSetupCompleted msg)
117 &LteEnbRrcSapProvider::RecvRrcConnectionSetupCompleted,
124 LteUeRrcProtocolIdeal::DoSendRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionReconfigurationCompleted msg)
128 m_rnti = m_rrc->GetRnti ();
129 SetEnbRrcSapProvider ();
132 &LteEnbRrcSapProvider::RecvRrcConnectionReconfigurationCompleted,
139 LteUeRrcProtocolIdeal::DoSendRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg)
142 &LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentRequest,
149 LteUeRrcProtocolIdeal::DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg)
152 &LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete,
159 LteUeRrcProtocolIdeal::DoSendMeasurementReport (LteRrcSap::MeasurementReport msg)
162 &LteEnbRrcSapProvider::RecvMeasurementReport,
169 LteUeRrcProtocolIdeal::SetEnbRrcSapProvider ()
171 uint16_t cellId = m_rrc->GetCellId ();
174 Ptr<LteEnbNetDevice> enbDev;
178 (i != listEnd) && (!found);
182 int nDevs = node->GetNDevices ();
184 (j < nDevs) && (!found);
187 enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
194 if (enbDev->GetCellId () == cellId)
202 NS_ASSERT_MSG (found,
" Unable to find eNB with CellId =" << cellId);
203 m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
204 Ptr<LteEnbRrcProtocolIdeal> enbRrcProtocolIdeal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolIdeal> ();
205 enbRrcProtocolIdeal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
209 NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolIdeal);
211 LteEnbRrcProtocolIdeal::LteEnbRrcProtocolIdeal ()
212 : m_enbRrcSapProvider (0)
215 m_enbRrcSapUser =
new MemberLteEnbRrcSapUser<LteEnbRrcProtocolIdeal> (
this);
218 LteEnbRrcProtocolIdeal::~LteEnbRrcProtocolIdeal ()
227 delete m_enbRrcSapUser;
231 LteEnbRrcProtocolIdeal::GetTypeId (
void)
233 static TypeId tid =
TypeId (
"ns3::LteEnbRrcProtocolIdeal")
235 .AddConstructor<LteEnbRrcProtocolIdeal> ()
241 LteEnbRrcProtocolIdeal::SetLteEnbRrcSapProvider (LteEnbRrcSapProvider* p)
243 m_enbRrcSapProvider = p;
247 LteEnbRrcProtocolIdeal::GetLteEnbRrcSapUser ()
249 return m_enbRrcSapUser;
253 LteEnbRrcProtocolIdeal::SetCellId (uint16_t cellId)
259 LteEnbRrcProtocolIdeal::GetUeRrcSapProvider (uint16_t rnti)
261 std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
262 it = m_enbRrcSapProviderMap.find (rnti);
263 NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (),
"could not find RNTI = " << rnti);
268 LteEnbRrcProtocolIdeal::SetUeRrcSapProvider (uint16_t rnti, LteUeRrcSapProvider* p)
270 std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
271 it = m_enbRrcSapProviderMap.find (rnti);
272 NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (),
"could not find RNTI = " << rnti);
277 LteEnbRrcProtocolIdeal::DoSetupUe (uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params)
314 m_enbRrcSapProviderMap[rnti] = 0;
319 LteEnbRrcProtocolIdeal::DoRemoveUe (uint16_t rnti)
322 m_enbRrcSapProviderMap.erase (rnti);
326 LteEnbRrcProtocolIdeal::DoSendMasterInformationBlock (LteRrcSap::MasterInformationBlock msg)
329 for (std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it = m_enbRrcSapProviderMap.begin ();
330 it != m_enbRrcSapProviderMap.end ();
334 &LteUeRrcSapProvider::RecvMasterInformationBlock,
341 LteEnbRrcProtocolIdeal::DoSendSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg)
349 int nDevs = node->GetNDevices ();
350 for (
int j = 0; j < nDevs; ++j)
352 Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
356 Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
357 if (ueRrc->GetCellId () == m_cellId)
360 &LteUeRrcSapProvider::RecvSystemInformationBlockType1,
361 ueRrc->GetLteUeRrcSapProvider (),
370 LteEnbRrcProtocolIdeal::DoSendSystemInformation (LteRrcSap::SystemInformation msg)
378 int nDevs = node->GetNDevices ();
379 for (
int j = 0; j < nDevs; ++j)
381 Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
384 Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
385 NS_LOG_LOGIC (
"considering UE IMSI " << ueDev->GetImsi () <<
" that has cellId " << ueRrc->GetCellId ());
386 if (ueRrc->GetCellId () == m_cellId)
388 NS_LOG_LOGIC (
"sending SI to IMSI " << ueDev->GetImsi ());
389 ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
391 &LteUeRrcSapProvider::RecvSystemInformation,
392 ueRrc->GetLteUeRrcSapProvider (),
401 LteEnbRrcProtocolIdeal::DoSendRrcConnectionSetup (uint16_t rnti, LteRrcSap::RrcConnectionSetup msg)
404 &LteUeRrcSapProvider::RecvRrcConnectionSetup,
405 GetUeRrcSapProvider (rnti),
410 LteEnbRrcProtocolIdeal::DoSendRrcConnectionReconfiguration (uint16_t rnti, LteRrcSap::RrcConnectionReconfiguration msg)
413 &LteUeRrcSapProvider::RecvRrcConnectionReconfiguration,
414 GetUeRrcSapProvider (rnti),
419 LteEnbRrcProtocolIdeal::DoSendRrcConnectionReestablishment (uint16_t rnti, LteRrcSap::RrcConnectionReestablishment msg)
422 &LteUeRrcSapProvider::RecvRrcConnectionReestablishment,
423 GetUeRrcSapProvider (rnti),
428 LteEnbRrcProtocolIdeal::DoSendRrcConnectionReestablishmentReject (uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentReject msg)
431 &LteUeRrcSapProvider::RecvRrcConnectionReestablishmentReject,
432 GetUeRrcSapProvider (rnti),
437 LteEnbRrcProtocolIdeal::DoSendRrcConnectionRelease (uint16_t rnti, LteRrcSap::RrcConnectionRelease msg)
440 &LteUeRrcSapProvider::RecvRrcConnectionRelease,
441 GetUeRrcSapProvider (rnti),
446 LteEnbRrcProtocolIdeal::DoSendRrcConnectionReject (uint16_t rnti, LteRrcSap::RrcConnectionReject msg)
449 &LteUeRrcSapProvider::RecvRrcConnectionReject,
450 GetUeRrcSapProvider (rnti),
466 std::map<uint32_t, LteRrcSap::HandoverPreparationInfo> g_handoverPreparationInfoMsgMap;
467 uint32_t g_handoverPreparationInfoMsgIdCounter = 0;
477 uint32_t GetMsgId ();
478 void SetMsgId (uint32_t
id);
479 static TypeId GetTypeId (
void);
481 virtual void Print (std::ostream &os)
const;
491 IdealHandoverPreparationInfoHeader::GetMsgId ()
497 IdealHandoverPreparationInfoHeader::SetMsgId (uint32_t
id)
504 IdealHandoverPreparationInfoHeader::GetTypeId (
void)
506 static TypeId tid = TypeId (
"ns3::IdealHandoverPreparationInfoHeader")
507 .SetParent<Header> ()
508 .AddConstructor<IdealHandoverPreparationInfoHeader> ()
521 os <<
" msgId=" << m_msgId;
545 uint32_t msgId = ++g_handoverPreparationInfoMsgIdCounter;
546 NS_ASSERT_MSG (g_handoverPreparationInfoMsgMap.find (msgId) == g_handoverPreparationInfoMsgMap.end (),
"msgId " << msgId <<
" already in use");
548 g_handoverPreparationInfoMsgMap.insert (std::pair<uint32_t, LteRrcSap::HandoverPreparationInfo> (msgId, msg));
556 LteRrcSap::HandoverPreparationInfo
557 LteEnbRrcProtocolIdeal::DoDecodeHandoverPreparationInformation (Ptr<Packet> p)
559 IdealHandoverPreparationInfoHeader h;
561 uint32_t msgId = h.GetMsgId ();
563 std::map<uint32_t, LteRrcSap::HandoverPreparationInfo>::iterator it = g_handoverPreparationInfoMsgMap.find (msgId);
564 NS_ASSERT_MSG (it != g_handoverPreparationInfoMsgMap.end (),
"msgId " << msgId <<
" not found");
565 LteRrcSap::HandoverPreparationInfo msg = it->second;
566 g_handoverPreparationInfoMsgMap.erase (it);
572 std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration> g_handoverCommandMsgMap;
573 uint32_t g_handoverCommandMsgIdCounter = 0;
583 uint32_t GetMsgId ();
584 void SetMsgId (uint32_t
id);
585 static TypeId GetTypeId (
void);
587 virtual void Print (std::ostream &os)
const;
597 IdealHandoverCommandHeader::GetMsgId ()
603 IdealHandoverCommandHeader::SetMsgId (uint32_t
id)
610 IdealHandoverCommandHeader::GetTypeId (
void)
612 static TypeId tid = TypeId (
"ns3::IdealHandoverCommandHeader")
613 .SetParent<Header> ()
614 .AddConstructor<IdealHandoverCommandHeader> ()
627 os <<
" msgId=" << m_msgId;
651 uint32_t msgId = ++g_handoverCommandMsgIdCounter;
652 NS_ASSERT_MSG (g_handoverCommandMsgMap.find (msgId) == g_handoverCommandMsgMap.end (),
"msgId " << msgId <<
" already in use");
654 g_handoverCommandMsgMap.insert (std::pair<uint32_t, LteRrcSap::RrcConnectionReconfiguration> (msgId, msg));
662 LteRrcSap::RrcConnectionReconfiguration
663 LteEnbRrcProtocolIdeal::DoDecodeHandoverCommand (Ptr<Packet> p)
665 IdealHandoverCommandHeader h;
667 uint32_t msgId = h.GetMsgId ();
669 std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration>::iterator it = g_handoverCommandMsgMap.find (msgId);
670 NS_ASSERT_MSG (it != g_handoverCommandMsgMap.end (),
"msgId " << msgId <<
" not found");
671 LteRrcSap::RrcConnectionReconfiguration msg = it->second;
672 g_handoverCommandMsgMap.erase (it);
#define NS_LOG_FUNCTION(parameters)
virtual void DoDispose(void)
#define NS_LOG_COMPONENT_DEFINE(name)
virtual uint32_t GetSerializedSize(void) const
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
iterator in a Buffer instance
virtual void Serialize(Buffer::Iterator start) const
static Iterator End(void)
virtual void Print(std::ostream &os) const
virtual uint32_t Deserialize(Buffer::Iterator start)
virtual void Print(std::ostream &os) const
#define NS_LOG_LOGIC(msg)
virtual void Serialize(Buffer::Iterator start) const
#define NS_ASSERT_MSG(condition, message)
static Iterator Begin(void)
virtual void DoDispose(void)
virtual uint32_t Deserialize(Buffer::Iterator start)
virtual TypeId GetInstanceTypeId(void) const
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
a base class which provides memory management and object aggregation
virtual TypeId GetInstanceTypeId(void) const
void WriteU32(uint32_t data)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void AddHeader(const Header &header)
virtual uint32_t GetSerializedSize(void) const