src/helper/emu-helper.cc
author Nicola Baldo <nbaldo@cttc.es>
Thu Aug 13 09:36:53 2009 +0200 (2009-08-13)
changeset 4709 b0743dbc4e55
parent 4264 9d2e96c4e6e4
child 4712 74ed62336c36
permissions -rw-r--r--
bug 639: add configurable capture size to pcap
craigdo@3828
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
craigdo@3828
     2
/*
craigdo@3828
     3
 * Copyright (c) 2008 University of Washington
craigdo@3828
     4
 *
craigdo@3828
     5
 * This program is free software; you can redistribute it and/or modify
craigdo@3828
     6
 * it under the terms of the GNU General Public License version 2 as
craigdo@3828
     7
 * published by the Free Software Foundation;
craigdo@3828
     8
 *
craigdo@3828
     9
 * This program is distributed in the hope that it will be useful,
craigdo@3828
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
craigdo@3828
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
craigdo@3828
    12
 * GNU General Public License for more details.
craigdo@3828
    13
 *
craigdo@3828
    14
 * You should have received a copy of the GNU General Public License
craigdo@3828
    15
 * along with this program; if not, write to the Free Software
craigdo@3828
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
craigdo@3828
    17
 */
craigdo@3828
    18
craigdo@3828
    19
#include <string>
craigdo@3828
    20
craigdo@3828
    21
#include "ns3/log.h"
craigdo@3828
    22
#include "ns3/simulator.h"
craigdo@3828
    23
#include "ns3/object-factory.h"
craigdo@4147
    24
#include "ns3/names.h"
craigdo@3828
    25
#include "ns3/queue.h"
craigdo@3830
    26
#include "ns3/emu-net-device.h"
craigdo@3828
    27
#include "ns3/pcap-writer.h"
craigdo@3828
    28
#include "ns3/config.h"
craigdo@3828
    29
#include "ns3/packet.h"
craigdo@3828
    30
craigdo@3828
    31
#include "emu-helper.h"
craigdo@3828
    32
craigdo@3828
    33
NS_LOG_COMPONENT_DEFINE ("EmuHelper");
craigdo@3828
    34
craigdo@3828
    35
