Update of BlackholeSprint scenario. Extending CcnxStackHelper API
(InstallRouteTo can now accept prefix as a parameter)
diff --git a/examples/base-experiment.h b/examples/base-experiment.h
new file mode 100644
index 0000000..7a9e4bf
--- /dev/null
+++ b/examples/base-experiment.h
@@ -0,0 +1,148 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011,2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef BASE_EXPERIMENT_H
+#define BASE_EXPERIMENT_H
+
+#include "ns3/rocketfuel-topology-reader.h"
+
+class BaseExperiment
+{
+public:
+ BaseExperiment ()
+ : m_rand (0,52)
+ , reader (0)
+ { }
+
+ ~BaseExperiment ()
+ {
+ if (reader != 0) delete reader;
+ }
+
+ void
+ ConfigureTopology ()
+ {
+ Names::Clear ();
+ cout << "Configure Topology\n";
+ if (reader != 0) delete reader;
+ reader = new RocketfuelWeightsReader ("/sprint");
+
+ string weights ("./src/NDNabstraction/examples/sprint-pops.weights");
+ string latencies ("./src/NDNabstraction/examples/sprint-pops.latencies");
+ string positions ("./src/NDNabstraction/examples/sprint-pops.positions");
+
+ reader->SetFileName (positions);
+ reader->SetFileType (RocketfuelWeightsReader::POSITIONS);
+ reader->Read ();
+
+ reader->SetFileName (weights);
+ reader->SetFileType (RocketfuelWeightsReader::WEIGHTS);
+ reader->Read ();
+
+ reader->SetFileName (latencies);
+ reader->SetFileType (RocketfuelWeightsReader::LATENCIES);
+ reader->Read ();
+
+ reader->Commit ();
+ }
+
+ void InstallCcnxStack ()
+ {
+ InternetStackHelper stack;
+ Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+ stack.SetRoutingHelper (ipv4RoutingHelper);
+ stack.Install (reader->GetNodes ());
+
+ reader->AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+
+ // Install CCNx stack
+ cout << "Installing CCNx stack\n";
+ CcnxStackHelper ccnxHelper;
+ ccnxHelper.SetForwardingStrategy ("ns3::CcnxBestRouteStrategy");
+ ccnxHelper.EnableLimits (true, Seconds(0.1));
+ ccnxHelper.SetDefaultRoutes (false);
+ ccnxHelper.InstallAll ();
+
+ // // Populate FIB based on IPv4 global routing controller
+ ccnxHelper.InstallFakeGlobalRoutes ();
+ ccnxHelper.InstallRoutesToAll ();
+ }
+
+ void InstallIpStack ()
+ {
+ InternetStackHelper stack;
+ stack.Install (reader->GetNodes ());
+ reader->AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+
+ Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+ }
+
+ void
+ GenerateRandomPairs (uint16_t numStreams)
+ {
+ m_pairs.clear ();
+ // map<uint32_t, set<uint32_t> > streams;
+ m_usedNodes.clear ();
+
+ uint16_t createdStreams = 0;
+ uint16_t guard = 0;
+ while (createdStreams < numStreams && guard < (numeric_limits<uint16_t>::max ()-1))
+ {
+ guard ++;
+
+ uint32_t node1_num = m_rand.GetValue ();
+ uint32_t node2_num = m_rand.GetValue ();
+
+ if (node1_num == node2_num)
+ continue;
+
+ if (m_usedNodes.count (node1_num) > 0 ||
+ m_usedNodes.count (node2_num) > 0 )
+ {
+ continue; // don't reuse nodes
+ }
+
+ m_usedNodes.insert (node1_num);
+ m_usedNodes.insert (node2_num);
+
+ m_pairs.push_back (make_tuple (node1_num, node2_num));
+ createdStreams ++;
+ }
+ }
+
+ void
+ Run (const Time &finishTime)
+ {
+ cout << "Run Simulation.\n";
+ Simulator::Stop (finishTime);
+ // Simulator::Schedule (Seconds (1.0), PrintTime);
+ Simulator::Run ();
+ Simulator::Destroy ();
+ cout << "Done.\n";
+ }
+
+ UniformVariable m_rand;
+ RocketfuelWeightsReader *reader;
+
+ list<tuple<uint32_t,uint32_t> > m_pairs;
+ set<uint32_t> m_usedNodes;
+};
+
+#endif
diff --git a/examples/blackhole-sprint.cc b/examples/blackhole-sprint.cc
index f97be29..a6afb82 100644
--- a/examples/blackhole-sprint.cc
+++ b/examples/blackhole-sprint.cc
@@ -27,7 +27,6 @@
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/random-variable.h"
-#include <iostream>
#include <sstream>
#include <map>
#include <list>
@@ -50,209 +49,74 @@
Simulator::Schedule (Seconds (1.0), PrintTime);
}
+#include "base-experiment.h"
-class Experiment
+class Experiment : public BaseExperiment
{
public:
- Experiment ()
- : m_reader ("/sprint") { }
-
- void
- ConfigureTopology ()
- {
- Names::Clear ();
-
- string weights ("./src/NDNabstraction/examples/sprint-pops.weights");
- string latencies ("./src/NDNabstraction/examples/sprint-pops.latencies");
- string positions ("./src/NDNabstraction/examples/sprint-pops.positions");
-
- m_reader.SetFileName (positions);
- m_reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
- m_reader.Read ();
-
- m_reader.SetFileName (weights);
- m_reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);
- m_reader.Read ();
-
- m_reader.SetFileName (latencies);
- m_reader.SetFileType (RocketfuelWeightsReader::LATENCIES);
- m_reader.Read ();
-
- m_reader.Commit ();
- NS_ASSERT_MSG (m_reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
-
- NS_LOG_INFO("Nodes = " << m_reader.GetNodes ().GetN());
- NS_LOG_INFO("Links = " << m_reader.LinksSize ());
-
- // ------------------------------------------------------------
- // -- Read topology data.
- // --------------------------------------------
-
- InternetStackHelper stack;
- Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
- stack.SetRoutingHelper (ipv4RoutingHelper);
- stack.Install (m_reader.GetNodes ());
-
- m_reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
-
- // Install CCNx stack
- NS_LOG_INFO ("Installing CCNx stack");
- CcnxStackHelper ccnxHelper;
- ccnxHelper.SetForwardingStrategy ("ns3::CcnxBestRouteStrategy");
- ccnxHelper.EnableLimits (true, Seconds(0.1));
- ccnxHelper.SetDefaultRoutes (false);
- ccnxHelper.InstallAll ();
-
- m_rand = UniformVariable (0, m_reader.GetNodes ().GetN());
- m_linkRand = UniformVariable(0, m_reader.LinksSize());
- }
-
- void
- ConfigureRouting ()
- {
- CcnxStackHelper ccnxHelper;
- // // Populate FIB based on IPv4 global routing controller
- ccnxHelper.InstallFakeGlobalRoutes ();
- ccnxHelper.InstallRoutesToAll ();
- }
-
-public:
- void
- Run (const Time &finishTime)
- {
- cout << "Run Simulation.\n";
- Simulator::Stop (finishTime);
- //Simulator::Schedule (Seconds (1.0), PrintTime);
- Simulator::Run ();
- Simulator::Destroy ();
- cout << "Done.\n";
- }
-
//We are creating 10 pairs of producer-hijacker and everybody else is a consumer
ApplicationContainer
- AddApplications(uint32_t numOfPairs)
+ AddApplications ()
{
- NS_LOG_INFO("Adding applications");
ApplicationContainer apps;
-
- list<uint32_t > usedNodes;
- list<uint32_t >::iterator listIterator;
- list<uint32_t >::iterator listIterator2;
-
- uint32_t producerNodeId;
- uint32_t hijackerNodeId;
- for(uint32_t pairCount = 0; pairCount < numOfPairs; pairCount++)
+ list<string> prefixes;
+
+ // Create Producers/Hijackers
+ for (list<tuple<uint32_t,uint32_t> >::iterator i = m_pairs.begin (); i != m_pairs.end (); i++)
{
- NS_LOG_INFO("pairCount = "<<pairCount);
- while(true)
- {
- producerNodeId = m_rand.GetValue ();
- hijackerNodeId = m_rand.GetValue ();
-
- bool unique = true;
- for(listIterator=usedNodes.begin(); listIterator != usedNodes.end(); ++listIterator)
- {
- if((*listIterator == producerNodeId) || (*listIterator == hijackerNodeId))
- {
- NS_LOG_INFO("NonUnique");
- unique = false;
- }
- }
-
- if(unique == true)
- {
- usedNodes.push_back(producerNodeId);
- usedNodes.push_back(hijackerNodeId);
- break;
- }
- }
-
- NS_LOG_INFO("Producer #" << producerNodeId);
- Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (producerNodeId));
- CcnxAppHelper producerHelper ("ns3::CcnxProducer");
- producerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
-
- apps.Add(producerHelper.Install (node1));
+ uint32_t node1_num = i->get<0> ();
+ uint32_t node2_num = i->get<1> ();
- NS_LOG_INFO("Hijacker # "<<hijackerNodeId);
- Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (hijackerNodeId));
- CcnxAppHelper hijackerHelper ("ns3::CcnxHijacker");
- hijackerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
-
- apps.Add(hijackerHelper.Install (node1));
-
- /*NS_LOG_INFO("Consumers");
- for(uint32_t j = 0; j<m_reader.GetNodes().GetN();j++)
- {
- //NS_LOG_INFO("j="<<j);
- bool consumer = true;
- for(listIterator=usedNodes.begin(); listIterator != usedNodes.end(); ++listIterator)
- {
- if(*listIterator == j)
- {
- consumer = false;
- NS_LOG_INFO(j<<" CANNOT be CONSUMER");
- break;
- }
- }
-
- if(consumer == true)
- {
- Ptr<Node> node3 = Names::Find<Node> ("/sprint", lexical_cast<string> (j));
-
- CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
- consumerHelper.SetPrefix ("/" + lexical_cast<string> (node1->GetId ()));
- consumerHelper.SetAttribute ("MeanRate", StringValue ("1Kbps"));
- consumerHelper.SetAttribute ("Size", StringValue ("2"));
-
- apps.Add(consumerHelper.Install (node3));
- }
- }*/
- }
-
- NS_LOG_INFO("Consumers");
- for(listIterator=usedNodes.begin(); listIterator != usedNodes.end(); ++listIterator,++listIterator)
- {
- for(uint32_t j = 0; j<m_reader.GetNodes().GetN();j++)
- {
- //NS_LOG_INFO("j="<<j);
- bool consumer = true;
- for(listIterator2=usedNodes.begin(); listIterator2 != usedNodes.end(); ++listIterator2)
- {
- if(*listIterator2 == j)
- {
- consumer = false;
- NS_LOG_INFO(j<<" CANNOT be a CONSUMER");
- break;
- }
- }
-
- if(consumer == true)
- {
- Ptr<Node> node3 = Names::Find<Node> ("/sprint", lexical_cast<string> (j));
- Ptr<Node> node4 = Names::Find<Node> ("/sprint", lexical_cast<string> (*listIterator));
+ Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (node1_num));
+ Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (node2_num));
- CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
- NS_LOG_INFO("Node = " << *listIterator);
- consumerHelper.SetPrefix ("/" + lexical_cast<string> (node4->GetId ()));
- consumerHelper.SetAttribute ("MeanRate", StringValue ("1Kbps"));
- consumerHelper.SetAttribute ("Size", StringValue ("2"));
+ // node1 legitimate producer
+ // node2 "fake" producer
+
+ string prefix = "/" + lexical_cast<string> (node1->GetId ());
+
+ CcnxAppHelper legitimateProducerHelper ("ns3::CcnxProducer");
+ legitimateProducerHelper.SetPrefix (prefix);
+ apps.Add
+ (legitimateProducerHelper.Install (node1));
- apps.Add(consumerHelper.Install (node3));
- }
+ CcnxAppHelper fakeProducerHelper ("ns3::CcnxHijacker");
+ fakeProducerHelper.SetPrefix (prefix);
+ apps.Add
+ (fakeProducerHelper.Install (node2));
+
+ // one more trick. Need to install route to hijacker (aka "hijacker announces itself as a legitimate producer")
+ CcnxStackHelper::InstallRouteTo (prefix, node2);
+
+ prefixes.push_back (prefix); // remember prefixes that consumers will be requesting
+ }
+
+ // All consumers request exactly 10 packets, to convert number interests packets to requested size:
+ // size = 1040 * (max_number_of_packets-1) / 1024 / 1024
+ double requestSize = 1040.0 * (10 - 1) / 1024.0 / 1024.0;
+
+ // Create Consumers
+ NodeContainer nodes = reader->GetNodes ();
+ for (NodeContainer::Iterator node = nodes.Begin (); node != nodes.End (); node++)
+ {
+ uint32_t namedId = lexical_cast<uint32_t> (Names::FindName (*node));
+ if (m_usedNodes.count (namedId) > 0)
+ continue;
+
+ CcnxAppHelper consumerHelper ("ns3::CcnxConsumerCbr");
+ BOOST_FOREACH (const string &prefix, prefixes)
+ {
+ consumerHelper.SetPrefix (prefix);
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("8Kbps")); // this is about 1 interest a second
+ consumerHelper.SetAttribute ("Size", DoubleValue(requestSize));
+
+ apps.Add
+ (consumerHelper.Install (*node));
}
- }
-
-
+ }
return apps;
}
-
- UniformVariable m_rand;
- UniformVariable m_linkRand;
-
-private:
- RocketfuelWeightsReader m_reader;
};
int
@@ -260,48 +124,45 @@
{
cout << "Begin blackhole scenario\n";
- Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("2Mbps"));
- Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("100"));
+ Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("100Mbps"));
+ Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("2000"));
- Time finishTime = Seconds (20.0);
-
-
+ Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("attributes.xml"));
+ Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Save"));
+ Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("Xml"));
+
+ uint32_t maxRuns = 1;
+ uint32_t startRun = 0;
CommandLine cmd;
- cmd.AddValue ("finish", "Finish time", finishTime);
+ cmd.AddValue ("start", "Initial run number", startRun);
+ cmd.AddValue ("runs", "Number of runs", maxRuns);
cmd.Parse (argc, argv);
- Experiment experiment;
+ // ConfigStore config;
+ // config.ConfigureDefaults ();
+ Experiment experiment;
for (uint32_t i = 0; i < 80; i++)
{
Config::SetGlobal ("RngRun", IntegerValue (i));
cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
Experiment experiment;
+ experiment.GenerateRandomPairs (10);
cout << "Run " << i << endl;
string prefix = "run-" + lexical_cast<string> (i) + "-";
experiment.ConfigureTopology ();
- ApplicationContainer apps = experiment.AddApplications (10);
- experiment.ConfigureRouting ();
-
- /*ApplicationContainer apps = experiment.AddApplications ();
-
- for (uint32_t i = 0; i < apps.GetN () / 2; i++)
- {
- cout << "From " << apps.Get (i*2)->GetNode ()->GetId ()
- << " to " << apps.Get (i*2 + 1)->GetNode ()->GetId ();
- cout << "\n";
- }
- */
-
+ experiment.InstallCcnxStack ();
+ ApplicationContainer apps = experiment.AddApplications ();
+
//tracing
CcnxTraceHelper traceHelper;
- traceHelper.EnableRateL3All (prefix + "rate-trace.log");
+ // traceHelper.EnableRateL3All (prefix + "rate-trace.log");
traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", prefix + "consumers-seqs.log");
- experiment.Run (finishTime);
+ experiment.Run (Seconds(20.0));
}
cout << "Finish blackhole scenario\n";
diff --git a/examples/congestion-pop.cc b/examples/congestion-pop.cc
index fcfcc99..ae28ad8 100644
--- a/examples/congestion-pop.cc
+++ b/examples/congestion-pop.cc
@@ -30,13 +30,6 @@
#include "ns3/applications-module.h"
#include "ns3/config-store.h"
-#include <iostream>
-#include <sstream>
-#include <map>
-#include <list>
-#include <set>
-#include "ns3/rocketfuel-topology-reader.h"
-
#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>
@@ -53,110 +46,11 @@
// Simulator::Schedule (Seconds (1.0), PrintTime);
// }
-class Experiment
+#include "base-experiment.h"
+
+class Experiment : public BaseExperiment
{
public:
- Experiment ()
- : m_rand (0,52)
- , reader (0)
- { }
-
- ~Experiment ()
- {
- if (reader != 0) delete reader;
- }
-
- void
- ConfigureTopology ()
- {
- Names::Clear ();
- cout << "Configure Topology\n";
- if (reader != 0) delete reader;
- reader = new RocketfuelWeightsReader ("/sprint");
-
- string weights ("./src/NDNabstraction/examples/sprint-pops.weights");
- string latencies ("./src/NDNabstraction/examples/sprint-pops.latencies");
- string positions ("./src/NDNabstraction/examples/sprint-pops.positions");
-
- reader->SetFileName (positions);
- reader->SetFileType (RocketfuelWeightsReader::POSITIONS);
- reader->Read ();
-
- reader->SetFileName (weights);
- reader->SetFileType (RocketfuelWeightsReader::WEIGHTS);
- reader->Read ();
-
- reader->SetFileName (latencies);
- reader->SetFileType (RocketfuelWeightsReader::LATENCIES);
- reader->Read ();
-
- reader->Commit ();
- }
-
- void InstallCcnxStack ()
- {
- InternetStackHelper stack;
- Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
- stack.SetRoutingHelper (ipv4RoutingHelper);
- stack.Install (reader->GetNodes ());
-
- reader->AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
-
- // Install CCNx stack
- cout << "Installing CCNx stack\n";
- CcnxStackHelper ccnxHelper;
- ccnxHelper.SetForwardingStrategy ("ns3::CcnxBestRouteStrategy");
- ccnxHelper.EnableLimits (true, Seconds(0.1));
- ccnxHelper.SetDefaultRoutes (false);
- ccnxHelper.InstallAll ();
-
- // // Populate FIB based on IPv4 global routing controller
- ccnxHelper.InstallFakeGlobalRoutes ();
- ccnxHelper.InstallRoutesToAll ();
- }
-
- void InstallIpStack ()
- {
- InternetStackHelper stack;
- stack.Install (reader->GetNodes ());
- reader->AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
-
- Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
- }
-
- void
- GenerateRandomPairs (uint16_t numStreams)
- {
- m_pairs.clear ();
- // map<uint32_t, set<uint32_t> > streams;
- set<uint32_t> usedNodes;
-
- uint16_t createdStreams = 0;
- uint16_t guard = 0;
- while (createdStreams < numStreams && guard < (numeric_limits<uint16_t>::max ()-1))
- {
- guard ++;
-
- uint32_t node1_num = m_rand.GetValue ();
- uint32_t node2_num = m_rand.GetValue ();
-
- if (node1_num == node2_num)
- continue;
-
- if (usedNodes.count (node1_num) > 0 ||
- usedNodes.count (node2_num) > 0 )
- {
- continue; // don't reuse nodes
- }
-
- usedNodes.insert (node1_num);
- usedNodes.insert (node2_num);
-
- m_pairs.push_back (make_tuple (node1_num, node2_num));
- createdStreams ++;
- }
- }
-
ApplicationContainer
AddCcnxApplications ()
{
@@ -226,23 +120,6 @@
return apps;
}
-
-
- void
- Run (const Time &finishTime)
- {
- cout << "Run Simulation.\n";
- Simulator::Stop (finishTime);
- // Simulator::Schedule (Seconds (1.0), PrintTime);
- Simulator::Run ();
- Simulator::Destroy ();
- cout << "Done.\n";
- }
-
- UniformVariable m_rand;
- RocketfuelWeightsReader *reader;
-
- list<tuple<uint32_t,uint32_t> > m_pairs;
};