src/lte/model/epc-x2.cc
changeset 9416 7d95ab53c4cf
parent 9412 da31245666bb
child 9433 d5700444db81
--- a/src/lte/model/epc-x2.cc	Tue Nov 20 18:56:24 2012 +0100
+++ b/src/lte/model/epc-x2.cc	Tue Nov 20 21:25:54 2012 +0100
@@ -120,7 +120,7 @@
 
   Address addr;
   int retval;
-  
+
   retval = enb1X2cSocket->GetSockName (addr);
   NS_ASSERT (retval == 0);
   InetSocketAddress localInetAddr = InetSocketAddress::ConvertFrom (addr);
@@ -225,7 +225,26 @@
           m_x2SapUser->RecvHandoverRequestAck (params);
         }
     }
-  else // procedureCode == EpcX2Header::HandoverPreparation
+  else if (procedureCode == EpcX2Header::LoadInformation)
+    {
+      if (messageType == EpcX2Header::InitiatingMessage)
+        {
+          NS_LOG_LOGIC ("Recv X2 message: LOAD INFORMATION");
+
+          EpcX2LoadInformationHeader x2LoadInfoHeader;
+          packet->RemoveHeader (x2LoadInfoHeader);
+
+          NS_LOG_INFO ("X2 LoadInformation header: " << x2LoadInfoHeader);
+
+          EpcX2SapUser::LoadInformationParams params;
+          params.cellInformationList = x2LoadInfoHeader.GetCellInformationList ();
+
+          NS_LOG_LOGIC ("cellInformationList size = " << params.cellInformationList.size ());
+
+          m_x2SapUser->RecvLoadInformation (params);
+        }
+    }
+  else if (procedureCode == EpcX2Header::UeContextRelease)
     {
       if (messageType == EpcX2Header::InitiatingMessage)
         {
@@ -246,7 +265,10 @@
           m_x2SapUser->RecvUeContextRelease (params);
         }
     }
-
+  else
+    {
+      NS_ASSERT_MSG (false, "ProcedureCode NOT SUPPORTED!!!");
+    }
 }
 
 //
@@ -291,7 +313,7 @@
   NS_LOG_INFO ("X2 HandoverRequest header: " << x2HoReqHeader);
 
   // Build the X2 packet
-  Ptr<Packet> packet = params.rrcContext;
+  Ptr<Packet> packet = (params.rrcContext != 0) ? (params.rrcContext) : (Create <Packet> ());
   packet->AddHeader (x2HoReqHeader);
   packet->AddHeader (x2Header);
   NS_LOG_INFO ("packetLen = " << packet->GetSize ());
@@ -395,4 +417,48 @@
 }
 
 
+void
+EpcX2::DoSendLoadInformation (EpcX2SapProvider::LoadInformationParams params)
+{
+  NS_LOG_FUNCTION (this);
+
+  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
+  NS_LOG_LOGIC ("cellInformationList size = " << params.cellInformationList.size ());
+
+  NS_ASSERT_MSG (m_x2InterfaceSockets.find (params.targetCellId) != m_x2InterfaceSockets.end (),
+                 "Missing infos for targetCellId = " << params.targetCellId);
+  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets [params.targetCellId];
+  Ptr<Socket> sourceSocket = socketInfo->m_localSocket;
+  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
+
+  NS_LOG_LOGIC ("sourceSocket = " << sourceSocket);
+  NS_LOG_LOGIC ("targetIpAddr = " << targetIpAddr);
+
+  NS_LOG_INFO ("Send X2 message: LOAD INFORMATION");
+
+  // Build the X2 message
+  EpcX2LoadInformationHeader x2LoadInfoHeader;
+  x2LoadInfoHeader.SetCellInformationList (params.cellInformationList);
+
+  EpcX2Header x2Header;
+  x2Header.SetMessageType (EpcX2Header::InitiatingMessage);
+  x2Header.SetProcedureCode (EpcX2Header::LoadInformation);
+  x2Header.SetLengthOfIes (x2LoadInfoHeader.GetLengthOfIes ());
+  x2Header.SetNumberOfIes (x2LoadInfoHeader.GetNumberOfIes ());
+
+  NS_LOG_INFO ("X2 header: " << x2Header);
+  NS_LOG_INFO ("X2 LoadInformation header: " << x2LoadInfoHeader);
+
+  // Build the X2 packet
+  Ptr<Packet> packet = Create <Packet> ();
+  packet->AddHeader (x2LoadInfoHeader);
+  packet->AddHeader (x2Header);
+  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
+
+  // Send the X2 message through the socket
+  sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2cUdpPort));
+
+}
+
+
 } // namespace ns3