namespace ns3 {
craigdo@3828
    36
craigdo@3828
    37
EmuHelper::EmuHelper ()
craigdo@3828
    38
{
craigdo@3828
    39
  NS_LOG_FUNCTION_NOARGS ();
craigdo@3828
    40
  m_queueFactory.SetTypeId ("ns3::DropTailQueue");
craigdo@3830
    41
  m_deviceFactory.SetTypeId ("ns3::EmuNetDevice");
craigdo@3828
    42
}
craigdo@3828
    43
craigdo@4264
    44
void 
craigdo@3828
    45
EmuHelper::SetQueue (
craigdo@3828
    46
  std::string type,
craigdo@3828
    47
  std::string n1, const AttributeValue &v1,
craigdo@3828
    48
  std::string n2, const AttributeValue &v2,
craigdo@3828
    49
  std::string n3, const AttributeValue &v3,
craigdo@3828
    50
  std::string n4, const AttributeValue &v4)
craigdo@3828
    51
{
craigdo@3828
    52
  NS_LOG_FUNCTION_NOARGS ();
craigdo@3828
    53
  m_queueFactory.SetTypeId (type);
craigdo@3828
    54
  m_queueFactory.Set (n1, v1);
craigdo@3828
    55
  m_queueFactory.Set (n2, v2);
craigdo@3828
    56
  m_queueFactory.Set (n3, v3);
craigdo@3828
    57
  m_queueFactory.Set (n4, v4);
craigdo@3828
    58
}
craigdo@3828
    59
craigdo@4264
    60
void 
craigdo@3828
    61
EmuHelper::SetAttribute (std::string n1, const AttributeValue &v1)
craigdo@3828
    62
{
craigdo@3828
    63
  NS_LOG_FUNCTION_NOARGS ();
craigdo@3828
    64
  m_deviceFactory.Set (n1, v1);
craigdo@3828
    65
}
craigdo@3828
    66
craigdo@4264
    67
void 
craigdo@4264
    68
EmuHelper::EnablePcap (std::string filename, uint32_t nodeid, uint32_t deviceid, bool promiscuous)
craigdo@3828
    69
{
craigdo@4264
    70
  NS_LOG_FUNCTION (filename << nodeid << deviceid << promiscuous);
craigdo@3828
    71
  std::ostringstream oss;
craigdo@3828
    72
  oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
nbaldo@4709
    73
  Ptr<PcapWriter> pcap = CreateObject<PcapWriter> ();
craigdo@3828
    74
  pcap->Open (oss.str ());
craigdo@3828
    75
  pcap->WriteEthernetHeader ();
craigdo@3828
    76
craigdo@3828
    77
  oss.str ("");
craigdo@4264
    78
  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid;
craigdo@4264
    79
  if (promiscuous)
craigdo@4264
    80
    {
craigdo@4264
    81
      oss << "/$ns3::EmuNetDevice/PromiscSniffer";
craigdo@4264
    82
    }
craigdo@4264
    83
  else
craigdo@4264
    84
    {
craigdo@4264
    85
      oss << "/$ns3::EmuNetDevice/Sniffer";
craigdo@4264
    86
    }
craigdo@4263
    87
  Config::ConnectWithoutContext (oss.str (), MakeBoundCallback (&EmuHelper::SniffEvent, pcap));
craigdo@3828
    88
}
craigdo@3828
    89
craigdo@4264
    90
void 
craigdo@4264
    91
EmuHelper::EnablePcap (std::string filename, Ptr<NetDevice> nd, bool promiscuous)
craigdo@3828
    92
{
craigdo@4264
    93
  NS_LOG_FUNCTION (filename << &nd << promiscuous);
craigdo@4264
    94
  EnablePcap (filename, nd->GetNode ()->GetId (), nd->GetIfIndex (), promiscuous);
craigdo@4264
    95
}
craigdo@4264
    96
craigdo@4264
    97
void 
craigdo@4264
    98
EmuHelper::EnablePcap (std::string filename, std::string ndName, bool promiscuous)
craigdo@4264
    99
{
craigdo@4264
   100
  NS_LOG_FUNCTION (filename << ndName << promiscuous);
craigdo@4264
   101
  Ptr<NetDevice> nd = Names::Find<NetDevice> (ndName);
craigdo@4264
   102
  EnablePcap (filename, nd->GetNode ()->GetId (), nd->GetIfIndex (), promiscuous);
craigdo@4264
   103
}
craigdo@4264
   104
craigdo@4264
   105
void 
craigdo@4264
   106
EmuHelper::EnablePcap (std::string filename, NetDeviceContainer d, bool promiscuous)
craigdo@4264
   107
{
craigdo@4264
   108
  NS_LOG_FUNCTION (filename << &d << promiscuous);
craigdo@3828
   109
  for (NetDeviceContainer::Iterator i = d.Begin (); i != d.End (); ++i)
craigdo@3828
   110
    {
craigdo@3828
   111
      Ptr<NetDevice> dev = *i;
craigdo@4264
   112
      EnablePcap (filename, dev->GetNode ()->GetId (), dev->GetIfIndex (), promiscuous);
craigdo@3828
   113
    }
craigdo@3828
   114
}
craigdo@3828
   115
craigdo@4264
   116
void
craigdo@4264
   117
EmuHelper::EnablePcap (std::string filename, NodeContainer n, bool promiscuous)
craigdo@3828
   118
{
craigdo@4264
   119
  NS_LOG_FUNCTION (filename << &n << promiscuous);
craigdo@3828
   120
  NetDeviceContainer devs;
craigdo@3828
   121
  for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
craigdo@3828
   122
    {
craigdo@3828
   123
      Ptr<Node> node = *i;
craigdo@3828
   124
      for (uint32_t j = 0; j < node->GetNDevices (); ++j)
craigdo@3828
   125
	{
craigdo@3828
   126
	  devs.Add (node->GetDevice (j));
craigdo@3828
   127
	}
craigdo@3828
   128
    }
craigdo@4264
   129
  EnablePcap (filename, devs, promiscuous);
craigdo@3828
   130
}
craigdo@3828
   131
craigdo@4264
   132
void
craigdo@4264
   133
EmuHelper::EnablePcapAll (std::string filename, bool promiscuous)
craigdo@3828
   134
{
craigdo@4264
   135
  NS_LOG_FUNCTION (filename << promiscuous);
craigdo@4264
   136
  EnablePcap (filename, NodeContainer::GetGlobal (), promiscuous);
craigdo@3828
   137
}
craigdo@3828
   138
craigdo@4264
   139
void 
craigdo@3828
   140
EmuHelper::EnableAscii (std::ostream &os, uint32_t nodeid, uint32_t deviceid)
craigdo@3828
   141
{
craigdo@3828
   142
  NS_LOG_FUNCTION (&os << nodeid << deviceid);
craigdo@3828
   143
  Packet::EnablePrinting ();
craigdo@3828
   144
  std::ostringstream oss;
craigdo@3828
   145
craigdo@4263
   146
  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::EmuNetDevice/MacRx";
craigdo@4263
   147
  Config::Connect (oss.str (), MakeBoundCallback (&EmuHelper::AsciiRxEvent, &os));
craigdo@3828
   148
craigdo@3828
   149
  oss.str ("");
craigdo@4263
   150
  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::EmuNetDevice/TxQueue/Enqueue";
craigdo@4263
   151
  Config::Connect (oss.str (), MakeBoundCallback (&EmuHelper::AsciiEnqueueEvent, &os));
craigdo@3828
   152
craigdo@3828
   153
  oss.str ("");
craigdo@4263
   154
  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::EmuNetDevice/TxQueue/Dequeue";
craigdo@4263
   155
  Config::Connect (oss.str (), MakeBoundCallback (&EmuHelper::AsciiDequeueEvent, &os));
craigdo@3828
   156
craigdo@3828
   157
  oss.str ("");
craigdo@4263
   158
  oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::EmuNetDevice/TxQueue/Drop";
craigdo@4263
   159
  Config::Connect (oss.str (), MakeBoundCallback (&EmuHelper::AsciiDropEvent, &os));
craigdo@3828
   160
}
craigdo@3828
   161
craigdo@4264
   162
void 
craigdo@3828
   163
EmuHelper::EnableAscii (std::ostream &os, NetDeviceContainer d)
craigdo@3828
   164
{
craigdo@3828
   165
  NS_LOG_FUNCTION (&os << &d);
craigdo@3828
   166
  for (NetDeviceContainer::Iterator i = d.Begin (); i != d.End (); ++i)
craigdo@3828
   167
    {
craigdo@3828
   168
      Ptr<NetDevice> dev = *i;
craigdo@3828
   169
      EnableAscii (os, dev->GetNode ()->GetId (), dev->GetIfIndex ());
craigdo@3828
   170
    }
craigdo@3828
   171
}
craigdo@3828
   172
craigdo@3828
   173
void
craigdo@3828
   174
EmuHelper::EnableAscii (std::ostream &os, NodeContainer n)
craigdo@3828
   175
{
craigdo@3828
   176
  NS_LOG_FUNCTION (&os << &n);
craigdo@3828
   177
  NetDeviceContainer devs;
craigdo@3828
   178
  for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
craigdo@3828
   179
    {
craigdo@3828
   180
      Ptr<Node> node = *i;
craigdo@3828
   181
      for (uint32_t j = 0; j < node->GetNDevices (); ++j)
craigdo@3828
   182
	{
craigdo@3828
   183
	  devs.Add (node->GetDevice (j));
craigdo@3828
   184
	}
craigdo@3828
   185
    }
craigdo@3828
   186
  EnableAscii (os, devs);
craigdo@3828
   187
}
craigdo@3828
   188
craigdo@4264
   189
void
craigdo@3828
   190
EmuHelper::EnableAsciiAll (std::ostream &os)
craigdo@3828
   191
{
craigdo@3828
   192
  NS_LOG_FUNCTION (&os);
craigdo@3828
   193
  EnableAscii (os, NodeContainer::GetGlobal ());
craigdo@3828
   194
}
craigdo@3828
   195
craigdo@3848
   196
NetDeviceContainer
craigdo@3848
   197
EmuHelper::Install (Ptr<Node> node) const
craigdo@3828
   198
{
craigdo@3848
   199
  return NetDeviceContainer (InstallPriv (node));
craigdo@3848
   200
}
craigdo@3848
   201
craigdo@4140
   202
NetDeviceContainer
craigdo@4140
   203
EmuHelper::Install (std::string nodeName) const
craigdo@4140
   204
{
craigdo@4140
   205
  Ptr<Node> node = Names::Find<Node> (nodeName);
craigdo@4140
   206
  return NetDeviceContainer (InstallPriv (node));
craigdo@4140
   207
}
craigdo@4140
   208
craigdo@3848
   209
NetDeviceContainer 
craigdo@3848
   210
EmuHelper::Install (const NodeContainer &c) const
craigdo@3848
   211
{
craigdo@3848
   212
  NetDeviceContainer devs;
craigdo@3848
   213
craigdo@3828
   214
  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); i++)
