25 #include "ns3/assert.h" 
   27 #include "ns3/object.h" 
   28 #include "ns3/names.h" 
   30 #include "ns3/packet-socket-factory.h" 
   31 #include "ns3/config.h" 
   32 #include "ns3/simulator.h" 
   33 #include "ns3/string.h" 
   34 #include "ns3/net-device.h" 
   35 #include "ns3/callback.h" 
   37 #include "ns3/core-config.h" 
   38 #include "ns3/arp-l3-protocol.h" 
   39 #include "ns3/ipv4-click-routing.h" 
   40 #include "ns3/ipv4-l3-click-protocol.h" 
   41 #include "ns3/trace-helper.h" 
   50 #define INTERFACE_CONTEXT 
   59 ClickInternetStackHelper::ClickInternetStackHelper ()
 
   60   : m_ipv4Enabled (true)
 
   67 ClickInternetStackHelper::Initialize ()
 
   69   SetTcp (
"ns3::TcpL4Protocol");
 
   72 ClickInternetStackHelper::~ClickInternetStackHelper ()
 
   76 ClickInternetStackHelper::ClickInternetStackHelper (
const ClickInternetStackHelper &o)
 
   78   m_ipv4Enabled = o.m_ipv4Enabled;
 
   79   m_tcpFactory = o.m_tcpFactory;
 
   82 ClickInternetStackHelper &
 
   83 ClickInternetStackHelper::operator = (
const ClickInternetStackHelper &o)
 
  100 ClickInternetStackHelper::SetTcp (
const std::string tid)
 
  102   m_tcpFactory.SetTypeId (tid);
 
  106 ClickInternetStackHelper::SetTcp (std::string tid, std::string n0, 
const AttributeValue &v0)
 
  108   m_tcpFactory.SetTypeId (tid);
 
  109   m_tcpFactory.Set (n0,v0);
 
  113 ClickInternetStackHelper::SetClickFile (NodeContainer c, std::string clickfile)
 
  115   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
 
  117       SetClickFile (*i, clickfile);
 
  122 ClickInternetStackHelper::SetClickFile (Ptr<Node> node, std::string clickfile)
 
  124   m_nodeToClickFileMap.insert (std::make_pair (node, clickfile));
 
  128 ClickInternetStackHelper::SetDefines (NodeContainer c, std::map<std::string, std::string> defines)
 
  130   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
 
  132       SetDefines (*i, defines);
 
  137 ClickInternetStackHelper::SetDefines (Ptr<Node> node, std::map<std::string, std::string> defines)
 
  139   m_nodeToDefinesMap.insert (std::make_pair (node, defines));
 
  143 ClickInternetStackHelper::SetRoutingTableElement (NodeContainer c, std::string rt)
 
  145   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
 
  147       SetRoutingTableElement (*i, rt);
 
  152 ClickInternetStackHelper::SetRoutingTableElement (Ptr<Node> node, std::string rt)
 
  154   m_nodeToRoutingTableElementMap.insert (std::make_pair (node, rt));
 
  158 ClickInternetStackHelper::Install (NodeContainer c)
 const 
  160   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
 
  167 ClickInternetStackHelper::InstallAll (
void)
 const 
  169   Install (NodeContainer::GetGlobal ());
 
  173 ClickInternetStackHelper::CreateAndAggregateObjectFromTypeId (Ptr<Node> node, 
const std::string typeId)
 
  175   ObjectFactory factory;
 
  176   factory.SetTypeId (typeId);
 
  177   Ptr<Object> protocol = factory.Create <Object> ();
 
  178   node->AggregateObject (protocol);
 
  182 ClickInternetStackHelper::Install (Ptr<Node> node)
 const 
  186       if (node->GetObject<Ipv4> () != 0)
 
  188           NS_FATAL_ERROR (
"ClickInternetStackHelper::Install (): Aggregating " 
  189                           "an InternetStack to a node with an existing Ipv4 object");
 
  193       CreateAndAggregateObjectFromTypeId (node, 
"ns3::ArpL3Protocol");
 
  194       CreateAndAggregateObjectFromTypeId (node, 
"ns3::Ipv4L3ClickProtocol");
 
  195       CreateAndAggregateObjectFromTypeId (node, 
"ns3::Icmpv4L4Protocol");
 
  196       CreateAndAggregateObjectFromTypeId (node, 
"ns3::UdpL4Protocol");
 
  197       node->AggregateObject (m_tcpFactory.Create<Object> ());
 
  198       Ptr<PacketSocketFactory> factory = CreateObject<PacketSocketFactory> ();
 
  199       node->AggregateObject (factory);
 
  201       Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
 
  202       Ptr<Ipv4ClickRouting> ipv4Routing = CreateObject<Ipv4ClickRouting> ();
 
  203       std::map< Ptr<Node>, std::string >::const_iterator it;
 
  204       it = m_nodeToClickFileMap.find (node);
 
  206       if (it != m_nodeToClickFileMap.end ())
 
  208           ipv4Routing->SetClickFile (it->second);
 
  211       std::map<Ptr<Node>, std::map<std::string, std::string> >::const_iterator definesIt;
 
  212       definesIt = m_nodeToDefinesMap.find (node);
 
  213       if (definesIt != m_nodeToDefinesMap.end ())
 
  215           ipv4Routing->SetDefines (definesIt->second);
 
  218       it = m_nodeToRoutingTableElementMap.find (node);
 
  219       if (it != m_nodeToRoutingTableElementMap.end ())
 
  221           ipv4Routing->SetClickRoutingTableElement (it->second);
 
  223       ipv4->SetRoutingProtocol (ipv4Routing);
 
  224       node->AggregateObject (ipv4Routing);
 
  229 ClickInternetStackHelper::Install (std::string nodeName)
 const 
  231   Ptr<Node> node = Names::Find<Node> (nodeName);
 
  249       NS_LOG_INFO (
"Ignoring packet to/from interface " << interface);
 
  258 ClickInternetStackHelper::PcapHooked (Ptr<Ipv4> ipv4)
 
  264       if ((*i).first.first == ipv4)
 
  273 ClickInternetStackHelper::EnablePcapIpv4Internal (std::string prefix, Ptr<Ipv4> ipv4, uint32_t interface, 
bool explicitFilename)
 
  279       NS_LOG_INFO (
"Call to enable Ipv4 pcap tracing but Ipv4 not enabled");
 
  287   PcapHelper pcapHelper;
 
  289   std::string filename;
 
  290   if (explicitFilename)
 
  296       filename = pcapHelper.GetFilenameFromInterfacePair (prefix, ipv4, interface);
 
  299   Ptr<PcapFileWrapper> 
