author | Manuel Requena <manuel.requena@cttc.es> |
Mon, 08 Oct 2012 23:22:57 +0200 | |
changeset 9404 | 1f737f190823 |
parent 9403 | 4927542cfb6b |
child 9410 | fa212cd4e671 |
permissions | -rw-r--r-- |
9330 | 1 |
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 |
/* |
|
3 |
* Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC) |
|
4 |
* |
|
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 |
|
7 |
* published by the Free Software Foundation; |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
17 |
* |
|
18 |
* Author: Manuel Requena <manuel.requena@cttc.es> |
|
19 |
*/ |
|
20 |
||
21 |
#include "ns3/log.h" |
|
22 |
#include "ns3/inet-socket-address.h" |
|
23 |
#include "ns3/packet.h" |
|
24 |
#include "ns3/node.h" |
|
25 |
#include "ns3/lte-enb-net-device.h" |
|
26 |
||
27 |
#include "ns3/epc-x2-header.h" |
|
28 |
#include "ns3/epc-x2.h" |
|
29 |
||
30 |
NS_LOG_COMPONENT_DEFINE ("EpcX2"); |
|
31 |
||
32 |
namespace ns3 { |
|
33 |
||
34 |
||
35 |
X2IfaceInfo::X2IfaceInfo (Ptr<Socket> localSocket, Ipv4Address remoteIpAddr) |
|
36 |
{ |
|
37 |
m_localSocket = localSocket; |
|
38 |
m_remoteIpAddr = remoteIpAddr; |
|
39 |
} |
|
40 |
||
41 |
X2IfaceInfo::~X2IfaceInfo (void) |
|
42 |
{ |
|
43 |
} |
|
44 |
||
45 |
X2IfaceInfo& |
|
46 |
X2IfaceInfo::operator= (const X2IfaceInfo& value) |
|
47 |
{ |
|
48 |
NS_LOG_FUNCTION (this); |
|
49 |
m_localSocket = value.m_localSocket; |
|
50 |
m_remoteIpAddr = value.m_remoteIpAddr; |
|
51 |
return *this; |
|
52 |
} |
|
53 |
||
54 |
/////////////////////////////////////////// |
|
55 |
||
56 |
X2CellInfo::X2CellInfo (uint16_t localCellId, uint16_t remoteCellId) |
|
57 |
{ |
|
58 |
m_localCellId = localCellId; |
|
59 |
m_remoteCellId = remoteCellId; |
|
60 |
} |
|
61 |
||
62 |
X2CellInfo::~X2CellInfo (void) |
|
63 |
{ |
|
64 |
} |
|
65 |
||
66 |
X2CellInfo& |
|
67 |
X2CellInfo::operator= (const X2CellInfo& value) |
|
68 |
{ |
|
69 |
NS_LOG_FUNCTION (this); |
|
70 |
m_localCellId = value.m_localCellId; |
|
71 |
m_remoteCellId = value.m_remoteCellId; |
|
72 |
return *this; |
|
73 |
} |
|
74 |
||
75 |
/////////////////////////////////////////// |
|
76 |
||
77 |
NS_OBJECT_ENSURE_REGISTERED (EpcX2); |
|
78 |
||
79 |
EpcX2::EpcX2 () |
|
80 |
: m_x2cUdpPort (4444) |
|
81 |
{ |
|
82 |
NS_LOG_FUNCTION (this); |
|
83 |
||
84 |
m_x2SapProvider = new EpcX2SpecificEpcX2SapProvider<EpcX2> (this); |
|
85 |
} |
|
86 |
||
87 |
TypeId |
|
88 |
EpcX2::GetTypeId (void) |
|
89 |
{ |
|
90 |
static TypeId tid = TypeId ("ns3::EpcX2") |
|
91 |
.SetParent<Object> (); |
|
92 |
return tid; |
|
93 |
} |
|
94 |
||
95 |
EpcX2::~EpcX2 (void) |
|
96 |
{ |
|
97 |
NS_LOG_FUNCTION (this); |
|
98 |
delete m_x2SapProvider; |
|
99 |
} |
|
100 |
||
101 |
void |
|
102 |
EpcX2::SetEpcX2SapUser (EpcX2SapUser * s) |
|
103 |
{ |
|
104 |
NS_LOG_FUNCTION (this << s); |
|
105 |
m_x2SapUser = s; |
|
106 |
} |
|
107 |
||
108 |
EpcX2SapProvider* |
|
109 |
EpcX2::GetEpcX2SapProvider () |
|
110 |
{ |
|
111 |
NS_LOG_FUNCTION (this); |
|
112 |
return m_x2SapProvider; |
|
113 |
} |
|
114 |
||
115 |
||
116 |
void |
|
117 |
EpcX2::AddX2Interface (uint16_t enb1CellId, Ptr<Socket> enb1X2cSocket, uint16_t enb2CellId, Ptr<Socket> enb2X2cSocket) |
|
118 |
{ |
|
119 |
NS_LOG_FUNCTION (this << enb1CellId << enb1X2cSocket << enb2CellId << enb2X2cSocket); |
|
120 |
||
121 |
Address addr; |
|
122 |
int retval; |
|
123 |
||
124 |
retval = enb1X2cSocket->GetSockName (addr); |
|
125 |
NS_ASSERT (retval == 0); |
|
126 |
InetSocketAddress localInetAddr = InetSocketAddress::ConvertFrom (addr); |
|
127 |
NS_LOG_LOGIC ("local IP address = " << localInetAddr.GetIpv4 ()); |
|
128 |
||
129 |
retval = enb2X2cSocket->GetSockName (addr); |
|
130 |
NS_ASSERT (retval == 0); |
|
131 |
InetSocketAddress remoteInetAddr = InetSocketAddress::ConvertFrom (addr); |
|
132 |
NS_LOG_LOGIC ("remote IP address = " << remoteInetAddr.GetIpv4 ()); |
|
133 |
||
134 |
enb1X2cSocket->SetRecvCallback (MakeCallback (&EpcX2::RecvFromX2cSocket, this)); |
|
135 |
||
136 |
NS_ASSERT_MSG (m_x2InterfaceSockets.find (enb2CellId) == m_x2InterfaceSockets.end (), |
|
137 |
"Mapping for remoteCellId = " << enb2CellId << " is already known"); |
|
138 |
m_x2InterfaceSockets [enb2CellId] = Create<X2IfaceInfo> (enb1X2cSocket, remoteInetAddr.GetIpv4 ()); |
|
139 |
||
140 |
NS_ASSERT_MSG (m_x2InterfaceCellIds.find (enb1X2cSocket) == m_x2InterfaceCellIds.end (), |
|
141 |
"Mapping for localSocket = " << enb1X2cSocket << " is already known"); |
|
142 |
m_x2InterfaceCellIds [enb1X2cSocket] = Create<X2CellInfo> (enb1CellId, enb2CellId); |
|
143 |
} |
|
144 |
||
145 |
||
146 |
void |
|
147 |
EpcX2::RecvFromX2cSocket (Ptr<Socket> socket) |
|
148 |
{ |
|
149 |
NS_LOG_FUNCTION (this << socket); |
|
150 |
||
151 |
NS_LOG_LOGIC ("Recv X2 message: from Socket"); |
|
152 |
Ptr<Packet> packet = socket->Recv (); |
|
153 |
NS_LOG_LOGIC ("packetLen = " << packet->GetSize ()); |
|
154 |
||
155 |
EpcX2Header x2Header; |
|
156 |
packet->RemoveHeader (x2Header); |
|
157 |
||
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
158 |
NS_LOG_LOGIC ("X2 header: " << x2Header); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
159 |
|
9330 | 160 |
uint8_t messageType = x2Header.GetMessageType (); |
161 |
uint8_t procedureCode = x2Header.GetProcedureCode (); |
|
162 |
||
163 |
NS_LOG_LOGIC ("messageType = " << (uint32_t)messageType); |
|
164 |
NS_LOG_LOGIC ("procedureCode = " << (uint32_t)procedureCode); |
|
165 |
||
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
166 |
if (procedureCode == EpcX2Header::HandoverPreparation) |
9330 | 167 |
{ |
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
168 |
if (messageType == EpcX2Header::InitiatingMessage) |
9330 | 169 |
{ |
170 |
NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST"); |
|
171 |
||
172 |
EpcX2HandoverRequestHeader x2HoReqHeader; |
|
173 |
packet->RemoveHeader (x2HoReqHeader); |
|
174 |
||
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
175 |
NS_LOG_INFO ("X2 HandoverRequest header: " << x2HoReqHeader); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
176 |
|
9330 | 177 |
NS_ASSERT_MSG (m_x2InterfaceCellIds.find (socket) != m_x2InterfaceCellIds.end (), |
178 |
"Missing infos of local and remote CellId"); |
|
179 |
Ptr<X2CellInfo> cellsInfo = m_x2InterfaceCellIds [socket]; |
|
180 |
||
181 |
EpcX2SapUser::HandoverRequestParams params; |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
182 |
params.oldEnbUeX2apId = x2HoReqHeader.GetOldEnbUeX2apId (); |
9330 | 183 |
params.cause = x2HoReqHeader.GetCause (); |
184 |
params.sourceCellId = cellsInfo->m_remoteCellId; |
|
185 |
params.targetCellId = x2HoReqHeader.GetTargetCellId (); |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
186 |
params.ueAggregateMaxBitRateDownlink = x2HoReqHeader.GetUeAggregateMaxBitRateDownlink (); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
187 |
params.ueAggregateMaxBitRateUplink = x2HoReqHeader.GetUeAggregateMaxBitRateUplink (); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
188 |
params.bearers = x2HoReqHeader.GetBearers (); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
189 |
params.rrcContext = packet; |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
190 |
|
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
191 |
NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
9404
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
192 |
NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); |
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
193 |
NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
194 |
NS_LOG_LOGIC ("cellsInfo->m_localCellId = " << cellsInfo->m_localCellId); |
9330 | 195 |
NS_ASSERT_MSG (params.targetCellId == cellsInfo->m_localCellId, |
196 |
"TargetCellId mismatches with localCellId"); |
|
197 |
||
9404
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
198 |
// Map oldEnbUeX2apId to sourceCellId |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
199 |
NS_ASSERT_MSG (m_x2Ues.find (params.oldEnbUeX2apId) == m_x2Ues.end (), |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
200 |
"UE already in CellId. enbUeX2apId = " << params.oldEnbUeX2apId << ". CellId = " << params.sourceCellId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
201 |
m_x2Ues [params.oldEnbUeX2apId] = params.sourceCellId; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
202 |
|
9330 | 203 |
m_x2SapUser->RecvHandoverRequest (params); |
204 |
} |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
205 |
else // messageType == SuccessfulOutcome |
9330 | 206 |
{ |
207 |
NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST ACK"); |
|
208 |
||
209 |
EpcX2HandoverRequestAckHeader x2HoReqAckHeader; |
|
210 |
packet->RemoveHeader (x2HoReqAckHeader); |
|
211 |
||
212 |
NS_ASSERT_MSG (m_x2InterfaceCellIds.find (socket) != m_x2InterfaceCellIds.end (), |
|
213 |
"Missing infos of local and remote CellId"); |
|
214 |
Ptr<X2CellInfo> cellsInfo = m_x2InterfaceCellIds [socket]; |
|
215 |
||
9345
8290ae6cab62
add/remove UEs and bearers upon handover
Nicola Baldo <nicola@baldo.biz>
parents:
9330
diff
changeset
|
216 |
EpcX2SapUser::HandoverRequestAckParams params; |
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
217 |
params.oldEnbUeX2apId = x2HoReqAckHeader.GetOldEnbUeX2apId (); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
218 |
params.newEnbUeX2apId = x2HoReqAckHeader.GetNewEnbUeX2apId (); |
9330 | 219 |
params.sourceCellId = cellsInfo->m_localCellId; |
220 |
params.targetCellId = cellsInfo->m_remoteCellId; |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
221 |
params.admittedBearers = x2HoReqAckHeader.GetAdmittedBearers (); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
222 |
params.notAdmittedBearers = x2HoReqAckHeader.GetNotAdmittedBearers (); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
223 |
params.rrcContext = packet; |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
224 |
|
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
225 |
NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
226 |
NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
227 |
NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
228 |
NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
9330 | 229 |
|
230 |
m_x2SapUser->RecvHandoverRequestAck (params); |
|
231 |
} |
|
232 |
} |
|
9404
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
233 |
else // procedureCode == EpcX2Header::HandoverPreparation |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
234 |
{ |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
235 |
if (messageType == EpcX2Header::InitiatingMessage) |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
236 |
{ |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
237 |
NS_LOG_LOGIC ("Recv X2 message: UE CONTEXT RELEASE"); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
238 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
239 |
EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
240 |
packet->RemoveHeader (x2UeCtxReleaseHeader); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
241 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
242 |
NS_LOG_INFO ("X2 UeContextRelease header: " << x2UeCtxReleaseHeader); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
243 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
244 |
EpcX2SapUser::UeContextReleaseParams params; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
245 |
params.oldEnbUeX2apId = x2UeCtxReleaseHeader.GetOldEnbUeX2apId (); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
246 |
params.newEnbUeX2apId = x2UeCtxReleaseHeader.GetNewEnbUeX2apId (); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
247 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
248 |
NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
249 |
NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
250 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
251 |
m_x2SapUser->RecvUeContextRelease (params); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
252 |
} |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
253 |
} |
9330 | 254 |
|
255 |
} |
|
256 |
||
257 |
// |
|
258 |
// Implementation of the X2 SAP Provider |
|
259 |
// |
|
260 |
void |
|
261 |
EpcX2::DoSendHandoverRequest (EpcX2SapProvider::HandoverRequestParams params) |
|
262 |
{ |
|
263 |
NS_LOG_FUNCTION (this); |
|
264 |
||
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
265 |
NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
9330 | 266 |
NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); |
267 |
NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
|
268 |
||
269 |
NS_ASSERT_MSG (m_x2InterfaceSockets.find (params.targetCellId) != m_x2InterfaceSockets.end (), |
|
270 |
"Missing infos for targetCellId = " << params.targetCellId); |
|
271 |
Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets [params.targetCellId]; |
|
272 |
Ptr<Socket> sourceSocket = socketInfo->m_localSocket; |
|
273 |
Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr; |
|
274 |
||
275 |
NS_LOG_LOGIC ("sourceSocket = " << sourceSocket); |
|
276 |
NS_LOG_LOGIC ("targetIpAddr = " << targetIpAddr); |
|
9404
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
277 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
278 |
// Map oldEnbUeX2apId to sourceCellId |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
279 |
NS_ASSERT_MSG (m_x2Ues.find (params.oldEnbUeX2apId) == m_x2Ues.end (), |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
280 |
"UE already in CellId. enbUeX2apId = " << params.oldEnbUeX2apId << ". CellId = " << params.sourceCellId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
281 |
m_x2Ues [params.oldEnbUeX2apId] = params.sourceCellId; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
282 |
|
9330 | 283 |
NS_LOG_INFO ("Send X2 message: HANDOVER REQUEST"); |
284 |
||
285 |
// Build the X2 message |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
286 |
EpcX2HandoverRequestHeader x2HoReqHeader; |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
287 |
x2HoReqHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
288 |
x2HoReqHeader.SetCause (params.cause); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
289 |
x2HoReqHeader.SetTargetCellId (params.targetCellId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
290 |
x2HoReqHeader.SetUeAggregateMaxBitRateDownlink (params.ueAggregateMaxBitRateDownlink); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
291 |
x2HoReqHeader.SetUeAggregateMaxBitRateUplink (params.ueAggregateMaxBitRateUplink); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
292 |
x2HoReqHeader.SetBearers (params.bearers); |
9330 | 293 |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
294 |
EpcX2Header x2Header; |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
295 |
x2Header.SetMessageType (EpcX2Header::InitiatingMessage); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
296 |
x2Header.SetProcedureCode (EpcX2Header::HandoverPreparation); |
9397
08dde5bce775
Add some IEs to the X2 message headers
Manuel Requena <manuel.requena@cttc.es>
parents:
9395
diff
changeset
|
297 |
x2Header.SetLengthOfIes (x2HoReqHeader.GetLengthOfIes ()); |
08dde5bce775
Add some IEs to the X2 message headers
Manuel Requena <manuel.requena@cttc.es>
parents:
9395
diff
changeset
|
298 |
x2Header.SetNumberOfIes (x2HoReqHeader.GetNumberOfIes ()); |
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
299 |
|
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
300 |
NS_LOG_INFO ("X2 header: " << x2Header); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
301 |
NS_LOG_INFO ("X2 HandoverRequest header: " << x2HoReqHeader); |
9330 | 302 |
|
303 |
// Build the X2 packet |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
304 |
Ptr<Packet> packet = params.rrcContext; |
9330 | 305 |
packet->AddHeader (x2HoReqHeader); |
306 |
packet->AddHeader (x2Header); |
|
307 |
NS_LOG_INFO ("packetLen = " << packet->GetSize ()); |
|
308 |
||
309 |
// Send the X2 message through the socket |
|
310 |
sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2cUdpPort)); |
|
311 |
} |
|
312 |
||
313 |
||
314 |
void |
|
315 |
EpcX2::DoSendHandoverRequestAck (EpcX2SapProvider::HandoverRequestAckParams params) |
|
316 |
{ |
|
317 |
NS_LOG_FUNCTION (this); |
|
318 |
||
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
319 |
NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
320 |
NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId); |
9330 | 321 |
NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); |
322 |
NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); |
|
323 |
||
324 |
NS_ASSERT_MSG (m_x2InterfaceSockets.find (params.sourceCellId) != m_x2InterfaceSockets.end (), |
|
325 |
"Socket infos not defined for sourceCellId = " << params.sourceCellId); |
|
326 |
||
327 |
Ptr<Socket> localSocket = m_x2InterfaceSockets [params.sourceCellId]->m_localSocket; |
|
328 |
Ipv4Address remoteIpAddr = m_x2InterfaceSockets [params.sourceCellId]->m_remoteIpAddr; |
|
329 |
||
330 |
NS_LOG_LOGIC ("localSocket = " << localSocket); |
|
331 |
NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr); |
|
332 |
||
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
333 |
NS_LOG_INFO ("Send X2 message: HANDOVER REQUEST ACK"); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
334 |
|
9330 | 335 |
// Build the X2 message |
336 |
EpcX2Header x2Header; |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
337 |
x2Header.SetMessageType (EpcX2Header::SuccessfulOutcome); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
338 |
x2Header.SetProcedureCode (EpcX2Header::HandoverPreparation); |
9330 | 339 |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
340 |
EpcX2HandoverRequestAckHeader x2HoAckHeader; |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
341 |
x2HoAckHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
342 |
x2HoAckHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
343 |
x2HoAckHeader.SetAdmittedBearers (params.admittedBearers); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
344 |
x2HoAckHeader.SetNotAdmittedBearers (params.notAdmittedBearers); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
345 |
|
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
346 |
NS_LOG_INFO ("X2 header: " << x2Header); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
347 |
NS_LOG_INFO ("X2 HandoverAck header: " << x2HoAckHeader); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
348 |
NS_LOG_INFO ("RRC context: " << params.rrcContext); |
9330 | 349 |
|
350 |
// Build the X2 packet |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
351 |
Ptr<Packet> packet = (params.rrcContext != 0) ? (params.rrcContext) : (Create <Packet> ()); |
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
352 |
packet->AddHeader (x2HoAckHeader); |
9330 | 353 |
packet->AddHeader (x2Header); |
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
354 |
NS_LOG_INFO ("packetLen = " << packet->GetSize ()); |
9330 | 355 |
|
9395
8a4511204699
Use new parameters of the X2 SAP
Manuel Requena <manuel.requena@cttc.es>
parents:
9330
diff
changeset
|
356 |
// Send the X2 message through the socket |
9330 | 357 |
localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort)); |
358 |
} |
|
359 |
||
360 |
||
9404
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
361 |
void |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
362 |
EpcX2::DoSendUeContextRelease (EpcX2SapProvider::UeContextReleaseParams params) |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
363 |
{ |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
364 |
NS_LOG_FUNCTION (this); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
365 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
366 |
NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
367 |
NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
368 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
369 |
NS_ASSERT_MSG (m_x2Ues.find (params.oldEnbUeX2apId) != m_x2Ues.end (), |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
370 |
"Missing CellId for enbUeX2apId = " << params.oldEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
371 |
uint16_t sourceCellId = m_x2Ues [params.oldEnbUeX2apId]; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
372 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
373 |
NS_LOG_LOGIC ("sourceCellId = " << sourceCellId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
374 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
375 |
NS_ASSERT_MSG (m_x2InterfaceSockets.find (sourceCellId) != m_x2InterfaceSockets.end (), |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
376 |
"Socket infos not defined for sourceCellId = " << sourceCellId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
377 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
378 |
Ptr<Socket> localSocket = m_x2InterfaceSockets [sourceCellId]->m_localSocket; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
379 |
Ipv4Address remoteIpAddr = m_x2InterfaceSockets [sourceCellId]->m_remoteIpAddr; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
380 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
381 |
NS_LOG_LOGIC ("localSocket = " << localSocket); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
382 |
NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
383 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
384 |
NS_LOG_INFO ("Send X2 message: UE CONTEXT RELEASE"); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
385 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
386 |
// Build the X2 message |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
387 |
EpcX2Header x2Header; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
388 |
x2Header.SetMessageType (EpcX2Header::InitiatingMessage); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
389 |
x2Header.SetProcedureCode (EpcX2Header::UeContextRelease); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
390 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
391 |
EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader; |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
392 |
x2UeCtxReleaseHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
393 |
x2UeCtxReleaseHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
394 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
395 |
NS_LOG_INFO ("X2 header: " << x2Header); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
396 |
NS_LOG_INFO ("X2 UeContextRelease header: " << x2UeCtxReleaseHeader); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
397 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
398 |
// Build the X2 packet |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
399 |
Ptr<Packet> packet = Create <Packet> (); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
400 |
packet->AddHeader (x2UeCtxReleaseHeader); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
401 |
packet->AddHeader (x2Header); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
402 |
NS_LOG_INFO ("packetLen = " << packet->GetSize ()); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
403 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
404 |
// Send the X2 message through the socket |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
405 |
localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort)); |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
406 |
} |
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
407 |
|
1f737f190823
Add UE Context Release X2 message
Manuel Requena <manuel.requena@cttc.es>
parents:
9403
diff
changeset
|
408 |
|
9330 | 409 |
} // namespace ns3 |