craigdo@3828
   215
    {
craigdo@3848
   216
      devs.Add (InstallPriv (*i));
craigdo@3848
   217
    }
craigdo@3828
   218
craigdo@3848
   219
  return devs;
craigdo@3848
   220
}
craigdo@3828
   221
craigdo@4264
   222
Ptr<NetDevice>
craigdo@3848
   223
EmuHelper::InstallPriv (Ptr<Node> node) const
craigdo@3848
   224
{
craigdo@3848
   225
  Ptr<EmuNetDevice> device = m_deviceFactory.Create<EmuNetDevice> ();
craigdo@3848
   226
  device->SetAddress (Mac48Address::Allocate ());
craigdo@3848
   227
  node->AddDevice (device);
craigdo@3848
   228
  Ptr<Queue> queue = m_queueFactory.Create<Queue> ();
craigdo@3848
   229
  device->SetQueue (queue);
craigdo@3848
   230
craigdo@3848
   231
  return device;
craigdo@3828
   232
}
craigdo@3828
   233
craigdo@4264
   234
void 
craigdo@4263
   235
EmuHelper::SniffEvent (Ptr<PcapWriter> writer, Ptr<const Packet> packet)
craigdo@3828
   236
{
craigdo@3828
   237
  NS_LOG_FUNCTION (writer << packet);
craigdo@3828
   238
  writer->WritePacket (packet);
craigdo@3828
   239
}
craigdo@3828
   240
