branch merge

This commit is contained in:
Craig Dowell committed 2007-11-15 18:57:07 -08:00
commit 60efef0caf
44 files changed
+1493 -283

No files matched your search

+240
View File
@@ -0,0 +1,240 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* 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
*
* ns-2 simple.tcl script (ported from ns-2)
* Originally authored by Steve McCanne, 12/19/1996
*/
// Port of ns-2/tcl/ex/simple.tcl to ns-3
//
// Network topology
//
// n0
// \ 5 Mb/s, 2ms
// \ 1.5Mb/s, 10ms
// n2 -------------------------n3
// /
// / 5 Mb/s, 2ms
// n1
//
// - all links are point-to-point links with indicated one-way BW/delay
// - CBR/UDP flows from n0 to n3, and from n3 to n1
// - FTP/TCP flow from n0 to n3, starting at time 1.2 to time 1.35 sec.
// - UDP packet size of 210 bytes, with per-packet interval 0.00375 sec.
// (i.e., DataRate of 448,000 bps)
// - DropTail queues
// - Tracing of queues and packet receptions to file
// "simple-error-model.tr"
#include "ns3/log.h"
#include "ns3/assert.h"
#include "ns3/command-line.h"
#include "ns3/default-value.h"
#include "ns3/ptr.h"
#include "ns3/simulator.h"
#include "ns3/nstime.h"
#include "ns3/data-rate.h"
#include "ns3/ascii-trace.h"
#include "ns3/pcap-trace.h"
#include "ns3/internet-node.h"
#include "ns3/default-value.h"
#include "ns3/component-manager.h"
#include "ns3/random-variable.h"
#include "ns3/point-to-point-channel.h"
#include "ns3/point-to-point-net-device.h"
#include "ns3/ipv4-address.h"
#include "ns3/inet-socket-address.h"
#include "ns3/ipv4.h"
#include "ns3/socket.h"
#include "ns3/ipv4-route.h"
#include "ns3/point-to-point-topology.h"
#include "ns3/onoff-application.h"
#include "ns3/packet-sink.h"
#include "ns3/error-model.h"
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("SimpleErrorModelExample");
int
main (int argc, char *argv[])
{
// Users may find it convenient to turn on explicit debugging
// for selected modules; the below lines suggest how to do this
#if 0
LogComponentEnable ("SimplePointToPointExample", LOG_LEVEL_INFO);
#endif
// Set up some default values for the simulation. Use the Bind()
// technique to tell the system what subclass of ErrorModel to use
DefaultValue::Bind ("ErrorModel", "RateErrorModel");
// Set a few parameters
DefaultValue::Bind ("RateErrorModelErrorRate", "0.01");
DefaultValue::Bind ("RateErrorModelErrorUnit", "EU_PKT");
DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
DefaultValue::Bind ("OnOffApplicationDataRate", "448kb/s");
// Allow the user to override any of the defaults and the above
// Bind()s at run-time, via command-line arguments
CommandLine::Parse (argc, argv);
// Here, we will explicitly create four nodes. In more sophisticated
// topologies, we could configure a node factory.
NS_LOG_INFO ("Create nodes.");
Ptr<Node> n0 = Create<InternetNode> ();
Ptr<Node> n1 = Create<InternetNode> ();
Ptr<Node> n2 = Create<InternetNode> ();
Ptr<Node> n3 = Create<InternetNode> ();
// We create the channels first without any IP addressing information
NS_LOG_INFO ("Create channels.");
Ptr<PointToPointChannel> channel0 =
PointToPointTopology::AddPointToPointLink (
n0, n2, DataRate(5000000), MilliSeconds(2));
Ptr<PointToPointChannel> channel1 =
PointToPointTopology::AddPointToPointLink (
n1, n2, DataRate(5000000), MilliSeconds(2));
Ptr<PointToPointChannel> channel2 =
PointToPointTopology::AddPointToPointLink (
n2, n3, DataRate(1500000), MilliSeconds(10));
// Later, we add IP addresses.
NS_LOG_INFO ("Assign IP Addresses.");
PointToPointTopology::AddIpv4Addresses (
channel0, n0, Ipv4Address("10.1.1.1"),
n2, Ipv4Address("10.1.1.2"));
PointToPointTopology::AddIpv4Addresses (
channel1, n1, Ipv4Address("10.1.2.1"),
n2, Ipv4Address("10.1.2.2"));
PointToPointTopology::AddIpv4Addresses (
channel2, n2, Ipv4Address("10.1.3.1"),
n3, Ipv4Address("10.1.3.2"));
// Finally, we add static routes. These three steps (Channel and
// NetDevice creation, IP Address assignment, and routing) are
// separated because there may be a need to postpone IP Address
// assignment (emulation) or modify to use dynamic routing
NS_LOG_INFO ("Add Static Routes.");
PointToPointTopology::AddIpv4Routes(n0, n2, channel0);
PointToPointTopology::AddIpv4Routes(n1, n2, channel1);
PointToPointTopology::AddIpv4Routes(n2, n3, channel2);
// Create the OnOff application to send UDP datagrams of size
// 210 bytes at a rate of 448 Kb/s
NS_LOG_INFO ("Create Applications.");
uint16_t port = 9; // Discard port (RFC 863)
Ptr<OnOffApplication> ooff = Create<OnOffApplication> (
n0,
InetSocketAddress ("10.1.3.2", port),
"Udp",
ConstantVariable(1),
ConstantVariable(0));
// Start the application
ooff->Start(Seconds(1.0));
ooff->Stop (Seconds(10.0));
// Create an optional packet sink to receive these packets
Ptr<PacketSink> sink = Create<PacketSink> (
n3,
InetSocketAddress (Ipv4Address::GetAny (), port),
"Udp");
// Start the sink
sink->Start (Seconds (1.0));
sink->Stop (Seconds (10.0));
// Create a similar flow from n3 to n1, starting at time 1.1 seconds
ooff = Create<OnOffApplication> (
n3,
InetSocketAddress ("10.1.2.1", port),
"Udp",
ConstantVariable(1),
ConstantVariable(0));
// Start the application
ooff->Start(Seconds(1.1));
ooff->Stop (Seconds(10.0));
// Create a packet sink to receive these packets
sink = Create<PacketSink> (
n1,
InetSocketAddress (Ipv4Address::GetAny (), port),
"Udp");
// Start the sink
sink->Start (Seconds (1.1));
sink->Stop (Seconds (10.0));
// Here, finish off packet routing configuration
// This will likely set by some global StaticRouting object in the future
NS_LOG_INFO ("Set Default Routes.");
Ptr<Ipv4> ipv4;
ipv4 = n0->QueryInterface<Ipv4> (Ipv4::iid);
ipv4->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1);
ipv4 = n3->QueryInterface<Ipv4> (Ipv4::iid);
ipv4->SetDefaultRoute (Ipv4Address ("10.1.3.1"), 1);
//
// Error model
//
// We want to add an error model to node 3's NetDevice
// We can obtain a handle to the NetDevice via the channel and node
// pointers
Ptr<PointToPointNetDevice> nd3 = PointToPointTopology::GetNetDevice
(n3, channel2);
// Create an ErrorModel based on the implementation (constructor)
// specified by the default classId
Ptr<ErrorModel> em = ErrorModel::CreateDefault ();
NS_ASSERT (em != 0);
// Now, query interface on the resulting em pointer to see if a
// RateErrorModel interface exists. If so, set the packet error rate
Ptr<RateErrorModel> bem = em->QueryInterface<RateErrorModel>
(RateErrorModel::iid);
if (bem)
{
bem->SetRandomVariable (UniformVariable ());
bem->SetRate (0.001);
}
nd3->AddReceiveErrorModel (em);
// Now, let's use the ListErrorModel and explicitly force a loss
// of the packets with pkt-uids = 11 and 17 on node 2, device 0
Ptr<PointToPointNetDevice> nd2 = PointToPointTopology::GetNetDevice
(n2, channel0);
std::list<uint32_t> sampleList;
sampleList.push_back (11);
sampleList.push_back (17);
// This time, we'll explicitly create the error model we want
Ptr<ListErrorModel> pem = Create<ListErrorModel> ();
pem->SetList (sampleList);
nd2->AddReceiveErrorModel (pem);
// Configure tracing of all enqueue, dequeue, and NetDevice receive events
// Trace output will be sent to the simple-error-model.tr file
NS_LOG_INFO ("Configure Tracing.");
AsciiTrace asciitrace ("simple-error-model.tr");
asciitrace.TraceAllQueues ();
asciitrace.TraceAllNetDeviceRx ();
NS_LOG_INFO ("Run Simulation.");
Simulator::Run ();
Simulator::Destroy ();
NS_LOG_INFO ("Done.");
}
+4
View File
@@ -14,6 +14,10 @@ def build(bld):
['point-to-point', 'internet-node'])
obj.source = 'simple-point-to-point.cc'
obj = bld.create_ns3_program('simple-error-model',
['point-to-point', 'internet-node'])
obj.source = 'simple-error-model.cc'
obj = bld.create_ns3_program('csma-one-subnet',
['csma', 'internet-node'])
obj.source = 'csma-one-subnet.cc'
+4 -4
View File
@@ -73,7 +73,7 @@ FakeInternetNode::Doit (void)
FakeInternetNode::UpperDoSendUp (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
NS_LOG_INFO ("**** Receive inbound packet");
m_dtqInbound.Enqueue(p);
return m_dtqInbound.Dequeue(p);
@@ -83,7 +83,7 @@ FakeInternetNode::UpperDoSendUp (Packet &p)
FakeInternetNode::UpperDoPull (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
return m_dtqOutbound.Dequeue(p);
}
@@ -142,7 +142,7 @@ FakePhysicalLayer::LowerDoNotify (LayerConnectorUpper *upper)
FakePhysicalLayer::UpperDoSendUp (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
NS_ASSERT(m_upperPartner);
return m_upperPartner->UpperSendUp(p);
@@ -152,7 +152,7 @@ FakePhysicalLayer::UpperDoSendUp (Packet &p)
FakePhysicalLayer::UpperDoPull (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
return m_dtqOutbound.Dequeue(p);
}
+3 -3
View File
@@ -109,7 +109,7 @@ void
OnOffApplication::SetMaxBytes(uint32_t maxBytes)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << maxBytes << ")");
NS_LOG_PARAMS (this << maxBytes);
m_maxBytes = maxBytes;
}
@@ -117,7 +117,7 @@ void
OnOffApplication::SetDefaultRate (const DataRate &rate)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &rate << ")");
NS_LOG_PARAMS (&rate);
g_defaultRate.SetValue (rate);
}
@@ -125,7 +125,7 @@ void
OnOffApplication::SetDefaultSize (uint32_t size)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << size << ")");
NS_LOG_PARAMS (size);
g_defaultSize.SetValue (size);
}
+5 -7
View File
@@ -40,9 +40,8 @@ UdpEchoClient::UdpEchoClient (
Application(n)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << n << ", " << serverAddress <<
", " << serverPort << ", " << count << ", " << interval <<
", " << size << ")");
NS_LOG_PARAMS (this << n << serverAddress << serverPort << count
<< interval << size);
Construct (n, serverAddress, serverPort, count, interval, size);
}
@@ -62,9 +61,8 @@ UdpEchoClient::Construct (
uint32_t size)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << n << ", " << serverAddress <<
", " << serverPort << ", " << count << ", " << interval <<
", " << size << ")");
NS_LOG_PARAMS (this << n << serverAddress << serverPort
<< count << interval << size);
m_node = n;
m_serverAddress = serverAddress;
@@ -154,7 +152,7 @@ UdpEchoClient::Receive(
const Address &from)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << socket << ", " << packet << ", " << from << ")");
NS_LOG_PARAMS (this << socket << packet << from);
if (InetSocketAddress::IsMatchingType (from))
{
+3 -3
View File
@@ -38,7 +38,7 @@ UdpEchoServer::UdpEchoServer (
Application(n)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << n << ", " << port << ")");
NS_LOG_PARAMS (this << n << port);
Construct (n, port);
}
@@ -54,7 +54,7 @@ UdpEchoServer::Construct (
uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << n << ", " << port << ")");
NS_LOG_PARAMS (this << n << port);
m_node = n;
m_port = port;
@@ -106,7 +106,7 @@ UdpEchoServer::Receive(
const Address &from)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << socket << ", " << packet << ", " << from << ")");
NS_LOG_PARAMS (this << socket << packet << from);
if (InetSocketAddress::IsMatchingType (from))
{
+6 -6
View File
@@ -145,32 +145,32 @@ uint64_t DataRate::Parse(const std::string s)
return v;
}
bool DataRate::operator < (const DataRate& rhs)
bool DataRate::operator < (const DataRate& rhs) const
{
return m_bps<rhs.m_bps;
}
bool DataRate::operator <= (const DataRate& rhs)
bool DataRate::operator <= (const DataRate& rhs) const
{
return m_bps<=rhs.m_bps;
}
bool DataRate::operator > (const DataRate& rhs)
bool DataRate::operator > (const DataRate& rhs) const
{
return m_bps>rhs.m_bps;
}
bool DataRate::operator >= (const DataRate& rhs)
bool DataRate::operator >= (const DataRate& rhs) const
{
return m_bps>=rhs.m_bps;
}
bool DataRate::operator == (const DataRate& rhs)
bool DataRate::operator == (const DataRate& rhs) const
{
return m_bps==rhs.m_bps;
}
bool DataRate::operator != (const DataRate& rhs)
bool DataRate::operator != (const DataRate& rhs) const
{
return m_bps!=rhs.m_bps;
}
+6 -6
View File
@@ -72,12 +72,12 @@ class DataRate
*/
DataRate (const std::string s);
bool operator < (const DataRate& rhs);
bool operator <= (const DataRate& rhs);
bool operator > (const DataRate& rhs);
bool operator >= (const DataRate& rhs);
bool operator == (const DataRate& rhs);
bool operator != (const DataRate& rhs);
bool operator < (const DataRate& rhs) const;
bool operator <= (const DataRate& rhs) const;
bool operator > (const DataRate& rhs) const;
bool operator >= (const DataRate& rhs) const;
bool operator == (const DataRate& rhs) const;
bool operator != (const DataRate& rhs) const;
/**
* \brief Calculate transmission time
+300
View File
@@ -0,0 +1,300 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 University of Washington
*
* 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: Tom Henderson <tomhend@u.washington.edu>
* This code has been ported from ns-2 (queue/errmodel.{cc,h}
*/
#include <math.h>
#include "error-model.h"
#include "ns3/packet.h"
#include "ns3/assert.h"
#include "ns3/log.h"
#include "ns3/random-variable.h"
#include "ns3/default-value.h"
NS_LOG_COMPONENT_DEFINE ("ErrorModel");
namespace ns3 {
static ClassIdDefaultValue g_classIdErrorModelDefaultValue ("ErrorModel",
"Error Model", ErrorModel::iid, "RateErrorModel");
const InterfaceId ErrorModel::iid =
MakeInterfaceId ("ErrorModel", Object::iid);
ErrorModel::ErrorModel () :
m_enable (true)
{
NS_LOG_FUNCTION;
SetInterfaceId (ErrorModel::iid);
}
ErrorModel::~ErrorModel ()
{
NS_LOG_FUNCTION;
}
Ptr<ErrorModel>
ErrorModel::CreateDefault (void)
{
NS_LOG_FUNCTION;
ClassId classId = g_classIdErrorModelDefaultValue.GetValue ();
Ptr<ErrorModel> em = ComponentManager::Create<ErrorModel> (classId,
ErrorModel::iid);
return em;
}
bool
ErrorModel::IsCorrupt (Packet& p)
{
NS_LOG_FUNCTION;
bool result;
// Insert any pre-conditions here
result = DoCorrupt (p);
// Insert any post-conditions here
return result;
}
void
ErrorModel::Reset (void)
{
NS_LOG_FUNCTION;
DoReset ();
}
void
ErrorModel::Enable (void)
{
NS_LOG_FUNCTION;
m_enable = true;
}
void
ErrorModel::Disable (void)
{
NS_LOG_FUNCTION;
m_enable = false;
}
bool
ErrorModel::IsEnabled (void) const
{
NS_LOG_FUNCTION;
return m_enable;
}
//
// RateErrorModel
//
const InterfaceId RateErrorModel::iid =
MakeInterfaceId ("RateErrorModel", ErrorModel::iid);
const ClassId RateErrorModel::cid =
MakeClassId<RateErrorModel> ("RateErrorModel", ErrorModel::iid,
RateErrorModel::iid);
// Defaults for rate/size
static NumericDefaultValue<double> g_defaultRateErrorModelErrorRate
("RateErrorModelErrorRate", "The error rate for the error model", 0.0);
static EnumDefaultValue<enum ErrorUnit>
g_defaultRateErrorModelErrorUnit ("RateErrorModelErrorUnit",
"The error unit for this error model",
EU_BYTE, "EU_BYTE",
EU_PKT, "EU_PKT",
EU_BIT, "EU_BIT",
0, (void*)0);
RateErrorModel::RateErrorModel () :
m_unit (g_defaultRateErrorModelErrorUnit.GetValue() ),
m_rate (g_defaultRateErrorModelErrorRate.GetValue() )
{
NS_LOG_FUNCTION;
// Assume a uniform random variable if user does not specify
m_ranvar = new UniformVariable ();
SetInterfaceId (RateErrorModel::iid);
}
RateErrorModel::~RateErrorModel ()
{
NS_LOG_FUNCTION;
delete m_ranvar;
}
enum ErrorUnit
RateErrorModel::GetUnit (void) const
{
NS_LOG_FUNCTION;
return m_unit;
}
void
RateErrorModel::SetUnit (enum ErrorUnit error_unit)
{
NS_LOG_FUNCTION;
m_unit = error_unit;
}
double
RateErrorModel::GetRate (void) const
{
NS_LOG_FUNCTION;
return m_rate;
}
void
RateErrorModel::SetRate (double rate)
{
NS_LOG_FUNCTION;
m_rate = rate;
}
void
RateErrorModel::SetRandomVariable (const RandomVariable &ranvar)
{
NS_LOG_FUNCTION;
delete m_ranvar;
m_ranvar = ranvar.Copy ();
}
bool
RateErrorModel::DoCorrupt (Packet& p)
{
NS_LOG_FUNCTION;
if (!m_enable)
{
return false;
}
switch (m_unit)
{
case EU_PKT:
return DoCorruptPkt (p);
case EU_BYTE:
return DoCorruptByte (p);
case EU_BIT:
return DoCorruptBit (p);
default:
NS_ASSERT_MSG (false, "m_unit not supported yet");
break;
}
return false;
}
bool
RateErrorModel::DoCorruptPkt (Packet& p)
{
NS_LOG_FUNCTION;
return (m_ranvar->GetValue () < m_rate);
}
bool
RateErrorModel::DoCorruptByte (Packet& p)
{
NS_LOG_FUNCTION;
// compute pkt error rate, assume uniformly distributed byte error
double per = 1 - pow (1.0 - m_rate, p.GetSize ());
return (m_ranvar->GetValue () < per);
}
bool
RateErrorModel::DoCorruptBit(Packet& p)
{
NS_LOG_FUNCTION;
// compute pkt error rate, assume uniformly distributed bit error
double per = 1 - pow (1.0 - m_rate, (8 * p.GetSize ()) );
return (m_ranvar->GetValue () < per);
}
void
RateErrorModel::DoReset (void)
{
NS_LOG_FUNCTION;
/* re-initialize any state; no-op for now */
}
//
// ListErrorModel
//
const InterfaceId ListErrorModel::iid =
MakeInterfaceId ("ListErrorModel", ErrorModel::iid);
const ClassId ListErrorModel::cid =
MakeClassId<ListErrorModel> ("ListErrorModel", ErrorModel::iid,
ListErrorModel::iid);
ListErrorModel::ListErrorModel ()
{
NS_LOG_FUNCTION;
SetInterfaceId (ListErrorModel::iid);
}
ListErrorModel::~ListErrorModel ()
{
NS_LOG_FUNCTION;
}
std::list<uint32_t>
ListErrorModel::GetList (void) const
{
NS_LOG_FUNCTION;
return m_packetList;
}
void
ListErrorModel::SetList (const std::list<uint32_t> &packetlist)
{
NS_LOG_FUNCTION;
m_packetList = packetlist;
}
// When performance becomes a concern, the list provided could be
// converted to a dynamically-sized array of uint32_t to avoid
// list iteration below.
bool
ListErrorModel::DoCorrupt (Packet& p)
{
NS_LOG_FUNCTION;
if (!m_enable)
{
return false;
}
uint32_t uid = p.GetUid ();
for (PacketListCI i = m_packetList.begin ();
i != m_packetList.end (); i++)
{
if (uid == *i)
{
return true;
}
}
return false;
}
void
ListErrorModel::DoReset (void)
{
NS_LOG_FUNCTION;
m_packetList.clear();
}
} //namespace ns3
+236
View File
@@ -0,0 +1,236 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 University of Washington
*
* 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: Tom Henderson <tomhend@u.washington.edu>
* This code has been ported from ns-2 (queue/errmodel.{cc,h}
*/
#ifndef ERROR_MODEL_H
#define ERROR_MODEL_H
#include <list>
#include "ns3/object.h"
#include "ns3/component-manager.h"
namespace ns3 {
class Packet;
class RandomVariable;
/**
* \brief General error model that can be used to corrupt packets
*
* This object is used to flag packets as being lost/errored or not.
* It is part of the Object framework and can be aggregated to
* other ns3 objects and handled by the Ptr class.
*
* The main method is IsCorrupt(Packet& p) which returns true if
* the packet is to be corrupted according to the underlying model.
* Depending on the error model, the packet itself may have its packet
* data buffer errored or not, or side information may be returned to
* the client in the form of a packet tag.
* The object can have state (resettable by Reset()).
* The object can also be enabled and disabled via two public member functions.
*
* Typical code (simplified) to use an ErrorModel may look something like
* this:
* \code
* Ptr<ErrorModel> rem = Create<RateErrorModel> ();
* rem->SetRandomVariable (UniformVariable ());
* rem->SetRate (0.001);
* ...
* Packet p;
* if (rem->IsCorrupt (p))
* {
* dropTrace(p);
* } else {
* Forward (p);
* }
* \endcode
*
* Two practical error models, a ListErrorModel and a RateErrorModel,
* are currently implemented.
*/
class ErrorModel : public Object
{
public:
static const InterfaceId iid;
/**
* A factory method to generate a preconfigured default ErrorModel for use
* \return an ErrorModel smart pointer that is the default ErrorModel
* type defined
*/
static Ptr<ErrorModel> CreateDefault (void);
ErrorModel ();
virtual ~ErrorModel ();
/**
* \returns true if the Packet is to be considered as errored/corrupted
* \param pkt Packet to apply error model to
*/
bool IsCorrupt (Packet& pkt);
/**
* Reset any state associated with the error model
*/
void Reset (void);
/**
* Enable the error model
*/
void Enable (void);
/**
* Disable the error model
*/
void Disable (void);
/**
* \return true if error model is enabled; false otherwise
*/
bool IsEnabled (void) const;
protected:
bool m_enable;
private:
/*
* These methods must be implemented by subclasses
*/
virtual bool DoCorrupt (Packet&) = 0;
virtual void DoReset (void) = 0;
};
enum ErrorUnit
{
EU_BIT,
EU_BYTE,
EU_PKT
};
/**
* \brief Determine which packets are errored corresponding to an underlying
* distribution, rate, and unit.
*
* This object is used to flag packets as being lost/errored or not.
* The two parameters that govern the behavior are the rate (or
* equivalently, the mean duration/spacing between errors), and the
* unit (which may be per-bit, per-byte, and per-packet).
* Users can optionally provide a RandomVariable object; the default
* is to use a Uniform(0,1) distribution.
* Reset() on this model will do nothing
*
* IsCorrupt() will not modify the packet data buffer
*/
class RateErrorModel : public ErrorModel
{
public:
static const InterfaceId iid;
static const ClassId cid;
RateErrorModel ();
virtual ~RateErrorModel ();
/**
* \returns the ErrorUnit being used by the underlying model
*/
enum ErrorUnit GetUnit (void) const;
/**
* \param error_unit the ErrorUnit to be used by the underlying model
*/
void SetUnit (enum ErrorUnit error_unit);
/**
* \returns the error rate being applied by the model
*/
double GetRate (void) const;
/**
* \param rate the error rate to be used by the model
*/
void SetRate (double rate);
/**
* \param ranvar A random variable distribution to generate random variates
*/
void SetRandomVariable (const RandomVariable &ranvar);
private:
virtual bool DoCorrupt (Packet& p);
virtual bool DoCorruptPkt (Packet& p);
virtual bool DoCorruptByte (Packet& p);
virtual bool DoCorruptBit (Packet& p);
virtual void DoReset (void);
enum ErrorUnit m_unit;
double m_rate;
RandomVariable* m_ranvar;
};
/**
* \brief Provide a list of Packet uids to corrupt
*
* This object is used to flag packets as being lost/errored or not.
* A note on performance: the list is assumed to be unordered, and
* in general, Packet uids received may be unordered. Therefore,
* each call to IsCorrupt() will result in a walk of the list with
* the present underlying implementation.
*
* Note also that if one wants to target multiple packets from looking
* at an (unerrored) trace file, the act of erroring a given packet may
* cause subsequent packet uids to change. For instance, suppose one wants
* to error packets 11 and 17 on a given device. It may be that erroring
* packet 11 will cause the subsequent uid stream to change and 17 may no
* longer correspond to the second packet that one wants to lose. Therefore,
* be advised that it might take some trial and error to select the
* right uids when multiple are provided.
*
* Reset() on this model will clear the list
*
* IsCorrupt() will not modify the packet data buffer
*/
class ListErrorModel : public ErrorModel
{
public:
static const InterfaceId iid;
static const ClassId cid;
ListErrorModel ();
virtual ~ListErrorModel ();
/**
* \return a copy of the underlying list
*/
std::list<uint32_t> GetList (void) const;
/**
* \param packetlist The list of packet uids to error.
*
* This method overwrites any previously provided list.
*/
void SetList (const std::list<uint32_t> &packetlist);
private:
virtual bool DoCorrupt (Packet& p);
virtual void DoReset (void);
typedef std::list<uint32_t> PacketList;
typedef std::list<uint32_t>::const_iterator PacketListCI;
PacketList m_packetList;
};
} //namespace ns3
#endif
+2 -2
View File
@@ -703,7 +703,7 @@ PacketMetadata::DoAddHeader (uint32_t uid, uint32_t size)
m_metadataSkipped = true;
return;
}
NS_LOG_PARAM ("(uid=" << uid << ", size=" << size << ")");
NS_LOG_PARAMS ("(uid=" << uid << ", size=" << size << ")");
struct PacketMetadata::SmallItem item;
item.next = m_head;
@@ -723,7 +723,7 @@ PacketMetadata::DoRemoveHeader (uint32_t uid, uint32_t size)
m_metadataSkipped = true;
return;
}
NS_LOG_PARAM ("(uid=" << uid << ", size=" << size << ")");
NS_LOG_PARAMS ("(uid=" << uid << ", size=" << size << ")");
struct PacketMetadata::SmallItem item;
struct PacketMetadata::ExtraItem extraItem;
uint32_t read = ReadItems (m_head, &item, &extraItem);
+2
View File
@@ -13,6 +13,7 @@ def build(bld):
'tag-registry.cc',
'pcap-writer.cc',
'data-rate.cc',
'error-model.cc',
]
headers = bld.create_obj('ns3header')
@@ -29,4 +30,5 @@ def build(bld):
'packet-metadata.h',
'pcap-writer.h',
'data-rate.h',
'error-model.h',
]
+81 -1
View File
@@ -317,6 +317,86 @@ CommandDefaultValue::DoGetDefaultValue (void) const
}
StringDefaultValue::StringDefaultValue (const std::string &name,
const std::string &help,
const std::string defaultValue)
: DefaultValueBase (name, help),
m_defaultValue (defaultValue),
m_value (defaultValue),
m_minSize (0),
m_maxSize (-1)
{
DefaultValueList::Add (this);
}
StringDefaultValue::StringDefaultValue (const std::string &name,
const std::string &help,
const std::string defaultValue,
int maxSize)
: DefaultValueBase (name, help),
m_defaultValue (defaultValue),
m_value (defaultValue),
m_minSize (0),
m_maxSize (maxSize)
{
DefaultValueList::Add (this);
}
StringDefaultValue::StringDefaultValue (const std::string &name,
const std::string &help,
const std::string defaultValue,
int minSize,
int maxSize)
: DefaultValueBase (name, help),
m_defaultValue (defaultValue),
m_value (defaultValue),
m_minSize (minSize),
m_maxSize (maxSize)
{
DefaultValueList::Add (this);
}
std::string
StringDefaultValue::GetValue (void) const
{
return m_value;
}
bool
StringDefaultValue::DoParseValue (const std::string &value)
{
if ((int)value.size () < m_minSize)
{
return false;
}
if (m_maxSize != -1 && (int)value.size () > m_maxSize)
{
return false;
}
m_value = value;
return true;
}
std::string
StringDefaultValue::DoGetType (void) const
{
if (m_maxSize == -1)
{
return "string:0";
}
else
{
std::ostringstream oss;
oss << "string:0:" << m_maxSize;
return oss.str ();
}
}
std::string
StringDefaultValue::DoGetDefaultValue (void) const
{
return m_defaultValue;
}
}//namespace ns3
#ifdef RUN_SELF_TESTS
@@ -381,7 +461,7 @@ DefaultValueTest::RunTests (void)
DefaultValue::Bind ("test-c", "257");
NumericDefaultValue<float> x ("test-x", "help-x", 10.0);
NumericDefaultValue<double> y ("test-y", "help-y", 10.0);
DefaultValue::Bind ("test-y", "-3");
EnumDefaultValue<enum MyEnum> e ("test-e", "help-e",
MY_ENUM_C, "C",
+53 -1
View File
@@ -219,6 +219,7 @@ private:
virtual bool DoParseValue (const std::string &value);
virtual std::string DoGetType (void) const;
virtual std::string DoGetDefaultValue (void) const;
T RealMin (void) const;
T m_defaultValue;
T m_minValue;
T m_maxValue;
@@ -339,6 +340,42 @@ public:
T m_value;
};
/**
* \brief A string variable for ns3::Bind
* \ingroup config
*
* Every instance of this type is automatically
* registered in the variable pool which is used
* by ns3::Bind.
*/
class StringDefaultValue : public DefaultValueBase
{
public:
StringDefaultValue (const std::string &name,
const std::string &help,
const std::string defaultValue);
StringDefaultValue (const std::string &name,
const std::string &help,
const std::string defaultValue,
int maxSize);
StringDefaultValue (const std::string &name,
const std::string &help,
const std::string defaultValue,
int minSize,
int maxSize);
std::string GetValue (void) const;
private:
virtual bool DoParseValue (const std::string &value);
virtual std::string DoGetType (void) const;
virtual std::string DoGetDefaultValue (void) const;
std::string m_defaultValue;
std::string m_value;
int m_minSize;
int m_maxSize;
};
/**
* \brief Class used to call a certain function during the configuration of the
* simulation
@@ -377,7 +414,7 @@ NumericDefaultValue<T>::NumericDefaultValue (std::string name,
T defaultValue)
: DefaultValueBase (name, help),
m_defaultValue (defaultValue),
m_minValue (std::numeric_limits<T>::min ()),
m_minValue (RealMin ()),
m_maxValue (std::numeric_limits<T>::max ()),
m_value (defaultValue)
{
@@ -469,6 +506,21 @@ NumericDefaultValue<T>::DoGetDefaultValue (void) const
return oss.str ();
}
template <typename T>
T
NumericDefaultValue<T>::RealMin (void) const
{
if (std::numeric_limits<T>::is_integer)
{
return std::numeric_limits<T>::min ();
}
else
{
return -std::numeric_limits<T>::max ();
}
}
/**************************************************************
**************************************************************/
+5
View File
@@ -341,6 +341,11 @@ LogComponentPrintList (void)
}
}
ParameterLogger g_parameterLogger;
EndParameterListStruct EndParameterList;
} // namespace ns3
#endif // NS3_LOG_ENABLE
+110 -3
View File
@@ -75,6 +75,7 @@
#endif
/**
* \ingroup logging
* \param msg message to output
@@ -88,6 +89,84 @@
#ifdef NS3_LOG_ENABLE
namespace ns3 {
struct EndParameterListStruct {};
extern EndParameterListStruct EndParameterList;
struct ParameterName
{
const char *name;
ParameterName (const char *name_) : name (name_) {}
};
class ParameterLogger : public std::ostream
{
int m_itemNumber;
const char *m_parameterName;
public:
ParameterLogger ()
: m_itemNumber (0)
{}
template<typename T>
ParameterLogger& operator<< (T param)
{
switch (m_itemNumber)
{
case 0: // first item is actually the function name
if (m_parameterName)
{
std::clog << m_parameterName << "=" << param;
m_parameterName = 0;
}
else
{
std::clog << param;
}
break;
case 1:
if (m_parameterName)
{
std::clog << ", " << m_parameterName << "=" << param;
m_parameterName = 0;
}
else
{
std::clog << ", " << param;
}
break;
default: // parameter following a previous parameter
std::clog << ", " << param;
break;
}
m_itemNumber++;
return *this;
}
ParameterLogger&
operator << (ParameterName paramName)
{
m_parameterName = paramName.name;
return *this;
}
ParameterLogger&
operator << (EndParameterListStruct dummy)
{
std::clog << ")" << std::endl;
m_itemNumber = 0;
return *this;
}
};
extern ParameterLogger g_parameterLogger;
}
/**
* \param level the log level
* \param msg the message to log
@@ -142,8 +221,33 @@
#define NS_LOG_FUNCTION \
NS_LOG_F(ns3::LOG_FUNCTION)
#define NS_LOG_PARAM(msg) \
NS_LOG(ns3::LOG_PARAM, msg)
#define NS_LOG_PARAMS(parameters) \
do \
{ \
if (g_log.IsEnabled (ns3::LOG_PARAM)) \
{ \
g_parameterLogger << __PRETTY_FUNCTION__ \
<< parameters \
<< EndParameterList; \
} \
} \
while (false)
#define NS_LOG_PARAMS_BEGIN() \
if (g_log.IsEnabled (ns3::LOG_PARAM)) \
{ \
g_parameterLogger << __PRETTY_FUNCTION__;
#define NS_LOG_PARAM(param) \
g_parameterLogger << ParameterName (#param) << param;
#define NS_LOG_PARAMS_END() \
g_parameterLogger << EndParameterList; \
}
#define NS_LOG_LOGIC(msg) \
NS_LOG(ns3::LOG_LOGIC, msg)
@@ -164,7 +268,10 @@
#define NS_LOG_DEBUG(msg)
#define NS_LOG_INFO(msg)
#define NS_LOG_FUNCTION
#define NS_LOG_PARAM(msg)
#define NS_LOG_PARAMS(parameters)
#define NS_LOG_PARAMS_BEGIN()
#define NS_LOG_PARAM(param)
#define NS_LOG_PARAMS_END()
#define NS_LOG_LOGIC(msg)
#define NS_LOG_UNCOND(msg)
+10 -12
View File
@@ -68,8 +68,7 @@ CsmaChannel::CsmaChannel(
m_delay (delay)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << Channel::GetName() << ", " << bps.GetBitRate() <<
", " << delay << ")");
NS_LOG_PARAMS (this << Channel::GetName() << bps.GetBitRate() << delay);
Init();
}
@@ -83,8 +82,7 @@ CsmaChannel::CsmaChannel(
m_delay (delay)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << name << ", " << bps.GetBitRate() << ", " << delay <<
")");
NS_LOG_PARAMS (this << name << bps.GetBitRate() << delay);
Init();
}
@@ -97,7 +95,7 @@ int32_t
CsmaChannel::Attach(Ptr<CsmaNetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << device << ")");
NS_LOG_PARAMS (this << device);
NS_ASSERT(device != 0);
CsmaDeviceRec rec(device);
@@ -110,7 +108,7 @@ bool
CsmaChannel::Reattach(Ptr<CsmaNetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << device << ")");
NS_LOG_PARAMS (this << device);
NS_ASSERT(device != 0);
std::vector<CsmaDeviceRec>::iterator it;
@@ -136,7 +134,7 @@ bool
CsmaChannel::Reattach(uint32_t deviceId)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << deviceId << ")");
NS_LOG_PARAMS (this << deviceId);
if (deviceId < m_deviceList.size())
{
@@ -158,7 +156,7 @@ bool
CsmaChannel::Detach(uint32_t deviceId)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << deviceId << ")");
NS_LOG_PARAMS (this << deviceId);
if (deviceId < m_deviceList.size())
{
@@ -189,7 +187,7 @@ bool
CsmaChannel::Detach(Ptr<CsmaNetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << device << ")");
NS_LOG_PARAMS (this << device);
NS_ASSERT(device != 0);
std::vector<CsmaDeviceRec>::iterator it;
@@ -208,7 +206,7 @@ bool
CsmaChannel::TransmitStart(Packet& p, uint32_t srcId)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << srcId << ")");
NS_LOG_PARAMS (this << &p << srcId);
NS_LOG_INFO ("UID is " << p.GetUid () << ")");
if (m_state != IDLE)
@@ -240,7 +238,7 @@ bool
CsmaChannel::TransmitEnd()
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &m_currentPkt << ", " << m_currentSrc << ")");
NS_LOG_PARAMS (this << &m_currentPkt << m_currentSrc);
NS_LOG_INFO ("UID is " << m_currentPkt.GetUid () << ")");
NS_ASSERT(m_state == TRANSMITTING);
@@ -266,7 +264,7 @@ void
CsmaChannel::PropagationCompleteEvent()
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &m_currentPkt << ")");
NS_LOG_PARAMS (this << &m_currentPkt);
NS_LOG_INFO ("UID is " << m_currentPkt.GetUid () << ")");
NS_ASSERT(m_state == PROPAGATING);
+55 -29
View File
@@ -28,6 +28,7 @@
#include "ns3/ethernet-header.h"
#include "ns3/ethernet-trailer.h"
#include "ns3/llc-snap-header.h"
#include "ns3/error-model.h"
NS_LOG_COMPONENT_DEFINE ("CsmaNetDevice");
@@ -82,10 +83,11 @@ CsmaTraceType::Get (void) const
CsmaNetDevice::CsmaNetDevice (Ptr<Node> node)
: NetDevice (node, Mac48Address::Allocate ()),
m_bps (DataRate (0xffffffff))
m_bps (DataRate (0xffffffff)),
m_receiveErrorModel (0)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << node << ")");
NS_LOG_PARAMS (this << node);
m_encapMode = IP_ARP;
Init(true, true);
}
@@ -93,10 +95,11 @@ CsmaNetDevice::CsmaNetDevice (Ptr<Node> node)
CsmaNetDevice::CsmaNetDevice (Ptr<Node> node, Mac48Address addr,
CsmaEncapsulationMode encapMode)
: NetDevice(node, addr),
m_bps (DataRate (0xffffffff))
m_bps (DataRate (0xffffffff)),
m_receiveErrorModel (0)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << node << ")");
NS_LOG_PARAMS (this << node);
m_encapMode = encapMode;
Init(true, true);
@@ -109,7 +112,7 @@ CsmaNetDevice::CsmaNetDevice (Ptr<Node> node, Mac48Address addr,
m_bps (DataRate (0xffffffff))
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << node << ")");
NS_LOG_PARAMS (this << node);
m_encapMode = encapMode;
Init(sendEnable, receiveEnable);
@@ -142,7 +145,7 @@ CsmaNetDevice&
CsmaNetDevice::operator= (const CsmaNetDevice nd)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &nd << ")");
NS_LOG_PARAMS (this << &nd);
return *this;
}
*/
@@ -195,7 +198,10 @@ void
CsmaNetDevice::SetDataRate (DataRate bps)
{
NS_LOG_FUNCTION;
m_bps = bps;
if (!m_channel || bps <= m_channel->GetDataRate ())
{
m_bps = bps;
}
}
void
@@ -507,7 +513,7 @@ bool
CsmaNetDevice::Attach (Ptr<CsmaChannel> ch)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &ch << ")");
NS_LOG_PARAMS (this << &ch);
m_channel = ch;
@@ -526,11 +532,20 @@ void
CsmaNetDevice::AddQueue (Ptr<Queue> q)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << q << ")");
NS_LOG_PARAMS (this << q);
m_queue = q;
}
void CsmaNetDevice::AddReceiveErrorModel (Ptr<ErrorModel> em)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << em << ")");
m_receiveErrorModel = em;
AddInterface (em);
}
void
CsmaNetDevice::Receive (const Packet& packet)
{
@@ -593,38 +608,48 @@ CsmaNetDevice::Receive (const Packet& packet)
return;
}
m_rxTrace (p);
if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (p) )
{
NS_LOG_LOGIC ("Dropping pkt due to error model ");
m_dropTrace (packet);
// Do not forward up; let this packet go
}
else
{
m_rxTrace (p);
//
// protocol must be initialized to avoid a compiler warning in the RAW
// case that breaks the optimized build.
//
uint16_t protocol = 0;
uint16_t protocol = 0;
switch (m_encapMode)
{
case ETHERNET_V1:
case IP_ARP:
protocol = header.GetLengthType();
break;
case LLC: {
LlcSnapHeader llc;
p.RemoveHeader (llc);
protocol = llc.GetType ();
} break;
case RAW:
NS_ASSERT (false);
break;
switch (m_encapMode)
{
case ETHERNET_V1:
case IP_ARP:
protocol = header.GetLengthType();
break;
case LLC:
{
LlcSnapHeader llc;
p.RemoveHeader (llc);
protocol = llc.GetType ();
}
break;
case RAW:
NS_ASSERT (false);
break;
}
ForwardUp (p, protocol, header.GetSource ());
return;
}
ForwardUp (p, protocol, header.GetSource ());
return;
}
Address
CsmaNetDevice::MakeMulticastAddress(Ipv4Address multicastGroup) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << multicastGroup << ")");
NS_LOG_PARAMS (this << multicastGroup);
//
// First, get the generic multicast address.
//
@@ -687,4 +712,5 @@ CsmaNetDevice::DoGetChannel(void) const
return m_channel;
}
} // namespace ns3
+17
View File
@@ -40,6 +40,7 @@ namespace ns3 {
class Queue;
class CsmaChannel;
class ErrorModel;
/**
* \brief hold in a TraceContext the type of trace source from a CsmaNetDevice
@@ -192,6 +193,16 @@ enum CsmaEncapsulationMode {
* ownership.
*/
void AddQueue (Ptr<Queue> queue);
/**
* Attach a receive ErrorModel to the CsmaNetDevice.
*
* The CsmaNetDevice may optionally include an ErrorModel in
* the packet receive chain.
*
* @see ErrorModel
* @param em a pointer to the ErrorModel
*/
void AddReceiveErrorModel(Ptr<ErrorModel> em);
/**
* Receive a packet from a connected CsmaChannel.
*
@@ -453,6 +464,12 @@ private:
* @see class DropTailQueue
*/
Ptr<Queue> m_queue;
/**
* Error model for receive packet events
*/
Ptr<ErrorModel> m_receiveErrorModel;
/**
* NOT TESTED
* The trace source for the packet reception events that the device can
@@ -52,8 +52,7 @@ PointToPointChannel::PointToPointChannel(
m_nDevices(0)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << Channel::GetName() << ", " << bps.GetBitRate() <<
", " << delay << ")");
NS_LOG_PARAMS (this << Channel::GetName() << bps.GetBitRate() << delay);
}
PointToPointChannel::PointToPointChannel(
@@ -67,15 +66,14 @@ PointToPointChannel::PointToPointChannel(
m_nDevices(0)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << name << ", " << bps.GetBitRate() << ", " <<
delay << ")");
NS_LOG_PARAMS (this << name << bps.GetBitRate() << delay);
}
void
PointToPointChannel::Attach(Ptr<PointToPointNetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << device << ")");
NS_LOG_PARAMS (this << device);
NS_ASSERT(m_nDevices < N_DEVICES && "Only two devices permitted");
NS_ASSERT(device != 0);
@@ -99,7 +97,7 @@ PointToPointChannel::TransmitStart(Packet& p,
const Time& txTime)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << src << ")");
NS_LOG_PARAMS (this << &p << src);
NS_LOG_LOGIC ("UID is " << p.GetUid () << ")");
NS_ASSERT(m_link[0].m_state != INITIALIZING);
@@ -26,6 +26,7 @@
#include "ns3/composite-trace-resolver.h"
#include "ns3/mac48-address.h"
#include "ns3/llc-snap-header.h"
#include "ns3/error-model.h"
#include "point-to-point-net-device.h"
#include "point-to-point-channel.h"
@@ -38,14 +39,28 @@ DataRateDefaultValue PointToPointNetDevice::g_defaultRate(
"The default data rate for point to point links",
DataRate ("10Mb/s"));
PointToPointTraceType::PointToPointTraceType ()
PointToPointTraceType::PointToPointTraceType (enum Type type)
: m_type (type)
{
NS_LOG_FUNCTION;
}
PointToPointTraceType::PointToPointTraceType ()
: m_type (RX)
{
NS_LOG_FUNCTION;
}
void
PointToPointTraceType::Print (std::ostream &os) const
{
os << "dev-rx";
switch (m_type) {
case RX:
os << "dev-rx";
break;
case DROP:
os << "dev-drop";
break;
}
}
uint16_t
@@ -63,6 +78,12 @@ PointToPointTraceType::GetTypeName (void) const
return "ns3::PointToPointTraceType";
}
enum PointToPointTraceType::Type
PointToPointTraceType::Get (void) const
{
NS_LOG_FUNCTION;
return m_type;
}
PointToPointNetDevice::PointToPointNetDevice (Ptr<Node> node,
const DataRate& rate)
@@ -73,10 +94,12 @@ PointToPointNetDevice::PointToPointNetDevice (Ptr<Node> node,
m_tInterframeGap (Seconds(0)),
m_channel (0),
m_queue (0),
m_rxTrace ()
m_rxTrace (),
m_dropTrace (),
m_receiveErrorModel (0)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << node << ")");
NS_LOG_PARAMS (this << node);
//
// XXX BUGBUG
//
@@ -94,6 +117,7 @@ PointToPointNetDevice::~PointToPointNetDevice()
{
NS_LOG_FUNCTION;
m_queue = 0;
m_receiveErrorModel = 0;
}
void
@@ -127,7 +151,10 @@ void PointToPointNetDevice::DoDispose()
void PointToPointNetDevice::SetDataRate(const DataRate& bps)
{
NS_LOG_FUNCTION;
m_bps = bps;
if (!m_channel || bps <= m_channel->GetDataRate ())
{
m_bps = bps;
}
}
void PointToPointNetDevice::SetInterframeGap(const Time& t)
@@ -174,7 +201,7 @@ bool PointToPointNetDevice::SendTo (const Packet& packet, const Address& dest,
PointToPointNetDevice::TransmitStart (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
NS_LOG_LOGIC ("UID is " << p.GetUid () << ")");
//
// This function is called to start the process of transmitting a packet.
@@ -221,7 +248,12 @@ PointToPointNetDevice::GetTraceResolver (void) const
TraceDoc ("receive MAC packet",
"const Packet &", "packet received"),
m_rxTrace,
PointToPointTraceType ());
PointToPointTraceType (PointToPointTraceType::RX));
resolver->AddSource ("drop",
TraceDoc ("drop MAC packet",
"const Packet &", "packet dropped"),
m_dropTrace,
PointToPointTraceType (PointToPointTraceType::DROP));
resolver->SetParentResolver (NetDevice::GetTraceResolver ());
return resolver;
}
@@ -230,7 +262,7 @@ bool
PointToPointNetDevice::Attach (Ptr<PointToPointChannel> ch)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &ch << ")");
NS_LOG_PARAMS (this << &ch);
m_channel = ch;
@@ -257,21 +289,38 @@ PointToPointNetDevice::Attach (Ptr<PointToPointChannel> ch)
void PointToPointNetDevice::AddQueue (Ptr<Queue> q)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << q << ")");
NS_LOG_PARAMS (this << q);
m_queue = q;
}
void PointToPointNetDevice::AddReceiveErrorModel (Ptr<ErrorModel> em)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << em << ")");
m_receiveErrorModel = em;
AddInterface (em);
}
void PointToPointNetDevice::Receive (Packet& p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
uint16_t protocol = 0;
Packet packet = p;
m_rxTrace (packet);
ProcessHeader(packet, protocol);
ForwardUp (packet, protocol, GetBroadcast ());
if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (p) )
{
m_dropTrace (packet);
// Do not forward up; let this packet go
}
else
{
m_rxTrace (packet);
ProcessHeader(packet, protocol);
ForwardUp (packet, protocol, GetBroadcast ());
}
}
Ptr<Queue> PointToPointNetDevice::GetQueue(void) const
@@ -37,6 +37,7 @@ namespace ns3 {
class Queue;
class PointToPointChannel;
class ErrorModel;
/**
* \brief hold in a TraceContext the type of trace source from a PointToPointNetDevice
@@ -44,10 +45,21 @@ class PointToPointChannel;
class PointToPointTraceType : public TraceContextElement
{
public:
enum Type {
RX,
DROP
};
PointToPointTraceType (enum Type type);
PointToPointTraceType ();
void Print (std::ostream &os) const;
static uint16_t GetUid (void);
std::string GetTypeName (void) const;
/**
* \returns the type of the trace source which generated an event.
*/
enum Type Get (void) const;
private:
enum Type m_type;
};
/**
@@ -133,6 +145,16 @@ public:
* ownership.
*/
void AddQueue (Ptr<Queue> queue);
/**
* Attach a receive ErrorModel to the PointToPointNetDevice.
*
* The PointToPointNetDevice may optionally include an ErrorModel in
* the packet receive chain.
*
* @see ErrorModel
* @param em a pointer to the ErrorModel
*/
void AddReceiveErrorModel(Ptr<ErrorModel> em);
/**
* Receive a packet from a connected PointToPointChannel.
*
@@ -288,11 +310,23 @@ private:
* @see class TraceResolver
*/
CallbackTraceSource<const Packet &> m_rxTrace;
/**
* The trace source for the packet drop events that the device can
* fire.
*
* @see class CallBackTraceSource
* @see class TraceResolver
*/
CallbackTraceSource<const Packet &> m_dropTrace;
/**
* Default data rate. Used for all newly created p2p net devices
*/
static DataRateDefaultValue g_defaultRate;
/**
* Error model for receive packet events
*/
Ptr<ErrorModel> m_receiveErrorModel;
};
}; // namespace ns3
@@ -62,6 +62,30 @@ PointToPointTopology::AddPointToPointLink(
return channel;
}
Ptr<PointToPointNetDevice>
PointToPointTopology::GetNetDevice (Ptr<Node> n, Ptr<PointToPointChannel> chan)
{
Ptr<PointToPointNetDevice> found = 0;
// The PointToPoint channel is used to find the relevant NetDevice
NS_ASSERT (chan->GetNDevices () == 2);
Ptr<PointToPointNetDevice> nd1 = chan->GetDevice (0);
Ptr<PointToPointNetDevice> nd2 = chan->GetDevice (1);
if ( nd1->GetNode ()->GetId () == n->GetId () )
{
found = nd1;
}
else if ( nd2->GetNode ()->GetId () == n->GetId () )
{
found = nd2;
}
else
{
NS_ASSERT (found);
}
return found;
}
void
PointToPointTopology::AddIpv4Addresses(
Ptr<const PointToPointChannel> chan,
@@ -55,6 +55,17 @@ public:
static Ptr<PointToPointChannel> AddPointToPointLink(
Ptr<Node> n1, Ptr<Node> n2, const DataRate& dataRate, const Time& delay);
/**
* \param n Node
* \param chan PointToPointChannel connected to node n
* \return Pointer to the corresponding PointToPointNetDevice
*
* Utility function to retrieve a PointToPointNetDevice pointer
* corresponding to the input parameters
*/
static Ptr<PointToPointNetDevice> GetNetDevice(
Ptr<Node> n, Ptr<PointToPointChannel> chan);
/**
* \param chan PointToPointChannel to use
* \param n1 Node
+1 -1
View File
@@ -64,7 +64,7 @@ void
ArpIpv4Interface::SendTo (Packet p, Ipv4Address dest)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << dest << ")");
NS_LOG_PARAMS (this << &p << dest);
NS_ASSERT (GetDevice () != 0);
if (GetDevice ()->NeedsArp ())
+12 -8
View File
@@ -93,7 +93,7 @@ Ipv4EndPoint *
Ipv4EndPointDemux::Allocate (Ipv4Address address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << this << ", " << address << ")");
NS_LOG_PARAMS (this << address);
uint16_t port = AllocateEphemeralPort ();
if (port == 0)
{
@@ -117,7 +117,7 @@ Ipv4EndPoint *
Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << this << ", " << address << ", " << port << ")");
NS_LOG_PARAMS (this << address << port);
if (LookupLocal (address, port))
{
NS_LOG_WARN ("Duplicate address/port; failing.");
@@ -134,10 +134,7 @@ Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
Ipv4Address peerAddress, uint16_t peerPort)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(localAddress=" << localAddress
<< ", localPort=" << localPort
<< ", peerAddress=" << peerAddress
<< ", peerPort=" << peerPort << ")");
NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++)
{
if ((*i)->GetLocalPort () == localPort &&
@@ -189,8 +186,15 @@ Ipv4EndPointDemux::Lookup (Ipv4Address daddr, uint16_t dport,
Ipv4EndPoint *generic = 0;
EndPoints retval;
NS_LOG_PARAM ("(daddr=" << daddr << ", dport=" << dport
<< ", saddr=" << saddr << ", sport=" << sport << ")");
//NS_LOG_PARAMS (this << daddr << dport << saddr << sport);
NS_LOG_PARAMS_BEGIN ();
NS_LOG_PARAM (this);
NS_LOG_PARAM (daddr);
NS_LOG_PARAM (dport);
NS_LOG_PARAM (saddr);
NS_LOG_PARAM (sport);
NS_LOG_PARAM (incomingInterface);
NS_LOG_PARAMS_END ();
for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++)
{
+4 -4
View File
@@ -41,7 +41,7 @@ Ipv4Interface::Ipv4Interface (Ptr<NetDevice> nd)
m_metric(1)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &nd << ")");
NS_LOG_PARAMS (this << &nd);
}
Ipv4Interface::~Ipv4Interface ()
@@ -68,7 +68,7 @@ void
Ipv4Interface::SetAddress (Ipv4Address a)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << a << ")");
NS_LOG_PARAMS (this << a);
m_address = a;
}
@@ -76,7 +76,7 @@ void
Ipv4Interface::SetNetworkMask (Ipv4Mask mask)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << mask << ")");
NS_LOG_PARAMS (this << mask);
m_netmask = mask;
}
@@ -101,7 +101,7 @@ void
Ipv4Interface::SetMetric (uint16_t metric)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << metric << ")");
NS_LOG_PARAMS ("(" << metric << ")");
m_metric = metric;
}
+38 -47
View File
@@ -233,7 +233,7 @@ Ipv4L3Protocol::AddHostRouteTo (Ipv4Address dest,
uint32_t interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << dest << ", " << nextHop << ", " << interface << ")");
NS_LOG_PARAMS (this << dest << nextHop << interface);
m_staticRouting->AddHostRouteTo (dest, nextHop, interface);
}
@@ -242,7 +242,7 @@ Ipv4L3Protocol::AddHostRouteTo (Ipv4Address dest,
uint32_t interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << dest << ", " << interface << ")");
NS_LOG_PARAMS (this << dest << interface);
m_staticRouting->AddHostRouteTo (dest, interface);
}
@@ -253,8 +253,7 @@ Ipv4L3Protocol::AddNetworkRouteTo (Ipv4Address network,
uint32_t interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << network << ", " << networkMask << ", " << nextHop <<
", " << interface << ")");
NS_LOG_PARAMS (this << network << networkMask << nextHop << interface);
m_staticRouting->AddNetworkRouteTo (network, networkMask, nextHop, interface);
}
@@ -264,8 +263,7 @@ Ipv4L3Protocol::AddNetworkRouteTo (Ipv4Address network,
uint32_t interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << network << ", " << networkMask << ", " << interface <<
")");
NS_LOG_PARAMS (this << network << networkMask << interface);
m_staticRouting->AddNetworkRouteTo (network, networkMask, interface);
}
@@ -274,7 +272,7 @@ Ipv4L3Protocol::SetDefaultRoute (Ipv4Address nextHop,
uint32_t interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << nextHop << ", " << interface << ")");
NS_LOG_PARAMS (this << nextHop << interface);
m_staticRouting->SetDefaultRoute (nextHop, interface);
}
@@ -285,7 +283,7 @@ Ipv4L3Protocol::Lookup (
Ipv4RoutingProtocol::RouteReplyCallback routeReply)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &ipHeader << ", " << &packet << &routeReply << ")");
NS_LOG_PARAMS (this << &ipHeader << &packet << &routeReply);
Lookup (Ipv4RoutingProtocol::IF_INDEX_ANY, ipHeader, packet, routeReply);
}
@@ -298,8 +296,7 @@ Ipv4L3Protocol::Lookup (
Ipv4RoutingProtocol::RouteReplyCallback routeReply)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << ifIndex << ", " << &ipHeader << ", " << &packet <<
&routeReply << ")");
NS_LOG_PARAMS (this << ifIndex << &ipHeader << &packet << &routeReply);
for (Ipv4RoutingProtocolList::const_iterator rprotoIter =
m_routingProtocols.begin ();
@@ -348,7 +345,7 @@ Ipv4L3Protocol::AddRoutingProtocol (Ptr<Ipv4RoutingProtocol> routingProtocol,
int priority)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &routingProtocol << ", " << priority << ")");
NS_LOG_PARAMS (this << &routingProtocol << priority);
m_routingProtocols.push_back
(std::pair<int, Ptr<Ipv4RoutingProtocol> > (-priority, routingProtocol));
m_routingProtocols.sort ();
@@ -372,7 +369,7 @@ void
Ipv4L3Protocol::RemoveRoute (uint32_t index)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM("(" << index << ")");
NS_LOG_PARAMS (this << index);
m_staticRouting->RemoveRoute (index);
}
@@ -383,8 +380,7 @@ Ipv4L3Protocol::AddMulticastRoute (Ipv4Address origin,
std::vector<uint32_t> outputInterfaces)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << origin << ", " << group << ", " << inputInterface <<
", " << &outputInterfaces << ")");
NS_LOG_PARAMS (this << origin << group << inputInterface << &outputInterfaces);
m_staticRouting->AddMulticastRoute (origin, group, inputInterface,
outputInterfaces);
@@ -394,7 +390,7 @@ void
Ipv4L3Protocol::SetDefaultMulticastRoute (uint32_t outputInterface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << outputInterface << ")");
NS_LOG_PARAMS (this << outputInterface);
m_staticRouting->SetDefaultMulticastRoute (outputInterface);
}
@@ -410,7 +406,7 @@ Ipv4MulticastRoute *
Ipv4L3Protocol::GetMulticastRoute (uint32_t index) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << index << ")");
NS_LOG_PARAMS (this << index);
return m_staticRouting->GetMulticastRoute (index);
}
@@ -420,8 +416,7 @@ Ipv4L3Protocol::RemoveMulticastRoute (Ipv4Address origin,
uint32_t inputInterface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << origin << ", " << group << ", " << inputInterface <<
")");
NS_LOG_PARAMS (this << origin << group << inputInterface);
m_staticRouting->RemoveMulticastRoute (origin, group, inputInterface);
}
@@ -429,7 +424,7 @@ void
Ipv4L3Protocol::RemoveMulticastRoute (uint32_t index)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << index << ")");
NS_LOG_PARAMS (this << index);
m_staticRouting->RemoveMulticastRoute (index);
}
@@ -437,7 +432,7 @@ uint32_t
Ipv4L3Protocol::AddInterface (Ptr<NetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &device << ")");
NS_LOG_PARAMS (this << &device);
Ptr<Ipv4Interface> interface = Create<ArpIpv4Interface> (m_node, device);
return AddIpv4Interface (interface);
}
@@ -446,7 +441,7 @@ uint32_t
Ipv4L3Protocol::AddIpv4Interface (Ptr<Ipv4Interface>interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << interface << ")");
NS_LOG_PARAMS (this << interface);
uint32_t index = m_nInterfaces;
m_interfaces.push_back (interface);
m_nInterfaces++;
@@ -457,7 +452,7 @@ Ptr<Ipv4Interface>
Ipv4L3Protocol::GetInterface (uint32_t index) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << index << ")");
NS_LOG_PARAMS (this << index);
uint32_t tmp = 0;
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
{
@@ -481,7 +476,7 @@ uint32_t
Ipv4L3Protocol::FindInterfaceForAddr (Ipv4Address addr) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << addr << ")");
NS_LOG_PARAMS (this << addr);
uint32_t ifIndex = 0;
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin ();
@@ -503,7 +498,7 @@ uint32_t
Ipv4L3Protocol::FindInterfaceForAddr (Ipv4Address addr, Ipv4Mask mask) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << addr << ", " << mask << ")");
NS_LOG_PARAMS (this << addr << mask);
uint32_t ifIndex = 0;
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin ();
@@ -525,7 +520,7 @@ Ptr<Ipv4Interface>
Ipv4L3Protocol::FindInterfaceForDevice (Ptr<const NetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &device << ")");
NS_LOG_PARAMS (this << &device);
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
{
if ((*i)->GetDevice () == device)
@@ -540,8 +535,7 @@ void
Ipv4L3Protocol::Receive( Ptr<NetDevice> device, const Packet& p, uint16_t protocol, const Address &from)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &device << ", " << &p << ", " << protocol << ", " <<
from << ")");
NS_LOG_PARAMS (this << &device << &p << protocol << from);
NS_LOG_LOGIC ("Packet from " << from);
@@ -585,8 +579,7 @@ Ipv4L3Protocol::Send (Packet const &packet,
uint8_t protocol)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &packet << ", " << source << ", " << ", " <<
destination << ", " << protocol << ")");
NS_LOG_PARAMS (this << &packet << source << destination << protocol);
Ipv4Header ipHeader;
@@ -637,8 +630,7 @@ Ipv4L3Protocol::SendRealOut (bool found,
Ipv4Header const &ipHeader)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << found << ", " << &route << ", " << &packet <<
&ipHeader << ")");
NS_LOG_PARAMS (this << found << &route << &packet << &ipHeader);
if (!found)
{
@@ -673,8 +665,7 @@ Ipv4L3Protocol::Forwarding (
Ptr<NetDevice> device)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << ifIndex << ", " << &packet << ", " << &ipHeader <<
", " << device << ")");
NS_LOG_PARAMS (ifIndex << &packet << &ipHeader<< device);
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin ();
i != m_interfaces.end (); i++)
@@ -751,7 +742,7 @@ Ipv4L3Protocol::ForwardUp (Packet p, Ipv4Header const&ip,
Ptr<Ipv4Interface> incomingInterface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << &ip << ")");
NS_LOG_PARAMS (this << &p << &ip);
Ptr<Ipv4L4Demux> demux = m_node->QueryInterface<Ipv4L4Demux> (Ipv4L4Demux::iid);
Ptr<Ipv4L4Protocol> protocol = demux->GetProtocol (ip.GetProtocol ());
@@ -762,7 +753,7 @@ void
Ipv4L3Protocol::JoinMulticastGroup (Ipv4Address origin, Ipv4Address group)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << origin << ", " << group << ")");
NS_LOG_PARAMS (this << origin << group);
m_multicastGroups.push_back(
std::pair<Ipv4Address, Ipv4Address> (origin, group));
}
@@ -771,7 +762,7 @@ void
Ipv4L3Protocol::LeaveMulticastGroup (Ipv4Address origin, Ipv4Address group)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << origin << ", " << group << ")");
NS_LOG_PARAMS (this << origin << group);
for (Ipv4MulticastGroupList::iterator i = m_multicastGroups.begin ();
i != m_multicastGroups.end ();
@@ -789,7 +780,7 @@ void
Ipv4L3Protocol::SetAddress (uint32_t i, Ipv4Address address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ", " << address << ")");
NS_LOG_PARAMS (this << i << address);
Ptr<Ipv4Interface> interface = GetInterface (i);
interface->SetAddress (address);
}
@@ -798,7 +789,7 @@ void
Ipv4L3Protocol::SetNetworkMask (uint32_t i, Ipv4Mask mask)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ", " << mask << ")");
NS_LOG_PARAMS (this << i << mask);
Ptr<Ipv4Interface> interface = GetInterface (i);
interface->SetNetworkMask (mask);
}
@@ -807,7 +798,7 @@ Ipv4Mask
Ipv4L3Protocol::GetNetworkMask (uint32_t i) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ")");
NS_LOG_PARAMS (this << i);
Ptr<Ipv4Interface> interface = GetInterface (i);
return interface->GetNetworkMask ();
}
@@ -816,7 +807,7 @@ Ipv4Address
Ipv4L3Protocol::GetAddress (uint32_t i) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ")");
NS_LOG_PARAMS (this << i);
Ptr<Ipv4Interface> interface = GetInterface (i);
return interface->GetAddress ();
}
@@ -825,7 +816,7 @@ void
Ipv4L3Protocol::SetMetric (uint32_t i, uint16_t metric)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ", " << metric << ")");
NS_LOG_PARAMS ("(" << i << ", " << metric << ")");
Ptr<Ipv4Interface> interface = GetInterface (i);
interface->SetMetric (metric);
}
@@ -834,7 +825,7 @@ uint16_t
Ipv4L3Protocol::GetMetric (uint32_t i) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ")");
NS_LOG_PARAMS ("(" << i << ")");
Ptr<Ipv4Interface> interface = GetInterface (i);
return interface->GetMetric ();
}
@@ -844,7 +835,7 @@ Ipv4L3Protocol::GetIfIndexForDestination (
Ipv4Address destination, uint32_t& ifIndex) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << destination << ", " << &ifIndex << ")");
NS_LOG_PARAMS (this << destination << &ifIndex);
//
// The first thing we do in trying to determine a source address is to
// consult the routing protocols. These will also check for a default route
@@ -911,7 +902,7 @@ uint16_t
Ipv4L3Protocol::GetMtu (uint32_t i) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ")");
NS_LOG_PARAMS (this << i);
Ptr<Ipv4Interface> interface = GetInterface (i);
return interface->GetMtu ();
}
@@ -920,7 +911,7 @@ bool
Ipv4L3Protocol::IsUp (uint32_t i) const
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ")");
NS_LOG_PARAMS (this << i);
Ptr<Ipv4Interface> interface = GetInterface (i);
return interface->IsUp ();
}
@@ -929,7 +920,7 @@ void
Ipv4L3Protocol::SetUp (uint32_t i)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << i << ")");
NS_LOG_PARAMS (this << i);
Ptr<Ipv4Interface> interface = GetInterface (i);
interface->SetUp ();
@@ -948,7 +939,7 @@ void
Ipv4L3Protocol::SetDown (uint32_t ifaceIndex)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << ifaceIndex << ")");
NS_LOG_PARAMS (this << ifaceIndex);
Ptr<Ipv4Interface> interface = GetInterface (ifaceIndex);
interface->SetDown ();
+1 -1
View File
@@ -47,7 +47,7 @@ void
Ipv4LoopbackInterface::SendTo (Packet packet, Ipv4Address dest)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &packet << ", " << dest << ")");
NS_LOG_PARAMS (this << &packet << dest);
Ptr<Ipv4L3Protocol> ipv4 =
m_node->QueryInterface<Ipv4L3Protocol> (Ipv4L3Protocol::iid);
+2 -3
View File
@@ -522,8 +522,7 @@ Ipv4StaticRouting::RequestRoute (
RouteReplyCallback routeReply)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << ifIndex << &ipHeader << ", " << &packet << ", " <<
&routeReply << ")");
NS_LOG_PARAMS (this << ifIndex << &ipHeader << &packet << &routeReply);
NS_LOG_LOGIC ("source = " << ipHeader.GetSource ());
@@ -576,7 +575,7 @@ bool
Ipv4StaticRouting::RequestIfIndex (Ipv4Address destination, uint32_t& ifIndex)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << destination << ", " << &ifIndex << ")");
NS_LOG_PARAMS (this << destination << &ifIndex);
//
// First, see if this is a multicast packet we have a route for. If we
// have a route, then send the packet down each of the specified interfaces.
+7 -10
View File
@@ -83,7 +83,7 @@ Ipv4EndPoint *
UdpL4Protocol::Allocate (Ipv4Address address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << address << ")");
NS_LOG_PARAMS (this << address);
return m_endPoints->Allocate (address);
}
@@ -91,7 +91,7 @@ Ipv4EndPoint *
UdpL4Protocol::Allocate (uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << port << ")");
NS_LOG_PARAMS (this << port);
return m_endPoints->Allocate (port);
}
@@ -99,7 +99,7 @@ Ipv4EndPoint *
UdpL4Protocol::Allocate (Ipv4Address address, uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << address << ", " << port << ")");
NS_LOG_PARAMS (this << address << port);
return m_endPoints->Allocate (address, port);
}
Ipv4EndPoint *
@@ -107,8 +107,7 @@ UdpL4Protocol::Allocate (Ipv4Address localAddress, uint16_t localPort,
Ipv4Address peerAddress, uint16_t peerPort)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << localAddress << ", " << localPort << ", " <<
peerAddress << ", " << peerPort << ")");
NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
return m_endPoints->Allocate (localAddress, localPort,
peerAddress, peerPort);
}
@@ -117,7 +116,7 @@ void
UdpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << endPoint << ")");
NS_LOG_PARAMS (this << endPoint);
m_endPoints->DeAllocate (endPoint);
}
@@ -128,8 +127,7 @@ UdpL4Protocol::Receive(Packet& packet,
Ptr<Ipv4Interface> interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &packet << ", " << source << ", " << destination <<
")");
NS_LOG_PARAMS (this << &packet << source << destination);
UdpHeader udpHeader;
packet.RemoveHeader (udpHeader);
@@ -149,8 +147,7 @@ UdpL4Protocol::Send (Packet packet,
uint16_t sport, uint16_t dport)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &packet << ", " << saddr << ", " << daddr << ", " <<
sport << ", " << dport << ")");
NS_LOG_PARAMS (this << &packet << saddr << daddr << sport << dport);
UdpHeader udpHeader;
udpHeader.SetDestination (dport);
+7 -7
View File
@@ -117,7 +117,7 @@ int
UdpSocket::Bind (const Address &address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM("(" << address << ")");
NS_LOG_PARAMS (this << address);
if (!InetSocketAddress::IsMatchingType (address))
{
@@ -175,7 +175,7 @@ int
UdpSocket::Connect(const Address & address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << address << ")");
NS_LOG_PARAMS (this << address);
Ipv4Route routeToDest;
InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
m_defaultAddress = transport.GetIpv4 ();
@@ -190,7 +190,7 @@ int
UdpSocket::Send (const Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
if (!m_connected)
{
@@ -226,7 +226,7 @@ int
UdpSocket::DoSendTo (const Packet &p, const Address &address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << address << ")");
NS_LOG_PARAMS (this << &p << address);
if (!m_connected)
{
@@ -248,7 +248,7 @@ int
UdpSocket::DoSendTo (const Packet &p, Ipv4Address dest, uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << dest << ", " << port << ")");
NS_LOG_PARAMS (this << &p << dest << port);
Ipv4Route routeToDest;
@@ -308,7 +308,7 @@ int
UdpSocket::SendTo(const Address &address, const Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << address << ", " << &p << ")");
NS_LOG_PARAMS (this << address << &p);
InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
Ipv4Address ipv4 = transport.GetIpv4 ();
uint16_t port = transport.GetPort ();
@@ -319,7 +319,7 @@ void
UdpSocket::ForwardUp (const Packet &packet, Ipv4Address ipv4, uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &packet << ", " << ipv4 << ", " << port << ")");
NS_LOG_PARAMS (this << &packet << ipv4 << port);
if (m_shutdownRecv)
{
+2 -2
View File
@@ -37,7 +37,7 @@ Channel::Channel (std::string name)
: m_name(name)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << name << ")");
NS_LOG_PARAMS (this << name);
SetInterfaceId (Channel::iid);
}
@@ -50,7 +50,7 @@ Channel::~Channel ()
Channel::SetName(std::string name)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << name << ")");
NS_LOG_PARAMS (this << name);
m_name = name;
}
+69 -4
View File
@@ -45,7 +45,7 @@ void
DropTailQueue::SetMaxPackets (uint32_t npackets)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << npackets << ")");
NS_LOG_PARAMS (this << npackets);
m_maxPackets = npackets;
}
@@ -61,7 +61,7 @@ bool
DropTailQueue::DoEnqueue (const Packet& p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
if (m_packets.size () >= m_maxPackets)
{
@@ -78,7 +78,7 @@ bool
DropTailQueue::DoDequeue (Packet& p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
if (m_packets.empty())
{
@@ -98,7 +98,7 @@ bool
DropTailQueue::DoPeek (Packet& p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
if (m_packets.empty())
{
@@ -111,4 +111,69 @@ DropTailQueue::DoPeek (Packet& p)
return true;
}
} // namespace ns3
#ifdef RUN_SELF_TESTS
#include "ns3/test.h"
namespace ns3 {
class DropTailQueueTest: public Test {
public:
virtual bool RunTests (void);
DropTailQueueTest ();
};
DropTailQueueTest::DropTailQueueTest ()
: Test ("DropTailQueue") {}
bool
DropTailQueueTest::RunTests (void)
{
bool result = true;
DropTailQueue queue;
queue.SetMaxPackets (3);
Packet p1, p2, p3, p4;
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 0);
queue.Enqueue (p1);
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 1);
queue.Enqueue (p2);
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 2);
queue.Enqueue (p3);
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 3);
queue.Enqueue (p4); // will be dropped
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 3);
Packet p;
NS_TEST_ASSERT (queue.Dequeue (p));
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 2);
NS_TEST_ASSERT_EQUAL (p.GetUid (), p1.GetUid ());
NS_TEST_ASSERT (queue.Dequeue (p));
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 1);
NS_TEST_ASSERT_EQUAL (p.GetUid (), p2.GetUid ());
NS_TEST_ASSERT (queue.Dequeue (p));
NS_TEST_ASSERT_EQUAL (queue.GetNPackets (), 0);
NS_TEST_ASSERT_EQUAL (p.GetUid (), p3.GetUid ());
NS_TEST_ASSERT (!queue.Dequeue (p));
return result;
}
static DropTailQueueTest gDropTailQueueTest;
}; // namespace ns3
#endif /* RUN_SELF_TESTS */
+3 -45
View File
@@ -36,13 +36,11 @@ Ipv4::~Ipv4 ()
{}
uint32_t
Ipv4::GetIfIndexByAddress (Ptr<Node> node, Ipv4Address a, Ipv4Mask amask)
Ipv4::GetIfIndexByAddress (Ipv4Address addr, Ipv4Mask mask)
{
Ptr<Ipv4> ipv4 = node->QueryInterface<Ipv4> (Ipv4::iid);
NS_ASSERT_MSG (ipv4, "Ipv4::GetIfIndexByAddress: No Ipv4 interface");
for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++)
for (uint32_t i = 0; i < GetNInterfaces (); i++)
{
if (ipv4->GetAddress (i).CombineMask(amask) == a.CombineMask(amask) )
if (GetAddress (i).CombineMask(mask) == addr.CombineMask(mask) )
{
return i;
}
@@ -52,44 +50,4 @@ Ipv4::GetIfIndexByAddress (Ptr<Node> node, Ipv4Address a, Ipv4Mask amask)
return 0;
}
//
// XXX BUGBUG I don't think this is really the right approach here. The call
// to GetRoute () filters down into Ipv4L3Protocol where it translates into
// a call into the Ipv4 static routing package. This bypasses any other
// routing packages. At a minimum, the name is misleading.
//
bool
Ipv4::GetRouteToDestination (
Ptr<Node> node,
Ipv4Route& route,
Ipv4Address a,
Ipv4Mask amask)
{
Ipv4Route tempRoute;
Ptr<Ipv4> ipv4 = node->QueryInterface<Ipv4> (Ipv4::iid);
NS_ASSERT_MSG (ipv4, "Ipv4::GetRouteToDestination: No Ipv4 interface");
for (uint32_t i = 0; i < ipv4->GetNRoutes (); i++)
{
tempRoute = ipv4->GetRoute (i);
// Host route found
if ( tempRoute.IsNetwork () == false && tempRoute.GetDest () == a )
{
route = tempRoute;
return true;
}
else if ( tempRoute.IsNetwork () &&
tempRoute.GetDestNetwork () == a.CombineMask(amask) )
{
route = tempRoute;
return true;
}
else if ( tempRoute.IsDefault () )
{
route = tempRoute;
return true;
}
}
return false;
}
} // namespace ns3
+10 -10
View File
@@ -449,16 +449,16 @@ public:
*/
virtual void SetDown (uint32_t i) = 0;
/**
* Convenience functions (Doxygen still needed)
*
* Return the ifIndex corresponding to the Ipv4Address provided.
*/
static uint32_t GetIfIndexByAddress (Ptr<Node> node, Ipv4Address a,
Ipv4Mask amask = Ipv4Mask("255.255.255.255"));
static bool GetRouteToDestination (Ptr<Node> node, Ipv4Route& route,
Ipv4Address a, Ipv4Mask amask = Ipv4Mask("255.255.255.255"));
/**
* \brief Convenience function to return the ifIndex corresponding
* to the Ipv4Address provided
*
* \param addr Ipv4Address
* \param mask corresponding Ipv4Mask
* \returns ifIndex corresponding to a/amask
*/
virtual uint32_t GetIfIndexByAddress (Ipv4Address addr,
Ipv4Mask mask = Ipv4Mask("255.255.255.255"));
};
} // namespace ns3
+7
View File
@@ -222,22 +222,26 @@ PacketSocket::SendTo(const Address &address, const Packet &p)
PacketSocketAddress ad;
if (m_state == STATE_CLOSED)
{
NS_LOG_LOGIC ("ERROR_BADF");
m_errno = ERROR_BADF;
return -1;
}
if (m_state == STATE_OPEN)
{
// XXX should return another error here.
NS_LOG_LOGIC ("ERROR_INVAL");
m_errno = ERROR_INVAL;
return -1;
}
if (m_shutdownSend)
{
NS_LOG_LOGIC ("ERROR_SHUTDOWN");
m_errno = ERROR_SHUTDOWN;
return -1;
}
if (!PacketSocketAddress::IsMatchingType (address))
{
NS_LOG_LOGIC ("ERROR_AFNOSUPPORT");
m_errno = ERROR_AFNOSUPPORT;
return -1;
}
@@ -250,6 +254,7 @@ PacketSocket::SendTo(const Address &address, const Packet &p)
Ptr<NetDevice> device = m_node->GetDevice (ad.GetSingleDevice ());
if (!device->Send (p, dest, ad.GetProtocol ()))
{
NS_LOG_LOGIC ("error: NetDevice::Send error");
error = true;
}
}
@@ -260,6 +265,7 @@ PacketSocket::SendTo(const Address &address, const Packet &p)
Ptr<NetDevice> device = m_node->GetDevice (i);
if (!device->Send (p, dest, ad.GetProtocol ()))
{
NS_LOG_LOGIC ("error: NetDevice::Send error");
error = true;
}
}
@@ -271,6 +277,7 @@ PacketSocket::SendTo(const Address &address, const Packet &p)
if (error)
{
NS_LOG_LOGIC ("ERROR_INVAL 2");
m_errno = ERROR_INVAL;
return -1;
}
+4 -4
View File
@@ -139,7 +139,7 @@ bool
Queue::Enqueue (const Packet& p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
NS_LOG_LOGIC ("m_traceEnqueue (p)");
m_traceEnqueue (p);
@@ -157,7 +157,7 @@ bool
Queue::Dequeue (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
bool retval = DoDequeue (p);
@@ -189,7 +189,7 @@ bool
Queue::Peek (Packet &p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
return DoPeek (p);
}
@@ -264,7 +264,7 @@ void
Queue::Drop (const Packet& p)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ")");
NS_LOG_PARAMS (this << &p);
m_nTotalDroppedPackets++;
m_nTotalDroppedBytes += p.GetSize ();
@@ -52,7 +52,7 @@ CandidateQueue::Clear (void)
CandidateQueue::Push (SPFVertex *vNew)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << vNew << ")");
NS_LOG_PARAMS (this << vNew);
CandidateList_t::iterator i = m_candidates.begin ();
@@ -975,7 +975,7 @@ GlobalRouteManagerImpl::DebugSPFCalculate (Ipv4Address root)
GlobalRouteManagerImpl::SPFCalculate (Ipv4Address root)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << root << ")");
NS_LOG_PARAMS (this << root);
SPFVertex *v;
//
@@ -1172,7 +1172,7 @@ GlobalRouteManagerImpl::FindOutgoingInterfaceId (Ipv4Address a, Ipv4Mask amask)
// we're looking for. If we find one, return the corresponding interface
// index.
//
return (Ipv4::GetIfIndexByAddress (node, a, amask) );
return (ipv4->GetIfIndexByAddress (a, amask) );
}
}
//
@@ -58,8 +58,7 @@ GlobalRoutingLinkRecord::GlobalRoutingLinkRecord (
m_metric (metric)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << linkType << ", " << linkId << ", " << linkData <<
", " << metric << ")");
NS_LOG_PARAMS (this << linkType << linkId << linkData << metric);
}
GlobalRoutingLinkRecord::~GlobalRoutingLinkRecord ()
@@ -157,8 +156,7 @@ GlobalRoutingLSA::GlobalRoutingLSA (
m_status(status)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << status << ", " << linkStateId << ", " <<
advertisingRtr << ")");
NS_LOG_PARAMS (this << status << linkStateId << advertisingRtr);
}
GlobalRoutingLSA::GlobalRoutingLSA (GlobalRoutingLSA& lsa)
+1 -1
View File
@@ -32,7 +32,7 @@ static class SchedulerListFactory : public SchedulerFactory
public:
SchedulerListFactory ()
{
SchedulerFactory::AddDefault (this, "List");
SchedulerFactory::Add (this, "List");
}
private:
virtual Scheduler *DoCreate (void) const
+1 -1
View File
@@ -43,7 +43,7 @@ static class SchedulerMapFactory : public SchedulerFactory
public:
SchedulerMapFactory ()
{
SchedulerFactory::Add (this, "Map");
SchedulerFactory::AddDefault (this, "Map");
}
private:
virtual Scheduler *DoCreate (void) const
+42 -32
View File
@@ -354,62 +354,62 @@ TimeTests::~TimeTests ()
bool TimeTests::RunTests (void)
{
bool ok = true;
bool result = true;
Time t0, t1;
CheckOld(&ok);
CheckOld(&result);
t0 = MilliSeconds ((uint64_t)10.0);
t1 = MilliSeconds ((uint64_t)11.0);
CheckOperations(t0, t1, &ok);
CheckOperations(t0, t1, &result);
// t0 = Seconds ((uint64_t)10.0);
// t1 = Seconds ((uint64_t)11.0);
// CheckOperations(t0, t1, &ok);
// CheckOperations(t0, t1, &result);
CheckConversions((uint64_t)5, &ok);
CheckConversions((uint64_t)0, &ok);
CheckConversions((uint64_t)783, &ok);
CheckConversions((uint64_t)1132, &ok);
// CheckConversions((uint64_t)3341039, &ok);
CheckConversions((uint64_t)5, &result);
CheckConversions((uint64_t)0, &result);
CheckConversions((uint64_t)783, &result);
CheckConversions((uint64_t)1132, &result);
// CheckConversions((uint64_t)3341039, &result);
// Now vary the precision and check the conversions
if (TimeStepPrecision::Get () != TimeStepPrecision::NS) {
ok = false;
result = false;
}
CheckPrecision(TimeStepPrecision::US, 7, &ok);
CheckPrecision(TimeStepPrecision::US, 7, &result);
CheckConversions((uint64_t)7, &ok);
CheckConversions((uint64_t)546, &ok);
CheckConversions((uint64_t)6231, &ok);
// CheckConversions((uint64_t)1234639, &ok);
CheckConversions((uint64_t)7, &result);
CheckConversions((uint64_t)546, &result);
CheckConversions((uint64_t)6231, &result);
// CheckConversions((uint64_t)1234639, &result);
CheckPrecision(TimeStepPrecision::MS, 3, &ok);
CheckPrecision(TimeStepPrecision::MS, 3, &result);
CheckConversions((uint64_t)3, &ok);
CheckConversions((uint64_t)134, &ok);
CheckConversions((uint64_t)2341, &ok);
// CheckConversions((uint64_t)8956239, &ok);
CheckConversions((uint64_t)3, &result);
CheckConversions((uint64_t)134, &result);
CheckConversions((uint64_t)2341, &result);
// CheckConversions((uint64_t)8956239, &result);
CheckPrecision(TimeStepPrecision::PS, 21, &ok);
CheckPrecision(TimeStepPrecision::PS, 21, &result);
CheckConversions((uint64_t)4, &ok);
CheckConversions((uint64_t)342, &ok);
CheckConversions((uint64_t)1327, &ok);
// CheckConversions((uint64_t)5439627, &ok);
CheckConversions((uint64_t)4, &result);
CheckConversions((uint64_t)342, &result);
CheckConversions((uint64_t)1327, &result);
// CheckConversions((uint64_t)5439627, &result);
CheckPrecision(TimeStepPrecision::NS, 12, &ok);
CheckConversions((uint64_t)12, &ok);
CheckPrecision(TimeStepPrecision::NS, 12, &result);
CheckConversions((uint64_t)12, &result);
CheckPrecision(TimeStepPrecision::S, 7, &ok);
CheckConversions((uint64_t)7, &ok);
CheckPrecision(TimeStepPrecision::S, 7, &result);
CheckConversions((uint64_t)7, &result);
CheckPrecision(TimeStepPrecision::FS, 5, &ok);
CheckConversions((uint64_t)5, &ok);
CheckPrecision(TimeStepPrecision::FS, 5, &result);
CheckConversions((uint64_t)5, &result);
TimeStepPrecision::Set (TimeStepPrecision::NS);
@@ -420,7 +420,17 @@ bool TimeTests::RunTests (void)
DefaultValue::Bind ("TimeStepPrecision", "PS");
DefaultValue::Bind ("TimeStepPrecision", "FS");
return ok;
Time tooBig = TimeStep (0x8000000000000000LL);
NS_TEST_ASSERT (tooBig.IsNegative ());
tooBig = TimeStep (0xffffffffffffffffLL);
NS_TEST_ASSERT (tooBig.IsNegative ());
tooBig = TimeStep (0x7fffffffffffffffLL);
NS_TEST_ASSERT (tooBig.IsPositive ());
tooBig += TimeStep (1);
NS_TEST_ASSERT (tooBig.IsNegative ());
return result;
}
void TimeTests::CheckOld (bool *ok)