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
point-to-point-helper.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2008 INRIA
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: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19
*/
20
21
#include "ns3/abort.h"
22
#include "ns3/log.h"
23
#include "ns3/simulator.h"
24
#include "ns3/point-to-point-net-device.h"
25
#include "ns3/point-to-point-channel.h"
26
#include "ns3/point-to-point-remote-channel.h"
27
#include "ns3/queue.h"
28
#include "ns3/config.h"
29
#include "ns3/packet.h"
30
#include "ns3/names.h"
31
#include "ns3/mpi-interface.h"
32
#include "ns3/mpi-receiver.h"
33
34
#include "ns3/trace-helper.h"
35
#include "
point-to-point-helper.h
"
36
37
NS_LOG_COMPONENT_DEFINE
(
"PointToPointHelper"
);
38
39
namespace
ns3 {
40
41
PointToPointHelper::PointToPointHelper
()
42
{
43
m_queueFactory
.
SetTypeId
(
"ns3::DropTailQueue"
);
44
m_deviceFactory
.
SetTypeId
(
"ns3::PointToPointNetDevice"
);
45
m_channelFactory
.
SetTypeId
(
"ns3::PointToPointChannel"
);
46
m_remoteChannelFactory
.
SetTypeId
(
"ns3::PointToPointRemoteChannel"
);
47
}
48
49
void
50
PointToPointHelper::SetQueue
(std::string type,
51
std::string n1,
const
AttributeValue
&v1,
52
std::string n2,
const
AttributeValue
&v2,
53
std::string n3,
const
AttributeValue
&v3,
54
std::string n4,
const
AttributeValue
&v4)
55
{
56
m_queueFactory
.
SetTypeId
(type);
57
m_queueFactory
.
Set
(n1, v1);
58
m_queueFactory
.
Set
(n2, v2);
59
m_queueFactory
.
Set
(n3, v3);
60
m_queueFactory
.
Set
(n4, v4);
61
}
62
63
void
64
PointToPointHelper::SetDeviceAttribute
(std::string n1,
const
AttributeValue
&v1)
65
{
66
m_deviceFactory
.
Set
(n1, v1);
67
}
68
69
void
70
PointToPointHelper::SetChannelAttribute
(std::string n1,
const
AttributeValue
&v1)
71
{
72
m_channelFactory
.
Set
(n1, v1);
73
m_remoteChannelFactory
.
Set
(n1, v1);
74
}
75
76
void
77
PointToPointHelper::EnablePcapInternal
(std::string prefix,
Ptr<NetDevice>
nd,
bool
promiscuous,
bool
explicitFilename)
78
{
79
//
80
// All of the Pcap enable functions vector through here including the ones
81
// that are wandering through all of devices on perhaps all of the nodes in
82
// the system. We can only deal with devices of type PointToPointNetDevice.
83
//
84
Ptr<PointToPointNetDevice>
device = nd->
GetObject
<
PointToPointNetDevice
> ();
85
if
(device == 0)
86
{
87
NS_LOG_INFO
(
"PointToPointHelper::EnablePcapInternal(): Device "
<< device <<
" not of type ns3::PointToPointNetDevice"
);
88
return
;
89
}
90
91
PcapHelper
pcapHelper;
92
93
std::string filename;
94
if
(explicitFilename)
95
{
96
filename = prefix;
97
}
98
else
99
{
100
filename = pcapHelper.
GetFilenameFromDevice
(prefix, device);
101
}
102
103
Ptr<PcapFileWrapper>
file = pcapHelper.
CreateFile
(filename, std::ios::out,
104
PcapHelper::DLT_PPP
);
105
pcapHelper.
HookDefaultSink
<
PointToPointNetDevice
> (device,
"PromiscSniffer"
, file);
106
}
107
108
void
109
PointToPointHelper::EnableAsciiInternal
(
110
Ptr<OutputStreamWrapper>
stream,
111
std::string prefix,
112
Ptr<NetDevice>
nd,
113
bool
explicitFilename)
114
{
115
//
116
// All of the ascii enable functions vector through here including the ones
117
// that are wandering through all of devices on perhaps all of the nodes in
118
// the system. We can only deal with devices of type PointToPointNetDevice.
119
//
120
Ptr<PointToPointNetDevice>
device = nd->
GetObject
<
PointToPointNetDevice
> ();
121
if
(device == 0)
122
{
123
NS_LOG_INFO
(
"PointToPointHelper::EnableAsciiInternal(): Device "
<< device <<
124
" not of type ns3::PointToPointNetDevice"
);
125
return
;
126
}
127
128
//
129
// Our default trace sinks are going to use packet printing, so we have to
130
// make sure that is turned on.
131
//
132
Packet::EnablePrinting
();
133
134
//
135
// If we are not provided an OutputStreamWrapper, we are expected to create
136
// one using the usual trace filename conventions and do a Hook*WithoutContext
137
// since there will be one file per context and therefore the context would
138
// be redundant.
139
//
140
if
(stream == 0)
141
{
142
//
143
// Set up an output stream object to deal with private ofstream copy
144
// constructor and lifetime issues. Let the helper decide the actual
145
// name of the file given the prefix.
146
//
147
AsciiTraceHelper
asciiTraceHelper;
148
149
std::string filename;
150
if
(explicitFilename)
151
{
152
filename = prefix;
153
}
154
else
155
{
156
filename = asciiTraceHelper.
GetFilenameFromDevice
(prefix, device);
157
}
158
159
Ptr<OutputStreamWrapper>
theStream = asciiTraceHelper.
CreateFileStream
(filename);
160
161
//
162
// The MacRx trace source provides our "r" event.
163
//
164
asciiTraceHelper.
HookDefaultReceiveSinkWithoutContext
<
PointToPointNetDevice
> (device,
"MacRx"
, theStream);
165
166
//
167
// The "+", '-', and 'd' events are driven by trace sources actually in the
168
// transmit queue.
169
//
170
Ptr<Queue>
queue = device->
GetQueue
();
171
asciiTraceHelper.
HookDefaultEnqueueSinkWithoutContext
<
Queue
> (queue,
"Enqueue"
, theStream);
172
asciiTraceHelper.
HookDefaultDropSinkWithoutContext
<
Queue
> (queue,
"Drop"
, theStream);
173
asciiTraceHelper.
HookDefaultDequeueSinkWithoutContext
<
Queue
> (queue,
"Dequeue"
, theStream);
174
175
// PhyRxDrop trace source for "d" event
176
asciiTraceHelper.
HookDefaultDropSinkWithoutContext
<
PointToPointNetDevice
> (device,
"PhyRxDrop"
, theStream);
177
178
return
;
179
}
180
181
//
182
// If we are provided an OutputStreamWrapper, we are expected to use it, and
183
// to providd a context. We are free to come up with our own context if we
184
// want, and use the AsciiTraceHelper Hook*WithContext functions, but for
185
// compatibility and simplicity, we just use Config::Connect and let it deal
186
// with the context.
187
//
188
// Note that we are going to use the default trace sinks provided by the
189
// ascii trace helper. There is actually no AsciiTraceHelper in sight here,
190
// but the default trace sinks are actually publicly available static
191
// functions that are always there waiting for just such a case.
192
//
193
uint32_t nodeid = nd->
GetNode
()->
GetId
();
194
uint32_t deviceid = nd->
GetIfIndex
();
195
std::ostringstream oss;
196
197
oss <<
"/NodeList/"
<< nd->
GetNode
()->
GetId
() <<
"/DeviceList/"
<< deviceid <<
"/$ns3::PointToPointNetDevice/MacRx"
;
198
Config::Connect
(oss.str (),
MakeBoundCallback
(&
AsciiTraceHelper::DefaultReceiveSinkWithContext
, stream));
199
200
oss.str (
""
);
201
oss <<
"/NodeList/"
<< nodeid <<
"/DeviceList/"
<< deviceid <<
"/$ns3::PointToPointNetDevice/TxQueue/Enqueue"
;
202
Config::Connect
(oss.str (),
MakeBoundCallback
(&
AsciiTraceHelper::DefaultEnqueueSinkWithContext
, stream));
203
204
oss.str (
""
);
205
oss <<
"/NodeList/"
<< nodeid <<
"/DeviceList/"
<< deviceid <<
"/$ns3::PointToPointNetDevice/TxQueue/Dequeue"
;
206
Config::Connect
(oss.str (),
MakeBoundCallback
(&
AsciiTraceHelper::DefaultDequeueSinkWithContext
, stream));
207
208
oss.str (
""
);
209
oss <<
"/NodeList/"
<< nodeid <<
"/DeviceList/"
<< deviceid <<
"/$ns3::PointToPointNetDevice/TxQueue/Drop"
;
210
Config::Connect
(oss.str (),
MakeBoundCallback
(&
AsciiTraceHelper::DefaultDropSinkWithContext
, stream));
211
212
oss.str (
""
);
213
oss <<
"/NodeList/"
<< nodeid <<
"/DeviceList/"
<< deviceid <<
"/$ns3::PointToPointNetDevice/PhyRxDrop"
;
214
Config::Connect
(oss.str (),
MakeBoundCallback
(&
AsciiTraceHelper::DefaultDropSinkWithContext
, stream));
215
}
216
217
NetDeviceContainer
218
PointToPointHelper::Install
(
NodeContainer
c)
219
{
220
NS_ASSERT
(c.
GetN
() == 2);
221
return
Install
(c.
Get
(0), c.
Get
(1));
222
}
223
224
NetDeviceContainer
225
PointToPointHelper::Install
(
Ptr<Node>
a,
Ptr<Node>
b)
226
{
227
NetDeviceContainer
container;
228
229
Ptr<PointToPointNetDevice>
devA =
m_deviceFactory
.
Create
<
PointToPointNetDevice
> ();
230
devA->
SetAddress
(
Mac48Address::Allocate
());
231
a->
AddDevice
(devA);
232
Ptr<Queue>
queueA =
m_queueFactory
.
Create
<
Queue
> ();
233
devA->
SetQueue
(queueA);
234
Ptr<PointToPointNetDevice>
devB =
m_deviceFactory
.
Create
<
PointToPointNetDevice
> ();
235
devB->
SetAddress
(
Mac48Address::Allocate
());
236
b->
AddDevice
(devB);
237
Ptr<Queue>
queueB =
m_queueFactory
.
Create
<
Queue
> ();
238
devB->
SetQueue
(queueB);
239
// If MPI is enabled, we need to see if both nodes have the same system id
240
// (rank), and the rank is the same as this instance. If both are true,
241
//use a normal p2p channel, otherwise use a remote channel
242
bool
useNormalChannel =
true
;
243
Ptr<PointToPointChannel>
channel = 0;
244
if
(
MpiInterface::IsEnabled
())
245
{
246
uint32_t n1SystemId = a->
GetSystemId
();
247
uint32_t n2SystemId = b->
GetSystemId
();
248
uint32_t currSystemId =
MpiInterface::GetSystemId
();
249
if
(n1SystemId != currSystemId || n2SystemId != currSystemId)
250
{
251
useNormalChannel =
false
;
252
}
253
}
254
if
(useNormalChannel)
255
{
256
channel =
m_channelFactory
.
Create
<
PointToPointChannel
> ();
257
}
258
else
259
{
260
channel =
m_remoteChannelFactory
.
Create
<
PointToPointRemoteChannel
> ();
261
Ptr<MpiReceiver>
mpiRecA = CreateObject<MpiReceiver> ();
262
Ptr<MpiReceiver>
mpiRecB = CreateObject<MpiReceiver> ();
263
mpiRecA->SetReceiveCallback (
MakeCallback
(&
PointToPointNetDevice::Receive
, devA));
264
mpiRecB->SetReceiveCallback (
MakeCallback
(&
PointToPointNetDevice::Receive
, devB));
265
devA->
AggregateObject
(mpiRecA);
266
devB->
AggregateObject
(mpiRecB);
267
}
268
269
devA->
Attach
(channel);
270
devB->
Attach
(channel);
271
container.
Add
(devA);
272
container.
Add
(devB);
273
274
return
container;
275
}
276
277
NetDeviceContainer
278
PointToPointHelper::Install
(
Ptr<Node>
a, std::string bName)
279
{
280
Ptr<Node>
b = Names::Find<Node> (bName);
281
return
Install
(a, b);
282
}
283
284
NetDeviceContainer
285
PointToPointHelper::Install
(std::string aName,
Ptr<Node>
b)
286
{
287
Ptr<Node>
a = Names::Find<Node> (aName);
288
return
Install
(a, b);
289
}
290
291
NetDeviceContainer
292
PointToPointHelper::Install
(std::string aName, std::string bName)
293
{
294
Ptr<Node>
a = Names::Find<Node> (aName);
295
Ptr<Node>
b = Names::Find<Node> (bName);
296
return
Install
(a, b);
297
}
298
299
}
// namespace ns3
src
point-to-point
helper
point-to-point-helper.cc
Generated on Fri Dec 21 2012 19:00:45 for ns-3 by
1.8.1.2