A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
lte-test-entities.cc
Go to the documentation of this file.
1
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2011 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/simulator.h"
22
#include "ns3/log.h"
23
24
#include "ns3/lte-rlc-header.h"
25
#include "ns3/lte-rlc-am-header.h"
26
#include "ns3/lte-pdcp-header.h"
27
28
#include "
lte-test-entities.h
"
29
30
NS_LOG_COMPONENT_DEFINE
(
"LteTestEntities"
);
31
32
namespace
ns3 {
33
34
36
37
TypeId
38
LteTestRrc::GetTypeId
(
void
)
39
{
40
static
TypeId
tid =
TypeId
(
"ns3::LteTestRrc"
)
41
.
SetParent
<
Object
> ()
42
.AddConstructor<LteTestRrc> ()
43
;
44
45
return
tid;
46
}
47
48
LteTestRrc::LteTestRrc
()
49
{
50
NS_LOG_FUNCTION
(
this
);
51
52
m_txPdus
= 0;
53
m_txBytes
= 0;
54
m_rxPdus
= 0;
55
m_rxBytes
= 0;
56
m_txLastTime
=
Time
(0);
57
m_rxLastTime
=
Time
(0);;
58
59
m_pdcpSapUser
=
new
LtePdcpSpecificLtePdcpSapUser<LteTestRrc>
(
this
);
60
// Simulator::ScheduleNow (&LteTestRrc::Start, this);
61
}
62
63
LteTestRrc::~LteTestRrc
()
64
{
65
NS_LOG_FUNCTION
(
this
);
66
}
67
68
void
69
LteTestRrc::DoDispose
()
70
{
71
NS_LOG_FUNCTION
(
this
);
72
delete
m_pdcpSapUser
;
73
}
74
75
void
76
LteTestRrc::SetLtePdcpSapProvider
(
LtePdcpSapProvider
* s)
77
{
78
m_pdcpSapProvider
= s;
79
}
80
81
LtePdcpSapUser
*
82
LteTestRrc::GetLtePdcpSapUser
(
void
)
83
{
84
return
m_pdcpSapUser
;
85
}
86
87
88
std::string
89
LteTestRrc::GetDataReceived
(
void
)
90
{
91
NS_LOG_FUNCTION
(
this
);
92
return
m_receivedData
;
93
}
94
95
// Stats
96
uint32_t
97
LteTestRrc::GetTxPdus
(
void
)
98
{
99
NS_LOG_FUNCTION
(
this
<<
m_txPdus
);
100
return
m_txPdus
;
101
}
102
103
uint32_t
104
LteTestRrc::GetTxBytes
(
void
)
105
{
106
NS_LOG_FUNCTION
(
this
<<
m_txBytes
);
107
return
m_txBytes
;
108
}
109
110
uint32_t
111
LteTestRrc::GetRxPdus
(
void
)
112
{
113
NS_LOG_FUNCTION
(
this
<<
m_rxPdus
);
114
return
m_rxPdus
;
115
}
116
117
uint32_t
118
LteTestRrc::GetRxBytes
(
void
)
119
{
120
NS_LOG_FUNCTION
(
this
<<
m_rxBytes
);
121
return
m_rxBytes
;
122
}
123
124
Time
125
LteTestRrc::GetTxLastTime
(
void
)
126
{
127
NS_LOG_FUNCTION
(
this
<<
m_txLastTime
);
128
return
m_txLastTime
;
129
}
130
131
Time
132
LteTestRrc::GetRxLastTime
(
void
)
133
{
134
NS_LOG_FUNCTION
(
this
<<
m_rxLastTime
);
135
return
m_rxLastTime
;
136
}
137
138
139
void
140
LteTestRrc::SetArrivalTime
(
Time
arrivalTime)
141
{
142
NS_LOG_FUNCTION
(
this
<< arrivalTime);
143
m_arrivalTime
= arrivalTime;
144
}
145
146
void
147
LteTestRrc::SetPduSize
(uint32_t pduSize)
148
{
149
NS_LOG_FUNCTION
(
this
<< pduSize);
150
m_pduSize
= pduSize;
151
}
152
153
158
void
159
LteTestRrc::DoReceivePdcpSdu
(
LtePdcpSapUser::ReceivePdcpSduParameters
params)
160
{
161
NS_LOG_FUNCTION
(
this
<< params.
pdcpSdu
->
GetSize
());
162
Ptr<Packet>
p = params.
pdcpSdu
;
163
// NS_LOG_LOGIC ("PDU received = " << (*p));
164
165
uint32_t dataLen = p->
GetSize
();
166
uint8_t *buf =
new
uint8_t[dataLen];
167
168
// Stats
169
m_rxPdus
++;
170
m_rxBytes
+= dataLen;
171
m_rxLastTime
=
Simulator::Now
();
172
173
p->CopyData (buf, dataLen);
174
m_receivedData
= std::string ((
char
*)buf, dataLen);
175
176
// NS_LOG_LOGIC (m_receivedData);
177
178
delete
[] buf;
179
}
180
185
void
186
LteTestRrc::Start
()
187
{
188
NS_LOG_FUNCTION
(
this
);
189
NS_ASSERT_MSG
(
m_arrivalTime
!= 0,
"Arrival time must be different from 0"
);
190
191
// Stats
192
m_txPdus
++;
193
m_txBytes
+=
m_pduSize
;
194
m_txLastTime
=
Simulator::Now
();
195
196
LtePdcpSapProvider::TransmitPdcpSduParameters
p;
197
p.
rnti
= 1111;
198
p.
lcid
= 222;
199
p.
pdcpSdu
= Create<Packet> (
m_pduSize
);
200
201
Simulator::ScheduleNow
(&
LtePdcpSapProvider::TransmitPdcpSdu
,
m_pdcpSapProvider
, p);
202
m_nextPdu
=
Simulator::Schedule
(
m_arrivalTime
, &
LteTestRrc::Start
,
this
);
203
// Simulator::Run ();
204
}
205
206
void
207
LteTestRrc::Stop
()
208
{
209
NS_LOG_FUNCTION
(
this
);
210
m_nextPdu
.
Cancel
();
211
}
212
213
void
214
LteTestRrc::SendData
(
Time
at, std::string dataToSend)
215
{
216
NS_LOG_FUNCTION
(
this
<< at << dataToSend.length () << dataToSend);
217
218
// Stats
219
m_txPdus
++;
220
m_txBytes
+= dataToSend.length ();
221
222
LtePdcpSapProvider::TransmitPdcpSduParameters
p;
223
p.
rnti
= 1111;
224
p.
lcid
= 222;
225
226
NS_LOG_LOGIC
(
"Data("
<< dataToSend.length () <<
") = "
<< dataToSend.data ());
227
p.
pdcpSdu
= Create<Packet> ((uint8_t *) dataToSend.data (), dataToSend.length ());
228
229
NS_LOG_LOGIC
(
"Packet("
<< p.
pdcpSdu
->
GetSize
() <<
")"
);
230
Simulator::Schedule
(at, &
LtePdcpSapProvider::TransmitPdcpSdu
,
m_pdcpSapProvider
, p);
231
}
232
234
235
TypeId
236
LteTestPdcp::GetTypeId
(
void
)
237
{
238
static
TypeId
tid =
TypeId
(
"ns3::LteTestPdcp"
)
239
.
SetParent
<
Object
> ()
240
.AddConstructor<LteTestPdcp> ()
241
;
242
243
return
tid;
244
}
245
246
LteTestPdcp::LteTestPdcp
()
247
{
248
NS_LOG_FUNCTION
(
this
);
249
m_rlcSapUser
=
new
LteRlcSpecificLteRlcSapUser<LteTestPdcp>
(
this
);
250
Simulator::ScheduleNow
(&
LteTestPdcp::Start
,
this
);
251
}
252
253
LteTestPdcp::~LteTestPdcp
()
254
{
255
NS_LOG_FUNCTION
(
this
);
256
}
257
258
void
259
LteTestPdcp::DoDispose
()
260
{
261
NS_LOG_FUNCTION
(
this
);
262
delete
m_rlcSapUser
;
263
}
264
265
void
266
LteTestPdcp::SetLteRlcSapProvider
(
LteRlcSapProvider
* s)
267
{
268
m_rlcSapProvider
= s;
269
}
270
271
LteRlcSapUser
*
272
LteTestPdcp::GetLteRlcSapUser
(
void
)
273
{
274
return
m_rlcSapUser
;
275
}
276
277
278
std::string
279
LteTestPdcp::GetDataReceived
(
void
)
280
{
281
NS_LOG_FUNCTION
(
this
);
282
283
return
m_receivedData
;
284
}
285
286
291
void
292
LteTestPdcp::DoReceivePdcpPdu
(
Ptr<Packet>
p)
293
{
294
NS_LOG_FUNCTION
(
this
<< p->
GetSize
());
295
NS_LOG_LOGIC
(
"Data = "
<< (*p));
296
297
uint32_t dataLen = p->
GetSize
();
298
uint8_t *buf =
new
uint8_t[dataLen];
299
p->
CopyData
(buf, dataLen);
300
m_receivedData
= std::string ((
char
*)buf, dataLen);
301
302
NS_LOG_LOGIC
(
m_receivedData
);
303
304
delete
[] buf;
305
}
306
311
void
312
LteTestPdcp::Start
()
313
{
314
NS_LOG_FUNCTION
(
this
);
315
}
316
317
void
318
LteTestPdcp::SendData
(
Time
time, std::string dataToSend)
319
{
320
NS_LOG_FUNCTION
(
this
<< time << dataToSend.length () << dataToSend);
321
322
LteRlcSapProvider::TransmitPdcpPduParameters
p;
323
p.
rnti
= 1111;
324
p.lcid = 222;
325
326
NS_LOG_LOGIC
(
"Data("
<< dataToSend.length () <<
") = "
<< dataToSend.data ());
327
p.pdcpPdu = Create<Packet> ((uint8_t *) dataToSend.data (), dataToSend.length ());
328
329
NS_LOG_LOGIC
(
"Packet("
<< p.pdcpPdu->GetSize () <<
")"
);
330
Simulator::Schedule
(time, &
LteRlcSapProvider::TransmitPdcpPdu
,
m_rlcSapProvider
, p);
331
}
332
334
335
TypeId
336
LteTestMac::GetTypeId
(
void
)
337
{
338
static
TypeId
tid =
TypeId
(
"ns3::LteTestMac"
)
339
.
SetParent
<
Object
> ()
340
.AddConstructor<LteTestMac> ()
341
;
342
343
return
tid;
344
}
345
346
LteTestMac::LteTestMac
()
347
{
348
NS_LOG_FUNCTION
(
this
);
349
m_device
= 0;
350
m_macSapProvider
=
new
EnbMacMemberLteMacSapProvider<LteTestMac>
(
this
);
351
m_macSapUser
= 0;
352
m_macLoopback
= 0;
353
m_pdcpHeaderPresent
=
false
;
354
m_rlcHeaderType
=
UM_RLC_HEADER
;
355
m_txOpportunityMode
=
MANUAL_MODE
;
356
m_txOppTime
=
Seconds
(0.001);
357
m_txOppSize
= 0;
358
359
m_txPdus
= 0;
360
m_txBytes
= 0;
361
m_rxPdus
= 0;
362
m_rxBytes
= 0;
363
364
// m_cmacSapProvider = new EnbMacMemberLteEnbCmacSapProvider (this);
365
// m_schedSapUser = new EnbMacMemberFfMacSchedSapUser (this);
366
// m_cschedSapUser = new EnbMacMemberFfMacCschedSapUser (this);
367
// m_enbPhySapUser = new EnbMacMemberLteEnbPhySapUser (this);
368
}
369
370
LteTestMac::~LteTestMac
()
371
{
372
NS_LOG_FUNCTION
(
this
);
373
}
374
375
void
376
LteTestMac::DoDispose
()
377
{
378
NS_LOG_FUNCTION
(
this
);
379
delete
m_macSapProvider
;
380
// delete m_cmacSapProvider;
381
// delete m_schedSapUser;
382
// delete m_cschedSapUser;
383
// delete m_enbPhySapUser;
384
385
m_device
= 0;
386
}
387
388
void
389
LteTestMac::SetDevice
(
Ptr<NetDevice>
device)
390
{
391
m_device
= device;
392
}
393
394
void
395
LteTestMac::SetLteMacSapUser
(
LteMacSapUser
* s)
396
{
397
m_macSapUser
= s;
398
}
399
400
LteMacSapProvider
*
401
LteTestMac::GetLteMacSapProvider
(
void
)
402
{
403
return
m_macSapProvider
;
404
}
405
406
void
407
LteTestMac::SetLteMacLoopback
(
Ptr<LteTestMac>
s)
408
{
409
m_macLoopback
= s;
410
}
411
412
std::string
413
LteTestMac::GetDataReceived
(
void
)
414
{
415
NS_LOG_FUNCTION
(
this
);
416
return
m_receivedData
;
417
}
418
419
// Stats
420
uint32_t
421
LteTestMac::GetTxPdus
(
void
)
422
{
423
NS_LOG_FUNCTION
(
this
<<
m_txPdus
);
424
return
m_txPdus
;
425
}
426
427
uint32_t
428
LteTestMac::GetTxBytes
(
void
)
429
{
430
NS_LOG_FUNCTION
(
this
<<
m_txBytes
);
431
return
m_txBytes
;
432
}
433
434
uint32_t
435
LteTestMac::GetRxPdus
(
void
)
436
{
437
NS_LOG_FUNCTION
(
this
<<
m_rxPdus
);
438
return
m_rxPdus
;
439
}
440
441
uint32_t
442
LteTestMac::GetRxBytes
(
void
)
443
{
444
NS_LOG_FUNCTION
(
this
<<
m_rxBytes
);
445
return
m_rxBytes
;
446
}
447
448
449
void
450
LteTestMac::SendTxOpportunity
(
Time
time, uint32_t bytes)
451
{
452
NS_LOG_FUNCTION
(
this
<< time << bytes);
453
Simulator::Schedule
(time, &
LteMacSapUser::NotifyTxOpportunity
,
m_macSapUser
, bytes, 0, 0);
454
if
(
m_txOpportunityMode
==
RANDOM_MODE
)
455
{
456
if
(
m_txOppTime
!=
Seconds
(0))
457
{
458
Simulator::Schedule
(
m_txOppTime
, &
LteTestMac::SendTxOpportunity
,
this
,
m_txOppTime
,
m_txOppSize
);
459
}
460
}
461
}
462
463
void
464
LteTestMac::SetPdcpHeaderPresent
(
bool
present)
465
{
466
NS_LOG_FUNCTION
(
this
<< present);
467
m_pdcpHeaderPresent
= present;
468
}
469
470
void
471
LteTestMac::SetRlcHeaderType
(uint8_t rlcHeaderType)
472
{
473
NS_LOG_FUNCTION
(
this
<< rlcHeaderType);
474
m_rlcHeaderType
= rlcHeaderType;
475
}
476
477
void
478
LteTestMac::SetTxOpportunityMode
(uint8_t mode)
479
{
480
NS_LOG_FUNCTION
(
this
<< (uint32_t)mode);
481
m_txOpportunityMode
= mode;
482
483
if
(
m_txOpportunityMode
==
RANDOM_MODE
)
484
{
485
if
(
m_txOppTime
!=
Seconds
(0.0))
486
{
487
SendTxOpportunity
(
m_txOppTime
,
m_txOppSize
);
488
}
489
}
490
}
491
492
void
493
LteTestMac::SetTxOppTime
(
Time
txOppTime)
494
{
495
NS_LOG_FUNCTION
(
this
<< txOppTime);
496
m_txOppTime
= txOppTime;
497
}
498
499
void
500
LteTestMac::SetTxOppSize
(uint32_t txOppSize)
501
{
502
NS_LOG_FUNCTION
(
this
<< txOppSize);
503
m_txOppSize
= txOppSize;
504
}
505
506
511
void
512
LteTestMac::DoTransmitPdu
(
LteMacSapProvider::TransmitPduParameters
params)
513
{
514
NS_LOG_FUNCTION
(
this
<< params.
pdu
->
GetSize
());
515
516
m_txPdus
++;
517
m_txBytes
+= params.
pdu
->
GetSize
();
518
519
if
(
m_device
)
520
{
521
m_device
->
Send
(params.
pdu
,
m_device
->
GetBroadcast
(), 0);
522
}
523
else
if
(
m_macLoopback
)
524
{
525
Simulator::Schedule
(
Seconds
(0.1), &
LteMacSapUser::ReceivePdu
,
526
m_macLoopback
->
m_macSapUser
, params.
pdu
);
527
}
528
else
529
{
530
LtePdcpHeader
pdcpHeader;
531
532
if
(
m_rlcHeaderType
==
AM_RLC_HEADER
)
533
{
534
// Remove AM RLC header
535
LteRlcAmHeader
rlcAmHeader;
536
params.
pdu
->
RemoveHeader
(rlcAmHeader);
537
NS_LOG_LOGIC
(
"AM RLC header: "
<< rlcAmHeader);
538
}
539
else
// if (m_rlcHeaderType == UM_RLC_HEADER)
540
{
541
// Remove UM RLC header
542
LteRlcHeader
rlcHeader;
543
params.
pdu
->
RemoveHeader
(rlcHeader);
544
NS_LOG_LOGIC
(
"UM RLC header: "
<< rlcHeader);
545
}
546
547
// Remove PDCP header, if present
548
if
(
m_pdcpHeaderPresent
)
549
{
550
params.
pdu
->
RemoveHeader
(pdcpHeader);
551
NS_LOG_LOGIC
(
"PDCP header: "
<< pdcpHeader);
552
}
553
554
// Copy data to a string
555
uint32_t dataLen = params.
pdu
->
GetSize
();
556
uint8_t *buf =
new
uint8_t[dataLen];
557
params.
pdu
->
CopyData
(buf, dataLen);
558
m_receivedData
= std::string ((
char
*)buf, dataLen);
559
560
NS_LOG_LOGIC
(
"Data ("
<< dataLen <<
") = "
<<
m_receivedData
);
561
delete
[] buf;
562
}
563
}
564
565
void
566
LteTestMac::DoReportBufferStatus
(
LteMacSapProvider::ReportBufferStatusParameters
params)
567
{
568
NS_LOG_FUNCTION
(
this
<< params.
txQueueSize
<< params.
retxQueueSize
<< params.
statusPduSize
);
569
570
if
(
m_txOpportunityMode
==
AUTOMATIC_MODE
)
571
{
572
if
(params.
statusPduSize
)
573
{
574
Simulator::Schedule
(
Seconds
(0.1), &
LteMacSapUser::NotifyTxOpportunity
,
575
m_macSapUser
, params.
statusPduSize
+ 2, 0, 0);
576
}
577
else
if
(params.
txQueueSize
)
578
{
579
Simulator::Schedule
(
Seconds
(0.1), &
LteMacSapUser::NotifyTxOpportunity
,
580
m_macSapUser
, params.
txQueueSize
+ 2, 0, 0);
581
}
582
else
if
(params.
retxQueueSize
)
583
{
584
Simulator::Schedule
(
Seconds
(0.1), &
LteMacSapUser::NotifyTxOpportunity
,
585
m_macSapUser
, params.
retxQueueSize
+ 2, 0, 0);
586
}
587
}
588
}
589
590
591
bool
592
LteTestMac::Receive
(
Ptr<NetDevice>
nd,
Ptr<const Packet>
p, uint16_t protocol,
const
Address
& addr)
593
{
594
NS_LOG_FUNCTION
(
this
<< addr << protocol << p->
GetSize
());
595
596
m_rxPdus
++;
597
m_rxBytes
+= p->
GetSize
();
598
599
Ptr<Packet>
packet = p->
Copy
();
600
m_macSapUser
->
ReceivePdu
(packet);
601
return
true
;
602
}
603
604
605
606
607
608
609
610
611
NS_OBJECT_ENSURE_REGISTERED
(
EpcTestRrc
);
612
613
EpcTestRrc::EpcTestRrc
()
614
: m_s1SapProvider (0)
615
{
616
NS_LOG_FUNCTION
(
this
);
617
m_s1SapUser
=
new
MemberEpcEnbS1SapUser<EpcTestRrc>
(
this
);
618
}
619
620
621
EpcTestRrc::~EpcTestRrc
()
622
{
623
NS_LOG_FUNCTION
(
this
);
624
}
625
626
627
void
628
EpcTestRrc::DoDispose
()
629
{
630
NS_LOG_FUNCTION
(
this
);
631
delete
m_s1SapUser
;
632
}
633
634
TypeId
635
EpcTestRrc::GetTypeId
(
void
)
636
{
637
NS_LOG_FUNCTION
(
"EpcTestRrc::GetTypeId"
);
638
static
TypeId
tid =
TypeId
(
"ns3::EpcTestRrc"
)
639
.
SetParent
<
Object
> ()
640
.AddConstructor<EpcTestRrc> ()
641
;
642
return
tid;
643
}
644
void
645
EpcTestRrc::SetS1SapProvider
(
EpcEnbS1SapProvider
* s)
646
{
647
m_s1SapProvider
= s;
648
}
649
650
651
EpcEnbS1SapUser
*
652
EpcTestRrc::GetS1SapUser
()
653
{
654
return
m_s1SapUser
;
655
}
656
657
void
658
EpcTestRrc::DoDataRadioBearerSetupRequest
(
EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters
request)
659
{
660
661
}
662
663
void
664
EpcTestRrc::DoPathSwitchRequestAcknowledge
(
EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters
params)
665
{
666
667
}
668
669
670
}
// namespace ns3
671
src
lte
test
lte-test-entities.cc
Generated on Tue May 14 2013 11:08:27 for ns-3 by
1.8.1.2