Merge remote-tracking branch 'git.irl/master'
diff --git a/apps/ccnx-consumer.cc b/apps/ccnx-consumer.cc
index 30ad394..ae56040 100644
--- a/apps/ccnx-consumer.cc
+++ b/apps/ccnx-consumer.cc
@@ -27,6 +27,7 @@
#include "ns3/string.h"
#include "ns3/boolean.h"
#include "ns3/uinteger.h"
+#include "ns3/double.h"
#include "ns3/ccnx.h"
#include "../model/ccnx-local-face.h"
@@ -54,15 +55,27 @@
.SetParent<CcnxApp> ()
.AddConstructor<CcnxConsumer> ()
.AddAttribute ("StartSeq", "Initial sequence number",
- IntegerValue(0),
+ IntegerValue (0),
MakeIntegerAccessor(&CcnxConsumer::m_seq),
MakeIntegerChecker<int32_t>())
-
- .AddAttribute ("OffTime", "Time interval between packets",
- StringValue ("100ms"),
- MakeTimeAccessor (&CcnxConsumer::m_offTime),
- MakeTimeChecker ())
- .AddAttribute ("InterestName","CcnxName of the Interest (use CcnxNameComponents)",
+
+ .AddAttribute ("Size", "Amount of data in megabytes to request (relies on PayloadSize parameter)",
+ DoubleValue (-1), // don't impose limit by default
+ MakeDoubleAccessor (&CcnxConsumer::GetMaxSize, &CcnxConsumer::SetMaxSize),
+ MakeDoubleChecker<double> ())
+
+ ///////
+ .AddAttribute ("PayloadSize", "Average size of content object size (to calculate interest generation rate)",
+ UintegerValue (1040),
+ MakeUintegerAccessor (&CcnxConsumer::GetPayloadSize, &CcnxConsumer::SetPayloadSize),
+ MakeUintegerChecker<uint32_t>())
+ .AddAttribute ("MeanRate", "Mean data packet rate (relies on the PayloadSize parameter)",
+ StringValue ("100Kbps"),
+ MakeDataRateAccessor (&CcnxConsumer::GetDesiredRate, &CcnxConsumer::SetDesiredRate),
+ MakeDataRateChecker ())
+ ///////
+
+ .AddAttribute ("Prefix","CcnxName of the Interest",
StringValue ("/"),
MakeCcnxNameComponentsAccessor (&CcnxConsumer::m_interestName),
MakeCcnxNameComponentsChecker ())
@@ -107,9 +120,13 @@
CcnxConsumer::CcnxConsumer ()
: m_rand (0, std::numeric_limits<uint32_t>::max ())
+ , m_desiredRate ("10Kbps")
+ , m_payloadSize (1040)
, m_seq (0)
{
NS_LOG_FUNCTION_NOARGS ();
+
+ UpdateMean (); // not necessary (will be called by ns3 object system anyways), but doesn't hurt
}
void
@@ -150,11 +167,81 @@
else
break; // nothing else to do. All later packets need not be retransmitted
}
+
+ if (m_retxSeqs.size () > 0)
+ {
+ ScheduleNextPacket ();
+ }
m_retxEvent = Simulator::Schedule (m_retxTimer,
&CcnxConsumer::CheckRetxTimeout, this);
}
+void
+CcnxConsumer::UpdateMean ()
+{
+ double mean = 8.0 * m_payloadSize / m_desiredRate.GetBitRate ();
+ m_randExp = ExponentialVariable (mean, 10000 * mean); // set upper limit to inter-arrival time
+}
+
+void
+CcnxConsumer::SetPayloadSize (uint32_t payload)
+{
+ m_payloadSize = payload;
+ UpdateMean ();
+}
+
+uint32_t
+CcnxConsumer::GetPayloadSize () const
+{
+ return m_payloadSize;
+}
+
+void
+CcnxConsumer::SetDesiredRate (DataRate rate)
+{
+ m_desiredRate = rate;
+ UpdateMean ();
+}
+
+DataRate
+CcnxConsumer::GetDesiredRate () const
+{
+ return m_desiredRate;
+}
+
+double
+CcnxConsumer::GetMaxSize () const
+{
+ if (m_seqMax == 0)
+ return -1.0;
+
+ return m_seqMax * m_payloadSize / 1024.0 / 1024.0;
+}
+
+void
+CcnxConsumer::SetMaxSize (double size)
+{
+ if (size < 0)
+ {
+ m_seqMax = 0;
+ return;
+ }
+
+ m_seqMax = floor(1.0 + size * 1024.0 * 1024.0 / m_payloadSize);
+ NS_LOG_DEBUG ("MaxSeqNo: " << m_seqMax);
+}
+
+
+void
+CcnxConsumer::ScheduleNextPacket ()
+{
+ if (!m_sendEvent.IsRunning ())
+ m_sendEvent = Simulator::Schedule (
+ Seconds(m_randExp.GetValue ()),
+ &CcnxConsumer::SendPacket, this);
+}
+
// Application Methods
void
CcnxConsumer::StartApplication () // Called at time specified by Start
@@ -163,9 +250,8 @@
// do base stuff
CcnxApp::StartApplication ();
-
- // schedule periodic packet generation
- m_sendEvent = Simulator::Schedule (Seconds(0.0), &CcnxConsumer::SendPacket, this);
+
+ ScheduleNextPacket ();
}
void
@@ -183,6 +269,8 @@
void
CcnxConsumer::SendPacket ()
{
+ if (!m_active) return;
+
NS_LOG_FUNCTION_NOARGS ();
boost::mutex::scoped_lock (m_seqTimeoutsGuard);
@@ -192,10 +280,22 @@
if (m_retxSeqs.size () != 0)
{
seq = *m_retxSeqs.begin ();
+ NS_LOG_INFO ("Before: " << m_retxSeqs.size ());
m_retxSeqs.erase (m_retxSeqs.begin ());
+ NS_LOG_INFO ("After: " << m_retxSeqs.size ());
}
else
- seq = m_seq++;
+ {
+ if (m_seqMax > 0)
+ {
+ if (m_seq >= m_seqMax)
+ {
+ return; // we are totally done
+ }
+ }
+
+ seq = m_seq++;
+ }
//
Ptr<CcnxNameComponents> nameWithSequence = Create<CcnxNameComponents> (m_interestName);
@@ -231,15 +331,22 @@
m_seqTimeouts.modify (res.first,
ll::bind(&SeqTimeout::time, ll::_1) = Simulator::Now ());
- m_sendEvent = Simulator::Schedule (m_offTime, &CcnxConsumer::SendPacket, this);
-
m_transmittedInterests (&interestHeader, this, m_face);
+
+ ScheduleNextPacket ();
}
+///////////////////////////////////////////////////
+// Process incoming packets //
+///////////////////////////////////////////////////
+
+
void
CcnxConsumer::OnContentObject (const Ptr<const CcnxContentObjectHeader> &contentObject,
const Ptr<const Packet> &payload)
{
+ if (!m_active) return;
+
CcnxApp::OnContentObject (contentObject, payload); // tracing inside
NS_LOG_FUNCTION (this << contentObject << payload);
@@ -251,20 +358,28 @@
boost::mutex::scoped_lock (m_seqTimeoutsGuard);
- SeqTimeoutsContainer::iterator entry = m_seqTimeouts.find (seq);
+ // SeqTimeoutsContainer::iterator entry = m_seqTimeouts.find (seq);
- NS_ASSERT_MSG (entry != m_seqTimeouts.end (),
- "Comment out this assert, if it causes problems");
+ // NS_ASSERT_MSG (entry != m_seqTimeouts.end (),
+ // "Comment out this assert, if it causes problems");
- if (entry != m_seqTimeouts.end ())
- m_seqTimeouts.erase (entry);
+ // if (entry != m_seqTimeouts.end ())
+ // m_seqTimeouts.erase (entry);
+
+ m_seqTimeouts.erase (seq);
+ m_retxSeqs.erase (seq);
}
void
CcnxConsumer::OnNack (const Ptr<const CcnxInterestHeader> &interest)
{
+ if (!m_active) return;
+
CcnxApp::OnNack (interest); // tracing inside
+ NS_LOG_DEBUG ("Nack type: " << interest->GetNack ());
+ boost::mutex::scoped_lock (m_seqTimeoutsGuard);
+
NS_LOG_FUNCTION (this << interest);
// NS_LOG_INFO ("Received NACK: " << boost::cref(*interest));
@@ -272,7 +387,11 @@
NS_LOG_INFO ("< NACK for " << seq);
// put in the queue of interests to be retransmitted
+ NS_LOG_INFO ("Before: " << m_retxSeqs.size ());
m_retxSeqs.insert (seq);
+ NS_LOG_INFO ("After: " << m_retxSeqs.size ());
+
+ ScheduleNextPacket ();
}
} // namespace ns3
diff --git a/apps/ccnx-consumer.h b/apps/ccnx-consumer.h
index fc4e363..9b28a2c 100644
--- a/apps/ccnx-consumer.h
+++ b/apps/ccnx-consumer.h
@@ -16,6 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
*/
#ifndef CCNX_CONSUMER_H
@@ -25,6 +26,7 @@
#include "ns3/random-variable.h"
#include "ns3/ccnx-name-components.h"
#include "ns3/nstime.h"
+#include "ns3/data-rate.h"
#include <set>
@@ -77,6 +79,24 @@
* \brief Constructs the Interest packet and sends it using a callback to the underlying CCNx protocol
*/
void
+ ScheduleNextPacket ();
+
+ void
+ UpdateMean ();
+
+ void
+ SetPayloadSize (uint32_t payload);
+
+ uint32_t
+ GetPayloadSize () const;
+
+ void
+ SetDesiredRate (DataRate rate);
+
+ DataRate
+ GetDesiredRate () const;
+
+ void
SendPacket ();
/**
@@ -99,12 +119,24 @@
Time
GetRetxTimer () const;
+ double
+ GetMaxSize () const;
+
+ void
+ SetMaxSize (double size);
+
protected:
- UniformVariable m_rand; ///< \brief this random variable is used for Nonce generation
- uint32_t m_seq; ///< \brief packet sequence number specific for every application
- EventId m_sendEvent; ///< \brief Eventid of pending "send packet" event
- Time m_retxTimer; ///< \brief Timeout defining how frequent retransmission timeouts should be checked
- EventId m_retxEvent; ///< \brief Event to check whether or not retransmission should be performed
+ UniformVariable m_rand; // nonce generator
+
+ ExponentialVariable m_randExp; // packet inter-arrival time generation (Poisson process)
+ DataRate m_desiredRate; // Desired data packet rate
+ uint32_t m_payloadSize; // expected payload size
+
+ uint32_t m_seq;
+ uint32_t m_seqMax; // maximum number of sequence number
+ EventId m_sendEvent; // Eventid of pending "send packet" event
+ Time m_retxTimer;
+ EventId m_retxEvent; // Event to check whether or not retransmission should be performed
Time m_rto; ///< \brief Retransmission timeout
Time m_rttVar; ///< \brief RTT variance
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index adac53e..2030e69 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -46,8 +46,8 @@
module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
## callback.h (module 'core'): ns3::CallbackBase [class]
module.add_class('CallbackBase', import_from_module='ns.core')
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper [class]
- module.add_class('CcnxConsumerHelper')
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper [class]
+ module.add_class('CcnxAppHelper')
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeaderException [class]
module.add_class('CcnxContentObjectHeaderException')
## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer [struct]
@@ -64,10 +64,10 @@
module.add_enum('Type', ['INTEREST', 'CONTENT_OBJECT'], outer_class=root_module['ns3::CcnxHeaderHelper'])
## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeaderException [class]
module.add_class('CcnxInterestHeaderException')
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper [class]
- module.add_class('CcnxProducerHelper')
## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper [class]
module.add_class('CcnxStackHelper')
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper [class]
+ module.add_class('CcnxTraceHelper')
## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException [class]
module.add_class('CcnxUnknownHeaderException')
## event-id.h (module 'core'): ns3::EventId [class]
@@ -120,6 +120,8 @@
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Chunk', 'ns3::ObjectBase', 'ns3::DefaultDeleter<ns3::Chunk>'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+ ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper [class]
+ module.add_class('SpringMobilityHelper')
## tag.h (module 'network'): ns3::Tag [class]
module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
@@ -136,6 +138,10 @@
module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
## random-variable.h (module 'core'): ns3::UniformVariable [class]
module.add_class('UniformVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+ ## vector.h (module 'core'): ns3::Vector2D [class]
+ module.add_class('Vector2D', import_from_module='ns.core')
+ ## vector.h (module 'core'): ns3::Vector3D [class]
+ module.add_class('Vector3D', import_from_module='ns.core')
## random-variable.h (module 'core'): ns3::WeibullVariable [class]
module.add_class('WeibullVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
## random-variable.h (module 'core'): ns3::ZetaVariable [class]
@@ -182,10 +188,14 @@
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > [class]
+ module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxAppTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxAppTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFibEntry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFibEntry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > [class]
+ module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxL3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxL3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxNameComponents', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxNameComponents>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
@@ -230,10 +240,12 @@
module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
## ccnx.h (module 'NDNabstraction'): ns3::Ccnx [class]
module.add_class('Ccnx', parent=root_module['ns3::Object'])
- ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::ForwardingStrategy [enumeration]
- module.add_enum('ForwardingStrategy', ['NDN_FLOODING', 'NDN_BESTROUTE', 'NDN_RANKING'], outer_class=root_module['ns3::Ccnx'])
+ ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::DropReason [enumeration]
+ module.add_enum('DropReason', ['DUPLICATED', 'SUPPRESSED', 'NO_FACES', 'NON_DUPLICATED', 'AFTER_SATISFIED', 'UNSOLICITED'], outer_class=root_module['ns3::Ccnx'])
## ccnx-app.h (module 'NDNabstraction'): ns3::CcnxApp [class]
module.add_class('CcnxApp', parent=root_module['ns3::Application'])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer [class]
+ module.add_class('CcnxAppTracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader [class]
module.add_class('CcnxContentObjectHeader', parent=root_module['ns3::Header'])
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectTail [class]
@@ -252,6 +264,8 @@
module.add_class('CcnxInterestHeader', parent=root_module['ns3::Header'])
## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [enumeration]
module.add_enum('', ['NORMAL_INTEREST', 'NACK_LOOP', 'NACK_CONGESTION', 'NACK_GIVEUP_PIT'], outer_class=root_module['ns3::CcnxInterestHeader'])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer [class]
+ module.add_class('CcnxL3Tracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents [class]
module.add_class('CcnxNameComponents', parent=root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponentsChecker [class]
@@ -280,6 +294,8 @@
module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+ ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
+ module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
## net-device.h (module 'network'): ns3::NetDevice [class]
module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -301,7 +317,9 @@
## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [class]
module.add_class('RocketfuelWeightsReader', parent=root_module['ns3::AnnotatedTopologyReader'])
## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [enumeration]
- module.add_enum('', ['WEIGHTS', 'LATENCIES'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+ module.add_enum('', ['WEIGHTS', 'LATENCIES', 'POSITIONS'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel [class]
+ module.add_class('SpringMobilityModel', parent=root_module['ns3::MobilityModel'])
## nstime.h (module 'core'): ns3::TimeChecker [class]
module.add_class('TimeChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -310,6 +328,14 @@
module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
## type-id.h (module 'core'): ns3::TypeIdValue [class]
module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+ ## vector.h (module 'core'): ns3::Vector2DChecker [class]
+ module.add_class('Vector2DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+ ## vector.h (module 'core'): ns3::Vector2DValue [class]
+ module.add_class('Vector2DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+ ## vector.h (module 'core'): ns3::Vector3DChecker [class]
+ module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+ ## vector.h (module 'core'): ns3::Vector3DValue [class]
+ module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
## address.h (module 'network'): ns3::AddressChecker [class]
module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
## address.h (module 'network'): ns3::AddressValue [class]
@@ -317,6 +343,18 @@
module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
module.add_container('std::list< boost::reference_wrapper< std::string const > >', 'boost::reference_wrapper< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const >', container_type='list')
module.add_container('std::list< std::string >', 'std::string', container_type='list')
+ typehandlers.add_type_alias('ns3::Vector3DChecker', 'ns3::VectorChecker')
+ typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
+ typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
+ module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+ typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
+ typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
+ typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
+ module.add_typedef(root_module['ns3::Vector3D'], 'Vector')
+ typehandlers.add_type_alias('ns3::Vector3DValue', 'ns3::VectorValue')
+ typehandlers.add_type_alias('ns3::Vector3DValue*', 'ns3::VectorValue*')
+ typehandlers.add_type_alias('ns3::Vector3DValue&', 'ns3::VectorValue&')
+ module.add_typedef(root_module['ns3::Vector3DValue'], 'VectorValue')
## Register a nested module for the namespace FatalImpl
@@ -351,15 +389,15 @@
register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
- register_Ns3CcnxConsumerHelper_methods(root_module, root_module['ns3::CcnxConsumerHelper'])
+ register_Ns3CcnxAppHelper_methods(root_module, root_module['ns3::CcnxAppHelper'])
register_Ns3CcnxContentObjectHeaderException_methods(root_module, root_module['ns3::CcnxContentObjectHeaderException'])
register_Ns3CcnxFibEntryContainer_methods(root_module, root_module['ns3::CcnxFibEntryContainer'])
register_Ns3CcnxFibFaceMetric_methods(root_module, root_module['ns3::CcnxFibFaceMetric'])
register_Ns3CcnxFibFaceMetricContainer_methods(root_module, root_module['ns3::CcnxFibFaceMetricContainer'])
register_Ns3CcnxHeaderHelper_methods(root_module, root_module['ns3::CcnxHeaderHelper'])
register_Ns3CcnxInterestHeaderException_methods(root_module, root_module['ns3::CcnxInterestHeaderException'])
- register_Ns3CcnxProducerHelper_methods(root_module, root_module['ns3::CcnxProducerHelper'])
register_Ns3CcnxStackHelper_methods(root_module, root_module['ns3::CcnxStackHelper'])
+ register_Ns3CcnxTraceHelper_methods(root_module, root_module['ns3::CcnxTraceHelper'])
register_Ns3CcnxUnknownHeaderException_methods(root_module, root_module['ns3::CcnxUnknownHeaderException'])
register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
@@ -383,6 +421,7 @@
register_Ns3SequentialVariable_methods(root_module, root_module['ns3::SequentialVariable'])
register_Ns3SimpleRefCount__Ns3Chunk_Ns3ObjectBase_Ns3DefaultDeleter__lt__ns3Chunk__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Chunk, ns3::ObjectBase, ns3::DefaultDeleter<ns3::Chunk> >'])
register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+ register_Ns3SpringMobilityHelper_methods(root_module, root_module['ns3::SpringMobilityHelper'])
register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
register_Ns3TriangularVariable_methods(root_module, root_module['ns3::TriangularVariable'])
@@ -390,6 +429,8 @@
register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
register_Ns3UniformVariable_methods(root_module, root_module['ns3::UniformVariable'])
+ register_Ns3Vector2D_methods(root_module, root_module['ns3::Vector2D'])
+ register_Ns3Vector3D_methods(root_module, root_module['ns3::Vector3D'])
register_Ns3WeibullVariable_methods(root_module, root_module['ns3::WeibullVariable'])
register_Ns3ZetaVariable_methods(root_module, root_module['ns3::ZetaVariable'])
register_Ns3ZipfVariable_methods(root_module, root_module['ns3::ZipfVariable'])
@@ -413,8 +454,10 @@
register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+ register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
+ register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
@@ -436,6 +479,7 @@
register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
register_Ns3Ccnx_methods(root_module, root_module['ns3::Ccnx'])
register_Ns3CcnxApp_methods(root_module, root_module['ns3::CcnxApp'])
+ register_Ns3CcnxAppTracer_methods(root_module, root_module['ns3::CcnxAppTracer'])
register_Ns3CcnxContentObjectHeader_methods(root_module, root_module['ns3::CcnxContentObjectHeader'])
register_Ns3CcnxContentObjectTail_methods(root_module, root_module['ns3::CcnxContentObjectTail'])
register_Ns3CcnxFace_methods(root_module, root_module['ns3::CcnxFace'])
@@ -444,6 +488,7 @@
register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
register_Ns3CcnxInterestHeader_methods(root_module, root_module['ns3::CcnxInterestHeader'])
+ register_Ns3CcnxL3Tracer_methods(root_module, root_module['ns3::CcnxL3Tracer'])
register_Ns3CcnxNameComponents_methods(root_module, root_module['ns3::CcnxNameComponents'])
register_Ns3CcnxNameComponentsChecker_methods(root_module, root_module['ns3::CcnxNameComponentsChecker'])
register_Ns3CcnxNameComponentsValue_methods(root_module, root_module['ns3::CcnxNameComponentsValue'])
@@ -458,6 +503,7 @@
register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+ register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -467,10 +513,15 @@
register_Ns3RandomVariableChecker_methods(root_module, root_module['ns3::RandomVariableChecker'])
register_Ns3RandomVariableValue_methods(root_module, root_module['ns3::RandomVariableValue'])
register_Ns3RocketfuelWeightsReader_methods(root_module, root_module['ns3::RocketfuelWeightsReader'])
+ register_Ns3SpringMobilityModel_methods(root_module, root_module['ns3::SpringMobilityModel'])
register_Ns3TimeChecker_methods(root_module, root_module['ns3::TimeChecker'])
register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+ register_Ns3Vector2DChecker_methods(root_module, root_module['ns3::Vector2DChecker'])
+ register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
+ register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
+ register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
return
@@ -1012,27 +1063,31 @@
is_static=True, visibility='protected')
return
-def register_Ns3CcnxConsumerHelper_methods(root_module, cls):
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(ns3::CcnxConsumerHelper const & arg0) [copy constructor]
- cls.add_constructor([param('ns3::CcnxConsumerHelper const &', 'arg0')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(std::string const & prefix) [constructor]
+def register_Ns3CcnxAppHelper_methods(root_module, cls):
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(ns3::CcnxAppHelper const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxAppHelper const &', 'arg0')])
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(std::string const & prefix) [constructor]
cls.add_constructor([param('std::string const &', 'prefix')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::NodeContainer c) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::NodeContainer c) [member function]
cls.add_method('Install',
'ns3::ApplicationContainer',
[param('ns3::NodeContainer', 'c')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
cls.add_method('Install',
'ns3::ApplicationContainer',
[param('ns3::Ptr< ns3::Node >', 'node')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(std::string nodeName) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(std::string nodeName) [member function]
cls.add_method('Install',
'ns3::ApplicationContainer',
[param('std::string', 'nodeName')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): void ns3::CcnxConsumerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
cls.add_method('SetAttribute',
'void',
[param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+ ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetPrefix(std::string const & prefix) [member function]
+ cls.add_method('SetPrefix',
+ 'void',
+ [param('std::string const &', 'prefix')])
return
def register_Ns3CcnxContentObjectHeaderException_methods(root_module, cls):
@@ -1103,29 +1158,6 @@
cls.add_constructor([param('ns3::CcnxInterestHeaderException const &', 'arg0')])
return
-def register_Ns3CcnxProducerHelper_methods(root_module, cls):
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(ns3::CcnxProducerHelper const & arg0) [copy constructor]
- cls.add_constructor([param('ns3::CcnxProducerHelper const &', 'arg0')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(std::string const & prefix, uint32_t virtualPayloadSize) [constructor]
- cls.add_constructor([param('std::string const &', 'prefix'), param('uint32_t', 'virtualPayloadSize')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::NodeContainer c) [member function]
- cls.add_method('Install',
- 'ns3::ApplicationContainer',
- [param('ns3::NodeContainer', 'c')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
- cls.add_method('Install',
- 'ns3::ApplicationContainer',
- [param('ns3::Ptr< ns3::Node >', 'node')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(std::string nodeName) [member function]
- cls.add_method('Install',
- 'ns3::ApplicationContainer',
- [param('std::string', 'nodeName')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): void ns3::CcnxProducerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
- cls.add_method('SetAttribute',
- 'void',
- [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
- return
-
def register_Ns3CcnxStackHelper_methods(root_module, cls):
## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper::CcnxStackHelper() [constructor]
cls.add_constructor([])
@@ -1185,6 +1217,33 @@
[])
return
+def register_Ns3CcnxTraceHelper_methods(root_module, cls):
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper(ns3::CcnxTraceHelper const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxTraceHelper const &', 'arg0')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper() [constructor]
+ cls.add_constructor([])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateAppAll(std::string const & app) [member function]
+ cls.add_method('EnableAggregateAppAll',
+ 'void',
+ [param('std::string const &', 'app')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateL3All() [member function]
+ cls.add_method('EnableAggregateL3All',
+ 'void',
+ [])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableRateL3All(std::string const & l3RateTrace="l3-rate.log") [member function]
+ cls.add_method('EnableRateL3All',
+ 'void',
+ [param('std::string const &', 'l3RateTrace', default_value='"l3-rate.log"')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetAppTraceFile(std::string const & appTrace="apps.log") [member function]
+ cls.add_method('SetAppTraceFile',
+ 'void',
+ [param('std::string const &', 'appTrace', default_value='"apps.log"')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetL3TraceFile(std::string const & l3Trace="l3.log") [member function]
+ cls.add_method('SetL3TraceFile',
+ 'void',
+ [param('std::string const &', 'l3Trace', default_value='"l3.log"')])
+ return
+
def register_Ns3CcnxUnknownHeaderException_methods(root_module, cls):
## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException::CcnxUnknownHeaderException() [constructor]
cls.add_constructor([])
@@ -2123,6 +2182,23 @@
is_static=True)
return
+def register_Ns3SpringMobilityHelper_methods(root_module, cls):
+ ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper() [constructor]
+ cls.add_constructor([])
+ ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper(ns3::SpringMobilityHelper const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::SpringMobilityHelper const &', 'arg0')])
+ ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+ cls.add_method('InstallSprings',
+ 'void',
+ [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')],
+ is_static=True)
+ ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(std::_List_const_iterator<ns3::TopologyReader::Link> first, std::_List_const_iterator<ns3::TopologyReader::Link> end) [member function]
+ cls.add_method('InstallSprings',
+ 'void',
+ [param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'first'), param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'end')],
+ is_static=True)
+ return
+
def register_Ns3Tag_methods(root_module, cls):
## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
cls.add_constructor([])
@@ -2423,6 +2499,52 @@
[param('double', 's'), param('double', 'l')])
return
+def register_Ns3Vector2D_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('ns3::Vector2D const &', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+ cls.add_binary_numeric_operator('-', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+ cls.add_binary_numeric_operator('/', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+ ## vector.h (module 'core'): ns3::Vector2D::Vector2D(ns3::Vector2D const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector2D const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector2D::Vector2D(double _x, double _y) [constructor]
+ cls.add_constructor([param('double', '_x'), param('double', '_y')])
+ ## vector.h (module 'core'): ns3::Vector2D::Vector2D() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector2D::x [variable]
+ cls.add_instance_attribute('x', 'double', is_const=False)
+ ## vector.h (module 'core'): ns3::Vector2D::y [variable]
+ cls.add_instance_attribute('y', 'double', is_const=False)
+ return
+
+def register_Ns3Vector3D_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('ns3::Vector3D const &', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+ cls.add_binary_numeric_operator('-', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+ cls.add_binary_numeric_operator('/', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+ ## vector.h (module 'core'): ns3::Vector3D::Vector3D(ns3::Vector3D const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector3D const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector3D::Vector3D(double _x, double _y, double _z) [constructor]
+ cls.add_constructor([param('double', '_x'), param('double', '_y'), param('double', '_z')])
+ ## vector.h (module 'core'): ns3::Vector3D::Vector3D() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector3D::x [variable]
+ cls.add_instance_attribute('x', 'double', is_const=False)
+ ## vector.h (module 'core'): ns3::Vector3D::y [variable]
+ cls.add_instance_attribute('y', 'double', is_const=False)
+ ## vector.h (module 'core'): ns3::Vector3D::z [variable]
+ cls.add_instance_attribute('z', 'double', is_const=False)
+ return
+
def register_Ns3WeibullVariable_methods(root_module, cls):
## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(ns3::WeibullVariable const & arg0) [copy constructor]
cls.add_constructor([param('ns3::WeibullVariable const &', 'arg0')])
@@ -2462,13 +2584,13 @@
return
def register_Ns3Int64x64_t_methods(root_module, cls):
- cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('!=')
cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
cls.add_output_stream_operator()
+ cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('==')
cls.add_binary_comparison_operator('>=')
cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
@@ -2859,6 +2981,18 @@
is_static=True)
return
+def register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, cls):
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount() [constructor]
+ cls.add_constructor([])
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > const & o) [copy constructor]
+ cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxAppTracer > > const &', 'o')])
+ ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::Cleanup() [member function]
+ cls.add_method('Cleanup',
+ 'void',
+ [],
+ is_static=True)
+ return
+
def register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, cls):
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >::SimpleRefCount() [constructor]
cls.add_constructor([])
@@ -2883,6 +3017,18 @@
is_static=True)
return
+def register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, cls):
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount() [constructor]
+ cls.add_constructor([])
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > const & o) [copy constructor]
+ cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxL3Tracer > > const &', 'o')])
+ ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::Cleanup() [member function]
+ cls.add_method('Cleanup',
+ 'void',
+ [],
+ is_static=True)
+ return
+
def register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, cls):
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >::SimpleRefCount() [constructor]
cls.add_constructor([])
@@ -2956,11 +3102,11 @@
return
def register_Ns3Time_methods(root_module, cls):
- cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('!=')
cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
cls.add_output_stream_operator()
+ cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('==')
cls.add_binary_comparison_operator('>=')
cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
@@ -3278,13 +3424,18 @@
return
def register_Ns3AnnotatedTopologyReader_methods(root_module, cls):
- ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="") [constructor]
- cls.add_constructor([param('std::string const &', 'path', default_value='""')])
+ ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="", double scale=1.0e+0) [constructor]
+ cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::Read() [member function]
cls.add_method('Read',
'ns3::NodeContainer',
[],
is_virtual=True)
+ ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::GetNodes() const [member function]
+ cls.add_method('GetNodes',
+ 'ns3::NodeContainer',
+ [],
+ is_const=True)
## annotated-topology-reader.h (module 'NDNabstraction'): void ns3::AnnotatedTopologyReader::AssignIpv4Addresses(ns3::Ipv4Address base) [member function]
cls.add_method('AssignIpv4Addresses',
'void',
@@ -3599,6 +3750,55 @@
visibility='protected', is_virtual=True)
return
+def register_Ns3CcnxAppTracer_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(ns3::CcnxAppTracer const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxAppTracer const &', 'arg0')])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, ns3::Ptr<ns3::Node> node, std::string const & appId="*") [constructor]
+ cls.add_constructor([param('std::string const &', 'app'), param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, std::string const & node, std::string const & appId="*") [constructor]
+ cls.add_constructor([param('std::string const &', 'app'), param('std::string const &', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Connect() [member function]
+ cls.add_method('Connect',
+ 'void',
+ [])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+ cls.add_method('InData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+ cls.add_method('InInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+ cls.add_method('InNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+ cls.add_method('OutData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+ cls.add_method('OutInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Print(std::ostream & os) const [member function]
+ cls.add_method('Print',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::PrintHeader(std::ostream & os) const [member function]
+ cls.add_method('PrintHeader',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ return
+
def register_Ns3CcnxContentObjectHeader_methods(root_module, cls):
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader::CcnxContentObjectHeader(ns3::CcnxContentObjectHeader const & arg0) [copy constructor]
cls.add_constructor([param('ns3::CcnxContentObjectHeader const &', 'arg0')])
@@ -3707,13 +3907,9 @@
'bool',
[],
is_const=True, is_virtual=True)
- ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket(ns3::Time const & interval) [member function]
+ ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket() [member function]
cls.add_method('LeakBucket',
'void',
- [param('ns3::Time const &', 'interval')])
- ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucketByOnePacket() [member function]
- cls.add_method('LeakBucketByOnePacket',
- 'void',
[])
## ccnx-face.h (module 'NDNabstraction'): std::ostream & ns3::CcnxFace::Print(std::ostream & os) const [member function]
cls.add_method('Print',
@@ -4024,6 +4220,75 @@
[param('int8_t', 'scope')])
return
+def register_Ns3CcnxL3Tracer_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::CcnxL3Tracer const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxL3Tracer const &', 'arg0')])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+ cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(std::string const & node) [constructor]
+ cls.add_constructor([param('std::string const &', 'node')])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Connect() [member function]
+ cls.add_method('Connect',
+ 'void',
+ [])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ccnx::DropReason arg3, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+ cls.add_method('DropData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ccnx::DropReason', 'arg3'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+ cls.add_method('DropInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+ cls.add_method('DropNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+ cls.add_method('InData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('InInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('InNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, bool fromCache, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+ cls.add_method('OutData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('OutInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('OutNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Print(std::ostream & os) const [member function]
+ cls.add_method('Print',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::PrintHeader(std::ostream & os) const [member function]
+ cls.add_method('PrintHeader',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ return
+
def register_Ns3CcnxNameComponents_methods(root_module, cls):
cls.add_output_stream_operator()
cls.add_binary_comparison_operator('<')
@@ -4335,6 +4600,62 @@
[param('ns3::Ipv6Prefix const &', 'value')])
return
+def register_Ns3MobilityModel_methods(root_module, cls):
+ ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
+ ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
+ cls.add_constructor([])
+ ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
+ cls.add_method('GetDistanceFrom',
+ 'double',
+ [param('ns3::Ptr< ns3::MobilityModel const >', 'position')],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
+ cls.add_method('GetPosition',
+ 'ns3::Vector',
+ [],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
+ cls.add_method('GetRelativeSpeed',
+ 'double',
+ [param('ns3::Ptr< ns3::MobilityModel const >', 'other')],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
+ cls.add_method('GetTypeId',
+ 'ns3::TypeId',
+ [],
+ is_static=True)
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
+ cls.add_method('GetVelocity',
+ 'ns3::Vector',
+ [],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
+ cls.add_method('SetPosition',
+ 'void',
+ [param('ns3::Vector const &', 'position')])
+ ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
+ cls.add_method('NotifyCourseChange',
+ 'void',
+ [],
+ is_const=True, visibility='protected')
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
+ cls.add_method('DoGetPosition',
+ 'ns3::Vector',
+ [],
+ is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
+ cls.add_method('DoGetVelocity',
+ 'ns3::Vector',
+ [],
+ is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+ ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+ cls.add_method('DoSetPosition',
+ 'void',
+ [param('ns3::Vector const &', 'position')],
+ is_pure_virtual=True, visibility='private', is_virtual=True)
+ return
+
def register_Ns3NetDevice_methods(root_module, cls):
## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
cls.add_constructor([])
@@ -4871,6 +5192,47 @@
cls.add_method('Commit',
'void',
[])
+ ## rocketfuel-weights-reader.h (module 'NDNabstraction'): void ns3::RocketfuelWeightsReader::SavePositions(std::string const & file) const [member function]
+ cls.add_method('SavePositions',
+ 'void',
+ [param('std::string const &', 'file')],
+ is_const=True)
+ return
+
+def register_Ns3SpringMobilityModel_methods(root_module, cls):
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel(ns3::SpringMobilityModel const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::SpringMobilityModel const &', 'arg0')])
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel() [constructor]
+ cls.add_constructor([])
+ ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::AddSpring(ns3::Ptr<ns3::MobilityModel> node) [member function]
+ cls.add_method('AddSpring',
+ 'void',
+ [param('ns3::Ptr< ns3::MobilityModel >', 'node')])
+ ## spring-mobility-model.h (module 'NDNabstraction'): static ns3::TypeId ns3::SpringMobilityModel::GetTypeId() [member function]
+ cls.add_method('GetTypeId',
+ 'ns3::TypeId',
+ [],
+ is_static=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetPosition() const [member function]
+ cls.add_method('DoGetPosition',
+ 'ns3::Vector',
+ [],
+ is_const=True, visibility='private', is_virtual=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetVelocity() const [member function]
+ cls.add_method('DoGetVelocity',
+ 'ns3::Vector',
+ [],
+ is_const=True, visibility='private', is_virtual=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+ cls.add_method('DoSetPosition',
+ 'void',
+ [param('ns3::Vector const &', 'position')],
+ visibility='private', is_virtual=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoStart() [member function]
+ cls.add_method('DoStart',
+ 'void',
+ [],
+ visibility='private', is_virtual=True)
return
def register_Ns3TimeChecker_methods(root_module, cls):
@@ -4953,6 +5315,86 @@
[param('ns3::TypeId const &', 'value')])
return
+def register_Ns3Vector2DChecker_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+ return
+
+def register_Ns3Vector2DValue_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
+ cls.add_constructor([param('ns3::Vector2D const &', 'value')])
+ ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
+ cls.add_method('Copy',
+ 'ns3::Ptr< ns3::AttributeValue >',
+ [],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+ cls.add_method('DeserializeFromString',
+ 'bool',
+ [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_virtual=True)
+ ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
+ cls.add_method('Get',
+ 'ns3::Vector2D',
+ [],
+ is_const=True)
+ ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+ cls.add_method('SerializeToString',
+ 'std::string',
+ [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
+ cls.add_method('Set',
+ 'void',
+ [param('ns3::Vector2D const &', 'value')])
+ return
+
+def register_Ns3Vector3DChecker_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+ return
+
+def register_Ns3Vector3DValue_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
+ cls.add_constructor([param('ns3::Vector3D const &', 'value')])
+ ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
+ cls.add_method('Copy',
+ 'ns3::Ptr< ns3::AttributeValue >',
+ [],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+ cls.add_method('DeserializeFromString',
+ 'bool',
+ [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_virtual=True)
+ ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
+ cls.add_method('Get',
+ 'ns3::Vector3D',
+ [],
+ is_const=True)
+ ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+ cls.add_method('SerializeToString',
+ 'std::string',
+ [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
+ cls.add_method('Set',
+ 'void',
+ [param('ns3::Vector3D const &', 'value')])
+ return
+
def register_Ns3AddressChecker_methods(root_module, cls):
## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
cls.add_constructor([])
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index adac53e..2030e69 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -46,8 +46,8 @@
module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
## callback.h (module 'core'): ns3::CallbackBase [class]
module.add_class('CallbackBase', import_from_module='ns.core')
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper [class]
- module.add_class('CcnxConsumerHelper')
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper [class]
+ module.add_class('CcnxAppHelper')
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeaderException [class]
module.add_class('CcnxContentObjectHeaderException')
## ccnx-fib.h (module 'NDNabstraction'): ns3::CcnxFibEntryContainer [struct]
@@ -64,10 +64,10 @@
module.add_enum('Type', ['INTEREST', 'CONTENT_OBJECT'], outer_class=root_module['ns3::CcnxHeaderHelper'])
## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeaderException [class]
module.add_class('CcnxInterestHeaderException')
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper [class]
- module.add_class('CcnxProducerHelper')
## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper [class]
module.add_class('CcnxStackHelper')
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper [class]
+ module.add_class('CcnxTraceHelper')
## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException [class]
module.add_class('CcnxUnknownHeaderException')
## event-id.h (module 'core'): ns3::EventId [class]
@@ -120,6 +120,8 @@
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Chunk', 'ns3::ObjectBase', 'ns3::DefaultDeleter<ns3::Chunk>'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+ ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper [class]
+ module.add_class('SpringMobilityHelper')
## tag.h (module 'network'): ns3::Tag [class]
module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
@@ -136,6 +138,10 @@
module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
## random-variable.h (module 'core'): ns3::UniformVariable [class]
module.add_class('UniformVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
+ ## vector.h (module 'core'): ns3::Vector2D [class]
+ module.add_class('Vector2D', import_from_module='ns.core')
+ ## vector.h (module 'core'): ns3::Vector3D [class]
+ module.add_class('Vector3D', import_from_module='ns.core')
## random-variable.h (module 'core'): ns3::WeibullVariable [class]
module.add_class('WeibullVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariable'])
## random-variable.h (module 'core'): ns3::ZetaVariable [class]
@@ -182,10 +188,14 @@
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > [class]
+ module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxAppTracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxAppTracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFaceContainer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFaceContainer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxFibEntry', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxFibEntry>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > [class]
+ module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxL3Tracer', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxL3Tracer>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> > [class]
module.add_class('SimpleRefCount', automatic_type_narrowing=True, template_parameters=['ns3::CcnxNameComponents', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CcnxNameComponents>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
@@ -230,10 +240,12 @@
module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
## ccnx.h (module 'NDNabstraction'): ns3::Ccnx [class]
module.add_class('Ccnx', parent=root_module['ns3::Object'])
- ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::ForwardingStrategy [enumeration]
- module.add_enum('ForwardingStrategy', ['NDN_FLOODING', 'NDN_BESTROUTE', 'NDN_RANKING'], outer_class=root_module['ns3::Ccnx'])
+ ## ccnx.h (module 'NDNabstraction'): ns3::Ccnx::DropReason [enumeration]
+ module.add_enum('DropReason', ['DUPLICATED', 'SUPPRESSED', 'NO_FACES', 'NON_DUPLICATED', 'AFTER_SATISFIED', 'UNSOLICITED'], outer_class=root_module['ns3::Ccnx'])
## ccnx-app.h (module 'NDNabstraction'): ns3::CcnxApp [class]
module.add_class('CcnxApp', parent=root_module['ns3::Application'])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer [class]
+ module.add_class('CcnxAppTracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader [class]
module.add_class('CcnxContentObjectHeader', parent=root_module['ns3::Header'])
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectTail [class]
@@ -252,6 +264,8 @@
module.add_class('CcnxInterestHeader', parent=root_module['ns3::Header'])
## ccnx-interest-header.h (module 'NDNabstraction'): ns3::CcnxInterestHeader [enumeration]
module.add_enum('', ['NORMAL_INTEREST', 'NACK_LOOP', 'NACK_CONGESTION', 'NACK_GIVEUP_PIT'], outer_class=root_module['ns3::CcnxInterestHeader'])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer [class]
+ module.add_class('CcnxL3Tracer', parent=root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponents [class]
module.add_class('CcnxNameComponents', parent=root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
## ccnx-name-components.h (module 'NDNabstraction'): ns3::CcnxNameComponentsChecker [class]
@@ -280,6 +294,8 @@
module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+ ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
+ module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
## net-device.h (module 'network'): ns3::NetDevice [class]
module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
@@ -301,7 +317,9 @@
## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [class]
module.add_class('RocketfuelWeightsReader', parent=root_module['ns3::AnnotatedTopologyReader'])
## rocketfuel-weights-reader.h (module 'NDNabstraction'): ns3::RocketfuelWeightsReader [enumeration]
- module.add_enum('', ['WEIGHTS', 'LATENCIES'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+ module.add_enum('', ['WEIGHTS', 'LATENCIES', 'POSITIONS'], outer_class=root_module['ns3::RocketfuelWeightsReader'])
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel [class]
+ module.add_class('SpringMobilityModel', parent=root_module['ns3::MobilityModel'])
## nstime.h (module 'core'): ns3::TimeChecker [class]
module.add_class('TimeChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -310,6 +328,14 @@
module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
## type-id.h (module 'core'): ns3::TypeIdValue [class]
module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+ ## vector.h (module 'core'): ns3::Vector2DChecker [class]
+ module.add_class('Vector2DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+ ## vector.h (module 'core'): ns3::Vector2DValue [class]
+ module.add_class('Vector2DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+ ## vector.h (module 'core'): ns3::Vector3DChecker [class]
+ module.add_class('Vector3DChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+ ## vector.h (module 'core'): ns3::Vector3DValue [class]
+ module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
## address.h (module 'network'): ns3::AddressChecker [class]
module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
## address.h (module 'network'): ns3::AddressValue [class]
@@ -317,6 +343,18 @@
module.add_container('std::map< std::string, std::string >', ('std::string', 'std::string'), container_type='map')
module.add_container('std::list< boost::reference_wrapper< std::string const > >', 'boost::reference_wrapper< std::basic_string< char, std::char_traits< char >, std::allocator< char > > const >', container_type='list')
module.add_container('std::list< std::string >', 'std::string', container_type='list')
+ typehandlers.add_type_alias('ns3::Vector3DChecker', 'ns3::VectorChecker')
+ typehandlers.add_type_alias('ns3::Vector3DChecker*', 'ns3::VectorChecker*')
+ typehandlers.add_type_alias('ns3::Vector3DChecker&', 'ns3::VectorChecker&')
+ module.add_typedef(root_module['ns3::Vector3DChecker'], 'VectorChecker')
+ typehandlers.add_type_alias('ns3::Vector3D', 'ns3::Vector')
+ typehandlers.add_type_alias('ns3::Vector3D*', 'ns3::Vector*')
+ typehandlers.add_type_alias('ns3::Vector3D&', 'ns3::Vector&')
+ module.add_typedef(root_module['ns3::Vector3D'], 'Vector')
+ typehandlers.add_type_alias('ns3::Vector3DValue', 'ns3::VectorValue')
+ typehandlers.add_type_alias('ns3::Vector3DValue*', 'ns3::VectorValue*')
+ typehandlers.add_type_alias('ns3::Vector3DValue&', 'ns3::VectorValue&')
+ module.add_typedef(root_module['ns3::Vector3DValue'], 'VectorValue')
## Register a nested module for the namespace FatalImpl
@@ -351,15 +389,15 @@
register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
- register_Ns3CcnxConsumerHelper_methods(root_module, root_module['ns3::CcnxConsumerHelper'])
+ register_Ns3CcnxAppHelper_methods(root_module, root_module['ns3::CcnxAppHelper'])
register_Ns3CcnxContentObjectHeaderException_methods(root_module, root_module['ns3::CcnxContentObjectHeaderException'])
register_Ns3CcnxFibEntryContainer_methods(root_module, root_module['ns3::CcnxFibEntryContainer'])
register_Ns3CcnxFibFaceMetric_methods(root_module, root_module['ns3::CcnxFibFaceMetric'])
register_Ns3CcnxFibFaceMetricContainer_methods(root_module, root_module['ns3::CcnxFibFaceMetricContainer'])
register_Ns3CcnxHeaderHelper_methods(root_module, root_module['ns3::CcnxHeaderHelper'])
register_Ns3CcnxInterestHeaderException_methods(root_module, root_module['ns3::CcnxInterestHeaderException'])
- register_Ns3CcnxProducerHelper_methods(root_module, root_module['ns3::CcnxProducerHelper'])
register_Ns3CcnxStackHelper_methods(root_module, root_module['ns3::CcnxStackHelper'])
+ register_Ns3CcnxTraceHelper_methods(root_module, root_module['ns3::CcnxTraceHelper'])
register_Ns3CcnxUnknownHeaderException_methods(root_module, root_module['ns3::CcnxUnknownHeaderException'])
register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
@@ -383,6 +421,7 @@
register_Ns3SequentialVariable_methods(root_module, root_module['ns3::SequentialVariable'])
register_Ns3SimpleRefCount__Ns3Chunk_Ns3ObjectBase_Ns3DefaultDeleter__lt__ns3Chunk__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Chunk, ns3::ObjectBase, ns3::DefaultDeleter<ns3::Chunk> >'])
register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+ register_Ns3SpringMobilityHelper_methods(root_module, root_module['ns3::SpringMobilityHelper'])
register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
register_Ns3TriangularVariable_methods(root_module, root_module['ns3::TriangularVariable'])
@@ -390,6 +429,8 @@
register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
register_Ns3UniformVariable_methods(root_module, root_module['ns3::UniformVariable'])
+ register_Ns3Vector2D_methods(root_module, root_module['ns3::Vector2D'])
+ register_Ns3Vector3D_methods(root_module, root_module['ns3::Vector3D'])
register_Ns3WeibullVariable_methods(root_module, root_module['ns3::WeibullVariable'])
register_Ns3ZetaVariable_methods(root_module, root_module['ns3::ZetaVariable'])
register_Ns3ZipfVariable_methods(root_module, root_module['ns3::ZipfVariable'])
@@ -413,8 +454,10 @@
register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+ register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >'])
register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >'])
register_Ns3SimpleRefCount__Ns3CcnxFibEntry_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFibEntry__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxFibEntry, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFibEntry> >'])
+ register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >'])
register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >'])
register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
@@ -436,6 +479,7 @@
register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
register_Ns3Ccnx_methods(root_module, root_module['ns3::Ccnx'])
register_Ns3CcnxApp_methods(root_module, root_module['ns3::CcnxApp'])
+ register_Ns3CcnxAppTracer_methods(root_module, root_module['ns3::CcnxAppTracer'])
register_Ns3CcnxContentObjectHeader_methods(root_module, root_module['ns3::CcnxContentObjectHeader'])
register_Ns3CcnxContentObjectTail_methods(root_module, root_module['ns3::CcnxContentObjectTail'])
register_Ns3CcnxFace_methods(root_module, root_module['ns3::CcnxFace'])
@@ -444,6 +488,7 @@
register_Ns3CcnxFibEntry_methods(root_module, root_module['ns3::CcnxFibEntry'])
register_Ns3CcnxFibEntryNoFaces_methods(root_module, root_module['ns3::CcnxFibEntry::NoFaces'])
register_Ns3CcnxInterestHeader_methods(root_module, root_module['ns3::CcnxInterestHeader'])
+ register_Ns3CcnxL3Tracer_methods(root_module, root_module['ns3::CcnxL3Tracer'])
register_Ns3CcnxNameComponents_methods(root_module, root_module['ns3::CcnxNameComponents'])
register_Ns3CcnxNameComponentsChecker_methods(root_module, root_module['ns3::CcnxNameComponentsChecker'])
register_Ns3CcnxNameComponentsValue_methods(root_module, root_module['ns3::CcnxNameComponentsValue'])
@@ -458,6 +503,7 @@
register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+ register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
register_Ns3Node_methods(root_module, root_module['ns3::Node'])
@@ -467,10 +513,15 @@
register_Ns3RandomVariableChecker_methods(root_module, root_module['ns3::RandomVariableChecker'])
register_Ns3RandomVariableValue_methods(root_module, root_module['ns3::RandomVariableValue'])
register_Ns3RocketfuelWeightsReader_methods(root_module, root_module['ns3::RocketfuelWeightsReader'])
+ register_Ns3SpringMobilityModel_methods(root_module, root_module['ns3::SpringMobilityModel'])
register_Ns3TimeChecker_methods(root_module, root_module['ns3::TimeChecker'])
register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+ register_Ns3Vector2DChecker_methods(root_module, root_module['ns3::Vector2DChecker'])
+ register_Ns3Vector2DValue_methods(root_module, root_module['ns3::Vector2DValue'])
+ register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
+ register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
return
@@ -1012,27 +1063,31 @@
is_static=True, visibility='protected')
return
-def register_Ns3CcnxConsumerHelper_methods(root_module, cls):
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(ns3::CcnxConsumerHelper const & arg0) [copy constructor]
- cls.add_constructor([param('ns3::CcnxConsumerHelper const &', 'arg0')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::CcnxConsumerHelper::CcnxConsumerHelper(std::string const & prefix) [constructor]
+def register_Ns3CcnxAppHelper_methods(root_module, cls):
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(ns3::CcnxAppHelper const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxAppHelper const &', 'arg0')])
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::CcnxAppHelper::CcnxAppHelper(std::string const & prefix) [constructor]
cls.add_constructor([param('std::string const &', 'prefix')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::NodeContainer c) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::NodeContainer c) [member function]
cls.add_method('Install',
'ns3::ApplicationContainer',
[param('ns3::NodeContainer', 'c')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
cls.add_method('Install',
'ns3::ApplicationContainer',
[param('ns3::Ptr< ns3::Node >', 'node')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxConsumerHelper::Install(std::string nodeName) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxAppHelper::Install(std::string nodeName) [member function]
cls.add_method('Install',
'ns3::ApplicationContainer',
[param('std::string', 'nodeName')])
- ## ccnx-consumer-helper.h (module 'NDNabstraction'): void ns3::CcnxConsumerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+ ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
cls.add_method('SetAttribute',
'void',
[param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+ ## ccnx-app-helper.h (module 'NDNabstraction'): void ns3::CcnxAppHelper::SetPrefix(std::string const & prefix) [member function]
+ cls.add_method('SetPrefix',
+ 'void',
+ [param('std::string const &', 'prefix')])
return
def register_Ns3CcnxContentObjectHeaderException_methods(root_module, cls):
@@ -1103,29 +1158,6 @@
cls.add_constructor([param('ns3::CcnxInterestHeaderException const &', 'arg0')])
return
-def register_Ns3CcnxProducerHelper_methods(root_module, cls):
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(ns3::CcnxProducerHelper const & arg0) [copy constructor]
- cls.add_constructor([param('ns3::CcnxProducerHelper const &', 'arg0')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::CcnxProducerHelper::CcnxProducerHelper(std::string const & prefix, uint32_t virtualPayloadSize) [constructor]
- cls.add_constructor([param('std::string const &', 'prefix'), param('uint32_t', 'virtualPayloadSize')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::NodeContainer c) [member function]
- cls.add_method('Install',
- 'ns3::ApplicationContainer',
- [param('ns3::NodeContainer', 'c')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
- cls.add_method('Install',
- 'ns3::ApplicationContainer',
- [param('ns3::Ptr< ns3::Node >', 'node')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): ns3::ApplicationContainer ns3::CcnxProducerHelper::Install(std::string nodeName) [member function]
- cls.add_method('Install',
- 'ns3::ApplicationContainer',
- [param('std::string', 'nodeName')])
- ## ccnx-producer-helper.h (module 'NDNabstraction'): void ns3::CcnxProducerHelper::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
- cls.add_method('SetAttribute',
- 'void',
- [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
- return
-
def register_Ns3CcnxStackHelper_methods(root_module, cls):
## ccnx-stack-helper.h (module 'NDNabstraction'): ns3::CcnxStackHelper::CcnxStackHelper() [constructor]
cls.add_constructor([])
@@ -1185,6 +1217,33 @@
[])
return
+def register_Ns3CcnxTraceHelper_methods(root_module, cls):
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper(ns3::CcnxTraceHelper const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxTraceHelper const &', 'arg0')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): ns3::CcnxTraceHelper::CcnxTraceHelper() [constructor]
+ cls.add_constructor([])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateAppAll(std::string const & app) [member function]
+ cls.add_method('EnableAggregateAppAll',
+ 'void',
+ [param('std::string const &', 'app')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableAggregateL3All() [member function]
+ cls.add_method('EnableAggregateL3All',
+ 'void',
+ [])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::EnableRateL3All(std::string const & l3RateTrace="l3-rate.log") [member function]
+ cls.add_method('EnableRateL3All',
+ 'void',
+ [param('std::string const &', 'l3RateTrace', default_value='"l3-rate.log"')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetAppTraceFile(std::string const & appTrace="apps.log") [member function]
+ cls.add_method('SetAppTraceFile',
+ 'void',
+ [param('std::string const &', 'appTrace', default_value='"apps.log"')])
+ ## ccnx-trace-helper.h (module 'NDNabstraction'): void ns3::CcnxTraceHelper::SetL3TraceFile(std::string const & l3Trace="l3.log") [member function]
+ cls.add_method('SetL3TraceFile',
+ 'void',
+ [param('std::string const &', 'l3Trace', default_value='"l3.log"')])
+ return
+
def register_Ns3CcnxUnknownHeaderException_methods(root_module, cls):
## ccnx-header-helper.h (module 'NDNabstraction'): ns3::CcnxUnknownHeaderException::CcnxUnknownHeaderException() [constructor]
cls.add_constructor([])
@@ -2123,6 +2182,23 @@
is_static=True)
return
+def register_Ns3SpringMobilityHelper_methods(root_module, cls):
+ ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper() [constructor]
+ cls.add_constructor([])
+ ## spring-mobility-helper.h (module 'NDNabstraction'): ns3::SpringMobilityHelper::SpringMobilityHelper(ns3::SpringMobilityHelper const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::SpringMobilityHelper const &', 'arg0')])
+ ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(ns3::Ptr<ns3::Node> node1, ns3::Ptr<ns3::Node> node2) [member function]
+ cls.add_method('InstallSprings',
+ 'void',
+ [param('ns3::Ptr< ns3::Node >', 'node1'), param('ns3::Ptr< ns3::Node >', 'node2')],
+ is_static=True)
+ ## spring-mobility-helper.h (module 'NDNabstraction'): static void ns3::SpringMobilityHelper::InstallSprings(std::_List_const_iterator<ns3::TopologyReader::Link> first, std::_List_const_iterator<ns3::TopologyReader::Link> end) [member function]
+ cls.add_method('InstallSprings',
+ 'void',
+ [param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'first'), param('std::_List_const_iterator< ns3::TopologyReader::Link >', 'end')],
+ is_static=True)
+ return
+
def register_Ns3Tag_methods(root_module, cls):
## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
cls.add_constructor([])
@@ -2423,6 +2499,52 @@
[param('double', 's'), param('double', 'l')])
return
+def register_Ns3Vector2D_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('ns3::Vector2D const &', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+ cls.add_binary_numeric_operator('-', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('ns3::Vector2D const &', 'right'))
+ cls.add_binary_numeric_operator('/', root_module['ns3::Vector2D'], root_module['ns3::Vector2D'], param('double', 'right'))
+ ## vector.h (module 'core'): ns3::Vector2D::Vector2D(ns3::Vector2D const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector2D const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector2D::Vector2D(double _x, double _y) [constructor]
+ cls.add_constructor([param('double', '_x'), param('double', '_y')])
+ ## vector.h (module 'core'): ns3::Vector2D::Vector2D() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector2D::x [variable]
+ cls.add_instance_attribute('x', 'double', is_const=False)
+ ## vector.h (module 'core'): ns3::Vector2D::y [variable]
+ cls.add_instance_attribute('y', 'double', is_const=False)
+ return
+
+def register_Ns3Vector3D_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+ cls.add_binary_numeric_operator('*', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+ cls.add_binary_numeric_operator('+', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('ns3::Vector3D const &', 'right'))
+ cls.add_inplace_numeric_operator('+=', param('double', 'right'))
+ cls.add_binary_numeric_operator('-', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('ns3::Vector3D const &', 'right'))
+ cls.add_binary_numeric_operator('/', root_module['ns3::Vector3D'], root_module['ns3::Vector3D'], param('double', 'right'))
+ ## vector.h (module 'core'): ns3::Vector3D::Vector3D(ns3::Vector3D const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector3D const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector3D::Vector3D(double _x, double _y, double _z) [constructor]
+ cls.add_constructor([param('double', '_x'), param('double', '_y'), param('double', '_z')])
+ ## vector.h (module 'core'): ns3::Vector3D::Vector3D() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector3D::x [variable]
+ cls.add_instance_attribute('x', 'double', is_const=False)
+ ## vector.h (module 'core'): ns3::Vector3D::y [variable]
+ cls.add_instance_attribute('y', 'double', is_const=False)
+ ## vector.h (module 'core'): ns3::Vector3D::z [variable]
+ cls.add_instance_attribute('z', 'double', is_const=False)
+ return
+
def register_Ns3WeibullVariable_methods(root_module, cls):
## random-variable.h (module 'core'): ns3::WeibullVariable::WeibullVariable(ns3::WeibullVariable const & arg0) [copy constructor]
cls.add_constructor([param('ns3::WeibullVariable const &', 'arg0')])
@@ -2462,13 +2584,13 @@
return
def register_Ns3Int64x64_t_methods(root_module, cls):
- cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('!=')
cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
cls.add_output_stream_operator()
+ cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('==')
cls.add_binary_comparison_operator('>=')
cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
@@ -2859,6 +2981,18 @@
is_static=True)
return
+def register_Ns3SimpleRefCount__Ns3CcnxAppTracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxAppTracer__gt___methods(root_module, cls):
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount() [constructor]
+ cls.add_constructor([])
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> > const & o) [copy constructor]
+ cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxAppTracer > > const &', 'o')])
+ ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxAppTracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxAppTracer> >::Cleanup() [member function]
+ cls.add_method('Cleanup',
+ 'void',
+ [],
+ is_static=True)
+ return
+
def register_Ns3SimpleRefCount__Ns3CcnxFaceContainer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxFaceContainer__gt___methods(root_module, cls):
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxFaceContainer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxFaceContainer> >::SimpleRefCount() [constructor]
cls.add_constructor([])
@@ -2883,6 +3017,18 @@
is_static=True)
return
+def register_Ns3SimpleRefCount__Ns3CcnxL3Tracer_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxL3Tracer__gt___methods(root_module, cls):
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount() [constructor]
+ cls.add_constructor([])
+ ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> > const & o) [copy constructor]
+ cls.add_constructor([param('ns3::SimpleRefCount< ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter< ns3::CcnxL3Tracer > > const &', 'o')])
+ ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CcnxL3Tracer, ns3::empty, ns3::DefaultDeleter<ns3::CcnxL3Tracer> >::Cleanup() [member function]
+ cls.add_method('Cleanup',
+ 'void',
+ [],
+ is_static=True)
+ return
+
def register_Ns3SimpleRefCount__Ns3CcnxNameComponents_Ns3Empty_Ns3DefaultDeleter__lt__ns3CcnxNameComponents__gt___methods(root_module, cls):
## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CcnxNameComponents, ns3::empty, ns3::DefaultDeleter<ns3::CcnxNameComponents> >::SimpleRefCount() [constructor]
cls.add_constructor([])
@@ -2956,11 +3102,11 @@
return
def register_Ns3Time_methods(root_module, cls):
- cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('!=')
cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
cls.add_output_stream_operator()
+ cls.add_binary_comparison_operator('<=')
cls.add_binary_comparison_operator('==')
cls.add_binary_comparison_operator('>=')
cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
@@ -3278,13 +3424,18 @@
return
def register_Ns3AnnotatedTopologyReader_methods(root_module, cls):
- ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="") [constructor]
- cls.add_constructor([param('std::string const &', 'path', default_value='""')])
+ ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::AnnotatedTopologyReader::AnnotatedTopologyReader(std::string const & path="", double scale=1.0e+0) [constructor]
+ cls.add_constructor([param('std::string const &', 'path', default_value='""'), param('double', 'scale', default_value='1.0e+0')])
## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::Read() [member function]
cls.add_method('Read',
'ns3::NodeContainer',
[],
is_virtual=True)
+ ## annotated-topology-reader.h (module 'NDNabstraction'): ns3::NodeContainer ns3::AnnotatedTopologyReader::GetNodes() const [member function]
+ cls.add_method('GetNodes',
+ 'ns3::NodeContainer',
+ [],
+ is_const=True)
## annotated-topology-reader.h (module 'NDNabstraction'): void ns3::AnnotatedTopologyReader::AssignIpv4Addresses(ns3::Ipv4Address base) [member function]
cls.add_method('AssignIpv4Addresses',
'void',
@@ -3599,6 +3750,55 @@
visibility='protected', is_virtual=True)
return
+def register_Ns3CcnxAppTracer_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(ns3::CcnxAppTracer const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxAppTracer const &', 'arg0')])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, ns3::Ptr<ns3::Node> node, std::string const & appId="*") [constructor]
+ cls.add_constructor([param('std::string const &', 'app'), param('ns3::Ptr< ns3::Node >', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): ns3::CcnxAppTracer::CcnxAppTracer(std::string const & app, std::string const & node, std::string const & appId="*") [constructor]
+ cls.add_constructor([param('std::string const &', 'app'), param('std::string const &', 'node'), param('std::string const &', 'appId', default_value='"*"')])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Connect() [member function]
+ cls.add_method('Connect',
+ 'void',
+ [])
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+ cls.add_method('InData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+ cls.add_method('InInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+ cls.add_method('InNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<ns3::CcnxApp> arg3, ns3::Ptr<ns3::CcnxFace> arg4) [member function]
+ cls.add_method('OutData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxApp >', 'arg3'), param('ns3::Ptr< ns3::CcnxFace >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<ns3::CcnxApp> arg2, ns3::Ptr<ns3::CcnxFace> arg3) [member function]
+ cls.add_method('OutInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxApp >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::Print(std::ostream & os) const [member function]
+ cls.add_method('Print',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ ## ccnx-app-tracer.h (module 'NDNabstraction'): void ns3::CcnxAppTracer::PrintHeader(std::ostream & os) const [member function]
+ cls.add_method('PrintHeader',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ return
+
def register_Ns3CcnxContentObjectHeader_methods(root_module, cls):
## ccnx-content-object-header.h (module 'NDNabstraction'): ns3::CcnxContentObjectHeader::CcnxContentObjectHeader(ns3::CcnxContentObjectHeader const & arg0) [copy constructor]
cls.add_constructor([param('ns3::CcnxContentObjectHeader const &', 'arg0')])
@@ -3707,13 +3907,9 @@
'bool',
[],
is_const=True, is_virtual=True)
- ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket(ns3::Time const & interval) [member function]
+ ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucket() [member function]
cls.add_method('LeakBucket',
'void',
- [param('ns3::Time const &', 'interval')])
- ## ccnx-face.h (module 'NDNabstraction'): void ns3::CcnxFace::LeakBucketByOnePacket() [member function]
- cls.add_method('LeakBucketByOnePacket',
- 'void',
[])
## ccnx-face.h (module 'NDNabstraction'): std::ostream & ns3::CcnxFace::Print(std::ostream & os) const [member function]
cls.add_method('Print',
@@ -4024,6 +4220,75 @@
[param('int8_t', 'scope')])
return
+def register_Ns3CcnxL3Tracer_methods(root_module, cls):
+ cls.add_output_stream_operator()
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::CcnxL3Tracer const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::CcnxL3Tracer const &', 'arg0')])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(ns3::Ptr<ns3::Node> node) [constructor]
+ cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): ns3::CcnxL3Tracer::CcnxL3Tracer(std::string const & node) [constructor]
+ cls.add_constructor([param('std::string const &', 'node')])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Connect() [member function]
+ cls.add_method('Connect',
+ 'void',
+ [])
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ccnx::DropReason arg3, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+ cls.add_method('DropData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ccnx::DropReason', 'arg3'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+ cls.add_method('DropInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::DropNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ccnx::DropReason arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+ cls.add_method('DropNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ccnx::DropReason', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, ns3::Ptr<const ns3::CcnxFace> arg3) [member function]
+ cls.add_method('InData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg3')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('InInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::InNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('InNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutData(std::string context, ns3::Ptr<const ns3::CcnxContentObjectHeader> arg1, ns3::Ptr<const ns3::Packet> arg2, bool fromCache, ns3::Ptr<const ns3::CcnxFace> arg4) [member function]
+ cls.add_method('OutData',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxContentObjectHeader const >', 'arg1'), param('ns3::Ptr< ns3::Packet const >', 'arg2'), param('bool', 'fromCache'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg4')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutInterests(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('OutInterests',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::OutNacks(std::string context, ns3::Ptr<const ns3::CcnxInterestHeader> arg1, ns3::Ptr<const ns3::CcnxFace> arg2) [member function]
+ cls.add_method('OutNacks',
+ 'void',
+ [param('std::string', 'context'), param('ns3::Ptr< ns3::CcnxInterestHeader const >', 'arg1'), param('ns3::Ptr< ns3::CcnxFace const >', 'arg2')],
+ is_pure_virtual=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::Print(std::ostream & os) const [member function]
+ cls.add_method('Print',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ ## ccnx-l3-tracer.h (module 'NDNabstraction'): void ns3::CcnxL3Tracer::PrintHeader(std::ostream & os) const [member function]
+ cls.add_method('PrintHeader',
+ 'void',
+ [param('std::ostream &', 'os')],
+ is_pure_virtual=True, is_const=True, is_virtual=True)
+ return
+
def register_Ns3CcnxNameComponents_methods(root_module, cls):
cls.add_output_stream_operator()
cls.add_binary_comparison_operator('<')
@@ -4335,6 +4600,62 @@
[param('ns3::Ipv6Prefix const &', 'value')])
return
+def register_Ns3MobilityModel_methods(root_module, cls):
+ ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel(ns3::MobilityModel const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::MobilityModel const &', 'arg0')])
+ ## mobility-model.h (module 'mobility'): ns3::MobilityModel::MobilityModel() [constructor]
+ cls.add_constructor([])
+ ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetDistanceFrom(ns3::Ptr<const ns3::MobilityModel> position) const [member function]
+ cls.add_method('GetDistanceFrom',
+ 'double',
+ [param('ns3::Ptr< ns3::MobilityModel const >', 'position')],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPosition() const [member function]
+ cls.add_method('GetPosition',
+ 'ns3::Vector',
+ [],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): double ns3::MobilityModel::GetRelativeSpeed(ns3::Ptr<const ns3::MobilityModel> other) const [member function]
+ cls.add_method('GetRelativeSpeed',
+ 'double',
+ [param('ns3::Ptr< ns3::MobilityModel const >', 'other')],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): static ns3::TypeId ns3::MobilityModel::GetTypeId() [member function]
+ cls.add_method('GetTypeId',
+ 'ns3::TypeId',
+ [],
+ is_static=True)
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetVelocity() const [member function]
+ cls.add_method('GetVelocity',
+ 'ns3::Vector',
+ [],
+ is_const=True)
+ ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::SetPosition(ns3::Vector const & position) [member function]
+ cls.add_method('SetPosition',
+ 'void',
+ [param('ns3::Vector const &', 'position')])
+ ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::NotifyCourseChange() const [member function]
+ cls.add_method('NotifyCourseChange',
+ 'void',
+ [],
+ is_const=True, visibility='protected')
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPosition() const [member function]
+ cls.add_method('DoGetPosition',
+ 'ns3::Vector',
+ [],
+ is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+ ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetVelocity() const [member function]
+ cls.add_method('DoGetVelocity',
+ 'ns3::Vector',
+ [],
+ is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+ ## mobility-model.h (module 'mobility'): void ns3::MobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+ cls.add_method('DoSetPosition',
+ 'void',
+ [param('ns3::Vector const &', 'position')],
+ is_pure_virtual=True, visibility='private', is_virtual=True)
+ return
+
def register_Ns3NetDevice_methods(root_module, cls):
## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
cls.add_constructor([])
@@ -4871,6 +5192,47 @@
cls.add_method('Commit',
'void',
[])
+ ## rocketfuel-weights-reader.h (module 'NDNabstraction'): void ns3::RocketfuelWeightsReader::SavePositions(std::string const & file) const [member function]
+ cls.add_method('SavePositions',
+ 'void',
+ [param('std::string const &', 'file')],
+ is_const=True)
+ return
+
+def register_Ns3SpringMobilityModel_methods(root_module, cls):
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel(ns3::SpringMobilityModel const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::SpringMobilityModel const &', 'arg0')])
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::SpringMobilityModel::SpringMobilityModel() [constructor]
+ cls.add_constructor([])
+ ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::AddSpring(ns3::Ptr<ns3::MobilityModel> node) [member function]
+ cls.add_method('AddSpring',
+ 'void',
+ [param('ns3::Ptr< ns3::MobilityModel >', 'node')])
+ ## spring-mobility-model.h (module 'NDNabstraction'): static ns3::TypeId ns3::SpringMobilityModel::GetTypeId() [member function]
+ cls.add_method('GetTypeId',
+ 'ns3::TypeId',
+ [],
+ is_static=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetPosition() const [member function]
+ cls.add_method('DoGetPosition',
+ 'ns3::Vector',
+ [],
+ is_const=True, visibility='private', is_virtual=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): ns3::Vector ns3::SpringMobilityModel::DoGetVelocity() const [member function]
+ cls.add_method('DoGetVelocity',
+ 'ns3::Vector',
+ [],
+ is_const=True, visibility='private', is_virtual=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
+ cls.add_method('DoSetPosition',
+ 'void',
+ [param('ns3::Vector const &', 'position')],
+ visibility='private', is_virtual=True)
+ ## spring-mobility-model.h (module 'NDNabstraction'): void ns3::SpringMobilityModel::DoStart() [member function]
+ cls.add_method('DoStart',
+ 'void',
+ [],
+ visibility='private', is_virtual=True)
return
def register_Ns3TimeChecker_methods(root_module, cls):
@@ -4953,6 +5315,86 @@
[param('ns3::TypeId const &', 'value')])
return
+def register_Ns3Vector2DChecker_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector2DChecker::Vector2DChecker(ns3::Vector2DChecker const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector2DChecker const &', 'arg0')])
+ return
+
+def register_Ns3Vector2DValue_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2DValue const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector2DValue const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector2DValue::Vector2DValue(ns3::Vector2D const & value) [constructor]
+ cls.add_constructor([param('ns3::Vector2D const &', 'value')])
+ ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector2DValue::Copy() const [member function]
+ cls.add_method('Copy',
+ 'ns3::Ptr< ns3::AttributeValue >',
+ [],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): bool ns3::Vector2DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+ cls.add_method('DeserializeFromString',
+ 'bool',
+ [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_virtual=True)
+ ## vector.h (module 'core'): ns3::Vector2D ns3::Vector2DValue::Get() const [member function]
+ cls.add_method('Get',
+ 'ns3::Vector2D',
+ [],
+ is_const=True)
+ ## vector.h (module 'core'): std::string ns3::Vector2DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+ cls.add_method('SerializeToString',
+ 'std::string',
+ [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): void ns3::Vector2DValue::Set(ns3::Vector2D const & value) [member function]
+ cls.add_method('Set',
+ 'void',
+ [param('ns3::Vector2D const &', 'value')])
+ return
+
+def register_Ns3Vector3DChecker_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector3DChecker::Vector3DChecker(ns3::Vector3DChecker const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector3DChecker const &', 'arg0')])
+ return
+
+def register_Ns3Vector3DValue_methods(root_module, cls):
+ ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue() [constructor]
+ cls.add_constructor([])
+ ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3DValue const & arg0) [copy constructor]
+ cls.add_constructor([param('ns3::Vector3DValue const &', 'arg0')])
+ ## vector.h (module 'core'): ns3::Vector3DValue::Vector3DValue(ns3::Vector3D const & value) [constructor]
+ cls.add_constructor([param('ns3::Vector3D const &', 'value')])
+ ## vector.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::Vector3DValue::Copy() const [member function]
+ cls.add_method('Copy',
+ 'ns3::Ptr< ns3::AttributeValue >',
+ [],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): bool ns3::Vector3DValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+ cls.add_method('DeserializeFromString',
+ 'bool',
+ [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_virtual=True)
+ ## vector.h (module 'core'): ns3::Vector3D ns3::Vector3DValue::Get() const [member function]
+ cls.add_method('Get',
+ 'ns3::Vector3D',
+ [],
+ is_const=True)
+ ## vector.h (module 'core'): std::string ns3::Vector3DValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+ cls.add_method('SerializeToString',
+ 'std::string',
+ [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')],
+ is_const=True, is_virtual=True)
+ ## vector.h (module 'core'): void ns3::Vector3DValue::Set(ns3::Vector3D const & value) [member function]
+ cls.add_method('Set',
+ 'void',
+ [param('ns3::Vector3D const &', 'value')])
+ return
+
def register_Ns3AddressChecker_methods(root_module, cls):
## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
cls.add_constructor([])
diff --git a/examples/abilene-topology.cc b/examples/abilene-topology.cc
index 8c83930..48ad6db 100644
--- a/examples/abilene-topology.cc
+++ b/examples/abilene-topology.cc
@@ -26,10 +26,8 @@
#include "ns3/point-to-point-grid.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/animation-interface.h"
-// #include "ns3/ccnx-l3-protocol.h"
-#include <iostream>
-#include <sstream>
+#include "../helper/ccnx-trace-helper.h"
#include "ns3/annotated-topology-reader.h"
#include "../utils/spring-mobility-helper.h"
@@ -40,13 +38,6 @@
NS_LOG_COMPONENT_DEFINE ("CcnxAbileneTopology");
-// int transmittedInterests = 0;
-// int receivedInterests = 0;
-// int droppedInterests = 0;
-
-// int transmittedData = 0;
-// int receivedData = 0;
-// int droppedData = 0;
void PrintTime ()
{
@@ -55,132 +46,26 @@
Simulator::Schedule (Seconds (10.0), PrintTime);
}
-void PrintFIBs ()
-{
- NS_LOG_INFO ("Outputing FIBs into [fibs.log]");
- Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("fibs.log", std::ios::out);
- for (NodeList::Iterator node = NodeList::Begin ();
- node != NodeList::End ();
- node++)
- {
- // *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
-
- Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
- NS_ASSERT_MSG (fib != 0, "Fire alarm");
- *routingStream->GetStream () << *fib << "\n\n";
- }
-}
-
-
-struct AggregateTrace
-{
- AggregateTrace ()
- : m_transmittedInterests (0)
- , m_transmittedData (0)
- , m_receivedInterests (0)
- , m_receivedNacks (0)
- , m_receivedData (0)
- {
- }
-
- void
- TransmittedInterests (std::string context,
- Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_transmittedInterests++;
- }
-
- void
- TransmittedData (std::string context,
- Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_transmittedData++;
- }
-
- void
- ReceivedInterests (std::string context,
- Ptr<const CcnxInterestHeader>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_receivedInterests++;
- }
-
- void
- ReceivedNacks (std::string context,
- Ptr<const CcnxInterestHeader>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_receivedNacks++;
- }
-
- void
- ReceivedData (std::string context,
- Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_receivedData++;
- }
-
- uint64_t m_transmittedInterests;
- uint64_t m_transmittedData;
- uint64_t m_receivedInterests;
- uint64_t m_receivedNacks;
- uint64_t m_receivedData;
-};
-
-ostream&
-operator << (ostream &os, const AggregateTrace &trace)
-{
- os << ">> (i): " << trace.m_transmittedInterests << "\n";
- os << ">> (d): " << trace.m_transmittedData << "\n";
- os << "<< (i): " << trace.m_receivedInterests << "\n";
- os << "<< (d): " << trace.m_receivedData << "\n";
- os << "<< (n): " << trace.m_receivedNacks << "\n";
- return os;
-}
-
-// static void OnTransmittedInterest (std::string context, Ptr<const CcnxInterestHeader> header,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// void PrintFIBs ()
// {
-// transmittedInterests++;
+// NS_LOG_INFO ("Outputing FIBs into [fibs.log]");
+// Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("fibs.log", std::ios::out);
+// for (NodeList::Iterator node = NodeList::Begin ();
+// node != NodeList::End ();
+// node++)
+// {
+// // *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
+
+// Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
+// NS_ASSERT_MSG (fib != 0, "Fire alarm");
+// *routingStream->GetStream () << *fib << "\n\n";
+// }
// }
-// static void OnReceivedInterest (std::string context, Ptr<const CcnxInterestHeader> header,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// receivedInterests++;
-// }
-
-// static void OnDroppedInterest (std::string context, Ptr<const CcnxInterestHeader> header, CcnxL3Protocol::DropReason reason,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// droppedInterests++;
-// }
-
-// static void OnTransmittedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-// CcnxL3Protocol::ContentObjectSource source, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// transmittedData++;
-// }
-
-// static void OnReceivedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// receivedData++;
-// }
-
-// static void OnDroppedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-// CcnxL3Protocol::DropReason reason, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face )
-// {
-// droppedData++;
-// }
int
main (int argc, char *argv[])
{
- // Packet::EnableChecking();
- // Packet::EnablePrinting();
string input ("./src/NDNabstraction/examples/abilene-topology.txt");
Time finishTime = Seconds (20.0);
@@ -199,8 +84,8 @@
// -- Read topology data.
// --------------------------------------------
- AnnotatedTopologyReader reader ("/abilene");
- reader.SetMobilityModel ("ns3::SpringMobilityModel");
+ AnnotatedTopologyReader reader ("/abilene", 2.0);
+ // reader.SetMobilityModel ("ns3::SpringMobilityModel");
reader.SetFileName (input);
NodeContainer nodes = reader.Read ();
@@ -211,7 +96,7 @@
return -1;
}
- SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
+ // SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
// InternetStackHelper stack;
// Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
@@ -232,11 +117,15 @@
ccnxHelper.InstallAll ();
NS_LOG_INFO ("Installing Applications");
- CcnxConsumerHelper consumerHelper ("/5");
- ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/abilene", "ATLAng"));
-
- // CcnxProducerHelper producerHelper ("/5",1024);
- // ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "IPLSng"));
+ CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+ consumerHelper.SetPrefix ("/Data");
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("1Mbps"));
+ ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/abilene", "SNVAng"));
+
+ CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+ producerHelper.SetPrefix ("/Data");
+
+ ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "NYCMng"));
// // Populate FIB based on IPv4 global routing controller
// ccnxHelper.InstallFakeGlobalRoutes ();
@@ -245,7 +134,7 @@
// Simulator::Schedule (Seconds (1.0), PrintFIBs);
// PrintFIBs ();
- // Simulator::Schedule (Seconds (10.0), PrintTime);
+ Simulator::Schedule (Seconds (10.0), PrintTime);
Simulator::Stop (finishTime);
@@ -256,36 +145,12 @@
anim->SetMobilityPollInterval (Seconds (1));
}
- // NS_LOG_INFO ("Configure Tracing.");
- AggregateTrace trace;
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/TransmittedInterests",
- MakeCallback (&AggregateTrace::TransmittedInterests, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedNacks",
- MakeCallback (&AggregateTrace::ReceivedNacks, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/ReceivedInterests",
- MakeCallback (&AggregateTrace::ReceivedInterests, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/TransmittedContentObjects",
- MakeCallback (&AggregateTrace::TransmittedData, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedContentObjects",
- MakeCallback (&AggregateTrace::ReceivedData, &trace));
-
- // Config::Connect("/NodeList/*/ns3::CcnxL3Protocol/TransmittedInterestTrace",
- // MakeCallback (&OnTransmittedInterest));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedInterestTrace",
- // MakeCallback (&OnReceivedInterest));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedInterestTrace",
- // MakeCallback (&OnDroppedInterest));
-
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedDataTrace",
- // MakeCallback (&OnReceivedData));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/TransmittedDataTrace",
- // MakeCallback (&OnTransmittedData));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedDataTrace",
- // MakeCallback (&OnDroppedData));
+ CcnxTraceHelper traceHelper;
+ traceHelper.EnableAggregateAppAll ("ns3::CcnxConsumer");
+ traceHelper.EnableAggregateAppAll ("ns3::CcnxProducer");
+ traceHelper.EnableAggregateL3All ();
+ traceHelper.SetL3TraceFile ("trace-l3.log");
+ traceHelper.SetAppTraceFile ("trace-app.log");
config.ConfigureAttributes ();
@@ -294,12 +159,5 @@
Simulator::Destroy ();
NS_LOG_INFO ("Done.");
- // NS_LOG_INFO("Total received interests = " << receivedInterests);
- // NS_LOG_INFO("Total transmitted interests = " << transmittedInterests);
- // NS_LOG_INFO("Total dropped interests = " << droppedInterests);
- // NS_LOG_INFO("Total received data = " << receivedData);
- // NS_LOG_INFO("Total transmitted data = " << transmittedData);
- // NS_LOG_INFO("Total dropped data = " << droppedData);
- NS_LOG_INFO (trace);
return 0;
}
diff --git a/examples/annotated-topology-read-example.cc b/examples/annotated-topology-read-example.cc
index c220873..450d8d1 100644
--- a/examples/annotated-topology-read-example.cc
+++ b/examples/annotated-topology-read-example.cc
@@ -93,15 +93,19 @@
Ptr<CcnxFaceContainer> cf = ccnx.Install (nodes);
NS_LOG_INFO ("Installing Applications");
- CcnxConsumerHelper helper ("/3");
- ApplicationContainer app = helper.Install (nodes.Get(1));
+ CcnxAppHelper helper ("ns3::CcnxConsumer");
+ helper.SetPrefix ("/3");
+ ApplicationContainer app = helper.Install ("1");
app.Start (Seconds (1.0));
app.Stop (Seconds (1000.05));
-
- CcnxProducerHelper helper3 ("/3",120);
- ApplicationContainer app3 = helper3.Install(nodes.Get(6));
- app3.Start(Seconds(0.0));
- app3.Stop(Seconds(1500.0));
+
+ CcnxAppHelper helper2 ("ns3::CcnxProducer");
+ helper2.SetPrefix ("/3");
+ helper2.SetAttribute ("PayloadSize", StringValue("1024"));
+ ApplicationContainer app2 = helper2.Install("3");
+
+ app2.Start(Seconds(0.0));
+ app2.Stop(Seconds(1500.0));
// ------------------------------------------------------------
// -- Run the simulation
diff --git a/examples/ccnx-grid.cc b/examples/ccnx-grid.cc
index 51d7858..a4255be 100644
--- a/examples/ccnx-grid.cc
+++ b/examples/ccnx-grid.cc
@@ -64,7 +64,6 @@
{
Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
- Config::SetDefault ("ns3::CcnxConsumer::OffTime", StringValue ("1s"));
Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
Packet::EnableChecking();
@@ -116,13 +115,17 @@
std::ostringstream prefix;
prefix << "/" << producer->GetId ();
- CcnxConsumerHelper consumerHelper (prefix.str ());
+ CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+ consumerHelper.SetPrefix (prefix.str ());
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("1Mbps"));
ApplicationContainer consumers = consumerHelper.Install (consumerNodes);
// consumers.Start (Seconds (0.0));
// consumers.Stop (finishTime);
- CcnxProducerHelper producerHelper (prefix.str (),1024);
+ CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+ producerHelper.SetPrefix (prefix.str ());
+ producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
ApplicationContainer producers = producerHelper.Install (producer);
// producers.Start(Seconds(0.0));
diff --git a/examples/ccnx-test.cc b/examples/ccnx-test.cc
index d5cb1ad..cae2815 100644
--- a/examples/ccnx-test.cc
+++ b/examples/ccnx-test.cc
@@ -46,13 +46,17 @@
CcnxStackHelper ccnx;
Ptr<CcnxFaceContainer> cf = ccnx.Install (c);
- CcnxConsumerHelper helper ("/3");
+ CcnxAppHelper helper ("ns3::CcnxConsumer");
+ helper.SetPrefix ("/3");
ApplicationContainer app = helper.Install ("1");
app.Start (Seconds (1.0));
app.Stop (Seconds (10.05));
-
- CcnxProducerHelper helper2 ("/3",120);
+
+ CcnxAppHelper helper2 ("ns3::CcnxProducer");
+ helper2.SetPrefix ("/3");
+ helper2.SetAttribute ("PayloadSize", StringValue("1024"));
ApplicationContainer app2 = helper2.Install("3");
+
app2.Start(Seconds(0.0));
app2.Stop(Seconds(15.0));
diff --git a/examples/congestion-pop.cc b/examples/congestion-pop.cc
new file mode 100644
index 0000000..51a5fa0
--- /dev/null
+++ b/examples/congestion-pop.cc
@@ -0,0 +1,230 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/NDNabstraction-module.h"
+#include "ns3/point-to-point-grid.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/random-variable.h"
+#include "ns3/internet-module.h"
+#include "ns3/applications-module.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>
+
+using namespace ns3;
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE ("Scenario");
+
+void PrintTime ()
+{
+ cout << "Progress: " << Simulator::Now ().ToDouble (Time::S) << "s" << endl;
+
+ Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
+class Experiment
+{
+public:
+ Experiment ()
+ : m_rand (0,52)
+ , reader ("/sprint")
+ { }
+
+ void
+ ConfigureCcnxTopology ()
+ {
+ 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");
+
+ RocketfuelWeightsReader reader ("/sprint");
+
+ 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 ();
+ NS_ASSERT_MSG (reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
+
+ NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
+ NS_LOG_INFO("Links = " << reader.LinksSize ());
+
+ // ------------------------------------------------------------
+ // -- Read topology data.
+ // --------------------------------------------
+
+ InternetStackHelper stack;
+ Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+ stack.SetRoutingHelper (ipv4RoutingHelper);
+ stack.Install (reader.GetNodes ());
+
+ 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 ();
+ }
+
+ void
+ ConfigureRouting ()
+ {
+ CcnxStackHelper ccnxHelper;
+ // // Populate FIB based on IPv4 global routing controller
+ ccnxHelper.InstallFakeGlobalRoutes ();
+ ccnxHelper.InstallRoutesToAll ();
+ }
+
+ ApplicationContainer
+ AddCcnxRandomApplications (uint16_t numStreams)
+ {
+ map<uint32_t, set<uint32_t> > streams;
+ ApplicationContainer apps;
+
+ 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 (streams[node1_num].count (node2_num) > 0) // don't create duplicate streams
+ continue;
+
+ streams[node1_num].insert (node2_num);
+
+ 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");
+ consumerHelper.SetPrefix ("/" + lexical_cast<string> (node2->GetId ()));
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+ consumerHelper.SetAttribute ("Size", StringValue ("1.983642578125")); //to make sure max seq # is 2000
+
+ CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+ producerHelper.SetPrefix ("/" + lexical_cast<string> (node2->GetId ()));
+
+ apps.Add
+ (consumerHelper.Install (node1));
+
+ apps.Add
+ (producerHelper.Install (node2));
+
+ createdStreams ++;
+ }
+
+ 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;
+};
+
+
+int
+main (int argc, char *argv[])
+{
+ cout << "Begin congestion-pop scenario\n";
+
+ Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
+ Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
+
+ uint32_t maxRuns = 1;
+ uint32_t startRun = 0;
+ CommandLine cmd;
+ cmd.AddValue ("start", "Initial run number", startRun);
+ cmd.AddValue ("runs", "Number of runs", maxRuns);
+ cmd.Parse (argc, argv);
+
+ for (uint32_t run = startRun; run < startRun + maxRuns; run++)
+ {
+ Config::SetGlobal ("RngRun", IntegerValue (run));
+ cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
+
+ Experiment experiment;
+ cout << "Run " << run << endl;
+
+ experiment.ConfigureCcnxTopology ();
+ ApplicationContainer apps = experiment.AddCcnxRandomApplications (20);
+ experiment.ConfigureRouting ();
+
+ string prefix = "run-" + lexical_cast<string> (run) + "-";
+
+ ofstream of_nodes ((prefix + "apps.log").c_str ());
+ for (uint32_t i = 0; i < apps.GetN () / 2; i++)
+ {
+ of_nodes << "From " << apps.Get (i*2)->GetNode ()->GetId ()
+ << " to " << apps.Get (i*2 + 1)->GetNode ()->GetId ();
+ of_nodes << "\n";
+ }
+ of_nodes.close ();
+
+ CcnxTraceHelper traceHelper;
+ traceHelper.EnableRateL3All (prefix + "rate-trace.log");
+ traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", prefix + "consumers-seqs.log");
+
+ experiment.Run (Seconds (200.0));
+ }
+
+ // cout << "Finish congestion-pop scenario\n";
+ return 0;
+}
diff --git a/examples/congestion-tcp-pop.cc b/examples/congestion-tcp-pop.cc
new file mode 100644
index 0000000..c1ac443
--- /dev/null
+++ b/examples/congestion-tcp-pop.cc
@@ -0,0 +1,231 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ */
+
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/NDNabstraction-module.h"
+#include "ns3/point-to-point-grid.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/random-variable.h"
+#include "ns3/internet-module.h"
+#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 "../helper/tracers/ipv4-seqs-app-tracer.h"
+
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+
+using namespace ns3;
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE ("Scenario");
+
+void PrintTime ()
+{
+ cout << "Progress: " << Simulator::Now ().ToDouble (Time::S) << "s" << endl;
+
+ Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
+class Experiment
+{
+public:
+ Experiment ()
+ : m_rand (0,52)
+ , reader ("/sprint")
+ { }
+
+ void
+ ConfigureIpv4Topology ()
+ {
+ 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");
+
+ 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 ();
+ NS_ASSERT_MSG (reader.LinksSize () != 0, "Problems reading the topology file. Failing.");
+
+ NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
+ NS_LOG_INFO("Links = " << reader.LinksSize ());
+
+ InternetStackHelper stack;
+ stack.Install (reader.GetNodes ());
+ reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
+ }
+
+ void
+ ConfigureRouting ()
+ {
+ Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+ // m_rand = UniformVariable (0, reader.GetNodes ().GetN());
+ }
+
+ ApplicationContainer
+ AddTcpRandomApplications (uint16_t numStreams)
+ {
+ map<uint32_t, set<uint32_t> > streams;
+ ApplicationContainer apps;
+
+ const static uint32_t base_port = 10;
+ 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 (streams[node1_num].count (node2_num) > 0) // don't create duplicate streams
+ continue;
+
+ streams[node1_num].insert (node2_num);
+
+ Ptr<Node> node1 = Names::Find<Node> ("/sprint", lexical_cast<string> (node1_num));
+ Ptr<Node> node2 = Names::Find<Node> ("/sprint", lexical_cast<string> (node2_num));
+
+ Ptr<Ipv4> ipv4 = node1->GetObject<Ipv4> ();
+ // ipv4->GetAddress (0, 0);
+
+ // to make sure we don't reuse the same port numbers for different flows, just make all port numbers unique
+ PacketSinkHelper consumerHelper ("ns3::TcpSocketFactory",
+ InetSocketAddress (Ipv4Address::GetAny (), base_port + createdStreams));
+
+ BulkSendHelper producerHelper ("ns3::TcpSocketFactory",
+ InetSocketAddress (ipv4->GetAddress (1, 0).GetLocal (), base_port + createdStreams));
+ // cout << "SendTo: " << ipv4->GetAddress (1, 0).GetLocal () << endl;
+ producerHelper.SetAttribute ("MaxBytes", UintegerValue (2081040)); // equal to 2001 ccnx packets
+
+ apps.Add
+ (consumerHelper.Install (node1));
+
+ apps.Add
+ (producerHelper.Install (node2));
+
+ createdStreams ++;
+ }
+
+ 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;
+};
+
+int
+main (int argc, char *argv[])
+{
+ cout << "Begin congestion-pop scenario\n";
+ Packet::EnableChecking();
+ Packet::EnablePrinting();
+
+ Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
+ Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
+ Config::SetDefault ("ns3::TcpSocket::SegmentSize", StringValue ("1040"));
+
+ Config::SetDefault ("ns3::BulkSendApplication::SendSize", StringValue ("1040"));
+
+ // 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 ("start", "Initial run number", startRun);
+ cmd.AddValue ("runs", "Number of runs", maxRuns);
+ cmd.Parse (argc, argv);
+
+ // ConfigStore config;
+ // config.ConfigureDefaults ();
+
+ for (uint32_t run = startRun; run < startRun + maxRuns; run++)
+ {
+ Config::SetGlobal ("RngRun", IntegerValue (run));
+ cout << "seed = " << SeedManager::GetSeed () << ", run = " << SeedManager::GetRun () << endl;
+
+ Experiment experiment;
+ cout << "Run " << run << endl;
+
+ experiment.ConfigureIpv4Topology ();
+ ApplicationContainer apps = experiment.AddTcpRandomApplications (20);
+ experiment.ConfigureRouting ();
+
+ string prefix = "run-tcp-" + lexical_cast<string> (run) + "-";
+
+ ofstream of_nodes ((prefix + "apps.log").c_str ());
+ for (uint32_t i = 0; i < apps.GetN () / 2; i++)
+ {
+ of_nodes << "From " << apps.Get (i*2)->GetNode ()->GetId ()
+ << " to " << apps.Get (i*2 + 1)->GetNode ()->GetId ();
+ of_nodes << "\n";
+ }
+
+ CcnxTraceHelper traceHelper;
+ traceHelper.EnableIpv4SeqsAppAll (prefix + "consumers-seqs.log");
+
+ // config.ConfigureAttributes ();
+
+ experiment.Run (Seconds (200.0));
+ }
+
+ // cout << "Finish congestion-pop scenario\n";
+ return 0;
+}
diff --git a/examples/sprint-pops.latencies b/examples/sprint-pops.latencies
new file mode 100644
index 0000000..7c3fd07
--- /dev/null
+++ b/examples/sprint-pops.latencies
@@ -0,0 +1,84 @@
+0 1 0.312
+2 3 10.786
+1 4 0.222
+1 5 1.035
+1 6 1.414
+1 7 1.24
+1 8 0.814
+1 9 19.532
+1 10 0.352
+1 11 4.593
+12 13 2.622
+14 15 0.207
+14 16 12.098
+14 17 13.941
+15 18 7.791
+15 19 38.946
+20 21 19.775
+20 22 0.345
+23 24 5.337
+25 26 0.276
+27 28 0.645
+8 20 19.787
+8 16 8.352
+8 28 1.578
+8 24 10.459
+8 26 5.005
+21 31 20.741
+13 32 4.737
+13 33 1.424
+17 35 2.091
+17 20 14.409
+17 18 7.13
+17 28 6.214
+17 24 6.437
+17 25 1.315
+17 26 1.176
+17 29 3.282
+17 36 2.478
+11 24 5.751
+11 38 3.235
+11 17 4.718
+33 39 1.817
+33 40 2.035
+6 7 0.327
+6 28 0.97
+6 25 5.176
+6 8 0.612
+6 17 5.725
+6 34 0.802
+6 11 6.007
+39 42 0.699
+16 24 3.655
+16 29 0.135
+16 17 3.286
+31 45 0.268
+31 46 0.268
+31 37 3.375
+31 47 2.708
+32 48 1.712
+32 44 2.329
+32 42 1.595
+48 49 3.201
+7 13 31.13
+38 43 1.643
+9 15 5.513
+9 20 0.437
+9 31 2.648
+9 30 0.124
+9 17 14.774
+9 19 42.03
+5 32 28.338
+5 8 0.359
+5 7 0.316
+18 23 0.779
+40 48 2.34
+40 49 2.529
+24 38 7.706
+24 31 9.827
+24 45 10.045
+24 50 0.092
+3 9 59.812
+19 41 26.19
+19 20 42.057
+19 51 14.125
diff --git a/examples/sprint-pops.positions b/examples/sprint-pops.positions
new file mode 100644
index 0000000..928e443
--- /dev/null
+++ b/examples/sprint-pops.positions
@@ -0,0 +1,53 @@
+router
+0 unknown -135.764 253.112
+1 unknown -124.26 242.106
+2 unknown -133.746 192.374
+3 unknown -125.181 203.615
+4 unknown -139.012 235.48
+5 unknown -114.553 255.538
+6 unknown -117.383 242.123
+7 unknown -124.098 258.288
+8 unknown -109.597 235.032
+9 unknown -114.699 219.473
+10 unknown -141.269 245.046
+11 unknown -104.331 242.371
+12 unknown -133.569 286.269
+13 unknown -123.315 277.497
+14 unknown -98.0591 218.885
+15 unknown -103.065 209.249
+16 unknown -97.6019 232.002
+17 unknown -104.764 227.93
+18 unknown -89.9659 217.538
+19 unknown -111.243 201.883
+20 unknown -105.782 215.929
+21 unknown -96.3977 226.003
+22 unknown -97.9862 200.901
+23 unknown -78.8835 225.308
+24 unknown -90.3514 236.091
+25 unknown -117.767 232.718
+26 unknown -114.42 224.798
+27 unknown -136.333 222.043
+28 unknown -122.444 228.514
+31 unknown -97.4791 241.611
+32 unknown -110.351 277.334
+33 unknown -117.777 292.69
+35 unknown -94.4122 211.85
+29 unknown -88.3097 226.526
+36 unknown -110.615 242.037
+38 unknown -88.4545 248.603
+39 unknown -103.356 298.492
+40 unknown -116.839 305.342
+34 unknown -131.979 243.096
+42 unknown -100.976 287.547
+45 unknown -82.2028 243.344
+46 unknown -96.0201 256.972
+37 unknown -103.425 254.683
+47 unknown -88.0706 256.064
+48 unknown -110.226 295.199
+44 unknown -97.4778 278.521
+49 unknown -106.546 309.269
+43 unknown -76.3178 258.2
+30 unknown -127.539 212.622
+50 unknown -74.0048 237.243
+41 unknown -105.291 188.236
+51 unknown -115.94 188.128
diff --git a/examples/sprint-pops.weights b/examples/sprint-pops.weights
new file mode 100644
index 0000000..387a37f
--- /dev/null
+++ b/examples/sprint-pops.weights
@@ -0,0 +1,84 @@
+0 1 312
+2 3 10786
+1 4 222
+1 5 2500
+1 6 4000
+1 7 2500
+1 8 3860
+1 9 11769
+1 10 352
+1 11 3500
+12 13 2622
+14 15 500
+14 16 14192
+14 17 8909
+15 18 11747
+15 19 44530
+20 21 19775
+20 22 345
+23 24 5337
+25 26 2184
+27 28 645
+8 20 11409
+8 16 8282
+8 28 3000
+8 24 7735
+8 26 5500
+21 31 20741
+13 32 7552
+13 33 1500
+17 35 2091
+17 20 14409
+17 18 4337
+17 28 4000
+17 24 5735
+17 25 1315
+17 26 2500
+17 29 3282
+17 36 2478
+11 24 5096
+11 38 3235
+11 17 4360
+33 39 2000
+33 40 3000
+6 7 2500
+6 28 6860
+6 25 5176
+6 8 5860
+6 17 3860
+6 34 802
+6 11 5500
+39 42 699
+16 24 1547
+16 29 3000
+16 17 5282
+31 45 500
+31 46 268
+31 37 3375
+31 47 2708
+32 48 1712
+32 44 2329
+32 42 3352
+48 49 3201
+7 13 30890
+38 43 1643
+9 15 5500
+9 20 2500
+9 31 4735
+9 30 124
+9 17 13909
+9 19 42030
+5 32 28338
+5 8 2360
+5 7 2000
+18 23 5735
+40 48 2340
+40 49 2529
+24 38 2860
+24 31 9909
+24 45 10409
+24 50 92
+3 9 59812
+19 41 26190
+19 20 39530
+19 51 14125
diff --git a/examples/sprint-topology.cc b/examples/sprint-topology.cc
index 3a53c35..b3baa7c 100644
--- a/examples/sprint-topology.cc
+++ b/examples/sprint-topology.cc
@@ -35,6 +35,13 @@
NS_LOG_COMPONENT_DEFINE ("CcnxSprintTopology");
+void PrintTime ()
+{
+ NS_LOG_INFO (Simulator::Now ());
+
+ Simulator::Schedule (Seconds (1.0), PrintTime);
+}
+
int
main (int argc, char *argv[])
{
@@ -42,16 +49,20 @@
// Packet::EnablePrinting();
string weights ("./src/NDNabstraction/examples/sprint.weights");
string latencies ("./src/NDNabstraction/examples/sprint.latencies");
+ string positions;
Time finishTime = Seconds (2.0);
string animationFile;
string strategy = "ns3::CcnxFloodingStrategy";
+ string save;
CommandLine cmd;
cmd.AddValue ("finish", "Finish time", finishTime);
cmd.AddValue ("netanim", "NetAnim filename", animationFile);
cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
cmd.AddValue ("weights", "Weights file", weights);
cmd.AddValue ("latencies", "Latencies file", latencies);
+ cmd.AddValue ("positions", "Positions files", positions);
+ cmd.AddValue ("save", "Save positions to a file", save);
cmd.Parse (argc, argv);
// ------------------------------------------------------------
@@ -61,9 +72,16 @@
RocketfuelWeightsReader reader ("/sprint");
reader.SetBoundingBox (0, 0, 400, 250);
+ if (!positions.empty())
+ {
+ reader.SetFileName (positions);
+ reader.SetFileType (RocketfuelWeightsReader::POSITIONS);
+ reader.Read ();
+ }
+
reader.SetFileName (weights);
reader.SetFileType (RocketfuelWeightsReader::WEIGHTS);
- NodeContainer nodes = reader.Read ();
+ reader.Read ();
reader.SetFileName (latencies);
reader.SetFileType (RocketfuelWeightsReader::LATENCIES);
@@ -76,13 +94,13 @@
return -1;
}
- NS_LOG_INFO("Nodes = " << nodes.GetN());
+ NS_LOG_INFO("Nodes = " << reader.GetNodes ().GetN());
NS_LOG_INFO("Links = " << reader.LinksSize ());
InternetStackHelper stack;
Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
stack.SetRoutingHelper (ipv4RoutingHelper);
- stack.Install (nodes);
+ stack.Install (reader.GetNodes ());
reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
@@ -98,14 +116,21 @@
// ccnxHelper.InstallFakeGlobalRoutes ();
// ccnxHelper.InstallRouteTo (Names::Find<Node> ("/sprint", "San+Jose,+CA4062"));
- // Simulator::Schedule (Seconds (1.0), PrintFIBs);
- // PrintFIBs ();
-
Simulator::Stop (finishTime);
+ Simulator::Schedule (Seconds (1.0), PrintTime);
+
+ // reader.SavePositions (save+".debug");
NS_LOG_INFO ("Run Simulation.");
Simulator::Run ();
Simulator::Destroy ();
NS_LOG_INFO ("Done.");
+
+ if (!save.empty ())
+ {
+ NS_LOG_INFO ("Saving positions.");
+ reader.SavePositions (save);
+ }
+
return 0;
}
diff --git a/examples/synthetic-topology.cc b/examples/synthetic-topology.cc
index 9fe44be..971bbe1 100644
--- a/examples/synthetic-topology.cc
+++ b/examples/synthetic-topology.cc
@@ -25,13 +25,11 @@
#include "ns3/NDNabstraction-module.h"
#include "ns3/point-to-point-grid.h"
#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/animation-interface.h"
-// #include "ns3/ccnx-l3-protocol.h"
+#include "../utils/spring-mobility-helper.h"
+#include "../helper/ccnx-trace-helper.h"
-#include <iostream>
#include <sstream>
#include "ns3/annotated-topology-reader.h"
-#include "../utils/spring-mobility-helper.h"
#include "ns3/config-store.h"
@@ -40,285 +38,122 @@
NS_LOG_COMPONENT_DEFINE ("CcnxSyntheticTopology");
-// int transmittedInterests = 0;
-// int receivedInterests = 0;
-// int droppedInterests = 0;
-
-// int transmittedData = 0;
-// int receivedData = 0;
-// int droppedData = 0;
-
void PrintTime ()
{
- NS_LOG_INFO (Simulator::Now ());
+ NS_LOG_INFO (Simulator::Now ());
- Simulator::Schedule (Seconds (10.0), PrintTime);
+ Simulator::Schedule (Seconds (10.0), PrintTime);
}
-void PrintFIBs ()
-{
- NS_LOG_INFO ("Outputing FIBs into [fibs.log]");
- Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("fibs.log", std::ios::out);
- for (NodeList::Iterator node = NodeList::Begin ();
- node != NodeList::End ();
- node++)
- {
- // *routingStream->GetStream () << "Node " << (*node)->GetId () << "\n";
-
- Ptr<CcnxFib> fib = (*node)->GetObject<CcnxFib> ();
- NS_ASSERT_MSG (fib != 0, "Fire alarm");
- *routingStream->GetStream () << *fib << "\n\n";
- }
-}
-
-
-struct AggregateTrace
-{
- AggregateTrace ()
- : m_transmittedInterests (0)
- , m_transmittedData (0)
- , m_receivedInterests (0)
- , m_receivedNacks (0)
- , m_receivedData (0)
- {
- }
-
- void
- TransmittedInterests (std::string context,
- Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_transmittedInterests++;
- }
-
- void
- TransmittedData (std::string context,
- Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_transmittedData++;
- }
-
- void
- ReceivedInterests (std::string context,
- Ptr<const CcnxInterestHeader>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_receivedInterests++;
- }
-
- void
- ReceivedNacks (std::string context,
- Ptr<const CcnxInterestHeader>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_receivedNacks++;
- }
-
- void
- ReceivedData (std::string context,
- Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
- Ptr<CcnxApp>, Ptr<CcnxFace>)
- {
- m_receivedData++;
- }
-
- uint64_t m_transmittedInterests;
- uint64_t m_transmittedData;
- uint64_t m_receivedInterests;
- uint64_t m_receivedNacks;
- uint64_t m_receivedData;
-};
-
-ostream&
-operator << (ostream &os, const AggregateTrace &trace)
-{
- os << ">> (i): " << trace.m_transmittedInterests << "\n";
- os << ">> (d): " << trace.m_transmittedData << "\n";
- os << "<< (i): " << trace.m_receivedInterests << "\n";
- os << "<< (d): " << trace.m_receivedData << "\n";
- os << "<< (n): " << trace.m_receivedNacks << "\n";
- return os;
-}
-
-// static void OnTransmittedInterest (std::string context, Ptr<const CcnxInterestHeader> header,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// transmittedInterests++;
-// }
-
-// static void OnReceivedInterest (std::string context, Ptr<const CcnxInterestHeader> header,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// receivedInterests++;
-// }
-
-// static void OnDroppedInterest (std::string context, Ptr<const CcnxInterestHeader> header, CcnxL3Protocol::DropReason reason,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// droppedInterests++;
-// }
-
-// static void OnTransmittedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-// CcnxL3Protocol::ContentObjectSource source, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// transmittedData++;
-// }
-
-// static void OnReceivedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-// Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-// {
-// receivedData++;
-// }
-
-// static void OnDroppedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-// CcnxL3Protocol::DropReason reason, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face )
-// {
-// droppedData++;
-// }
-
-int
+int
main (int argc, char *argv[])
{
- // Packet::EnableChecking();
- // Packet::EnablePrinting();
- string input ("./src/NDNabstraction/examples/synthetic-topology.txt");
+ string input ("./src/NDNabstraction/examples/synthetic-topology.txt");
- Time finishTime = Seconds (20.0);
- string animationFile;
- string strategy = "ns3::CcnxFloodingStrategy";
- CommandLine cmd;
- cmd.AddValue ("finish", "Finish time", finishTime);
- cmd.AddValue ("netanim", "NetAnim filename", animationFile);
- cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
- cmd.Parse (argc, argv);
+ Time finishTime = Seconds (20.0);
+ string strategy = "ns3::CcnxFloodingStrategy";
+ CommandLine cmd;
+ cmd.AddValue ("finish", "Finish time", finishTime);
+ cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
+ cmd.Parse (argc, argv);
- ConfigStore config;
- config.ConfigureDefaults ();
+ ConfigStore config;
+ config.ConfigureDefaults ();
- // ------------------------------------------------------------
- // -- Read topology data.
- // --------------------------------------------
+ // ------------------------------------------------------------
+ // -- Read topology data.
+ // --------------------------------------------
- AnnotatedTopologyReader reader ("/synthetic");
- //reader.SetMobilityModel ("ns3::SpringMobilityModel");
- reader.SetFileName (input);
+ AnnotatedTopologyReader reader ("/synthetic");
+ // reader.SetMobilityModel ("ns3::SpringMobilityModel");
+ reader.SetFileName (input);
+ NodeContainer nodes = reader.Read ();
+ // SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
- NodeContainer nodes = reader.Read ();
-
- if (reader.LinksSize () == 0)
- {
- NS_LOG_ERROR ("Problems reading the topology file. Failing.");
- return -1;
- }
-
- //SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
-
- InternetStackHelper stack;
- Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
- stack.SetRoutingHelper (ipv4RoutingHelper);
- stack.Install (nodes);
- /*
- reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
- */
- NS_LOG_INFO("Nodes = " << nodes.GetN());
- NS_LOG_INFO("Links = " << reader.LinksSize ());
-
- // Install CCNx stack
- NS_LOG_INFO ("Installing CCNx stack");
- CcnxStackHelper ccnxHelper;
- ccnxHelper.SetForwardingStrategy (strategy);
- ccnxHelper.EnableLimits (false, Seconds(0.1));
- ccnxHelper.SetDefaultRoutes (true);
- ccnxHelper.InstallAll ();
-
- NS_LOG_INFO ("Installing Applications");
- CcnxConsumerHelper consumerHelper ("/5");
- ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/synthetic", "NODE2"));
-
- consumers.Start (Seconds (0.0));
- consumers.Stop (finishTime);
-
- CcnxConsumerHelper consumerHelper2("/6");
- ApplicationContainer consumers2 = consumerHelper2.Install(Names::Find<Node> ("/synthetic", "NODE6"));
-
- consumers2.Start (Seconds (0.0));
- consumers2.Stop (finishTime);
-
- CcnxProducerHelper producerHelper ("/5",1024);
- ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/synthetic", "NODE7"));
-
- producers.Start (Seconds (0.0));
- producers.Stop (finishTime);
-
- CcnxProducerHelper producerHelper2 ("/6",1024);
- ApplicationContainer producers2 = producerHelper2.Install (Names::Find<Node> ("/synthetic", "NODE1"));
+ InternetStackHelper stack;
+ Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+ stack.SetRoutingHelper (ipv4RoutingHelper);
+ stack.Install (nodes);
- producers2.Start (Seconds (0.0));
- producers2.Stop (finishTime);
+ reader.AssignIpv4Addresses (Ipv4Address ("10.0.0.0"));
- // Populate FIB based on IPv4 global routing controller
- //ccnxHelper.InstallFakeGlobalRoutes ();
- //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE1"));
- //ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "NODE7"));
+ NS_LOG_INFO("Nodes = " << nodes.GetN());
+ NS_LOG_INFO("Links = " << reader.LinksSize ());
- Simulator::Schedule (Seconds (1.0), PrintFIBs);
- PrintFIBs ();
+ // Install CCNx stack
+ NS_LOG_INFO ("Installing CCNx stack");
+ CcnxStackHelper ccnxHelper;
+ ccnxHelper.SetForwardingStrategy (strategy);
+ ccnxHelper.EnableLimits (true, Seconds(0.1));
+ ccnxHelper.SetDefaultRoutes (false);
+ ccnxHelper.InstallAll ();
- Simulator::Schedule (Seconds (10.0), PrintTime);
-
- Simulator::Stop (finishTime);
-
- AnimationInterface *anim = 0;
- if (animationFile != "")
- {
- anim = new AnimationInterface (animationFile);
- anim->SetMobilityPollInterval (Seconds (1));
- }
-
- // NS_LOG_INFO ("Configure Tracing.");
- AggregateTrace trace;
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/TransmittedInterests",
- MakeCallback (&AggregateTrace::TransmittedInterests, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedNacks",
- MakeCallback (&AggregateTrace::ReceivedNacks, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/ReceivedInterests",
- MakeCallback (&AggregateTrace::ReceivedInterests, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/TransmittedContentObjects",
- MakeCallback (&AggregateTrace::TransmittedData, &trace));
-
- Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedContentObjects",
- MakeCallback (&AggregateTrace::ReceivedData, &trace));
-
- // Config::Connect("/NodeList/*/ns3::CcnxL3Protocol/TransmittedInterestTrace",
- // MakeCallback (&OnTransmittedInterest));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedInterestTrace",
- // MakeCallback (&OnReceivedInterest));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedInterestTrace",
- // MakeCallback (&OnDroppedInterest));
-
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedDataTrace",
- // MakeCallback (&OnReceivedData));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/TransmittedDataTrace",
- // MakeCallback (&OnTransmittedData));
- // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedDataTrace",
- // MakeCallback (&OnDroppedData));
-
- config.ConfigureAttributes ();
-
- NS_LOG_INFO ("Run Simulation.");
- Simulator::Run ();
- Simulator::Destroy ();
- NS_LOG_INFO ("Done.");
-
- // NS_LOG_INFO("Total received interests = " << receivedInterests);
- // NS_LOG_INFO("Total transmitted interests = " << transmittedInterests);
- // NS_LOG_INFO("Total dropped interests = " << droppedInterests);
- // NS_LOG_INFO("Total received data = " << receivedData);
- // NS_LOG_INFO("Total transmitted data = " << transmittedData);
- // NS_LOG_INFO("Total dropped data = " << droppedData);
- NS_LOG_INFO (trace);
- return 0;
+ NS_LOG_INFO ("Installing Applications");
+ CcnxAppHelper consumerHelper ("ns3::CcnxConsumer");
+
+ consumerHelper.SetPrefix ("/6");
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+ consumerHelper.SetAttribute ("Size", StringValue ("1.0"));
+ ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/synthetic", "c1"));
+
+ consumerHelper.SetPrefix ("/7");
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+ ApplicationContainer consumers2 = consumerHelper.Install(Names::Find<Node> ("/synthetic", "c2"));
+
+ consumerHelper.SetPrefix ("/8");
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+ ApplicationContainer consumers3 = consumerHelper.Install(Names::Find<Node> ("/synthetic", "c3"));
+
+ consumerHelper.SetPrefix ("/10");
+ consumerHelper.SetAttribute ("MeanRate", StringValue ("2Mbps"));
+ ApplicationContainer consumers4 = consumerHelper.Install(Names::Find<Node> ("/synthetic", "c4"));
+
+ consumers.Start (Seconds (0));
+ consumers2.Start (Seconds (2.5));
+ consumers3.Start (Seconds (5));
+ consumers4.Start (Seconds (7.5));
+
+ /////////////////////////////////////////////
+
+ CcnxAppHelper producerHelper ("ns3::CcnxProducer");
+ producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
+
+ producerHelper.SetPrefix ("/6");
+ producerHelper.Install (Names::Find<Node> ("/synthetic", "p1"));
+
+ producerHelper.SetPrefix ("/7");
+ producerHelper.Install (Names::Find<Node> ("/synthetic", "p2"));
+
+ producerHelper.SetPrefix ("/8");
+ producerHelper.Install (Names::Find<Node> ("/synthetic", "p3"));
+
+ producerHelper.SetPrefix ("/10");
+ producerHelper.Install (Names::Find<Node> ("/synthetic", "p4"));
+
+ // Populate FIB based on IPv4 global routing controller
+ ccnxHelper.InstallFakeGlobalRoutes ();
+ ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p1"));
+ ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p2"));
+ ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p3"));
+ ccnxHelper.InstallRouteTo (Names::Find<Node> ("/synthetic", "p4"));
+
+ Simulator::Schedule (Seconds (10.0), PrintTime);
+
+ Simulator::Stop (finishTime);
+
+ CcnxTraceHelper traceHelper;
+ // traceHelper.EnableAggregateAppAll ("ns3::CcnxConsumer");
+ // traceHelper.EnableAggregateAppAll ("ns3::CcnxProducer");
+ // traceHelper.EnableAggregateL3All ();
+ // traceHelper.SetL3TraceFile ("trace-l3.log");
+ // traceHelper.SetAppTraceFile ("trace-app.log");
+ // traceHelper.EnableRateL3All ("rate-trace.log");
+ traceHelper.EnableSeqsAppAll ("ns3::CcnxConsumer", "consumers-seqs.log");
+
+ NS_LOG_INFO ("Run Simulation.");
+ Simulator::Run ();
+ Simulator::Destroy ();
+ NS_LOG_INFO ("Done.");
+
+ return 0;
}
diff --git a/examples/synthetic-topology.txt b/examples/synthetic-topology.txt
index a1bf8f7..260f6ab 100644
--- a/examples/synthetic-topology.txt
+++ b/examples/synthetic-topology.txt
@@ -1,20 +1,29 @@
router
#name city latitude longitude
-NODE1 NODE1 60 20
-NODE2 NODE2 20 20
-NODE3 NODE3 40 40
-NODE4 NODE4 20 60
-NODE5 NODE5 40 80
-NODE6 NODE6 60 100
-NODE7 NODE7 20 100
+c1 NODE1 50 30
+c2 NODE2 30 30
+c3 x 10 30
+n1 NODE3 40 40
+n12 NODE4 30 60
+n2 NODE5 40 80
+p1 NODE6 50 90
+p2 NODE7 30 90
+p3 x 10 90
+c4 x 10 40
+p4 x 10 80
link
#capacity on 4/10/2003 (see page 20 of http://www.internet2.edu/presentations/spring03/20030410-Abilene-Corbato.pdf)
#OSPF weight on 04/10/2003 (see http://www.abilene.iu.edu/images/Ab-IGP-topo.jpg)
-#x y capacity(kbps) OSPF Delay QueueSize1 QueueSize2
-NODE1 NODE3 10000 1 1 80 120
-NODE2 NODE3 10000 1 1 110 150
-NODE3 NODE4 1000 1176 1 40 30
-NODE3 NODE5 1000 587 1 50 55 50
-NODE4 NODE5 1000 846 1 10 20
-NODE5 NODE6 10000 260 1 15 35
-NODE5 NODE7 10000 700 50 25 45
+#x y capacity(kbps) OSPF Delay MaxPackets
+c1 n1 10Mbps 1 50ms 200
+c2 n1 10Mbps 1 10ms 200
+c3 n1 10Mbps 1 100ms 200
+n1 n2 1Mbps 1176 20ms 20
+n1 n12 1Mbps 587 1ms 20
+n12 n2 1Mbps 846 1ms 20
+n2 p1 10Mbps 260 1ms 200
+n2 p2 10Mbps 700 1ms 200
+n2 p3 10Mbps 1 1ms 200
+c4 n1 10Mbps 1 1ms 200
+n2 p4 10Mbps 1 1ms 200
+
diff --git a/examples/wscript b/examples/wscript
deleted file mode 100644
index 0d2e449..0000000
--- a/examples/wscript
+++ /dev/null
@@ -1,8 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
- if not bld.env['ENABLE_EXAMPLES']:
- return;
-
- # obj = bld.create_ns3_program('stupid-interest-generator', ['NDNabstraction'])
- # obj.source = 'stupid-interest-generator.cc'
diff --git a/helper/ccnx-consumer-helper.cc b/helper/ccnx-app-helper.cc
similarity index 64%
rename from helper/ccnx-consumer-helper.cc
rename to helper/ccnx-app-helper.cc
index d41de22..d52a005 100644
--- a/helper/ccnx-consumer-helper.cc
+++ b/helper/ccnx-app-helper.cc
@@ -18,47 +18,49 @@
* Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
*/
-#include "ccnx-consumer-helper.h"
+#include "ccnx-app-helper.h"
#include "ns3/log.h"
-#include "ns3/ccnx-name-components.h"
+#include "ns3/string.h"
#include "ns3/names.h"
-#include "../apps/ccnx-consumer.h"
+#include "ns3/ccnx-app.h"
-NS_LOG_COMPONENT_DEFINE ("CcnxConsumerHelper");
+NS_LOG_COMPONENT_DEFINE ("CcnxAppHelper");
namespace ns3
{
-
-CcnxConsumerHelper::CcnxConsumerHelper (const std::string &prefix)
+
+CcnxAppHelper::CcnxAppHelper (const std::string &app)
{
- m_factory.SetTypeId ("ns3::CcnxConsumer");
-
- CcnxNameComponentsValue prefixValue;
- prefixValue.DeserializeFromString (prefix, MakeCcnxNameComponentsChecker ());
- m_factory.Set ("InterestName", prefixValue);
+ m_factory.SetTypeId (app);
}
-
+
+void
+CcnxAppHelper::SetPrefix (const std::string &prefix)
+{
+ m_factory.Set ("Prefix", StringValue(prefix));
+}
+
void
-CcnxConsumerHelper::SetAttribute (std::string name, const AttributeValue &value)
+CcnxAppHelper::SetAttribute (std::string name, const AttributeValue &value)
{
m_factory.Set (name, value);
}
ApplicationContainer
-CcnxConsumerHelper::Install (Ptr<Node> node)
+CcnxAppHelper::Install (Ptr<Node> node)
{
return ApplicationContainer (InstallPriv (node));
}
ApplicationContainer
-CcnxConsumerHelper::Install (std::string nodeName)
+CcnxAppHelper::Install (std::string nodeName)
{
Ptr<Node> node = Names::Find<Node> (nodeName);
return ApplicationContainer (InstallPriv (node));
}
ApplicationContainer
-CcnxConsumerHelper::Install (NodeContainer c)
+CcnxAppHelper::Install (NodeContainer c)
{
ApplicationContainer apps;
for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
@@ -70,11 +72,12 @@
}
Ptr<Application>
-CcnxConsumerHelper::InstallPriv (Ptr<Node> node)
+CcnxAppHelper::InstallPriv (Ptr<Node> node)
{
- Ptr<CcnxConsumer> app = m_factory.Create<CcnxConsumer> ();
+ Ptr<CcnxApp> app = m_factory.Create<CcnxApp> ();
node->AddApplication (app);
return app;
}
+
}
diff --git a/helper/ccnx-consumer-helper.h b/helper/ccnx-app-helper.h
similarity index 87%
rename from helper/ccnx-consumer-helper.h
rename to helper/ccnx-app-helper.h
index 158ede7..3eb1296 100644
--- a/helper/ccnx-consumer-helper.h
+++ b/helper/ccnx-app-helper.h
@@ -18,8 +18,8 @@
* Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
*/
-#ifndef CCNX_CONSUMER_HELPER_H
-#define CCNX_CONSUMER_HELPER_H
+#ifndef CCNX_APP_HELPER_H
+#define CCNX_APP_HELPER_H
#include "ns3/object-factory.h"
#include "ns3/attribute.h"
@@ -28,23 +28,29 @@
#include "ns3/ptr.h"
namespace ns3
-{
+{
+
/**
* \brief A helper to make it easier to instantiate an ns3::CcnxConsumer Application
* on a set of nodes.
*/
-
-class CcnxConsumerHelper
+class CcnxAppHelper
{
public:
/**
- * \brief Create an CcnxConsumerHelper to make it easier to work with CcnxConsumer Apps
+ * \brief Create an CcnxAppHelper to make it easier to work with CCNx apps
*
- * \param prefix Prefix which will be requested by the consumer applications
+ * \param app Class of the application
*/
- CcnxConsumerHelper (const std::string &prefix);
-
+ CcnxAppHelper (const std::string &prefix);
+
+ /**
+ * @brief Set the prefix consumer will be requesting
+ */
+ void
+ SetPrefix (const std::string &prefix);
+
/**
* \brief Helper function used to set the underlying application attributes.
*
@@ -94,7 +100,7 @@
ObjectFactory m_factory;
};
-}
+} // namespace ns3
-#endif
+#endif // CCNX_APP_HELPER_H
diff --git a/helper/ccnx-producer-helper.cc b/helper/ccnx-producer-helper.cc
deleted file mode 100644
index ec44aca..0000000
--- a/helper/ccnx-producer-helper.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ccnx-producer-helper.h"
-#include "ns3/log.h"
-#include "ns3/ccnx-name-components.h"
-#include "ns3/uinteger.h"
-#include "ns3/names.h"
-#include "../apps/ccnx-producer.h"
-
-NS_LOG_COMPONENT_DEFINE ("CcnxProducerHelper");
-
-namespace ns3
-{
-
-CcnxProducerHelper::CcnxProducerHelper (const std::string &prefix, uint32_t virtualPayloadSize)
-{
- m_factory.SetTypeId ("ns3::CcnxProducer");
-
- CcnxNameComponentsValue prefixValue;
- prefixValue.DeserializeFromString (prefix, MakeCcnxNameComponentsChecker ());
- m_factory.Set ("Prefix", prefixValue);
-
- m_factory.Set ("PayloadSize", UintegerValue (virtualPayloadSize));
-}
-
-void
-CcnxProducerHelper::SetAttribute (std::string name, const AttributeValue &value)
-{
- m_factory.Set (name, value);
-}
-
-ApplicationContainer
-CcnxProducerHelper::Install (Ptr<Node> node)
-{
- NS_LOG_FUNCTION(this);
- return ApplicationContainer (InstallPriv (node));
-}
-
-ApplicationContainer
-CcnxProducerHelper::Install (std::string nodeName)
-{
- Ptr<Node> node = Names::Find<Node> (nodeName);
- return ApplicationContainer (InstallPriv (node));
-}
-
-ApplicationContainer
-CcnxProducerHelper::Install (NodeContainer c)
-{
- ApplicationContainer apps;
- for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
- {
- apps.Add (InstallPriv (*i));
- }
-
- return apps;
-}
-
-Ptr<Application>
-CcnxProducerHelper::InstallPriv (Ptr<Node> node)
-{
- NS_LOG_INFO ("InstallPriv started");
- Ptr<CcnxProducer> app = m_factory.Create<CcnxProducer> ();
- node->AddApplication (app);
-
- return app;
-}
-}
diff --git a/helper/ccnx-producer-helper.h b/helper/ccnx-producer-helper.h
deleted file mode 100644
index eaa3665..0000000
--- a/helper/ccnx-producer-helper.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#ifndef CCNX_PRODUCER_HELPER_H
-#define CCNX_PRODUCER_HELPER_H
-
-#include "ns3/object-factory.h"
-#include "ns3/attribute.h"
-#include "ns3/node-container.h"
-#include "ns3/application-container.h"
-#include "ns3/ptr.h"
-
-namespace ns3
-{
-/**
-* \brief A helper to make it easier to instantiate an ns3::CcnxProducer application
-* on a set of nodes.
-*/
-
-class Node;
-
-class CcnxProducerHelper
-{
-public:
- /**
- * Create an CcnxProducerHelper to make it easier to work with CcnxProducer applications
- *
- */
- CcnxProducerHelper (const std::string &prefix, uint32_t virtualPayloadSize);
-
- /**
- * Helper function used to set the underlying application attributes.
- *
- * \param name the name of the application attribute to set
- * \param value the value of the application attribute to set
- */
- void SetAttribute (std::string name, const AttributeValue &value);
-
- /**
- * Install an ns3::CcnxProducer on each node of the input container
- * configured with all the attributes set with SetAttribute.
- *
- * \param c NodeContainer of the set of nodes on which an CcnxProducer
- * will be installed.
- * \returns Container of Ptr to the applications installed.
- */
- ApplicationContainer Install (NodeContainer c);
-
- /**
- * Install an ns3::CcnxProducer on the node configured with all the
- * attributes set with SetAttribute.
- *
- * \param node The node on which an CcnxProducer will be installed.
- * \returns Container of Ptr to the applications installed.
- */
- ApplicationContainer Install (Ptr<Node> node);
-
- /**
- * Install an ns3::CcnxProducer on the node configured with all the
- * attributes set with SetAttribute.
- *
- * \param nodeName The node on which an CcnxProducer will be installed.
- * \returns Container of Ptr to the applications installed.
- */
- ApplicationContainer Install (std::string nodeName);
-
-private:
- /**
- * \internal
- * Install an ns3::CcnxProducer on the node configured with all the
- * attributes set with SetAttribute.
- *
- * \param node The node on which an CcnxProducer will be installed.
- * \returns Ptr to the application installed.
- */
- Ptr<Application> InstallPriv (Ptr<Node> node);
- ObjectFactory m_factory;
-};
-}
-
-#endif
-
diff --git a/helper/ccnx-stack-helper.cc b/helper/ccnx-stack-helper.cc
index 9699c38..ff73cae 100644
--- a/helper/ccnx-stack-helper.cc
+++ b/helper/ccnx-stack-helper.cc
@@ -159,9 +159,9 @@
{
NS_LOG_INFO ("EnableLimits: " << enable);
m_limitsEnabled = enable;
+ m_avgRtt = avgRtt;
m_avgContentObjectSize = avgContentObject;
m_avgInterestSize = avgInterest;
- m_avgRtt = avgRtt;
}
Ptr<CcnxFaceContainer>
@@ -200,8 +200,7 @@
Ptr<CcnxL3Protocol> ccnx = CreateObject<CcnxL3Protocol> ();
node->AggregateObject (ccnx);
- ccnx->SetForwardingStrategy
- (DynamicCast<CcnxForwardingStrategy> (m_strategyFactory.Create<Object> ()));
+ ccnx->SetForwardingStrategy (m_strategyFactory.Create<CcnxForwardingStrategy> ());
for (uint32_t index=0; index < node->GetNDevices (); index++)
{
@@ -239,7 +238,8 @@
NS_LOG_INFO("DataRate for this link is " << dataRate.Get());
double maxInterestPackets = 1.0 * dataRate.Get ().GetBitRate () / 8.0 / m_avgContentObjectSize;
- NS_LOG_INFO ("BucketMax: " << maxInterestPackets);
+ NS_LOG_INFO ("Max packets per second: " << maxInterestPackets);
+ NS_LOG_INFO ("Max burst: " << m_avgRtt.ToDouble (Time::S) * maxInterestPackets);
// Set bucket max to BDP
face->SetBucketMax (m_avgRtt.ToDouble (Time::S) * maxInterestPackets); // number of interests allowed
@@ -559,7 +559,7 @@
// }
void
-CcnxStackHelper::InstallFakeGlobalRoutes ()
+CcnxStackHelper::InstallFakeGlobalRoutesImpl ()
{
for (NodeList::Iterator node = NodeList::Begin ();
node != NodeList::End ();
@@ -584,7 +584,12 @@
globalRouter->InjectRoute (Ipv4Address((*node)->GetId ()), Ipv4Mask("255.255.255.255"));
}
+}
+void
+CcnxStackHelper::InstallFakeGlobalRoutes ()
+{
+ InstallFakeGlobalRoutesImpl ();
Ipv4GlobalRoutingHelper::PopulateAllPossibleRoutingTables ();
}
diff --git a/helper/ccnx-stack-helper.h b/helper/ccnx-stack-helper.h
index f52c0d3..b4cdbc6 100644
--- a/helper/ccnx-stack-helper.h
+++ b/helper/ccnx-stack-helper.h
@@ -180,6 +180,9 @@
void
InstallFakeGlobalRoutes ();
+ void
+ InstallFakeGlobalRoutesImpl ();
+
/**
* \brief Installs CCNx route to `node` based on fake IPv4 routes
*
diff --git a/helper/ccnx-trace-helper.cc b/helper/ccnx-trace-helper.cc
new file mode 100644
index 0000000..1742462
--- /dev/null
+++ b/helper/ccnx-trace-helper.cc
@@ -0,0 +1,290 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-trace-helper.h"
+
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/packet.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/node-list.h"
+#include "ns3/object-vector.h"
+#include "ns3/simulator.h"
+#include "ns3/names.h"
+
+#include <boost/ref.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "tracers/ccnx-aggregate-app-tracer.h"
+#include "tracers/ccnx-aggregate-l3-tracer.h"
+#include "tracers/ccnx-rate-l3-tracer.h"
+#include "tracers/ccnx-seqs-app-tracer.h"
+#include "tracers/ipv4-seqs-app-tracer.h"
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+#include <fstream>
+
+using namespace std;
+using namespace boost;
+
+NS_LOG_COMPONENT_DEFINE ("CcnxTraceHelper");
+
+namespace ns3 {
+
+CcnxTraceHelper::CcnxTraceHelper ()
+ : m_l3RateTrace (0)
+ , m_appSeqsTrace (0)
+ , m_ipv4AppSeqsTrace (0)
+{
+}
+
+CcnxTraceHelper::~CcnxTraceHelper ()
+{
+ NS_LOG_FUNCTION (this);
+ if (m_l3RateTrace != 0) delete m_l3RateTrace;
+ if (m_appSeqsTrace != 0) delete m_appSeqsTrace;
+ if (m_ipv4AppSeqsTrace != 0) delete m_ipv4AppSeqsTrace;
+
+ if (m_apps.size () > 0)
+ {
+ ofstream of;
+ if (!m_appTrace.empty ())
+ {
+ of.open (m_appTrace.c_str (), ios_base::trunc | ios_base::out);
+ of << "# ";
+ m_apps.front ()->PrintHeader (of);
+ of << "\n";
+ }
+
+ for (std::list<Ptr<CcnxAppTracer> >::iterator app = m_apps.begin ();
+ app != m_apps.end ();
+ app++)
+ {
+ if (!m_appTrace.empty ())
+ {
+ (*app)->Print (of);
+ of << "\n";
+ }
+ else
+ {
+ NS_LOG_INFO (*(*app));
+ }
+ }
+ }
+
+ if (m_l3s.size () > 0)
+ {
+ ofstream of;
+ if (!m_l3Trace.empty ())
+ {
+ of.open (m_l3Trace.c_str (), ios_base::trunc | ios_base::out);
+ of << "# ";
+ m_l3s.front ()->PrintHeader (of);
+ of << "\n";
+ }
+
+ for (std::list<Ptr<CcnxL3Tracer> >::iterator l3 = m_l3s.begin ();
+ l3 != m_l3s.end ();
+ l3++)
+ {
+ if (!m_l3Trace.empty ())
+ {
+ (*l3)->Print (of);
+ of << "\n";
+ }
+ else
+ {
+ NS_LOG_INFO (*(*l3));
+ }
+ }
+ }
+}
+
+void
+CcnxTraceHelper::SetAppTraceFile (const std::string &appTrace)
+{
+ NS_LOG_FUNCTION (this << appTrace);
+ m_appTrace = appTrace;
+}
+
+void
+CcnxTraceHelper::SetL3TraceFile (const std::string &l3Trace)
+{
+ NS_LOG_FUNCTION (this << l3Trace);
+ m_l3Trace = l3Trace;
+}
+
+void
+CcnxTraceHelper::EnableAggregateAppAll (const std::string &appName)
+{
+ NS_LOG_FUNCTION (this << appName);
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ ObjectVectorValue apps;
+ (*node)->GetAttribute ("ApplicationList", apps);
+
+ NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+ uint32_t appId = 0;
+ for (ObjectVectorValue::Iterator app = apps.Begin ();
+ app != apps.End ();
+ app++, appId++)
+ {
+ NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app)->GetInstanceTypeId ().GetName ());
+ if ((*app)->GetInstanceTypeId ().GetName () == appName)
+ {
+ m_apps.push_back (Create<CcnxAggregateAppTracer> (appName,
+ *node,
+ lexical_cast<string> (appId)));
+ }
+ }
+ }
+}
+
+void
+CcnxTraceHelper::EnableAggregateL3All ()
+{
+ NS_LOG_FUNCTION (this);
+
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+ m_l3s.push_back (Create<CcnxAggregateL3Tracer> (*node));
+ }
+}
+
+void
+CcnxTraceHelper::EnableRateL3All (const std::string &l3RateTrace)
+{
+ NS_LOG_FUNCTION (this);
+ m_l3RateTrace = new ofstream (l3RateTrace.c_str (), ios::trunc);
+
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+ Ptr<CcnxRateL3Tracer> trace = Create<CcnxRateL3Tracer> (boost::ref(*m_l3RateTrace), *node);
+ trace->SetAveragingPeriod (Seconds (0.5));
+ m_l3Rates.push_back (trace);
+ }
+
+ if (m_l3Rates.size () > 0)
+ {
+ // *m_l3RateTrace << "# "; // not necessary for R's read.table
+ m_l3Rates.front ()->PrintHeader (*m_l3RateTrace);
+ *m_l3RateTrace << "\n";
+ }
+}
+
+void
+CcnxTraceHelper::EnableSeqsAppAll (const std::string &appName, const std::string &trace)
+{
+ NS_LOG_FUNCTION (this);
+ m_appSeqsTrace = new ofstream (trace.c_str (), ios::trunc);
+
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ ObjectVectorValue apps;
+ (*node)->GetAttribute ("ApplicationList", apps);
+
+ NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+ uint32_t appId = 0;
+ for (ObjectVectorValue::Iterator app = apps.Begin ();
+ app != apps.End ();
+ app++, appId++)
+ {
+ NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app)->GetInstanceTypeId ().GetName ());
+ if ((*app)->GetInstanceTypeId ().GetName () == appName)
+ {
+ Ptr<CcnxSeqsAppTracer> trace = Create<CcnxSeqsAppTracer> (boost::ref(*m_appSeqsTrace),
+ appName,
+ *node,
+ lexical_cast<string> (appId));
+ m_appSeqs.push_back (trace);
+ }
+ }
+
+ }
+
+ if (m_appSeqs.size () > 0)
+ {
+ // *m_l3RateTrace << "# "; // not necessary for R's read.table
+ m_appSeqs.front ()->PrintHeader (*m_appSeqsTrace);
+ *m_appSeqsTrace << "\n";
+ }
+}
+
+void
+CcnxTraceHelper::EnableIpv4SeqsAppAll (const std::string &trace)
+{
+ NS_LOG_FUNCTION (this);
+ m_ipv4AppSeqsTrace = new ofstream (trace.c_str (), ios::trunc);
+
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ ObjectVectorValue apps;
+ (*node)->GetAttribute ("ApplicationList", apps);
+
+ NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+ uint32_t appId = 0;
+ for (ObjectVectorValue::Iterator app = apps.Begin ();
+ app != apps.End ();
+ app++, appId++)
+ {
+ NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app)->GetInstanceTypeId ().GetName ());
+ if ((*app)->GetInstanceTypeId ().GetName () == "ns3::PacketSink" ||
+ (*app)->GetInstanceTypeId ().GetName () == "ns3::BulkSendApplication")
+ {
+ Ptr<Ipv4SeqsAppTracer> trace = Create<Ipv4SeqsAppTracer> (boost::ref(*m_ipv4AppSeqsTrace),
+ *node,
+ lexical_cast<string> (appId));
+ m_ipv4AppSeqs.push_back (trace);
+ }
+ }
+
+ }
+
+ if (m_ipv4AppSeqs.size () > 0)
+ {
+ m_ipv4AppSeqs.front ()->PrintHeader (*m_ipv4AppSeqsTrace);
+ *m_ipv4AppSeqsTrace << "\n";
+ }
+}
+
+
+} // namespace ns3
diff --git a/helper/ccnx-trace-helper.h b/helper/ccnx-trace-helper.h
new file mode 100644
index 0000000..4079f9c
--- /dev/null
+++ b/helper/ccnx-trace-helper.h
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_TRACE_HELPER_H
+#define CCNX_TRACE_HELPER_H
+
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+
+#include <list>
+
+namespace ns3 {
+
+class CcnxAppTracer;
+class CcnxL3Tracer;
+class Ipv4AppTracer;
+
+class CcnxTraceHelper
+{
+public:
+ CcnxTraceHelper ();
+
+ /**
+ * @brief Destructor that invokes trace output procedures
+ */
+ ~CcnxTraceHelper ();
+
+ /**
+ * @brief Set filename to output app trace.
+ *
+ * By default, trace is output to NS_LOG_INFO stream
+ *
+ * @param file File where trace will be written to
+ */
+ void
+ SetAppTraceFile (const std::string &appTrace = "apps.log");
+
+ /**
+ * @brief Set filename to output app trace.
+ *
+ * By default, trace is output to NS_LOG_INFO stream
+ *
+ * @param file File where trace will be written to
+ */
+ void
+ SetL3TraceFile (const std::string &l3Trace = "l3.log");
+
+ /**
+ * @brief Enable aggregate app-level CCNx tracing on all CCNx applications
+ *
+ * @param app Class name of the application of interest
+ */
+ void
+ EnableAggregateAppAll (const std::string &app);
+
+ /**
+ * @brief Enable aggregate network-level CCNx tracing on all CCNx node
+ */
+ void
+ EnableAggregateL3All ();
+
+ /**
+ * @brief Enable network-level CCNx rate tracing on all CCNx nodes
+ */
+ void
+ EnableRateL3All (const std::string &l3RateTrace = "l3-rate.log");
+
+ /**
+ * @brief Enable app-level CCNx sequence tracing on all CCNx applications
+ */
+ void
+ EnableSeqsAppAll (const std::string &app, const std::string &appSeqsTrace = "app-seqs.log");
+
+ /**
+ * @brief Enable app-level IPv4 sequence tracing on all nodes (BulkSender + PacketSink)
+ */
+ void
+ EnableIpv4SeqsAppAll (const std::string &appSeqsTrace = "app-seqs.log");
+
+private:
+ std::string m_appTrace;
+ std::list<Ptr<CcnxAppTracer> > m_apps;
+
+ std::string m_l3Trace;
+ std::list<Ptr<CcnxL3Tracer> > m_l3s;
+
+ std::list<Ptr<CcnxL3Tracer> > m_l3Rates;
+ std::ostream *m_l3RateTrace;
+
+ std::list<Ptr<CcnxAppTracer> > m_appSeqs;
+ std::ostream *m_appSeqsTrace;
+
+ std::list<Ptr<Ipv4AppTracer> > m_ipv4AppSeqs;
+ std::ostream *m_ipv4AppSeqsTrace;
+};
+
+
+} // namespace ns3
+
+#endif /* CCNX_TRACE_HELPER_H */
diff --git a/helper/tracers/ccnx-aggregate-app-tracer.cc b/helper/tracers/ccnx-aggregate-app-tracer.cc
new file mode 100644
index 0000000..6129e8c
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-app-tracer.cc
@@ -0,0 +1,172 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-aggregate-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+
+CcnxAggregateAppTracer::CcnxAggregateAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId)
+ : CcnxAppTracer (app, node, appId)
+ , m_inInterests (0)
+ , m_outInterests (0)
+ , m_inNacks (0)
+ , m_inData (0)
+ , m_outData (0)
+
+ , m_inInterestsBytes (0)
+ , m_outInterestsBytes (0)
+ , m_inNacksBytes (0)
+ , m_inDataBytes (0)
+ , m_outDataBytes (0)
+{
+}
+
+CcnxAggregateAppTracer::CcnxAggregateAppTracer (const std::string &app, const std::string &node, const std::string &appId)
+ : CcnxAppTracer (app, node, appId)
+ , m_inInterests (0)
+ , m_outInterests (0)
+ , m_inNacks (0)
+ , m_inData (0)
+ , m_outData (0)
+
+ , m_inInterestsBytes (0)
+ , m_outInterestsBytes (0)
+ , m_inNacksBytes (0)
+ , m_inDataBytes (0)
+ , m_outDataBytes (0)
+{
+}
+
+void
+CcnxAggregateAppTracer::Reset ()
+{
+ m_inInterests = 0;
+ m_outInterests = 0;
+ m_inNacks = 0;
+ m_inData = 0;
+ m_outData = 0;
+
+ m_inInterestsBytes = 0;
+ m_outInterestsBytes = 0;
+ m_inNacksBytes = 0;
+ m_inDataBytes = 0;
+ m_outDataBytes = 0;
+}
+
+void
+CcnxAggregateAppTracer::PrintHeader (std::ostream &os) const
+{
+ os << "NodeId" << "\t"
+ << "App" << "\t"
+ << "AppId" << "\t"
+ << "InInterests" << "\t"
+ << "OutInterests" << "\t"
+
+ << "InNacks" << "\t"
+
+ << "InData" << "\t"
+ << "OutData" << "\t"
+
+ << "InInterestsBytes" << "\t"
+ << "OutInterestsBytes" << "\t"
+
+ << "InNacksBytes" << "\t"
+
+ << "InDataBytes" << "\t"
+ << "OutDataBytes";
+}
+
+void
+CcnxAggregateAppTracer::Print (std::ostream &os) const
+{
+ os << m_node << "\t"
+ << m_app << "\t"
+ << m_appId << "\t"
+
+ << m_inInterests << "\t"
+ << m_outInterests << "\t"
+
+ << m_inNacks << "\t"
+
+ << m_inData << "\t"
+ << m_outData << "\t"
+
+ << m_inInterestsBytes << "\t"
+ << m_outInterestsBytes << "\t"
+
+ << m_inNacksBytes << "\t"
+
+ << m_inDataBytes << "\t"
+ << m_outDataBytes;
+}
+
+void
+CcnxAggregateAppTracer::OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ m_outInterests++;
+ m_outInterestsBytes += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ m_outData++;
+ m_outDataBytes += header->GetSerializedSize () + payload->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::InInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ m_inInterests++;
+ m_inInterestsBytes += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::InNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ m_inNacks++;
+ m_inNacksBytes += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateAppTracer::InData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ m_inData++;
+ m_inDataBytes += header->GetSerializedSize () + payload->GetSerializedSize ();
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-aggregate-app-tracer.h b/helper/tracers/ccnx-aggregate-app-tracer.h
new file mode 100644
index 0000000..e321b64
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-app-tracer.h
@@ -0,0 +1,81 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_AGGREGATE_APP_TRACER_H
+#define CCNX_AGGREGATE_APP_TRACER_H
+
+#include "ns3/ccnx-app-tracer.h"
+
+namespace ns3 {
+
+class CcnxAggregateAppTracer : public CcnxAppTracer
+{
+public:
+ CcnxAggregateAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId = "*");
+ CcnxAggregateAppTracer (const std::string &app, const std::string &node, const std::string &appId = "*");
+ virtual ~CcnxAggregateAppTracer () { };
+
+ virtual void
+ PrintHeader (std::ostream &os) const;
+
+ virtual void
+ Print (std::ostream &os) const;
+
+ virtual void
+ OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ InInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ InNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ InData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+protected:
+ void
+ Reset ();
+
+protected:
+ uint64_t m_inInterests;
+ uint64_t m_outInterests;
+ uint64_t m_inNacks;
+ uint64_t m_inData;
+ uint64_t m_outData;
+
+ uint64_t m_inInterestsBytes;
+ uint64_t m_outInterestsBytes;
+ uint64_t m_inNacksBytes;
+ uint64_t m_inDataBytes;
+ uint64_t m_outDataBytes;
+};
+
+} // namespace ns3
+
+#endif // CCNX_AGGREGATE_APP_TRACER_H
diff --git a/helper/tracers/ccnx-aggregate-l3-tracer.cc b/helper/tracers/ccnx-aggregate-l3-tracer.cc
new file mode 100644
index 0000000..596f036
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-l3-tracer.cc
@@ -0,0 +1,201 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-aggregate-l3-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+
+CcnxAggregateL3Tracer::CcnxAggregateL3Tracer (Ptr<Node> node)
+ : CcnxL3Tracer (node)
+{
+ Reset ();
+}
+
+CcnxAggregateL3Tracer::CcnxAggregateL3Tracer (const std::string &node)
+ : CcnxL3Tracer (node)
+{
+ Reset ();
+}
+
+void
+CcnxAggregateL3Tracer::Stats::Reset ()
+{
+ m_inInterests = 0;
+ m_outInterests = 0;
+ m_dropInterests = 0;
+ m_inNacks = 0;
+ m_outNacks = 0;
+ m_dropNacks = 0;
+ m_inData = 0;
+ m_outData = 0;
+ m_dropData = 0;
+}
+
+
+void
+CcnxAggregateL3Tracer::Reset ()
+{
+ m_packets.Reset ();
+ m_bytes.Reset ();
+}
+
+
+void
+CcnxAggregateL3Tracer::PrintHeader (std::ostream &os) const
+{
+ os << "Node" << "\t"
+ << "InInterests" << "\t"
+ << "OutInterests" << "\t"
+ << "DropInterests" << "\t"
+
+ << "InNacks" << "\t"
+ << "OutNacks" << "\t"
+ << "DropNacks" << "\t"
+
+ << "InData" << "\t"
+ << "OutData" << "\t"
+ << "DropData" << "\t"
+
+ << "InInterestsBytes" << "\t"
+ << "OutInterestsBytes" << "\t"
+ << "DropInterestsBytes" << "\t"
+
+ << "InNacksBytes" << "\t"
+ << "OutNacksBytes" << "\t"
+ << "DropNacksBytes" << "\t"
+
+ << "InDataBytes" << "\t"
+ << "OutDataBytes" << "\t"
+ << "DropDataBytes";
+}
+
+void
+CcnxAggregateL3Tracer::Print (std::ostream &os) const
+{
+ os << m_node << "\t"
+ << m_packets.m_inInterests << "\t"
+ << m_packets.m_outInterests << "\t"
+ << m_packets.m_dropInterests << "\t"
+
+ << m_packets.m_inNacks << "\t"
+ << m_packets.m_outNacks << "\t"
+ << m_packets.m_dropNacks << "\t"
+
+ << m_packets.m_inData << "\t"
+ << m_packets.m_outData << "\t"
+ << m_packets.m_dropData << "\t"
+
+ << m_bytes.m_inInterests << "\t"
+ << m_bytes.m_outInterests << "\t"
+ << m_bytes.m_dropInterests << "\t"
+
+ << m_bytes.m_inNacks << "\t"
+ << m_bytes.m_outNacks << "\t"
+ << m_bytes.m_dropNacks << "\t"
+
+ << m_bytes.m_inData << "\t"
+ << m_bytes.m_outData << "\t"
+ << m_bytes.m_dropData;
+}
+
+void
+CcnxAggregateL3Tracer::OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+ m_packets.m_outInterests++;
+ m_bytes.m_outInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::InInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+ m_packets.m_inInterests++;
+ m_bytes.m_inInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::DropInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace>)
+{
+ m_packets.m_dropInterests++;
+ m_bytes.m_dropInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::OutNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+ m_packets.m_outNacks++;
+ m_bytes.m_outNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::InNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace>)
+{
+ m_packets.m_inNacks++;
+ m_bytes.m_inNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::DropNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace>)
+{
+ m_packets.m_dropNacks++;
+ m_bytes.m_dropNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxAggregateL3Tracer::OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ bool fromCache, Ptr<const CcnxFace>)
+{
+ m_packets.m_outData++;
+ m_bytes.m_outData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxAggregateL3Tracer::InData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ Ptr<const CcnxFace>)
+{
+ m_packets.m_inData++;
+ m_bytes.m_inData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxAggregateL3Tracer::DropData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ Ccnx::DropReason, Ptr<const CcnxFace>)
+{
+ m_packets.m_dropData++;
+ m_bytes.m_dropData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-aggregate-l3-tracer.h b/helper/tracers/ccnx-aggregate-l3-tracer.h
new file mode 100644
index 0000000..8536258
--- /dev/null
+++ b/helper/tracers/ccnx-aggregate-l3-tracer.h
@@ -0,0 +1,88 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_AGGREGATE_L3_TRACER_H
+#define CCNX_AGGREGATE_L3_TRACER_H
+
+#include "ns3/ccnx-l3-tracer.h"
+
+namespace ns3 {
+
+class CcnxAggregateL3Tracer : public CcnxL3Tracer
+{
+public:
+ CcnxAggregateL3Tracer (Ptr<Node> node);
+ CcnxAggregateL3Tracer (const std::string &node);
+ virtual ~CcnxAggregateL3Tracer () { };
+
+ virtual void
+ PrintHeader (std::ostream &os) const;
+
+ virtual void
+ Print (std::ostream &os) const;
+
+ virtual void
+ OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ InInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ DropInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+ virtual void
+ OutNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ InNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ DropNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+ virtual void
+ OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>);
+
+ virtual void
+ InData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<const CcnxFace>);
+
+ virtual void
+ DropData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+protected:
+ void
+ Reset ();
+
+protected:
+ Stats m_packets;
+ Stats m_bytes;
+};
+
+} // namespace ns3
+
+#endif // CCNX_AGGREGATE_L3_TRACER_H
diff --git a/helper/tracers/ccnx-app-tracer.cc b/helper/tracers/ccnx-app-tracer.cc
new file mode 100644
index 0000000..a2bbbdd
--- /dev/null
+++ b/helper/tracers/ccnx-app-tracer.cc
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/names.h"
+
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+
+#include <boost/lexical_cast.hpp>
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+using namespace std;
+using namespace boost;
+
+namespace ns3 {
+
+CcnxAppTracer::CcnxAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId)
+ : m_app (app)
+ , m_appId (appId)
+ , m_nodePtr (node)
+{
+ m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
+
+ Connect ();
+
+ string name = Names::FindName (node);
+ if (!name.empty ())
+ {
+ m_node = name;
+ }
+}
+
+CcnxAppTracer::CcnxAppTracer (const std::string &app, const std::string &node, const std::string &appId)
+ : m_app (app)
+ , m_appId (appId)
+ , m_node (node)
+{
+ Connect ();
+}
+
+void
+CcnxAppTracer::Connect ()
+{
+ Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/TransmittedInterests",
+ MakeCallback (&CcnxAppTracer::OutInterests, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedNacks",
+ MakeCallback (&CcnxAppTracer::InNacks, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedInterests",
+ MakeCallback (&CcnxAppTracer::InInterests, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/TransmittedContentObjects",
+ MakeCallback (&CcnxAppTracer::OutData, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedContentObjects",
+ MakeCallback (&CcnxAppTracer::InData, this));
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-app-tracer.h b/helper/tracers/ccnx-app-tracer.h
new file mode 100644
index 0000000..fd9f42d
--- /dev/null
+++ b/helper/tracers/ccnx-app-tracer.h
@@ -0,0 +1,87 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_APP_TRACER_H
+#define CCNX_APP_TRACER_H
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ccnx.h"
+
+namespace ns3 {
+
+class CcnxApp;
+
+class CcnxAppTracer : public SimpleRefCount<CcnxAppTracer>
+{
+public:
+ CcnxAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId = "*");
+ CcnxAppTracer (const std::string &app, const std::string &node, const std::string &appId = "*");
+ virtual ~CcnxAppTracer () { };
+
+ void
+ Connect ();
+
+ virtual void
+ PrintHeader (std::ostream &os) const = 0;
+
+ virtual void
+ Print (std::ostream &os) const = 0;
+
+ virtual void
+ OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+ virtual void
+ InInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+ virtual void
+ InNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+ virtual void
+ OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+ virtual void
+ InData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
+
+protected:
+ std::string m_app;
+ std::string m_appId;
+ std::string m_node;
+ Ptr<Node> m_nodePtr;
+};
+
+inline std::ostream&
+operator << (std::ostream &os, const CcnxAppTracer &tracer)
+{
+ os << "# ";
+ tracer.PrintHeader (os);
+ os << "\n";
+ tracer.Print (os);
+ return os;
+}
+
+} // namespace ns3
+
+#endif // CCNX_APP_TRACER_H
diff --git a/helper/tracers/ccnx-l3-tracer.cc b/helper/tracers/ccnx-l3-tracer.cc
new file mode 100644
index 0000000..415105b
--- /dev/null
+++ b/helper/tracers/ccnx-l3-tracer.cc
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-l3-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/names.h"
+#include "ns3/callback.h"
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+
+#include <boost/lexical_cast.hpp>
+
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+using namespace std;
+
+namespace ns3 {
+
+CcnxL3Tracer::CcnxL3Tracer (Ptr<Node> node)
+: m_nodePtr (node)
+{
+ m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
+
+ Connect ();
+
+ string name = Names::FindName (node);
+ if (!name.empty ())
+ {
+ m_node = name;
+ }
+}
+
+CcnxL3Tracer::CcnxL3Tracer (const std::string &node)
+: m_node (node)
+{
+ Connect ();
+}
+
+void
+CcnxL3Tracer::Connect ()
+{
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/ForwardingStrategy/OutInterests",
+ MakeCallback (&CcnxL3Tracer::OutInterests, this));
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InInterests",
+ MakeCallback (&CcnxL3Tracer::InInterests, this));
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropInterests",
+ MakeCallback (&CcnxL3Tracer::DropInterests, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/OutNacks",
+ MakeCallback (&CcnxL3Tracer::OutNacks, this));
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InNacks",
+ MakeCallback (&CcnxL3Tracer::InNacks, this));
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropNacks",
+ MakeCallback (&CcnxL3Tracer::DropNacks, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/OutData",
+ MakeCallback (&CcnxL3Tracer::OutData, this));
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InData",
+ MakeCallback (&CcnxL3Tracer::InData, this));
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropData",
+ MakeCallback (&CcnxL3Tracer::DropData, this));
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-l3-tracer.h b/helper/tracers/ccnx-l3-tracer.h
new file mode 100644
index 0000000..ac21cef
--- /dev/null
+++ b/helper/tracers/ccnx-l3-tracer.h
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_L3_TRACER_H
+#define CCNX_L3_TRACER_H
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ccnx.h"
+
+namespace ns3 {
+
+class Node;
+
+class CcnxL3Tracer : public SimpleRefCount<CcnxL3Tracer>
+{
+public:
+ CcnxL3Tracer (Ptr<Node> node);
+ CcnxL3Tracer (const std::string &node);
+ virtual ~CcnxL3Tracer () { };
+
+ void
+ Connect ();
+
+ virtual void
+ PrintHeader (std::ostream &os) const = 0;
+
+ virtual void
+ Print (std::ostream &os) const = 0;
+
+ virtual void
+ OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ InInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ DropInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ OutNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ InNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ DropNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
+
+
+ virtual void
+ OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ InData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<const CcnxFace>) = 0;
+
+ virtual void
+ DropData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
+
+protected:
+ std::string m_node;
+ Ptr<Node> m_nodePtr;
+
+ struct Stats
+ {
+ void Reset ();
+
+ uint64_t m_inInterests;
+ uint64_t m_outInterests;
+ uint64_t m_dropInterests;
+ uint64_t m_inNacks;
+ uint64_t m_outNacks;
+ uint64_t m_dropNacks;
+ uint64_t m_inData;
+ uint64_t m_outData;
+ uint64_t m_dropData;
+ };
+};
+
+inline std::ostream&
+operator << (std::ostream &os, const CcnxL3Tracer &tracer)
+{
+ os << "# ";
+ tracer.PrintHeader (os);
+ os << "\n";
+ tracer.Print (os);
+ return os;
+}
+
+} // namespace ns3
+
+#endif // CCNX_L3_TRACER_H
diff --git a/helper/tracers/ccnx-rate-l3-tracer.cc b/helper/tracers/ccnx-rate-l3-tracer.cc
new file mode 100644
index 0000000..d44ce44
--- /dev/null
+++ b/helper/tracers/ccnx-rate-l3-tracer.cc
@@ -0,0 +1,213 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-rate-l3-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+
+CcnxRateL3Tracer::CcnxRateL3Tracer (std::ostream &os, Ptr<Node> node)
+ : CcnxL3Tracer (node)
+ , m_os (os)
+{
+ SetAveragingPeriod (Seconds (1.0));
+}
+
+CcnxRateL3Tracer::CcnxRateL3Tracer (std::ostream &os, const std::string &node)
+ : CcnxL3Tracer (node)
+ , m_os (os)
+{
+ SetAveragingPeriod (Seconds (1.0));
+}
+
+CcnxRateL3Tracer::~CcnxRateL3Tracer ()
+{
+ m_printEvent.Cancel ();
+}
+
+void
+CcnxRateL3Tracer::SetAveragingPeriod (const Time &period)
+{
+ m_period = period;
+ m_printEvent.Cancel ();
+ m_printEvent = Simulator::Schedule (m_period, &CcnxRateL3Tracer::PeriodicPrinter, this);
+}
+
+void
+CcnxRateL3Tracer::PeriodicPrinter ()
+{
+ Print (m_os);
+ Reset ();
+
+ m_printEvent = Simulator::Schedule (m_period, &CcnxRateL3Tracer::PeriodicPrinter, this);
+}
+
+void
+CcnxRateL3Tracer::PrintHeader (std::ostream &os) const
+{
+ os << "Time" << "\t"
+
+ << "Node" << "\t"
+ << "FaceId" << "\t"
+ << "FaceDescr" << "\t"
+
+ << "Type" << "\t"
+ << "Packets" << "\t"
+ << "Kilobytes";
+}
+
+void
+CcnxRateL3Tracer::Reset ()
+{
+ for (std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
+ stats != m_stats.end ();
+ stats++)
+ {
+ stats->second.get<0> ().Reset ();
+ stats->second.get<1> ().Reset ();
+ }
+}
+
+const double alpha = 0.8;
+
+#define STATS(INDEX) stats->second.get<INDEX> ()
+#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble (Time::S)
+
+#define PRINTER(printName, fieldName) \
+STATS(2).fieldName = /*new value*/alpha * RATE(0, fieldName) + /*old value*/(1-alpha) * STATS(2).fieldName; \
+ STATS(3).fieldName = /*new value*/alpha * RATE(1, fieldName) / 1024.0 + /*old value*/(1-alpha) * STATS(3).fieldName; \
+ \
+os << time.ToDouble (Time::S) << "\t" \
+ << m_node << "\t" \
+ << stats->first->GetId () << "\t" \
+ << *stats->first << "\t" \
+ << printName << "\t" \
+ << STATS(2).fieldName << "\t" \
+ << STATS(3).fieldName << "\n";
+
+void
+CcnxRateL3Tracer::Print (std::ostream &os) const
+{
+ for (std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
+ stats != m_stats.end ();
+ stats++)
+ {
+ Time time = Simulator::Now ();
+
+ PRINTER ("InInterests", m_inInterests);
+ PRINTER ("OutInterests", m_outInterests);
+ PRINTER ("DropInterests", m_dropInterests);
+
+ PRINTER ("InNacks", m_inNacks);
+ PRINTER ("OutNacks", m_outNacks);
+ PRINTER ("DropNacks", m_dropNacks);
+
+ PRINTER ("InData", m_inData);
+ PRINTER ("OutData", m_outData);
+ PRINTER ("DropData", m_dropData);
+ }
+}
+
+
+void
+CcnxRateL3Tracer::OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_outInterests ++;
+ m_stats[face].get<1> ().m_outInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::InInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_inInterests ++;
+ m_stats[face].get<1> ().m_inInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::DropInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_dropInterests ++;
+ m_stats[face].get<1> ().m_dropInterests += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::OutNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_outNacks ++;
+ m_stats[face].get<1> ().m_outNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::InNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_inNacks ++;
+ m_stats[face].get<1> ().m_inNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::DropNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ccnx::DropReason, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_dropNacks ++;
+ m_stats[face].get<1> ().m_dropNacks += header->GetSerializedSize ();
+}
+
+void
+CcnxRateL3Tracer::OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ bool fromCache, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_inData ++;
+ m_stats[face].get<1> ().m_inData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxRateL3Tracer::InData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_outData ++;
+ m_stats[face].get<1> ().m_outData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+void
+CcnxRateL3Tracer::DropData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> payload,
+ Ccnx::DropReason, Ptr<const CcnxFace> face)
+{
+ m_stats[face].get<0> ().m_dropData ++;
+ m_stats[face].get<1> ().m_dropData += header->GetSerializedSize () + payload->GetSize ();
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-rate-l3-tracer.h b/helper/tracers/ccnx-rate-l3-tracer.h
new file mode 100644
index 0000000..83e48c4
--- /dev/null
+++ b/helper/tracers/ccnx-rate-l3-tracer.h
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_RATE_L3_TRACER_H
+#define CCNX_RATE_L3_TRACER_H
+
+#include "ns3/ccnx-l3-tracer.h"
+
+#include "ns3/nstime.h"
+#include "ns3/event-id.h"
+
+#include <boost/tuple/tuple.hpp>
+#include <map>
+
+namespace ns3 {
+
+/**
+ * @ingroup ccnx
+ * @brief CCNx network-layer rate tracer
+ */
+class CcnxRateL3Tracer : public CcnxL3Tracer
+{
+public:
+ /**
+ * @brief Network layer tracer constructor
+ */
+ CcnxRateL3Tracer (std::ostream &os, Ptr<Node> node);
+ CcnxRateL3Tracer (std::ostream &os, const std::string &node);
+ virtual ~CcnxRateL3Tracer ();
+
+ void
+ SetAveragingPeriod (const Time &period);
+
+ virtual void
+ PrintHeader (std::ostream &os) const;
+
+ virtual void
+ Print (std::ostream &os) const;
+
+ virtual void
+ OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ InInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ DropInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+ virtual void
+ OutNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ InNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace>);
+
+ virtual void
+ DropNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+ virtual void
+ OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>);
+
+ virtual void
+ InData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<const CcnxFace>);
+
+ virtual void
+ DropData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>);
+
+private:
+ void
+ PeriodicPrinter ();
+
+ void
+ Reset ();
+
+private:
+ std::ostream& m_os;
+ Time m_period;
+ EventId m_printEvent;
+
+ mutable std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> > m_stats;
+};
+
+} // namespace ns3
+
+#endif // CCNX_RATE_L3_TRACER_H
diff --git a/helper/tracers/ccnx-seqs-app-tracer.cc b/helper/tracers/ccnx-seqs-app-tracer.cc
new file mode 100644
index 0000000..5ea636e
--- /dev/null
+++ b/helper/tracers/ccnx-seqs-app-tracer.cc
@@ -0,0 +1,116 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ccnx-seqs-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+
+#include "ns3/ccnx-app.h"
+#include "ns3/ccnx-face.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 {
+
+CcnxSeqsAppTracer::CcnxSeqsAppTracer (std::ostream &os, const std::string &app, Ptr<Node> node, const std::string &appId)
+ : CcnxAppTracer (app, node, appId)
+ , m_os (os)
+{
+}
+
+CcnxSeqsAppTracer::CcnxSeqsAppTracer (std::ostream &os, const std::string &app, const std::string &node, const std::string &appId)
+ : CcnxAppTracer (app, node, appId)
+ , m_os (os)
+{
+}
+
+void
+CcnxSeqsAppTracer::Reset ()
+{
+}
+
+void
+CcnxSeqsAppTracer::PrintHeader (std::ostream &os) const
+{
+ os << "Time\t"
+ << "Node\t"
+ << "AppName\t"
+ << "AppId\t"
+ << "Type\t"
+ << "SeqNo";
+}
+
+void
+CcnxSeqsAppTracer::Print (std::ostream &os) const
+{
+}
+
+#define PRINTER(type) \
+ m_os \
+ << Simulator::Now ().ToDouble (Time::S) << "\t" \
+ << m_node << "\t" \
+ << m_app << "\t" \
+ << m_appId << "\t" \
+ << type << "\t" \
+ << header->GetName ().GetLastComponent () << std::endl;
+
+void
+CcnxSeqsAppTracer::OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header, Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ PRINTER ("OutInterest");
+}
+
+void
+CcnxSeqsAppTracer::OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet>,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ PRINTER ("OutData");
+}
+
+void
+CcnxSeqsAppTracer::InInterests (std::string context,
+ Ptr<const CcnxInterestHeader> header,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ PRINTER ("InInterest");
+}
+
+void
+CcnxSeqsAppTracer::InNacks (std::string context,
+ Ptr<const CcnxInterestHeader> header,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ PRINTER ("InNacks");
+}
+
+void
+CcnxSeqsAppTracer::InData (std::string context,
+ Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet>,
+ Ptr<CcnxApp>, Ptr<CcnxFace>)
+{
+ PRINTER ("InData");
+}
+
+} // namespace ns3
diff --git a/helper/tracers/ccnx-seqs-app-tracer.h b/helper/tracers/ccnx-seqs-app-tracer.h
new file mode 100644
index 0000000..b0fd618
--- /dev/null
+++ b/helper/tracers/ccnx-seqs-app-tracer.h
@@ -0,0 +1,71 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 CCNX_SEQS_APP_TRACER_H
+#define CCNX_SEQS_APP_TRACER_H
+
+#include "ns3/ccnx-app-tracer.h"
+
+namespace ns3 {
+
+class CcnxSeqsAppTracer : public CcnxAppTracer
+{
+public:
+ CcnxSeqsAppTracer (std::ostream &os, const std::string &app, Ptr<Node> node, const std::string &appId = "*");
+ CcnxSeqsAppTracer (std::ostream &os, const std::string &app, const std::string &node, const std::string &appId = "*");
+ virtual ~CcnxSeqsAppTracer () { };
+
+ virtual void
+ PrintHeader (std::ostream &os) const;
+
+ virtual void
+ Print (std::ostream &os) const;
+
+ virtual void
+ OutInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ InInterests (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ InNacks (std::string context,
+ Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ OutData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+ virtual void
+ InData (std::string context,
+ Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
+
+protected:
+ void
+ Reset ();
+
+protected:
+ std::ostream& m_os;
+};
+
+} // namespace ns3
+
+#endif // CCNX_AGGREGATE_APP_TRACER_H
diff --git a/helper/tracers/ipv4-app-tracer.cc b/helper/tracers/ipv4-app-tracer.cc
new file mode 100644
index 0000000..57fb612
--- /dev/null
+++ b/helper/tracers/ipv4-app-tracer.cc
@@ -0,0 +1,70 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012 UCLA
+ *
+ * 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>
+ */
+
+#include "ipv4-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/names.h"
+
+#include <boost/lexical_cast.hpp>
+
+using namespace std;
+using namespace boost;
+
+namespace ns3 {
+
+Ipv4AppTracer::Ipv4AppTracer (Ptr<Node> node, const std::string &appId)
+ : m_appId (appId)
+ , m_nodePtr (node)
+{
+ m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
+
+ Connect ();
+
+ string name = Names::FindName (node);
+ if (!name.empty ())
+ {
+ m_node = name;
+ }
+}
+
+void
+Ipv4AppTracer::Connect ()
+{
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/SendOutgoing",
+ MakeCallback (&Ipv4AppTracer::Tx, this));
+
+ Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/LocalDeliver",
+ MakeCallback (&Ipv4AppTracer::Rx, this));
+
+ // Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/Tx",
+ // MakeCallback (&Ipv4AppTracer::Rx, this));
+
+ // Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::PacketSink/Rx",
+ // MakeCallback (&Ipv4AppTracer::InData, this));
+
+ // Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::BulkSendApplication/Tx",
+ // MakeCallback (&Ipv4AppTracer::OutData, this));
+}
+
+
+} // namespace ns3
diff --git a/helper/tracers/ipv4-app-tracer.h b/helper/tracers/ipv4-app-tracer.h
new file mode 100644
index 0000000..f24c6c3
--- /dev/null
+++ b/helper/tracers/ipv4-app-tracer.h
@@ -0,0 +1,74 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012 UCLA
+ *
+ * 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 IPV4_APP_TRACER_H
+#define IPV4_APP_TRACER_H
+
+#include "ns3/ptr.h"
+#include "ns3/simple-ref-count.h"
+#include "ns3/ipv4.h"
+
+namespace ns3 {
+
+class Ipv4Header;
+
+class Ipv4AppTracer : public SimpleRefCount<Ipv4AppTracer>
+{
+public:
+ Ipv4AppTracer (Ptr<Node> node, const std::string &appId = "*");
+ virtual ~Ipv4AppTracer () { };
+
+ void
+ Connect ();
+
+ virtual void
+ PrintHeader (std::ostream &os) const = 0;
+
+ virtual void
+ Print (std::ostream &os) const = 0;
+
+ virtual void
+ Rx (std::string context,
+ const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
+
+ virtual void
+ Tx (std::string context,
+ const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
+
+protected:
+ std::string m_app;
+ std::string m_appId;
+ std::string m_node;
+ Ptr<Node> m_nodePtr;
+};
+
+inline std::ostream&
+operator << (std::ostream &os, const Ipv4AppTracer &tracer)
+{
+ os << "# ";
+ tracer.PrintHeader (os);
+ os << "\n";
+ tracer.Print (os);
+ return os;
+}
+
+} // namespace ns3
+
+#endif // IPV4_APP_TRACER_H
diff --git a/helper/tracers/ipv4-seqs-app-tracer.cc b/helper/tracers/ipv4-seqs-app-tracer.cc
new file mode 100644
index 0000000..3147ed0
--- /dev/null
+++ b/helper/tracers/ipv4-seqs-app-tracer.cc
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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>
+ */
+
+#include "ipv4-seqs-app-tracer.h"
+#include "ns3/node.h"
+#include "ns3/packet.h"
+#include "ns3/config.h"
+#include "ns3/callback.h"
+#include "ns3/simulator.h"
+
+#include "ns3/tcp-l4-protocol.h"
+#include "ns3/tcp-header.h"
+#include "ns3/ipv4-header.h"
+
+namespace ns3 {
+
+Ipv4SeqsAppTracer::Ipv4SeqsAppTracer (std::ostream &os, Ptr<Node> node, const std::string &appId)
+ : Ipv4AppTracer (node, appId)
+ , m_os (os)
+{
+}
+
+void
+Ipv4SeqsAppTracer::Reset ()
+{
+}
+
+void
+Ipv4SeqsAppTracer::PrintHeader (std::ostream &os) const
+{
+ os << "Time\t"
+ << "Node\t"
+ << "AppName\t"
+ << "AppId\t"
+ << "Type\t"
+ << "SeqNo";
+}
+
+void
+Ipv4SeqsAppTracer::Print (std::ostream &os) const
+{
+}
+
+#define PRINTER(type,size) \
+ m_os \
+ << Simulator::Now ().ToDouble (Time::S) << "\t" \
+ << m_node << "\t" \
+ << m_app << "\t" \
+ << m_appId << "\t" \
+ << type << "\t" \
+ << size / 1040.0 << std::endl;
+
+void
+Ipv4SeqsAppTracer::Tx (std::string context,
+ const Ipv4Header &ip, Ptr<const Packet>, uint32_t)
+{
+ if (ip.GetProtocol () != TcpL4Protocol::PROT_NUMBER) return;
+}
+
+void
+Ipv4SeqsAppTracer::Rx (std::string context,
+ const Ipv4Header &ip, Ptr<const Packet> pktOrig, uint32_t)
+{
+ if (ip.GetProtocol () != TcpL4Protocol::PROT_NUMBER) return;
+
+ TcpHeader tcp;
+ Ptr<Packet> packet = pktOrig->Copy ();
+ packet->RemoveHeader (tcp);
+
+ if (tcp.GetFlags () | TcpHeader::ACK)
+ {
+ PRINTER("InAck", tcp.GetAckNumber ().GetValue ());
+ }
+}
+
+
+// void
+// Ipv4SeqsAppTracer::InData (std::string context,
+// Ptr<const Packet> packet, const Address &address)
+// {
+// PRINTER ("InData", m_inSeq);
+// m_inSeq += packet->GetSize ();
+// }
+
+// void
+// Ipv4SeqsAppTracer::OutData (std::string context,
+// Ptr<const Packet> packet)
+// {
+// PRINTER ("OutData", m_outSeq);
+// m_outSeq += packet->GetSize ();
+// }
+
+} // namespace ns3
diff --git a/helper/tracers/ipv4-seqs-app-tracer.h b/helper/tracers/ipv4-seqs-app-tracer.h
new file mode 100644
index 0000000..4805968
--- /dev/null
+++ b/helper/tracers/ipv4-seqs-app-tracer.h
@@ -0,0 +1,58 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2011 UCLA
+ *
+ * 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 IPV4_SEQS_APP_TRACER_H
+#define IPV4_SEQS_APP_TRACER_H
+
+#include "ns3/ipv4-app-tracer.h"
+
+namespace ns3 {
+
+class Ipv4SeqsAppTracer : public Ipv4AppTracer
+{
+public:
+ Ipv4SeqsAppTracer (std::ostream &os, Ptr<Node> node, const std::string &appId = "*");
+ virtual ~Ipv4SeqsAppTracer () { };
+
+ virtual void
+ PrintHeader (std::ostream &os) const;
+
+ virtual void
+ Print (std::ostream &os) const;
+
+ virtual void
+ Rx (std::string context,
+ const Ipv4Header &, Ptr<const Packet>, uint32_t);
+
+ virtual void
+ Tx (std::string context,
+ const Ipv4Header &, Ptr<const Packet>, uint32_t);
+
+protected:
+ void
+ Reset ();
+
+protected:
+ std::ostream& m_os;
+};
+
+} // namespace ns3
+
+#endif // IPV4_AGGREGATE_APP_TRACER_H
diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index 15c0d6b..194a90c 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -52,10 +52,11 @@
NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
-AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path)
+AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path, double scale/*=1.0*/)
: m_path (path)
, m_randX (0, 100.0)
, m_randY (0, 100.0)
+ , m_scale (scale)
{
NS_LOG_FUNCTION (this);
@@ -100,21 +101,28 @@
loc->SetPosition (Vector (posX, posY, 0));
Names::Add (m_path, name, node);
+ m_nodes.Add (node);
return node;
}
NodeContainer
+AnnotatedTopologyReader::GetNodes () const
+{
+ return m_nodes;
+}
+
+
+NodeContainer
AnnotatedTopologyReader::Read (void)
{
ifstream topgen;
topgen.open (GetFileName ().c_str ());
- NodeContainer nodes;
if ( !topgen.is_open () )
{
NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
- return nodes;
+ return m_nodes;
}
while (!topgen.eof ())
@@ -137,8 +145,9 @@
double latitude, longitude;
lineBuffer >> name >> city >> latitude >> longitude;
- Ptr<Node> node = CreateNode (name, 2*longitude, -2*latitude);
- nodes.Add (node);
+ if (name.empty ()) continue;
+
+ Ptr<Node> node = CreateNode (name, m_scale*longitude, -m_scale*latitude);
}
map<string, set<string> > processedLinks; // to eliminate duplications
@@ -154,9 +163,9 @@
// NS_LOG_DEBUG ("Input: [" << line << "]");
istringstream lineBuffer (line);
- string from, to, capacity, metric, delay, queueSizeNode1, queueSizeNode2;
+ string from, to, capacity, metric, delay, maxPackets;
- lineBuffer >> from >> to >> capacity >> metric >> delay >> queueSizeNode1 >> queueSizeNode2;
+ lineBuffer >> from >> to >> capacity >> metric >> delay >> maxPackets;
if (processedLinks[to].size () != 0 &&
processedLinks[to].find (from) != processedLinks[to].end ())
@@ -177,21 +186,19 @@
if (!delay.empty ())
link.SetAttribute ("Delay", delay);
- if (!queueSizeNode1.empty ())
- link.SetAttribute ("QueueSizeNode1", queueSizeNode1);
- if (!queueSizeNode2.empty ())
- link.SetAttribute ("QueueSizeNode2", queueSizeNode2);
+ if (!maxPackets.empty ())
+ link.SetAttribute ("MaxPackets", maxPackets);
AddLink (link);
- NS_LOG_DEBUG ("New link " << from << " <==> " << to << " / " << capacity << "Kbps with " << metric << " metric");
+ NS_LOG_DEBUG ("New link " << from << " <==> " << to << " / " << capacity << " with " << metric << " metric (" << delay << ", " << maxPackets << ")");
}
- NS_LOG_INFO ("Annotated topology created with " << nodes.GetN () << " nodes and " << LinksSize () << " links");
+ NS_LOG_INFO ("Annotated topology created with " << m_nodes.GetN () << " nodes and " << LinksSize () << " links");
topgen.close ();
ApplySettings ();
- return nodes;
+ return m_nodes;
}
void
@@ -252,38 +259,34 @@
if (link.GetAttributeFailSafe ("DataRate", tmp))
{
- NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate")+"Kbps");
- p2p.SetDeviceAttribute ("DataRate", StringValue(link.GetAttribute("DataRate")+"Kbps"));
+ NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate"));
+ p2p.SetDeviceAttribute ("DataRate", StringValue (link.GetAttribute ("DataRate")));
}
- if (link.GetAttributeFailSafe("Delay", tmp))
+ if (link.GetAttributeFailSafe ("Delay", tmp))
{
- NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay")+"ms");
- p2p.SetChannelAttribute ("Delay", StringValue(link.GetAttribute("Delay")+"ms"));
+ NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay"));
+ p2p.SetChannelAttribute ("Delay", StringValue (link.GetAttribute ("Delay")));
}
-
+
NetDeviceContainer nd = p2p.Install(link.GetFromNode (), link.GetToNode ());
link.SetNetDevices (nd.Get (0), nd.Get (1));
- if (link.GetAttributeFailSafe("QueueSizeNode1", tmp))
+ if (link.GetAttributeFailSafe ("MaxPackets", tmp))
{
- PointerValue txQueueFrom;
- link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueueFrom);
- NS_ASSERT (txQueueFrom.Get<DropTailQueue> () != 0);
+ NS_LOG_INFO ("MaxPackets = " + link.GetAttribute ("MaxPackets"));
- NS_LOG_INFO ("QueueFrom: " << link.GetAttribute("QueueSizeNode1"));
- txQueueFrom.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode1")));
+ PointerValue txQueue;
+
+ link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueue);
+ NS_ASSERT (txQueue.Get<DropTailQueue> () != 0);
+ txQueue.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute ("MaxPackets")));
+
+ link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueue);
+ NS_ASSERT (txQueue.Get<DropTailQueue> () != 0);
+ txQueue.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute ("MaxPackets")));
}
-
- if (link.GetAttributeFailSafe("QueueSizeNode2", tmp))
- {
- PointerValue txQueueTo;
- link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueueTo);
- NS_ASSERT (txQueueTo.Get<DropTailQueue> () != 0);
- NS_LOG_INFO ("QueueTo: " << link.GetAttribute("QueueSizeNode2"));
- txQueueTo.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode2")));
- }
}
}
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index 4bacd2a..b9268b8 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -39,10 +39,11 @@
* \brief Constructor
*
* \param path ns3::Names path
+ * \param scale Scaling factor for coordinates in input file
*
* \see ns3::Names class
*/
- AnnotatedTopologyReader (const std::string &path="");
+ AnnotatedTopologyReader (const std::string &path="", double scale=1.0);
virtual ~AnnotatedTopologyReader ();
/**
@@ -52,8 +53,14 @@
*
* \return the container of the nodes created (or empty container if there was an error)
*/
- virtual
- NodeContainer Read (void);
+ virtual NodeContainer
+ Read ();
+
+ /**
+ * \brief Get nodes read by the reader
+ */
+ NodeContainer
+ GetNodes () const;
/**
* \brief Assign IPv4 addresses to all links
@@ -91,6 +98,7 @@
protected:
std::string m_path;
+ NodeContainer m_nodes;
private:
AnnotatedTopologyReader (const AnnotatedTopologyReader&);
@@ -100,6 +108,7 @@
UniformVariable m_randY;
ObjectFactory m_mobilityFactory;
+ double m_scale;
};
}
diff --git a/model/ccnx-bestroute-strategy.cc b/model/ccnx-bestroute-strategy.cc
index b850d08..2bbe287 100644
--- a/model/ccnx-bestroute-strategy.cc
+++ b/model/ccnx-bestroute-strategy.cc
@@ -19,7 +19,10 @@
*/
#include "ccnx-bestroute-strategy.h"
+
#include "ccnx-interest-header.h"
+#include "ccnx-pit.h"
+#include "ccnx-pit-entry.h"
#include "ns3/assert.h"
#include "ns3/log.h"
@@ -83,6 +86,7 @@
if (outgoing != pitEntry.m_outgoing.end () &&
outgoing->m_retxCount >= pitEntry.m_maxRetxCount)
{
+ NS_LOG_ERROR (outgoing->m_retxCount << " >= " << pitEntry.m_maxRetxCount);
continue; // already forwarded before during this retransmission cycle
}
@@ -96,6 +100,7 @@
ll::bind(&CcnxPitEntry::AddOutgoing, ll::_1, metricFace.m_face));
metricFace.m_face->Send (packet->Copy ());
+ m_transmittedInterestsTrace (header, metricFace.m_face);
propagatedCount++;
break; // do only once
diff --git a/model/ccnx-content-store.cc b/model/ccnx-content-store.cc
index 4875386..b0c4858 100644
--- a/model/ccnx-content-store.cc
+++ b/model/ccnx-content-store.cc
@@ -150,7 +150,7 @@
}
-boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader> >
+boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
CcnxContentStore::Lookup (Ptr<const CcnxInterestHeader> interest)
{
NS_LOG_FUNCTION_NOARGS ();
@@ -162,9 +162,9 @@
m_contentStore.project<i_mru> (it));
// return fully formed CCNx packet
- return boost::make_tuple (it->GetFullyFormedCcnxPacket (), it->GetHeader ());
+ return boost::make_tuple (it->GetFullyFormedCcnxPacket (), it->GetHeader (), it->GetPacket ());
}
- return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader> > (0, 0);
+ return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader>, Ptr<Packet> > (0, 0, 0);
}
void
diff --git a/model/ccnx-content-store.h b/model/ccnx-content-store.h
index dd0f884..9f07a47 100644
--- a/model/ccnx-content-store.h
+++ b/model/ccnx-content-store.h
@@ -174,7 +174,7 @@
* If an entry is found, it is promoted to the top of most recent
* used entries index, \see m_contentStore
*/
- boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader> >
+ boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
Lookup (Ptr<const CcnxInterestHeader> interest);
/**
@@ -215,22 +215,6 @@
* Release build dumps everything in MRU order
*/
void Print () const;
-
-protected:
- // /**
- // * \brief Move the given CS entry to the head of the list
- // *
- // * \param entry Content Store entry
- // */
- // void Promote( CsEntry &entry );
-
- /**
- * \todo Alex: DoDispose and NotifyNewAggregate are seem to be very
- * important, but I'm not yet sure what exactly they are supposed to
- * do
- */
- // virtual void DoDispose ();
- // virtual void NotifyNewAggregate ();
private:
CcnxContentStore (const CcnxContentStore &o); ///< Disabled copy constructor
@@ -244,7 +228,7 @@
* \brief Content store implemented as a Boost.MultiIndex container
* \internal
*/
- CcnxContentStoreContainer::type m_contentStore;
+ CcnxContentStoreContainer::type m_contentStore;
};
inline std::ostream&
diff --git a/model/ccnx-face.cc b/model/ccnx-face.cc
index 17d0612..77122e0 100644
--- a/model/ccnx-face.cc
+++ b/model/ccnx-face.cc
@@ -27,6 +27,7 @@
#include "ns3/assert.h"
#include "ns3/uinteger.h"
#include "ns3/double.h"
+#include "ns3/simulator.h"
#include <boost/ref.hpp>
@@ -72,6 +73,7 @@
, m_protocolHandler (MakeNullCallback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>&> ())
, m_ifup (false)
, m_id ((uint32_t)-1)
+ , m_lastLeakTime (0)
{
NS_LOG_FUNCTION (this);
@@ -109,10 +111,12 @@
if (!IsUp ())
return false;
+
+ LeakBucket ();
if (m_bucketMax > 0)
{
- //NS_LOG_DEBUG ("Limits enabled: " << m_bucketMax << ", current: " << m_bucket);
+ NS_LOG_DEBUG ("Limits enabled: " << m_bucketMax << ", current: " << m_bucket);
if (m_bucket+1.0 > m_bucketMax)
{
//NS_LOG_DEBUG ("Returning false");
@@ -155,10 +159,21 @@
}
void
-CcnxFace::LeakBucket (const Time &interval)
+CcnxFace::LeakBucket ()
{
+ if (m_lastLeakTime.IsZero ())
+ {
+ m_lastLeakTime = Simulator::Now ();
+ return;
+ }
+
+ Time interval = Simulator::Now () - m_lastLeakTime;
const double leak = m_bucketLeak * interval.ToDouble (Time::S);
- m_bucket = std::max (0.0, m_bucket - leak);
+ if (leak >= 1.0)
+ {
+ m_bucket = std::max (0.0, m_bucket - leak);
+ m_lastLeakTime = Simulator::Now ();
+ }
// NS_LOG_DEBUG ("max: " << m_bucketMax << ", Current bucket: " << m_bucket << ", leak size: " << leak << ", interval: " << interval << ", " << m_bucketLeak);
}
@@ -177,12 +192,6 @@
m_bucketLeak = leak;
}
-void
-CcnxFace::LeakBucketByOnePacket ()
-{
- m_bucket = std::max (0.0, m_bucket-1.0);
-}
-
// void
// CcnxFace::SetMetric (uint16_t metric)
// {
@@ -202,6 +211,7 @@
* NetDevice states, such as found in real implementations
* (where the device may be down but face state is still up).
*/
+
bool
CcnxFace::IsUp (void) const
{
diff --git a/model/ccnx-face.h b/model/ccnx-face.h
index e0deb2a..df488dc 100644
--- a/model/ccnx-face.h
+++ b/model/ccnx-face.h
@@ -178,16 +178,12 @@
SetBucketLeak (double leak);
/**
- * @brief Leak the Interest allowance bucket by (1/interval) * m_bucketMax amount
- *
- * @param interval Time interval with which the bucket is leaked
+ * @brief Leak the Interest allowance bucket by (1/interval) * m_bucketMax amount,
+ * where interval is time between two consecutive calls of LeakBucket
*/
void
- LeakBucket (const Time &interval);
+ LeakBucket ();
- void
- LeakBucketByOnePacket ();
-
/**
* \brief Compare two faces. Only two faces on the same node could be compared.
*
@@ -228,7 +224,8 @@
private:
ProtocolHandler m_protocolHandler; ///< Callback via which packets are getting send to CCNx stack
bool m_ifup; ///< \brief flag indicating that the interface is UP
- uint32_t m_id; ///< \brief id of the interface in CCNx stack (per-node uniqueness)
+ uint32_t m_id; ///< \brief id of the interface in CCNx stack (per-node uniqueness)
+ Time m_lastLeakTime;
};
std::ostream& operator<< (std::ostream& os, const CcnxFace &face);
diff --git a/model/ccnx-flooding-strategy.cc b/model/ccnx-flooding-strategy.cc
index 4a8dd50..5b8542d 100644
--- a/model/ccnx-flooding-strategy.cc
+++ b/model/ccnx-flooding-strategy.cc
@@ -19,10 +19,13 @@
*/
#include "ccnx-flooding-strategy.h"
+#include "ccnx-interest-header.h"
+#include "ccnx-pit.h"
+#include "ccnx-pit-entry.h"
+
#include "ns3/assert.h"
#include "ns3/log.h"
#include "ns3/simulator.h"
-#include "ccnx-interest-header.h"
#include <boost/ref.hpp>
#include <boost/foreach.hpp>
@@ -114,6 +117,7 @@
// }
metricFace.m_face->Send (packet->Copy ());
+ m_transmittedInterestsTrace (header, metricFace.m_face);
propagatedCount++;
}
diff --git a/model/ccnx-forwarding-strategy.cc b/model/ccnx-forwarding-strategy.cc
index 4a1c3a8..fbd4613 100644
--- a/model/ccnx-forwarding-strategy.cc
+++ b/model/ccnx-forwarding-strategy.cc
@@ -24,6 +24,11 @@
#include "ccnx-forwarding-strategy.h"
#include "ns3/log.h"
#include "ns3/simulator.h"
+#include "ns3/double.h"
+
+#include "ccnx-pit.h"
+#include "ccnx-pit-entry.h"
+
#include "ccnx-interest-header.h"
#include <boost/ref.hpp>
@@ -45,6 +50,10 @@
static TypeId tid = TypeId ("ns3::CcnxForwardingStrategy")
.SetGroupName ("Ccnx")
.SetParent<Object> ()
+
+ .AddTraceSource ("OutInterests", "Interests that were transmitted",
+ MakeTraceSourceAccessor (&CcnxForwardingStrategy::m_transmittedInterestsTrace))
+
;
return tid;
}
@@ -69,7 +78,7 @@
Ptr<CcnxInterestHeader> &header,
const Ptr<const Packet> &packet)
{
- // NS_LOG_FUNCTION (this);
+ NS_LOG_FUNCTION (this);
int propagatedCount = 0;
@@ -88,6 +97,7 @@
if (outgoing != pitEntry.m_outgoing.end () &&
outgoing->m_retxCount >= pitEntry.m_maxRetxCount)
{
+ NS_LOG_DEBUG ("retxCount: " << outgoing->m_retxCount << ", maxRetxCount: " << pitEntry.m_maxRetxCount);
continue;
}
@@ -102,6 +112,7 @@
ll::bind(&CcnxPitEntry::AddOutgoing, ll::_1, metricFace.m_face));
metricFace.m_face->Send (packet->Copy ());
+ m_transmittedInterestsTrace (header, metricFace.m_face);
propagatedCount++;
break; // propagate only one interest
@@ -117,5 +128,4 @@
return propagatedCount > 0;
}
-
} //namespace ns3
diff --git a/model/ccnx-forwarding-strategy.h b/model/ccnx-forwarding-strategy.h
index 9fae7b1..23c15a5 100644
--- a/model/ccnx-forwarding-strategy.h
+++ b/model/ccnx-forwarding-strategy.h
@@ -24,16 +24,14 @@
#include "ns3/packet.h"
#include "ns3/callback.h"
#include "ns3/object.h"
-
-#include "ccnx.h"
-#include "ccnx-fib.h"
-#include "ccnx-pit.h"
-#include "ccnx-pit-entry.h"
+#include "ns3/traced-callback.h"
namespace ns3 {
class CcnxFace;
class CcnxInterestHeader;
+class CcnxPit;
+class CcnxPitEntry;
/**
* \ingroup ccnx
@@ -74,7 +72,7 @@
*/
void
SetPit (Ptr<CcnxPit> pit);
-
+
protected:
/**
* @brief Propagate interest via a green interface. Fail, if no green interfaces available
@@ -93,10 +91,11 @@
const Ptr<CcnxFace> &incomingFace,
Ptr<CcnxInterestHeader> &header,
const Ptr<const Packet> &packet);
+
+ TracedCallback<Ptr<const CcnxInterestHeader>, Ptr<const CcnxFace> > m_transmittedInterestsTrace;
protected:
Ptr<CcnxPit> m_pit;
- Ptr<Ccnx> m_ccnx; // just for tracing purposes. Should not be used in any other way
};
} //namespace ns3
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index fb1e5e4..223c578 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -31,6 +31,7 @@
#include "ns3/pointer.h"
#include "ns3/boolean.h"
#include "ns3/string.h"
+#include "ns3/simulator.h"
#include "ns3/ccnx-header-helper.h"
@@ -74,31 +75,12 @@
MakePointerAccessor (&CcnxL3Protocol::SetForwardingStrategy, &CcnxL3Protocol::GetForwardingStrategy),
MakePointerChecker<CcnxForwardingStrategy> ())
- .AddAttribute ("BucketLeakInterval",
- "Interval to leak buckets",
- StringValue ("10ms"),
- MakeTimeAccessor (&CcnxL3Protocol::GetBucketLeakInterval,
- &CcnxL3Protocol::SetBucketLeakInterval),
- MakeTimeChecker ())
-
- .AddTraceSource ("TransmittedInterestTrace", "Interests that were transmitted",
- MakeTraceSourceAccessor (&CcnxL3Protocol::m_transmittedInterestsTrace))
-
- .AddTraceSource ("ReceivedInterestTrace", "Interests that were received",
- MakeTraceSourceAccessor (&CcnxL3Protocol::m_receivedInterestsTrace))
-
- .AddTraceSource ("DroppedInterestTrace", "Interests that were dropped",
- MakeTraceSourceAccessor (&CcnxL3Protocol::m_droppedInterestsTrace))
-
- .AddTraceSource ("ReceivedDataTrace", "Data that were received",
- MakeTraceSourceAccessor (&CcnxL3Protocol::m_receivedDataTrace))
-
- .AddTraceSource ("TransmittedDataTrace", "Data that were transmitted",
- MakeTraceSourceAccessor (&CcnxL3Protocol::m_transmittedDataTrace))
-
- .AddTraceSource ("DroppedDataTrace", "Data that were dropped",
- MakeTraceSourceAccessor (&CcnxL3Protocol::m_droppedDataTrace))
-
+ // .AddAttribute ("BucketLeakInterval",
+ // "Interval to leak buckets",
+ // StringValue ("100ms"),
+ // MakeTimeAccessor (&CcnxL3Protocol::GetBucketLeakInterval,
+ // &CcnxL3Protocol::SetBucketLeakInterval),
+ // MakeTimeChecker ())
;
return tid;
}
@@ -152,9 +134,6 @@
{
NS_LOG_FUNCTION (this);
- if (m_bucketLeakEvent.IsRunning ())
- m_bucketLeakEvent.Cancel ();
-
for (CcnxFaceList::iterator i = m_faces.begin (); i != m_faces.end (); ++i)
{
*i = 0;
@@ -318,18 +297,17 @@
const Ptr<const Packet> &packet)
{
NS_LOG_FUNCTION (incomingFace << header << packet);
+ m_inNacks (header, incomingFace);
tuple<const CcnxPitEntry&,bool,bool> ret = m_pit->Lookup (*header);
CcnxPitEntry const& pitEntry = ret.get<0> ();
bool isNew = ret.get<1> ();
bool isDuplicated = ret.get<2> ();
- // NS_ASSERT_MSG (isDuplicated,
- // "NACK should be a duplicated interest");
if (isNew || !isDuplicated) // potential flow
{
// somebody is doing something bad
- m_droppedInterestsTrace (header, NACK_NONDUPLICATE, m_node->GetObject<Ccnx> (), incomingFace);
+ m_dropNacks (header, NON_DUPLICATED, incomingFace);
return;
}
@@ -338,10 +316,11 @@
if (outFace == pitEntry.m_outgoing.end ())
{
- NS_ASSERT_MSG (false,
- "Node " << GetObject<Node> ()->GetId () << ", outgoing entry should exist for face " << boost::cref(*incomingFace) << "\n" <<
- "size: " << pitEntry.m_outgoing.size ());
+// NS_ASSERT_MSG (false,
+// "Node " << GetObject<Node> ()->GetId () << ", outgoing entry should exist for face " << boost::cref(*incomingFace) << "\n" <<
+// "size: " << pitEntry.m_outgoing.size ());
+ // m_dropNacks (header, NON_DUPLICATE, incomingFace);
return;
}
@@ -371,7 +350,7 @@
if (pitEntry.m_incoming.size () == 0) // interest was actually satisfied
{
// no need to do anything
- m_droppedInterestsTrace (header, NACK_AFTER_SATISFIED, m_node->GetObject<Ccnx> (), incomingFace);
+ m_dropNacks (header, AFTER_SATISFIED, incomingFace);
return;
}
@@ -380,7 +359,7 @@
NS_LOG_DEBUG ("Not all outgoing are in vain");
// suppress
// Don't do anything, we are still expecting data from some other face
- m_droppedInterestsTrace (header, NACK_SUPPRESSED, m_node->GetObject<Ccnx> (), incomingFace);
+ m_dropNacks (header, SUPPRESSED, incomingFace);
return;
}
@@ -397,7 +376,10 @@
// // If no interests was propagated, then there is not other option for forwarding or
// // ForwardingStrategy failed to find it.
if (!propagated)
- GiveUpInterest (pitEntry, header);
+ {
+ m_dropNacks (header, NO_FACES, incomingFace); // this headers doesn't have NACK flag set
+ GiveUpInterest (pitEntry, header);
+ }
}
// Processing Interests
@@ -409,7 +391,7 @@
const Ptr<const Packet> &packet)
{
NS_LOG_FUNCTION (incomingFace << header << packet);
- //m_receivedInterestsTrace (header, m_node->GetObject<Ccnx> (), incomingFace);
+ m_inInterests (header, incomingFace);
// Lookup of Pit (and associated Fib) entry for this Interest
tuple<const CcnxPitEntry&,bool,bool> ret = m_pit->Lookup (*header);
@@ -417,40 +399,41 @@
// bool isNew = ret.get<1> ();
bool isDuplicated = ret.get<2> ();
+ // NS_LOG_DEBUG ("isNew: " << isNew << ", isDup: " << isDuplicated);
+
if (isDuplicated)
{
+ m_dropInterests (header, DUPLICATED, incomingFace);
+
/**
* This condition will handle "routing" loops and also recently satisfied interests.
* Every time interest is satisfied, PIT entry (with empty incoming and outgoing faces)
* is kept for another small chunk of time.
*/
- // //Trace duplicate interest
- // m_droppedInterestsTrace (header, NDN_DUPLICATE_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
-
NS_LOG_DEBUG ("Sending NACK_LOOP");
header->SetNack (CcnxInterestHeader::NACK_LOOP);
Ptr<Packet> nack = Create<Packet> ();
nack->AddHeader (*header);
incomingFace->Send (nack);
+ m_outNacks (header, incomingFace);
- // //Trace duplicate interest
- m_droppedInterestsTrace (header, NDN_DUPLICATE_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
return;
}
Ptr<Packet> contentObject;
- Ptr<const CcnxContentObjectHeader> contentObjectHeader; // unused for now
- tie (contentObject, contentObjectHeader) = m_contentStore->Lookup (header);
+ Ptr<const CcnxContentObjectHeader> contentObjectHeader; // used for tracing
+ Ptr<const Packet> payload; // used for tracing
+ tie (contentObject, contentObjectHeader, payload) = m_contentStore->Lookup (header);
if (contentObject != 0)
{
NS_ASSERT (contentObjectHeader != 0);
NS_LOG_LOGIC("Found in cache");
- m_transmittedDataTrace (contentObjectHeader, contentObject, CACHED, m_node->GetObject<Ccnx> (), incomingFace);
incomingFace->Send (contentObject);
+ m_outData (contentObjectHeader, payload, true, incomingFace);
// Set pruning timout on PIT entry (instead of deleting the record)
m_pit->modify (m_pit->iterator_to (pitEntry),
@@ -481,6 +464,8 @@
ll::var(inFace) = ll::bind (&CcnxPitEntry::AddIncoming, ll::_1, incomingFace));
}
+ NS_LOG_DEBUG ("IsRetx: " << isRetransmitted);
+
// update PIT entry lifetime
m_pit->modify (m_pit->iterator_to (pitEntry),
ll::bind (&CcnxPitEntry::UpdateLifetime, ll::_1,
@@ -504,9 +489,8 @@
if (!isRetransmitted &&
pitEntry.AreTherePromisingOutgoingFacesExcept (incomingFace))
{ // Suppress this interest if we're still expecting data from some other face
-
- // We are already expecting data later in future. Suppress the interest
- m_droppedInterestsTrace (header, NDN_SUPPRESSED_INTEREST, m_node->GetObject<Ccnx> (), incomingFace);
+
+ m_dropInterests (header, SUPPRESSED, incomingFace);
return;
}
@@ -534,35 +518,13 @@
// If no interests was propagated, then there is not other option for forwarding or
// ForwardingStrategy failed to find it.
if (!propagated)
- GiveUpInterest (pitEntry, header);
-}
-
-void
-CcnxL3Protocol::GiveUpInterest (const CcnxPitEntry &pitEntry,
- Ptr<CcnxInterestHeader> header)
-{
- Ptr<Packet> packet = Create<Packet> ();
- header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
- packet->AddHeader (*header);
-
- BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
{
- incoming.m_face->Send (packet->Copy ());
-
- //m_droppedInterestsTrace (header, DROP_CONGESTION,
- // m_node->GetObject<Ccnx> (), incomingFace);
+ NS_LOG_DEBUG ("Not propagated");
+ m_dropInterests (header, NO_FACES, incomingFace);
+ GiveUpInterest (pitEntry, header);
}
- // All incoming interests cannot be satisfied. Remove them
- m_pit->modify (m_pit->iterator_to (pitEntry),
- ll::bind (&CcnxPitEntry::ClearIncoming, ll::_1));
-
- // Set pruning timout on PIT entry (instead of deleting the record)
- m_pit->modify (m_pit->iterator_to (pitEntry),
- ll::bind (&CcnxPitEntry::SetExpireTime, ll::_1,
- Simulator::Now () + m_pit->GetPitEntryPruningTimeout ()));
}
-
// Processing ContentObjects
void
CcnxL3Protocol::OnData (const Ptr<CcnxFace> &incomingFace,
@@ -572,7 +534,7 @@
{
NS_LOG_FUNCTION (incomingFace << header << payload << packet);
- m_receivedDataTrace (header, payload, m_node->GetObject<Ccnx> (), incomingFace);
+ m_inData (header, payload, incomingFace);
// 1. Lookup PIT entry
try
@@ -617,7 +579,10 @@
BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
{
if (incoming.m_face != incomingFace)
- incoming.m_face->Send (packet->Copy ());
+ {
+ incoming.m_face->Send (packet->Copy ());
+ m_outData (header, payload, false, incoming.m_face);
+ }
// successfull forwarded data trace
}
@@ -636,42 +601,70 @@
// (unsolicited data packets should not "poison" content store)
//drop dulicated or not requested data packet
- m_droppedDataTrace (header, payload, NDN_UNSOLICITED_DATA, m_node->GetObject<Ccnx> (), incomingFace);
+ m_dropData (header, payload, UNSOLICITED, incomingFace);
return; // do not process unsoliced data packets
}
}
void
-CcnxL3Protocol::SetBucketLeakInterval (Time interval)
+CcnxL3Protocol::GiveUpInterest (const CcnxPitEntry &pitEntry,
+ Ptr<CcnxInterestHeader> header)
{
- m_bucketLeakInterval = interval;
-
- if (m_bucketLeakEvent.IsRunning ())
- m_bucketLeakEvent.Cancel ();
+ Ptr<Packet> packet = Create<Packet> ();
+ header->SetNack (CcnxInterestHeader::NACK_GIVEUP_PIT);
+ packet->AddHeader (*header);
- m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
- &CcnxL3Protocol::LeakBuckets, this);
-}
-
-Time
-CcnxL3Protocol::GetBucketLeakInterval () const
-{
- return m_bucketLeakInterval;
-}
-
-void
-CcnxL3Protocol::LeakBuckets ()
-{
- // NS_LOG_FUNCTION (this);
-
- BOOST_FOREACH (const Ptr<CcnxFace> &face, m_faces)
+ BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
{
- face->LeakBucket (m_bucketLeakInterval);
- }
+ incoming.m_face->Send (packet->Copy ());
- m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
- &CcnxL3Protocol::LeakBuckets,
- this);
+ m_outNacks (header, incoming.m_face);
+ }
+ // All incoming interests cannot be satisfied. Remove them
+ m_pit->modify (m_pit->iterator_to (pitEntry),
+ ll::bind (&CcnxPitEntry::ClearIncoming, ll::_1));
+
+ // Remove also outgoing
+ m_pit->modify (m_pit->iterator_to (pitEntry),
+ ll::bind (&CcnxPitEntry::ClearOutgoing, ll::_1));
+
+ // Set pruning timout on PIT entry (instead of deleting the record)
+ m_pit->modify (m_pit->iterator_to (pitEntry),
+ ll::bind (&CcnxPitEntry::SetExpireTime, ll::_1,
+ Simulator::Now () + m_pit->GetPitEntryPruningTimeout ()));
}
+// void
+// CcnxL3Protocol::SetBucketLeakInterval (Time interval)
+// {
+// m_bucketLeakInterval = interval;
+
+// if (m_bucketLeakEvent.IsRunning ())
+// m_bucketLeakEvent.Cancel ();
+
+// m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
+// &CcnxL3Protocol::LeakBuckets, this);
+// }
+
+// Time
+// CcnxL3Protocol::GetBucketLeakInterval () const
+// {
+// return m_bucketLeakInterval;
+// }
+
+// void
+// CcnxL3Protocol::LeakBuckets ()
+// {
+// // NS_LOG_FUNCTION (this);
+
+// BOOST_FOREACH (const Ptr<CcnxFace> &face, m_faces)
+// {
+// face->LeakBucket (m_bucketLeakInterval);
+// }
+
+// m_bucketLeakEvent = Simulator::Schedule (m_bucketLeakInterval,
+// &CcnxL3Protocol::LeakBuckets,
+// this);
+// }
+
} //namespace ns3
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 29500fc..d3e1b44 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -23,14 +23,11 @@
#include <list>
#include <vector>
-#include <stdint.h>
+
#include "ns3/ptr.h"
#include "ns3/net-device.h"
-#include "ns3/traced-callback.h"
#include "ns3/nstime.h"
-#include "ns3/simulator.h"
-#include "ns3/ccnx-producer-helper.h"
#include "ccnx-content-store.h"
#include "ccnx-pit.h"
#include "ccnx-fib.h"
@@ -87,36 +84,6 @@
virtual ~CcnxL3Protocol ();
/**
- * \enum DropReason
- * \brief Reason why a packet has been dropped.
- */
- enum DropReason
- {
- NDN_DUPLICATE_INTEREST, ///< \brief Duplicate Interest
- NDN_SUPPRESSED_INTEREST, ///< \brief Suppressed Interest
- NDN_UNSOLICITED_DATA, ///< \brief Unsolicited ContentObject(duplicate?)
- NDN_PIT_TIMER_EXPIRED,
- INTERFACE_DOWN, ///< \brief Interface is down
-
- NACK_SUPPRESSED,
- NACK_AFTER_SATISFIED,
- NACK_NONDUPLICATE,
-
- DROP_NO_ROUTE, /**< No route to host */
- };
-
- /**
- * \enum DropReason
- * \brief Description of where content object was originated
- */
- enum ContentObjectSource
- {
- APPLICATION,
- FORWARDED,
- CACHED
- };
-
- /**
* \brief Assigns node to the CCNx stack
*
* \param node Simulation node
@@ -212,17 +179,17 @@
CcnxL3Protocol(const CcnxL3Protocol &); ///< copy constructor is disabled
CcnxL3Protocol &operator = (const CcnxL3Protocol &); ///< copy operator is disabled
- /// \brief Set buckets leak interval
- void
- SetBucketLeakInterval (Time interval);
+ // /// \brief Set buckets leak interval
+ // void
+ // SetBucketLeakInterval (Time interval);
- /// \brief Get buckets leak interval
- Time
- GetBucketLeakInterval () const;
+ // /// \brief Get buckets leak interval
+ // Time
+ // GetBucketLeakInterval () const;
- /// \brief Periodically generate pre-calculated number of tokens (leak buckets)
- void
- LeakBuckets ();
+ // /// \brief Periodically generate pre-calculated number of tokens (leak buckets)
+ // void
+ // LeakBuckets ();
void
GiveUpInterest (const CcnxPitEntry &pitEntry,
@@ -240,32 +207,9 @@
Ptr<CcnxPit> m_pit; ///< \brief PIT (pending interest table)
Ptr<CcnxFib> m_fib; ///< \brief FIB
Ptr<CcnxContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
-
- Time m_bucketLeakInterval;
- EventId m_bucketLeakEvent;
- TracedCallback<Ptr<const CcnxInterestHeader>,
- Ptr<Ccnx>, Ptr<const CcnxFace> > m_receivedInterestsTrace;
-
- TracedCallback<Ptr<const CcnxInterestHeader>,
- Ptr<Ccnx>, Ptr<const CcnxFace> > m_transmittedInterestsTrace;
-
- TracedCallback<Ptr<const CcnxInterestHeader>,
- DropReason,
- Ptr<Ccnx>, Ptr<const CcnxFace> > m_droppedInterestsTrace;
-
- TracedCallback<Ptr<const CcnxContentObjectHeader>,
- Ptr<const Packet>,/*payload*/
- Ptr<Ccnx>, Ptr<const CcnxFace> > m_receivedDataTrace;
-
- TracedCallback<Ptr<const CcnxContentObjectHeader>,
- Ptr<const Packet>,/*payload*/
- ContentObjectSource,
- Ptr<Ccnx>, Ptr<const CcnxFace> > m_transmittedDataTrace;
- TracedCallback<Ptr<const CcnxContentObjectHeader>,
- Ptr<const Packet>,/*payload*/
- DropReason,
- Ptr<Ccnx>, Ptr<const CcnxFace> > m_droppedDataTrace;
+ // Time m_bucketLeakInterval;
+ // EventId m_bucketLeakEvent;
};
} // Namespace ns3
diff --git a/model/ccnx-name-components.cc b/model/ccnx-name-components.cc
index d785423..893f7bb 100644
--- a/model/ccnx-name-components.cc
+++ b/model/ccnx-name-components.cc
@@ -50,6 +50,17 @@
return m_prefix;
}
+std::string
+CcnxNameComponents::GetLastComponent () const
+{
+ if (m_prefix.size () == 0)
+ {
+ return "";
+ }
+
+ return m_prefix.back ();
+}
+
std::list<boost::reference_wrapper<const std::string> >
CcnxNameComponents::GetSubComponents (size_t num) const
{
@@ -88,7 +99,8 @@
istream_iterator<char> eos; // end of stream
std::string component = "";
- for (istream_iterator<char> it (is); it != eos; it++)
+ istream_iterator<char> it (is);
+ for (; it != eos; it++)
{
if (*it == '/')
{
@@ -102,6 +114,9 @@
if (component != "")
components.Add (component);
+ is.clear ();
+ // NS_LOG_ERROR (components << ", bad: " << is.bad () <<", fail: " << is.fail ());
+
return is;
}
diff --git a/model/ccnx-name-components.h b/model/ccnx-name-components.h
index 892ac4b..7f629dc 100644
--- a/model/ccnx-name-components.h
+++ b/model/ccnx-name-components.h
@@ -83,6 +83,9 @@
const std::list<std::string> &
GetComponents () const;
+ std::string
+ GetLastComponent () const;
+
/**
* \brief Get subcomponents of the name, starting with first component
* @param[in] num Number of components to return. Valid value is in range [1, GetComponents ().size ()]
diff --git a/model/ccnx-pit-entry.cc b/model/ccnx-pit-entry.cc
index 76c7997..0cc6509 100644
--- a/model/ccnx-pit-entry.cc
+++ b/model/ccnx-pit-entry.cc
@@ -140,6 +140,7 @@
void
CcnxPitEntry::IncreaseAllowedRetxCount ()
{
+ NS_LOG_ERROR (this);
m_maxRetxCount++;
}
diff --git a/model/ccnx-pit-entry.h b/model/ccnx-pit-entry.h
index c07eeda..12ffa91 100644
--- a/model/ccnx-pit-entry.h
+++ b/model/ccnx-pit-entry.h
@@ -195,6 +195,13 @@
AddOutgoing (Ptr<CcnxFace> face);
/**
+ * @brief Clear all incoming faces either after all of them were satisfied or NACKed
+ */
+ void
+ ClearOutgoing ()
+ { m_outgoing.clear (); }
+
+ /**
* @brief Remove all references to face.
*
* This method should be called before face is completely removed from the stack.
diff --git a/model/ccnx.cc b/model/ccnx.cc
index 21ec2bf..2e30e7f 100644
--- a/model/ccnx.cc
+++ b/model/ccnx.cc
@@ -23,6 +23,10 @@
#include "ns3/boolean.h"
#include "ccnx.h"
+#include "ccnx-face.h"
+#include "ccnx-forwarding-strategy.h"
+#include "ccnx-interest-header.h"
+#include "ccnx-content-object-header.h"
namespace ns3 {
@@ -34,6 +38,29 @@
static TypeId tid = TypeId ("ns3::Ccnx")
.SetGroupName ("Ccnx")
.SetParent<Object> ()
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+
+ // "OutInterests" trace is inside CcnxForwardingStrategy
+ .AddTraceSource ("InInterests", "InInterests", MakeTraceSourceAccessor (&Ccnx::m_inInterests))
+ .AddTraceSource ("DropInterests", "DropInterests", MakeTraceSourceAccessor (&Ccnx::m_dropInterests))
+
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+
+ .AddTraceSource ("OutNacks", "OutNacks", MakeTraceSourceAccessor (&Ccnx::m_outNacks))
+ .AddTraceSource ("InNacks", "InNacks", MakeTraceSourceAccessor (&Ccnx::m_inNacks))
+ .AddTraceSource ("DropNacks", "DropNacks", MakeTraceSourceAccessor (&Ccnx::m_dropNacks))
+
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+
+ .AddTraceSource ("OutData", "OutData", MakeTraceSourceAccessor (&Ccnx::m_outData))
+ .AddTraceSource ("InData", "InData", MakeTraceSourceAccessor (&Ccnx::m_inData))
+ .AddTraceSource ("DropData", "DropData", MakeTraceSourceAccessor (&Ccnx::m_dropData))
+
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
;
return tid;
}
diff --git a/model/ccnx.h b/model/ccnx.h
index 38c2f74..8d565c1 100644
--- a/model/ccnx.h
+++ b/model/ccnx.h
@@ -23,6 +23,7 @@
#include "ns3/object.h"
#include "ns3/callback.h"
+#include "ns3/traced-callback.h"
namespace ns3 {
@@ -79,13 +80,6 @@
class Ccnx : public Object
{
public:
- enum ForwardingStrategy
- {
- NDN_FLOODING = 1,
- NDN_BESTROUTE = 2,
- NDN_RANKING = 3
- };
-
/**
* \brief Interface ID
*
@@ -94,48 +88,6 @@
static TypeId GetTypeId ();
virtual ~Ccnx ();
- // /**
- // * \brief Send an Interest packet to a specified face
- // *
- // * \param face face where to send this packet
- // * \param header Interest header
- // * \param packet fully prepared CCNx packet to send
- // *
- // * Higher-level layers (forwarding strategy in particular) call this
- // * method to send a packet down the stack to the MAC and PHY layers.
- // */
- // virtual void
- // SendInterest (const Ptr<CcnxFace> &face,
- // const Ptr<const CcnxInterestHeader> &header,
- // const Ptr<Packet> &packet) = 0;
-
- // /**
- // * \brief Send a ContentObject packet to a specified face
- // *
- // * \param face face where to send this packet
- // * \param header ContentObject header
- // * \param packet fully prepared CCNx packet to send
- // *
- // * Higher-level layers (forwarding strategy in particular) call this
- // * method to send a packet down the stack to the MAC and PHY layers.
- // */
- // virtual void
- // SendContentObject (const Ptr<CcnxFace> &face,
- // const Ptr<const CcnxContentObjectHeader> &header,
- // const Ptr<Packet> &packet) = 0;
-
- // /**
- // * \brief Lower layers calls this method after demultiplexing
- // *
- // * Lower-layer-dependent implementation of CcnxFace will do actual work
- // * to set up demultiplexing and call this function as a callback
- // *
- // * \param face face from which packet came from
- // * \param p the packet
- // */
- // virtual void
- // Receive (const Ptr<CcnxFace> &face, const Ptr<const Packet> &p) = 0;
-
/**
* \brief Register a new forwarding strategy to be used by this Ccnx
* stack
@@ -197,6 +149,64 @@
*/
virtual Ptr<CcnxFace>
GetFaceByNetDevice (Ptr<NetDevice> netDevice) const = 0;
+
+
+ /**
+ * \enum DropReason
+ * \brief A reason why the packet has been dropped
+ */
+ enum DropReason
+ {
+ DUPLICATED, // Interests
+ SUPPRESSED, // Interests and Nacks
+ NO_FACES, // Interests
+ NON_DUPLICATED, // Nacks
+ AFTER_SATISFIED, // Nacks
+ UNSOLICITED // data
+ };
+
+protected:
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+
+ // transmittedInterestTrace is inside ForwardingStrategy
+
+ TracedCallback<Ptr<const CcnxInterestHeader>,
+ Ptr<const CcnxFace> > m_inInterests;
+
+ TracedCallback<Ptr<const CcnxInterestHeader>,
+ DropReason,
+ Ptr<const CcnxFace> > m_dropInterests;
+
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+
+ TracedCallback<Ptr<const CcnxInterestHeader>,
+ Ptr<const CcnxFace> > m_outNacks;
+
+ TracedCallback<Ptr<const CcnxInterestHeader>,
+ Ptr<const CcnxFace> > m_inNacks;
+
+ TracedCallback<Ptr<const CcnxInterestHeader>,
+ DropReason,
+ Ptr<const CcnxFace> > m_dropNacks;
+
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
+
+ TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+ bool /*from cache*/,
+ Ptr<const CcnxFace> > m_outData;
+
+ TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+ Ptr<const CcnxFace> > m_inData;
+
+ TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+ DropReason,
+ Ptr<const CcnxFace> > m_dropData;
};
} // namespace ns3
diff --git a/model/rocketfuel-weights-reader.cc b/model/rocketfuel-weights-reader.cc
index 448464e..4681e4e 100644
--- a/model/rocketfuel-weights-reader.cc
+++ b/model/rocketfuel-weights-reader.cc
@@ -39,8 +39,7 @@
#include "ns3/uinteger.h"
#include "ns3/ipv4-address.h"
-#include "ns3/constant-position-mobility-model.h"
-#include "ns3/random-variable.h"
+#include "ns3/mobility-model.h"
#include <regex.h>
@@ -78,14 +77,16 @@
NodeContainer
RocketfuelWeightsReader::Read ()
{
+ if (m_inputType == POSITIONS)
+ return AnnotatedTopologyReader::Read ();
+
ifstream topgen;
topgen.open (GetFileName ().c_str ());
- NodeContainer nodes;
if ( !topgen.is_open () )
{
NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
- return nodes;
+ return m_nodes;
}
map<string, set<string> > processedLinks; // to eliminate duplications
@@ -117,14 +118,12 @@
if (fromNode == 0)
{
fromNode = CreateNode (from);
- nodes.Add (fromNode);
}
Ptr<Node> toNode = Names::Find<Node> (m_path, to);
if (toNode == 0)
{
toNode = CreateNode (to);
- nodes.Add (toNode);
}
Link *link;
@@ -142,12 +141,12 @@
{
case WEIGHTS:
{
- double metric = boost::lexical_cast<double> (attribute);
- link->SetAttribute ("OSPF", boost::lexical_cast<string> (metric*2));
+ uint16_t metric = boost::lexical_cast<uint16_t> (attribute);
+ link->SetAttribute ("OSPF", boost::lexical_cast<string> (metric));
break;
}
case LATENCIES:
- link->SetAttribute ("Delay", attribute);
+ link->SetAttribute ("Delay", attribute+"ms");
break;
default:
; //
@@ -165,9 +164,9 @@
if (!repeatedRun)
{
- NS_LOG_INFO ("Rocketfuel topology created with " << nodes.GetN () << " nodes and " << LinksSize () << " links");
+ NS_LOG_INFO ("Rocketfuel topology created with " << m_nodes.GetN () << " nodes and " << LinksSize () << " links");
}
- return nodes;
+ return m_nodes;
}
void
@@ -178,18 +177,22 @@
SpringMobilityHelper::InstallSprings (LinksBegin (), LinksEnd ());
}
+void
+RocketfuelWeightsReader::SavePositions (const std::string &file) const
+{
+ ofstream os (file.c_str (), ios::trunc);
+ os << "router\n";
+
+ for (NodeContainer::Iterator node = m_nodes.Begin ();
+ node != m_nodes.End ();
+ node++)
+ {
+ std::string name = Names::FindName (*node);
+ Ptr<MobilityModel> mobility = (*node)->GetObject<MobilityModel> ();
+ Vector position = mobility->GetPosition ();
-// void
-// RocketfuelWeightsReader::Cheat (NodeContainer &nodes)
-// {
-// double epsilon = 1;
-
-// for (NodeContainer::Iterator i = nodes.Begin ();
-// i != nodes.End ();
-// i++)
-// {
-
-// }
-// }
+ os << name << "\t" << "unknown" << "\t" << -position.y << "\t" << position.x << "\n";
+ }
+}
} /* namespace ns3 */
diff --git a/model/rocketfuel-weights-reader.h b/model/rocketfuel-weights-reader.h
index ecf4905..cf6a784 100644
--- a/model/rocketfuel-weights-reader.h
+++ b/model/rocketfuel-weights-reader.h
@@ -64,12 +64,13 @@
enum
{
WEIGHTS,
- LATENCIES
+ LATENCIES,
+ POSITIONS
};
- // void
- // Cheat (NodeContainer &nodes);
-
+ void
+ SavePositions (const std::string &file) const;
+
private:
RocketfuelWeightsReader (const RocketfuelWeightsReader&);
RocketfuelWeightsReader& operator= (const RocketfuelWeightsReader&);
diff --git a/utils/ipv4-global-routing-ordered-nexthops.cc b/utils/ipv4-global-routing-ordered-nexthops.cc
index a01c044..f206a69 100644
--- a/utils/ipv4-global-routing-ordered-nexthops.cc
+++ b/utils/ipv4-global-routing-ordered-nexthops.cc
@@ -110,9 +110,18 @@
{
NS_LOG_FUNCTION (this << dest << oif);
- Ipv4AddressTrieMap::const_iterator longest_prefix_map = m_routes.longest_prefix_match (dest);
+ // Cheating with lookups. Need to redesign Trie
+ Ipv4AddressTrieMap::const_iterator longest_prefix_map;
+ Ipv4Mask mask ("255.255.255.255");
+ do {
+ NS_LOG_DEBUG ("Try mask " << mask);
+ longest_prefix_map = m_routes.longest_prefix_match (dest.CombineMask (mask));
+ mask = Ipv4Mask (mask.Get () << 8);
+ } while (longest_prefix_map == m_routes.end () && !mask.IsEqual (Ipv4Mask::GetZero ()));
+
if (longest_prefix_map == m_routes.end ())
{
+ NS_LOG_LOGIC ("Route not found...");
return 0;
}
diff --git a/utils/ipv4-global-routing-unordered-nexthops.cc b/utils/ipv4-global-routing-unordered-nexthops.cc
index 0fdce0b..a4f3660 100644
--- a/utils/ipv4-global-routing-unordered-nexthops.cc
+++ b/utils/ipv4-global-routing-unordered-nexthops.cc
@@ -141,9 +141,18 @@
NS_ASSERT_MSG (entryNum < m_numLogicalEntries,
"Number of requested logical entry should be smaller than total number of logical entries");
- Ipv4AddressTrieMap::const_iterator longest_prefix_map = m_routes.longest_prefix_match (dest);
+ // Cheating with lookups. Need to redesign Trie
+ Ipv4AddressTrieMap::const_iterator longest_prefix_map;
+ Ipv4Mask mask ("255.255.255.255");
+ do {
+ NS_LOG_DEBUG ("Try mask " << mask);
+ longest_prefix_map = m_routes.longest_prefix_match (dest.CombineMask (mask));
+ mask = Ipv4Mask (mask.Get () << 8);
+ } while (longest_prefix_map == m_routes.end () && !mask.IsEqual (Ipv4Mask::GetZero ()));
+
if (longest_prefix_map == m_routes.end ())
{
+ NS_LOG_LOGIC ("Route not found...");
return 0;
}
diff --git a/utils/spring-mobility-model.cc b/utils/spring-mobility-model.cc
index 5fb968b..170b428 100644
--- a/utils/spring-mobility-model.cc
+++ b/utils/spring-mobility-model.cc
@@ -33,6 +33,9 @@
NS_OBJECT_ENSURE_REGISTERED (SpringMobilityModel);
double SpringMobilityModel::m_totalKineticEnergy = 0.0;
+bool SpringMobilityModel::m_stable = false;
+EventId SpringMobilityModel::m_updateEvent;
+double SpringMobilityModel::m_epsilon = 100.0;
const double COLOUMB_K = 200;
@@ -41,10 +44,10 @@
static TypeId tid = TypeId ("ns3::SpringMobilityModel")
.SetParent<MobilityModel> ()
.AddConstructor<SpringMobilityModel> ()
- .AddAttribute ("Epsilon", "Bound for kinetic energy when system is considered stable",
- DoubleValue (1000.0),
- MakeDoubleAccessor (&SpringMobilityModel::m_epsilon),
- MakeDoubleChecker<double> ())
+ // .AddAttribute ("Epsilon", "Bound for kinetic energy when system is considered stable",
+ // DoubleValue (100.0),
+ // MakeDoubleAccessor (&SpringMobilityModel::m_epsilon),
+ // MakeDoubleChecker<double> ())
.AddAttribute ("NodeMass", "Node mass",
DoubleValue (10),
MakeDoubleAccessor (&SpringMobilityModel::m_nodeMass),
@@ -62,7 +65,7 @@
MakeDoubleAccessor (&SpringMobilityModel::m_springConstant),
MakeDoubleChecker<double> ())
.AddAttribute ("DampingFactor", "Dumping factor",
- DoubleValue (0.6),
+ DoubleValue (0.8),
MakeDoubleAccessor (&SpringMobilityModel::m_dampingFactor),
MakeDoubleChecker<double> ())
;
@@ -73,7 +76,6 @@
SpringMobilityModel::SpringMobilityModel ()
: m_position (0,0,0)
, m_velocity (0,0,0)
- , m_stable (false)
{
}
@@ -90,15 +92,35 @@
void
SpringMobilityModel::DoStart ()
{
- // m_updateEvent = Simulator::Schedule (Seconds(0.05), &SpringMobilityModel::Update, this);
+ if (!m_updateEvent.IsRunning ())
+ m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
+}
- // Simulator::Schedule (Seconds(2.0), &SpringMobilityModel::Test, this);
+void
+SpringMobilityModel::UpdateAll ()
+{
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
+ if (model != 0)
+ model->Update ();
+ }
+
+ if (m_totalKineticEnergy < m_epsilon)
+ {
+ m_stable = true;
+ NS_LOG_INFO ("Stabilized with " << m_totalKineticEnergy);
+ }
+ else
+ m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
}
void
SpringMobilityModel::Update () const
{
- // NS_LOG_FUNCTION (this << m_stable << m_position << m_velocity);
+ NS_LOG_FUNCTION (this << m_stable << m_position << m_velocity);
if (m_stable) return;
Time now = Simulator::Now ();
@@ -152,22 +174,13 @@
velocityValue = CalculateDistance (m_velocity, Vector(0,0,0));
m_totalKineticEnergy += m_nodeMass * velocityValue * velocityValue;
- if (m_totalKineticEnergy < m_epsilon)
- {
- m_stable = true;
- NS_LOG_INFO ("Stabilized with " << m_totalKineticEnergy);
- }
-
NotifyCourseChange ();
- // m_updateEvent = Simulator::Schedule (Seconds(0.05), &SpringMobilityModel::Update, this);
}
Vector
SpringMobilityModel::DoGetPosition (void) const
{
// NS_LOG_FUNCTION (this << m_position);
- Update ();
-
return m_position;
}
void
@@ -178,6 +191,19 @@
NotifyCourseChange ();
m_stable = false;
+
+
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
+ if (model != 0)
+ model->m_lastTime = Simulator::Now ();
+ }
+
+ if (!m_updateEvent.IsRunning ())
+ m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
}
Vector
SpringMobilityModel::DoGetVelocity (void) const
diff --git a/utils/spring-mobility-model.h b/utils/spring-mobility-model.h
index 553ab9d..700c994 100644
--- a/utils/spring-mobility-model.h
+++ b/utils/spring-mobility-model.h
@@ -68,8 +68,11 @@
void
Update (void) const;
+ static void
+ UpdateAll ();
+
private:
- double m_epsilon;
+ static double m_epsilon;
double m_nodeMass;
double m_nodeCharge;
@@ -78,14 +81,13 @@
double m_dampingFactor;
static double m_totalKineticEnergy;
+ static bool m_stable;
+ static EventId m_updateEvent;
mutable Vector m_position;
mutable Vector m_velocity;
- mutable bool m_stable;
mutable Time m_lastTime;
- EventId m_updateEvent;
-
std::list<Ptr<MobilityModel> > m_springs;
};
diff --git a/wscript b/wscript
index d0c569c..5b6c0d4 100644
--- a/wscript
+++ b/wscript
@@ -48,19 +48,22 @@
module.source = bld.path.ant_glob(['model/*.cc', 'apps/*.cc',
'utils/*.cc',
'helper/*.cc',
+ 'helper/tracers/*.cc',
'helper/ccnb-parser/*.cc',
'helper/ccnb-parser/visitors/*.cc',
'helper/ccnb-parser/syntax-tree/*.cc'])
headers.source = [
"helper/ccnx-stack-helper.h",
- "helper/ccnx-producer-helper.h",
- "helper/ccnx-consumer-helper.h",
+ "helper/ccnx-app-helper.h",
"helper/ccnx-header-helper.h",
+ "helper/ccnx-trace-helper.h",
+ "helper/tracers/ipv4-app-tracer.h",
+ "helper/tracers/ccnx-app-tracer.h",
+ "helper/tracers/ccnx-l3-tracer.h",
+ "helper/ccnx-face-container.h",
"apps/ccnx-app.h",
- # "apps/ccnx-consumer.h",
- # "apps/ccnx-producer.h",
"model/hash-helper.h",
"model/ccnx.h",
@@ -70,18 +73,13 @@
"model/ccnx-content-object-header.h",
"model/ccnx-name-components.h",
"model/ccnx-fib.h",
-
- "helper/ccnx-face-container.h",
+
+ "utils/spring-mobility-model.h",
+ "utils/spring-mobility-helper.h",
+
"model/rocketfuel-weights-reader.h",
"model/annotated-topology-reader.h",
]
- # headers.source = bld.path.ant_glob(['model/*.h', 'apps/*.h',
- # 'helper/*.h',
- # 'helper/ccnb-parser/*.h',
- # 'helper/ccnb-parser/visitors/*.h',
- # 'helper/ccnb-parser/syntax-tree/*.h'])
-
- # headers.source = [x.path_from(bld.path) for x in headers.source]
tests.source = bld.path.ant_glob('test/*.cc');
@@ -95,9 +93,6 @@
obj = bld.create_ns3_program('ccnx-grid', ['NDNabstraction', 'point-to-point-layout'])
obj.source = 'examples/ccnx-grid.cc'
- obj = bld.create_ns3_program('syntactic-topology', ['NDNabstraction', 'point-to-point-layout'])
- obj.source = 'examples/syntactic-topology-ndnabstraction.cc'
-
obj = bld.create_ns3_program('annotated-topology', ['NDNabstraction', 'point-to-point-layout'])
obj.source = 'examples/annotated-topology-read-example.cc'
@@ -116,6 +111,12 @@
obj = bld.create_ns3_program('ccnx-synthetic-topology', ['NDNabstraction'])
obj.source = 'examples/synthetic-topology.cc'
+ obj = bld.create_ns3_program('congestion-pop', ['NDNabstraction'])
+ obj.source = 'examples/congestion-pop.cc'
+
+ obj = bld.create_ns3_program('congestion-tcp-pop', ['NDNabstraction'])
+ obj.source = 'examples/congestion-tcp-pop.cc'
+
#obj = bld.create_ns3_program('congestion-pop', ['NDNabstraction'])
#obj.source = 'examples/congestion-pop.cc'
@@ -131,22 +132,4 @@
#obj = bld.create_ns3_program('blackhole-abilene', ['NDNabstraction'])
#obj.source = 'examples/blackhole-abilene.cc'
- # for path in ["examples"]:
- # anode = bld.path.find_dir (path)
- # if not anode or not anode.is_child_of(bld.srcnode):
- # raise Utils.WscriptError("Unable to use '%s' - either because \
- # it's not a relative path"", or it's not child of \
- # '%s'."%(name,bld.srcnode))
- # bld.rescan(anode)
- # for filename in bld.cache_dir_contents[anode.id]:
- # if filename.startswith('.') or not filename.endswith(".cc"):
- # continue
- # name = filename[:-len(".cc")]
- # obj = bld.create_ns3_program(name, ['NDNabstraction'])
- # obj.path = obj.path.find_dir (path)
- # obj.source = filename
- # obj.target = name
- # obj.name = obj.target
- # obj.uselib = 'BOOST BOOST_IOSTREAMS'
-
bld.ns3_python_bindings()