craigdo@4264
   241
void 
craigdo@3828
   242
EmuHelper::AsciiEnqueueEvent (
craigdo@3828
   243
  std::ostream *os, 
craigdo@3828
   244
  std::string path, 
craigdo@3828
   245
  Ptr<const Packet> packet)
craigdo@3828
   246
{
craigdo@3828
   247
  NS_LOG_FUNCTION (&os << path << packet);
craigdo@3828
   248
  *os << "+ " << Simulator::Now ().GetSeconds () << " ";
craigdo@3828
   249
  *os << path << " " << *packet << std::endl;
craigdo@3828
   250
}
craigdo@3828
   251
craigdo@4264
   252
void 
craigdo@3828
   253
EmuHelper::AsciiDequeueEvent (
craigdo@3828
   254
  std::ostream *os, 
craigdo@3828
   255
  std::string path, 
craigdo@3828
   256
  Ptr<const Packet> packet)
craigdo@3828
   257
{
craigdo@3828
   258
  NS_LOG_FUNCTION (&os << path << packet);
craigdo@3828
   259
  *os << "- " << Simulator::Now ().GetSeconds () << " ";
craigdo@3828
   260
  *os << path << " " << *packet << std::endl;
craigdo@3828
   261
}
craigdo@3828
   262
craigdo@4264
   263
void 
craigdo@3828
   264
EmuHelper::AsciiDropEvent (
craigdo@3828
   265
  std::ostream *os, 
craigdo@3828
   266
  std::string path, 
craigdo@3828
   267
  Ptr<const Packet> packet)
craigdo@3828
   268
{
craigdo@3828
   269
  NS_LOG_FUNCTION (&os << path << packet);
craigdo@3828
   270
  *os << "d " << Simulator::Now ().GetSeconds () << " ";
craigdo@3828
   271
  *os << path << " " << *packet << std::endl;
craigdo@3828
   272
}
craigdo@3828
   273
craigdo@4264
   274
void 
craigdo@3828
   275
EmuHelper::AsciiRxEvent (
craigdo@3828
   276
  std::ostream *os, 
craigdo@3828
   277
  std::string path, 
craigdo@3828
   278
  Ptr<const Packet> packet)
craigdo@3828
   279
{
craigdo@3828
   280
  NS_LOG_FUNCTION (&os << path << packet);
craigdo@3828
   281
  *os << "r " << Simulator::Now ().GetSeconds () << " ";
craigdo@3828
   282
  *os << path << " " << *packet << std::endl;
craigdo@3828
   283
}
craigdo@3828
   284
craigdo@3828
   285
} // namespace ns3