branch merge
This commit is contained in:
commit
60efef0caf
44 files changed
+1493
-283
No files matched your search
@@ -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.");
|
||||
}
|
||||
@@ -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'
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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',
|
||||
]
|
||||
@@ -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",
|
||||
|
||||
@@ -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 ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************
|
||||
**************************************************************/
|
||||
|
||||
|
||||
@@ -341,6 +341,11 @@ LogComponentPrintList (void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ParameterLogger g_parameterLogger;
|
||||
EndParameterListStruct EndParameterList;
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif // NS3_LOG_ENABLE
|
||||
+110
-3
@@ -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)
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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 ())
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user