file = pcapHelper.CreateFile (filename, std::ios::out, PcapHelper::DLT_RAW);
 
  305   if (!PcapHooked (ipv4))
 
  311       Ptr<Ipv4L3Protocol> ipv4L3Protocol = ipv4->GetObject<Ipv4L3Protocol> ();
 
  312       NS_ASSERT_MSG (ipv4L3Protocol, 
"ClickInternetStackHelper::EnablePcapIpv4Internal(): " 
  313                      "m_ipv4Enabled and ipv4L3Protocol inconsistent");
 
  316       NS_ASSERT_MSG (result == 
true, 
"ClickInternetStackHelper::EnablePcapIpv4Internal():  " 
  317                      "Unable to connect ipv4L3Protocol \"Tx\"");
 
  320       NS_ASSERT_MSG (result == 
true, 
"ClickInternetStackHelper::EnablePcapIpv4Internal():  " 
  321                      "Unable to connect ipv4L3Protocol \"Rx\"");
 
  329   Ptr<OutputStreamWrapper> stream,
 
  330   Ipv4Header 
const &header,
 
  331   Ptr<const Packet> packet,
 
  332   Ipv4L3Protocol::DropReason reason,
 
  345       NS_LOG_INFO (
"Ignoring packet to/from interface " << interface);
 
  349   Ptr<Packet> p = packet->Copy ();
 
  350   p->AddHeader (header);
 
  356   Ptr<OutputStreamWrapper> stream,
 
  358   Ipv4Header 
const &header,
 
  359   Ptr<const Packet> packet,
 
  360   Ipv4L3Protocol::DropReason reason,
 
  373       NS_LOG_INFO (
"Ignoring packet to/from interface " << interface);
 
  377   Ptr<Packet> p = packet->Copy ();
 
  378   p->AddHeader (header);
 
  379 #ifdef INTERFACE_CONTEXT 
  388 ClickInternetStackHelper::AsciiHooked (Ptr<Ipv4> ipv4)
 
  394       if ((*i).first.first == ipv4)
 
  403 ClickInternetStackHelper::EnableAsciiIpv4Internal (
 
  404   Ptr<OutputStreamWrapper> stream,
 
  408   bool explicitFilename)
 
  412       NS_LOG_INFO (
"Call to enable Ipv4 ascii tracing but Ipv4 not enabled");
 
  420   Packet::EnablePrinting ();
 
  439       AsciiTraceHelper asciiTraceHelper;
 
  441       std::string filename;
 
  442       if (explicitFilename)
 
  448           filename = asciiTraceHelper.GetFilenameFromInterfacePair (prefix, ipv4, interface);
 
  451       Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream (filename);
 
  457       if (!AsciiHooked (ipv4))
 
  464           Ptr<ArpL3Protocol> arpL3Protocol = ipv4->GetObject<ArpL3Protocol> ();
 
  465           asciiTraceHelper.HookDefaultDropSinkWithoutContext<ArpL3Protocol> (arpL3Protocol, 
"Drop", theStream);
 
  473           Ptr<Ipv4L3Protocol> ipv4L3Protocol = ipv4->GetObject<Ipv4L3Protocol> ();
 
  474           bool result = ipv4L3Protocol->TraceConnectWithoutContext (
"Drop",
 
  477           NS_ASSERT_MSG (result == 
true, 
"ClickInternetStackHelper::EanableAsciiIpv4Internal():  " 
  478                          "Unable to connect ipv4L3Protocol \"Drop\"");
 
  497   if (!AsciiHooked (ipv4))
 
  499       Ptr<Node> node = ipv4->GetObject<Node> ();
 
  500       std::ostringstream oss;
 
  508       oss << 
"/NodeList/" << node->GetId () << 
"/$ns3::ArpL3Protocol/Drop";
 
  516       oss << 
"/NodeList/" << node->GetId () << 
"/$ns3::Ipv4L3Protocol/Drop";