A Discrete-Event Network Simulator
API
fd-net-device-helper.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 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: Alina Quereilhac <alina.quereilhac@inria.fr>
19  *
20  */
21 
22 #include "fd-net-device-helper.h"
23 
24 #include "ns3/abort.h"
25 #include "ns3/config.h"
26 #include "ns3/fd-net-device.h"
27 #include "ns3/log.h"
28 #include "ns3/names.h"
29 #include "ns3/object-factory.h"
30 #include "ns3/packet.h"
31 #include "ns3/simulator.h"
32 #include "ns3/trace-helper.h"
33 
34 #include <string>
35 
36 namespace ns3 {
37 
38 NS_LOG_COMPONENT_DEFINE ("FdNetDeviceHelper");
39 
41 {
42  m_deviceFactory.SetTypeId ("ns3::FdNetDevice");
43 }
44 
45 void
46 FdNetDeviceHelper::SetTypeId (std::string type)
47 {
49 }
50 
51 void
53 {
54  NS_LOG_FUNCTION (this);
55  m_deviceFactory.Set (n1, v1);
56 }
57 
58 void
59 FdNetDeviceHelper::EnablePcapInternal (std::string prefix, Ptr<NetDevice> nd, bool promiscuous, bool explicitFilename)
60 {
61  //
62  // All of the Pcap enable functions vector through here including the ones
63  // that are wandering through all of devices on perhaps all of the nodes in
64  // the system. We can only deal with devices of type FdNetDevice.
65  //
66  Ptr<FdNetDevice> device = nd->GetObject<FdNetDevice> ();
67  if (device == 0)
68  {
69  NS_LOG_INFO ("FdNetDeviceHelper::EnablePcapInternal(): Device " << device << " not of type ns3::FdNetDevice");
70  return;
71  }
72 
73  PcapHelper pcapHelper;
74 
75  std::string filename;
76  if (explicitFilename)
77  {
78  filename = prefix;
79  }
80  else
81  {
82  filename = pcapHelper.GetFilenameFromDevice (prefix, device);
83  }
84 
85  Ptr<PcapFileWrapper> file = pcapHelper.CreateFile (filename, std::ios::out, PcapHelper::DLT_EN10MB);
86  if (promiscuous)
87  {
88  pcapHelper.HookDefaultSink<FdNetDevice> (device, "PromiscSniffer", file);
89  }
90  else
91  {
92  pcapHelper.HookDefaultSink<FdNetDevice> (device, "Sniffer", file);
93  }
94 }
95 
96 void
99  std::string prefix,
100  Ptr<NetDevice> nd,
101  bool explicitFilename)
102 {
103  //
104  // All of the ascii enable functions vector through here including the ones
105  // that are wandering through all of devices on perhaps all of the nodes in
106  // the system. We can only deal with devices of type FdNetDevice.
107  //
108  Ptr<FdNetDevice> device = nd->GetObject<FdNetDevice> ();
109  if (device == 0)
110  {
111  NS_LOG_INFO ("FdNetDeviceHelper::EnableAsciiInternal(): Device " << device << " not of type ns3::FdNetDevice");
112  return;
113  }
114 
115  //
116  // Our default trace sinks are going to use packet printing, so we have to
117  // make sure that is turned on.
118  //
120 
121  //
122  // If we are not provided an OutputStreamWrapper, we are expected to create
123  // one using the usual trace filename conventions and do a Hook*WithoutContext
124  // since there will be one file per context and therefore the context would
125  // be redundant.
126  //
127  if (stream == 0)
128  {
129  //
130  // Set up an output stream object to deal with private ofstream copy
131  // constructor and lifetime issues. Let the helper decide the actual
132  // name of the file given the prefix.
133  //
134  AsciiTraceHelper asciiTraceHelper;
135 
136  std::string filename;
137  if (explicitFilename)
138  {
139  filename = prefix;
140  }
141  else
142  {
143  filename = asciiTraceHelper.GetFilenameFromDevice (prefix, device);
144  }
145 
146  Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream (filename);
147 
148  //
149  // The MacRx trace source provides our "r" event.
150  //
151  asciiTraceHelper.HookDefaultReceiveSinkWithoutContext<FdNetDevice> (device, "MacRx", theStream);
152 
153  return;
154  }
155 
156  //
157  // If we are provided an OutputStreamWrapper, we are expected to use it, and
158  // to providd a context. We are free to come up with our own context if we
159  // want, and use the AsciiTraceHelper Hook*WithContext functions, but for
160  // compatibility and simplicity, we just use Config::Connect and let it deal
161  // with the context.
162  //
163  // Note that we are going to use the default trace sinks provided by the
164  // ascii trace helper. There is actually no AsciiTraceHelper in sight here,
165  // but the default trace sinks are actually publicly available static
166  // functions that are always there waiting for just such a case.
167  //
168  uint32_t deviceid = nd->GetIfIndex ();
169  std::ostringstream oss;
170 
171  oss << "/NodeList/" << nd->GetNode ()->GetId () << "/DeviceList/" << deviceid << "/$ns3::FdNetDevice/MacRx";
173 }
174 
177 {
178  return NetDeviceContainer (InstallPriv (node));
179 }
180 
182 FdNetDeviceHelper::Install (std::string nodeName) const
183 {
184  Ptr<Node> node = Names::Find<Node> (nodeName);
185  return NetDeviceContainer (InstallPriv (node));
186 }
187 
190 {
191  NetDeviceContainer devs;
192 
193  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); i++)
194  {
195  devs.Add (InstallPriv (*i));
196  }
197 
198  return devs;
199 }
200 
203 {
205  device->SetAddress (Mac48Address::Allocate ());
206  node->AddDevice (device);
207  return device;
208 }
209 
210 } // namespace ns3
virtual Ptr< NetDevice > InstallPriv(Ptr< Node > node) const
This method creates an ns3::FdNetDevice and associates it to a node.
Manage ASCII trace files for device models.
Definition: trace-helper.h:161
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Hold a value for an Attribute.
Definition: attribute.h:68
Manage pcap files for device models.
Definition: trace-helper.h:38
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1703
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
virtual void EnableAsciiInternal(Ptr< OutputStreamWrapper > stream, std::string prefix, Ptr< NetDevice > nd, bool explicitFilename)
Enable ascii trace output on the indicated net device.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we&#39;ll use to write the traced bits. ...
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the ascii trace helper figure out a reasonable filename to use for an ascii trace file associated...
Ptr< PcapFileWrapper > CreateFile(std::string filename, std::ios::openmode filemode, DataLinkType dataLinkType, uint32_t snapLen=std::numeric_limits< uint32_t >::max(), int32_t tzCorrection=0)
Create and initialize a pcap file.
Definition: trace-helper.cc:49
void SetAttribute(std::string n1, const AttributeValue &v1)
virtual void EnablePcapInternal(std::string prefix, Ptr< NetDevice > nd, bool promiscuous, bool explicitFilename)
Enable pcap output on the indicated net device.
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the pcap helper figure out a reasonable filename to use for a pcap file associated with a device...
Definition: trace-helper.cc:80
virtual NetDeviceContainer Install(Ptr< Node > node) const
This method creates a FdNetDevice and associates it to a node.
static Mac48Address Allocate(void)
Allocate a new Mac48Address.
static void EnablePrinting(void)
Enable printing packets metadata.
Definition: packet.cc:572
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
holds a vector of ns3::NetDevice pointers
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:918
static void DefaultReceiveSinkWithContext(Ptr< OutputStreamWrapper > file, std::string context, Ptr< const Packet > p)
Basic Receive default trace sink.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
void HookDefaultReceiveSinkWithoutContext(Ptr< T > object, std::string traceName, Ptr< OutputStreamWrapper > stream)
Hook a trace source to the default receive operation trace sink that does not accept nor log a trace ...
Definition: trace-helper.h:527
void SetTypeId(std::string type)
Set the TypeId of the Objects to be created by this helper.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
a NetDevice to read/write network traffic from/into a file descriptor.
Definition: fd-net-device.h:84
void HookDefaultSink(Ptr< T > object, std::string traceName, Ptr< PcapFileWrapper > file)
Hook a trace source to the default trace sink.
Definition: trace-helper.h:147
FdNetDeviceHelper()
Construct a FdNetDeviceHelper.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
ObjectFactory m_deviceFactory
factory for the NetDevices