diff --git a/.hgtags b/.hgtags index 45520a625..b4fa52149 100644 --- a/.hgtags +++ b/.hgtags @@ -7,3 +7,4 @@ 267e2ebc28e4e4ae2f579e1cfc29902acade0c34 buffer-working-before-breaking 606df29888e7573b825fc891a002f0757166b616 release ns-3.0.6 36472385a1cc7c44d34fb7a5951b930010f4e8d2 release ns-3.0.7 +560a5091e0e6ded47d269e2f2dee780f13950a63 release ns-3.0.8 diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 4aff62726..3c6a78ebb 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -3,6 +3,11 @@ This file contains ns-3 release notes (most recent releases first). +Release 3.0.8 (2007/11/15) +======================== + - A simple error model + - Source files for ns-3 tutorial + Release 3.0.7 (2007/10/15) ======================== - OLSR routing protocol diff --git a/VERSION b/VERSION index 2451c27ca..67786e246 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.0.7 +3.0.8 diff --git a/doc/doxygen.conf b/doc/doxygen.conf index dfa34b466..476854249 100644 --- a/doc/doxygen.conf +++ b/doc/doxygen.conf @@ -496,7 +496,7 @@ WARN_LOGFILE = INPUT = src \ doc/main.txt \ doc/introspected-doxygen.h \ - doc/tracing.h \ + doc/tracing.h # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default diff --git a/doc/main.txt b/doc/main.txt index 1027eb97f..6da3b9e08 100644 --- a/doc/main.txt +++ b/doc/main.txt @@ -18,7 +18,7 @@ * - a Functor class: ns3::Callback * - an os-independent interface to get access to the elapsed wall clock time: ns3::SystemWallClockMs * - a class to register regression tests with the test manager: ns3::Test and ns3::TestManager - * - debugging facilities: \ref debugging, \ref assert, \ref error + * - debugging facilities: \ref logging, \ref assert, \ref error * - \ref randomvariable * - \ref config * - a base class for objects which need to support reference counting diff --git a/doc/tracing.h b/doc/tracing.h index 45e7d9db5..27657bd02 100644 --- a/doc/tracing.h +++ b/doc/tracing.h @@ -497,6 +497,8 @@ * }; * // called from MyModel::GetTraceResolver * MyModelTraceType (enum Type type); + * // needed for by the tracing subsystem. + * MyModelTraceType (); * // called from trace sink * enum Type Get (void) const; * // needed by the tracing subsystem @@ -513,10 +515,14 @@ * \endcode * The implementation does not require much thinking: * \code + * MyModelTraceType::MyModelTraceType () + * : m_type (RX) + * {// an arbitrary default value. + * } * MyModelTraceType::MyModelTraceType (enum Type type) * : m_type (type) * {} - * enum Type + * enum MyModelTraceType::Type * MyModelTraceType::Get (void) const * { * return m_type; @@ -531,14 +537,14 @@ * } * void * MyModelTraceType::Print (std::ostream &os) const - * ( + * { * // this method is invoked by the print function of a TraceContext * // if it contains an instance of this TraceContextElement. * switch (m_type) { * case RX: os << "rx"; break; * // ... * } - * ) + * } * std::string * MyModelTraceType::GetTypeName (void) const * { diff --git a/examples/simple-error-model.cc b/examples/simple-error-model.cc new file mode 100644 index 000000000..04b627e62 --- /dev/null +++ b/examples/simple-error-model.cc @@ -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 n0 = Create (); + Ptr n1 = Create (); + Ptr n2 = Create (); + Ptr n3 = Create (); + + // We create the channels first without any IP addressing information + NS_LOG_INFO ("Create channels."); + Ptr channel0 = + PointToPointTopology::AddPointToPointLink ( + n0, n2, DataRate(5000000), MilliSeconds(2)); + + Ptr channel1 = + PointToPointTopology::AddPointToPointLink ( + n1, n2, DataRate(5000000), MilliSeconds(2)); + + Ptr 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 ooff = Create ( + 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 sink = Create ( + 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 ( + 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 ( + 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 = n0->QueryInterface (Ipv4::iid); + ipv4->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1); + ipv4 = n3->QueryInterface (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 nd3 = PointToPointTopology::GetNetDevice + (n3, channel2); + // Create an ErrorModel based on the implementation (constructor) + // specified by the default classId + Ptr 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 bem = em->QueryInterface + (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 nd2 = PointToPointTopology::GetNetDevice + (n2, channel0); + std::list sampleList; + sampleList.push_back (11); + sampleList.push_back (17); + // This time, we'll explicitly create the error model we want + Ptr pem = Create (); + 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."); +} diff --git a/examples/wscript b/examples/wscript index f597225fb..e458fa057 100644 --- a/examples/wscript +++ b/examples/wscript @@ -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' diff --git a/samples/main-adhoc-wifi.cc b/samples/main-adhoc-wifi.cc index fc153f6e0..b97822213 100644 --- a/samples/main-adhoc-wifi.cc +++ b/samples/main-adhoc-wifi.cc @@ -46,13 +46,13 @@ static GnuplotDataset *g_output = 0; static Ptr CreateAdhocNode (Ptr channel, - Position position, const char *address) + Vector position, const char *address) { Ptr node = Create (); Ptr device = Create (node); device->ConnectTo (channel); Ptr mobility = Create (); - mobility->Set (position); + mobility->SetPosition (position); node->AddInterface (mobility); Ptr ipv4 = node->QueryInterface (Ipv4::iid); @@ -64,23 +64,23 @@ CreateAdhocNode (Ptr channel, } static void -SetPosition (Ptr node, Position position) +SetPosition (Ptr node, Vector position) { Ptr mobility = node->QueryInterface (MobilityModel::iid); - mobility->Set (position); + mobility->SetPosition (position); } -static Position +static Vector GetPosition (Ptr node) { Ptr mobility = node->QueryInterface (MobilityModel::iid); - return mobility->Get (); + return mobility->GetPosition (); } static void AdvancePosition (Ptr node) { - Position pos = GetPosition (node); + Vector pos = GetPosition (node); double mbs = ((g_bytesTotal * 8.0) / 1000000); g_bytesTotal = 0; g_output->Add (pos.x, mbs); @@ -119,10 +119,10 @@ RunOneExperiment (void) Ptr channel = Create (); Ptr a = CreateAdhocNode (channel, - Position (5.0,0.0,0.0), + Vector (5.0,0.0,0.0), "192.168.0.1"); Ptr b = CreateAdhocNode (channel, - Position (0.0, 0.0, 0.0), + Vector (0.0, 0.0, 0.0), "192.168.0.2"); Ptr app = Create (a, InetSocketAddress ("192.168.0.2", 10), diff --git a/samples/main-ap-wifi.cc b/samples/main-ap-wifi.cc index 26266b94f..85e8877ce 100644 --- a/samples/main-ap-wifi.cc +++ b/samples/main-ap-wifi.cc @@ -69,7 +69,7 @@ WifiPhyStateTrace (const TraceContext &context, Time start, Time duration, enum static Ptr CreateApNode (Ptr channel, - Position position, + Vector position, const char *ipAddress, Ssid ssid, Time at) @@ -80,7 +80,7 @@ CreateApNode (Ptr channel, Simulator::Schedule (at, &NqapWifiNetDevice::StartBeaconing, device); device->ConnectTo (channel); Ptr mobility = Create (); - mobility->Set (position); + mobility->SetPosition (position); node->AddInterface (mobility); Ptr ipv4 = node->QueryInterface (Ipv4::iid); @@ -93,7 +93,7 @@ CreateApNode (Ptr channel, static Ptr CreateStaNode (Ptr channel, - Position position, + Vector position, const char *ipAddress, Ssid ssid) { @@ -103,7 +103,7 @@ CreateStaNode (Ptr channel, ssid); device->ConnectTo (channel); Ptr mobility = Create (); - mobility->Set (position); + mobility->SetPosition (position); node->AddInterface (mobility); Ptr ipv4 = node->QueryInterface (Ipv4::iid); @@ -115,23 +115,23 @@ CreateStaNode (Ptr channel, } static void -SetPosition (Ptr node, Position position) +SetPosition (Ptr node, Vector position) { Ptr mobility = node->QueryInterface (MobilityModel::iid); - mobility->Set (position); + mobility->SetPosition (position); } -static Position +static Vector GetPosition (Ptr node) { Ptr mobility = node->QueryInterface (MobilityModel::iid); - return mobility->Get (); + return mobility->GetPosition (); } static void AdvancePosition (Ptr node) { - Position pos = GetPosition (node); + Vector pos = GetPosition (node); pos.x += 5.0; if (pos.x >= 210.0) { return; @@ -164,19 +164,19 @@ int main (int argc, char *argv[]) Ssid ssid = Ssid ("mathieu"); Ptr a = CreateApNode (channel, - Position (5.0,0.0,0.0), + Vector (5.0,0.0,0.0), "192.168.0.1", ssid, Seconds (0.1)); Simulator::Schedule (Seconds (1.0), &AdvancePosition, a); Ptr b = CreateStaNode (channel, - Position (0.0, 0.0, 0.0), + Vector (0.0, 0.0, 0.0), "192.168.0.2", ssid); Ptr c = CreateStaNode (channel, - Position (0.0, 0.0, 0.0), + Vector (0.0, 0.0, 0.0), "192.168.0.3", ssid); diff --git a/samples/main-channel.cc b/samples/main-channel.cc index 99ceb04ec..025f1c3a8 100644 --- a/samples/main-channel.cc +++ b/samples/main-channel.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); } diff --git a/samples/main-grid-topology.cc b/samples/main-grid-topology.cc index e2fb1c3e6..7d9f5bbe5 100644 --- a/samples/main-grid-topology.cc +++ b/samples/main-grid-topology.cc @@ -41,7 +41,7 @@ int main (int argc, char *argv[]) Ptr object = *j; Ptr position = object->QueryInterface (MobilityModel::iid); NS_ASSERT (position != 0); - Position pos = position->Get (); + Vector pos = position->GetPosition (); std::cout << "x=" << pos.x << ", y=" << pos.y << ", z=" << pos.z << std::endl; } diff --git a/samples/main-propagation-loss.cc b/samples/main-propagation-loss.cc index 7a6de7e58..2df93d2f1 100644 --- a/samples/main-propagation-loss.cc +++ b/samples/main-propagation-loss.cc @@ -30,10 +30,10 @@ PrintOne (double minTxpower, double maxTxpower, double stepTxpower, double min, Ptr b = Create (); Ptr model = PropagationLossModel::CreateDefault (); - a->Set (Position (0.0, 0.0, 0.0)); + a->SetPosition (Vector (0.0, 0.0, 0.0)); for (double x = min; x < max; x+= step) { - b->Set (Position (x, 0.0, 0.0)); + b->SetPosition (Vector (x, 0.0, 0.0)); std::cout << x << " "; for (double txpower = minTxpower; txpower < maxTxpower; txpower += stepTxpower) { diff --git a/samples/main-random-topology.cc b/samples/main-random-topology.cc index 3021ed3fb..fe896278d 100644 --- a/samples/main-random-topology.cc +++ b/samples/main-random-topology.cc @@ -17,7 +17,7 @@ using namespace ns3; static void CourseChange (const TraceContext &context, Ptr position) { - Position pos = position->Get (); + Vector pos = position->GetPosition (); std::cout << Simulator::Now () << ", pos=" << position << ", x=" << pos.x << ", y=" << pos.y << ", z=" << pos.z << std::endl; } diff --git a/samples/main-random-walk.cc b/samples/main-random-walk.cc index cccd64936..c4a0db34f 100644 --- a/samples/main-random-walk.cc +++ b/samples/main-random-walk.cc @@ -18,11 +18,11 @@ using namespace ns3; static void CourseChange (ns3::TraceContext const&, Ptr mobility) { - Position pos = mobility->Get (); - Speed vel = mobility->GetSpeed (); + Vector pos = mobility->GetPosition (); + Vector vel = mobility->GetVelocity (); std::cout << Simulator::Now () << ", model=" << mobility << ", POS: x=" << pos.x << ", y=" << pos.y - << ", z=" << pos.z << "; VEL:" << vel.dx << ", y=" << vel.dy - << ", z=" << vel.dz << std::endl; + << ", z=" << pos.z << "; VEL:" << vel.x << ", y=" << vel.y + << ", z=" << vel.z << std::endl; } int main (int argc, char *argv[]) diff --git a/src/applications/onoff/onoff-application.cc b/src/applications/onoff/onoff-application.cc index 29f3d9d04..8fa315fc9 100644 --- a/src/applications/onoff/onoff-application.cc +++ b/src/applications/onoff/onoff-application.cc @@ -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); } diff --git a/src/applications/udp-echo/udp-echo-client.cc b/src/applications/udp-echo/udp-echo-client.cc index a5489ef2c..35a52e7b4 100644 --- a/src/applications/udp-echo/udp-echo-client.cc +++ b/src/applications/udp-echo/udp-echo-client.cc @@ -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)) { diff --git a/src/applications/udp-echo/udp-echo-server.cc b/src/applications/udp-echo/udp-echo-server.cc index 2538013cf..5d2d5b361 100644 --- a/src/applications/udp-echo/udp-echo-server.cc +++ b/src/applications/udp-echo/udp-echo-server.cc @@ -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)) { diff --git a/src/common/data-rate.cc b/src/common/data-rate.cc index 832fa98cb..5e8358804 100644 --- a/src/common/data-rate.cc +++ b/src/common/data-rate.cc @@ -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 (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; } diff --git a/src/common/data-rate.h b/src/common/data-rate.h index 1e5db50f9..3607f4916 100644 --- a/src/common/data-rate.h +++ b/src/common/data-rate.h @@ -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 diff --git a/src/common/error-model.cc b/src/common/error-model.cc new file mode 100644 index 000000000..938cced29 --- /dev/null +++ b/src/common/error-model.cc @@ -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 + * This code has been ported from ns-2 (queue/errmodel.{cc,h} + */ + +#include + +#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::CreateDefault (void) +{ + NS_LOG_FUNCTION; + ClassId classId = g_classIdErrorModelDefaultValue.GetValue (); + Ptr em = ComponentManager::Create (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", ErrorModel::iid, + RateErrorModel::iid); + +// Defaults for rate/size +static NumericDefaultValue g_defaultRateErrorModelErrorRate + ("RateErrorModelErrorRate", "The error rate for the error model", 0.0); + +static EnumDefaultValue + 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", ErrorModel::iid, + ListErrorModel::iid); + +ListErrorModel::ListErrorModel () +{ + NS_LOG_FUNCTION; + SetInterfaceId (ListErrorModel::iid); +} + +ListErrorModel::~ListErrorModel () +{ + NS_LOG_FUNCTION; +} + +std::list +ListErrorModel::GetList (void) const +{ + NS_LOG_FUNCTION; + return m_packetList; +} + +void +ListErrorModel::SetList (const std::list &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 diff --git a/src/common/error-model.h b/src/common/error-model.h new file mode 100644 index 000000000..e386d2f94 --- /dev/null +++ b/src/common/error-model.h @@ -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 + * This code has been ported from ns-2 (queue/errmodel.{cc,h} + */ +#ifndef ERROR_MODEL_H +#define ERROR_MODEL_H + +#include +#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 rem = Create (); + * 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 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 GetList (void) const; + /** + * \param packetlist The list of packet uids to error. + * + * This method overwrites any previously provided list. + */ + void SetList (const std::list &packetlist); + +private: + virtual bool DoCorrupt (Packet& p); + virtual void DoReset (void); + + typedef std::list PacketList; + typedef std::list::const_iterator PacketListCI; + + PacketList m_packetList; + +}; + + +} //namespace ns3 +#endif diff --git a/src/common/packet-metadata.cc b/src/common/packet-metadata.cc index ebb5850ba..0f6541f75 100644 --- a/src/common/packet-metadata.cc +++ b/src/common/packet-metadata.cc @@ -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); diff --git a/src/common/wscript b/src/common/wscript index 8b016d2ce..363bc12a9 100644 --- a/src/common/wscript +++ b/src/common/wscript @@ -14,6 +14,7 @@ def build(bld): 'pcap-writer.cc', 'data-rate.cc', 'gnuplot.cc', + 'error-model.cc', ] headers = bld.create_obj('ns3header') @@ -31,4 +32,5 @@ def build(bld): 'pcap-writer.h', 'data-rate.h', 'gnuplot.h', + 'error-model.h', ] diff --git a/src/core/default-value.cc b/src/core/default-value.cc index e9020ebe3..24814bf46 100644 --- a/src/core/default-value.cc +++ b/src/core/default-value.cc @@ -461,7 +461,7 @@ DefaultValueTest::RunTests (void) DefaultValue::Bind ("test-c", "257"); NumericDefaultValue x ("test-x", "help-x", 10.0); NumericDefaultValue y ("test-y", "help-y", 10.0); - + DefaultValue::Bind ("test-y", "-3"); EnumDefaultValue e ("test-e", "help-e", MY_ENUM_C, "C", diff --git a/src/core/default-value.h b/src/core/default-value.h index fb51d8906..686b3ad94 100644 --- a/src/core/default-value.h +++ b/src/core/default-value.h @@ -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; @@ -413,7 +414,7 @@ NumericDefaultValue::NumericDefaultValue (std::string name, T defaultValue) : DefaultValueBase (name, help), m_defaultValue (defaultValue), - m_minValue (std::numeric_limits::min ()), + m_minValue (RealMin ()), m_maxValue (std::numeric_limits::max ()), m_value (defaultValue) { @@ -505,6 +506,21 @@ NumericDefaultValue::DoGetDefaultValue (void) const return oss.str (); } +template +T +NumericDefaultValue::RealMin (void) const +{ + if (std::numeric_limits::is_integer) + { + return std::numeric_limits::min (); + } + else + { + return -std::numeric_limits::max (); + } +} + + /************************************************************** **************************************************************/ diff --git a/src/core/log.cc b/src/core/log.cc index de43712cf..0edf8eabd 100644 --- a/src/core/log.cc +++ b/src/core/log.cc @@ -341,6 +341,11 @@ LogComponentPrintList (void) } } + +ParameterLogger g_parameterLogger; +EndParameterListStruct EndParameterList; + + } // namespace ns3 #endif // NS3_LOG_ENABLE diff --git a/src/core/log.h b/src/core/log.h index d4cf9542e..72c429bda 100644 --- a/src/core/log.h +++ b/src/core/log.h @@ -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 + 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) diff --git a/src/core/random-variable.cc b/src/core/random-variable.cc index fa44440d0..2190b90e1 100644 --- a/src/core/random-variable.cc +++ b/src/core/random-variable.cc @@ -42,7 +42,6 @@ namespace ns3{ //----------------------------------------------------------------------------- // RandomVariable methods -uint32_t RandomVariable::runNumber = 0; bool RandomVariable::initialized = false; // True if RngStream seed set bool RandomVariable::useDevRandom = false; // True if use /dev/random bool RandomVariable::globalSeedSet = false; // True if GlobalSeed called @@ -50,6 +49,7 @@ int RandomVariable::devRandom = -1; uint32_t RandomVariable::globalSeed[6]; unsigned long RandomVariable::heuristic_sequence; RngStream* RandomVariable::m_static_generator = 0; +uint32_t RandomVariable::runNumber = 0; //the static object random_variable_initializer initializes the static members //of RandomVariable @@ -58,9 +58,9 @@ static class RandomVariableInitializer public: RandomVariableInitializer() { - RandomVariable::Initialize(); // sets the static package seed - RandomVariable::m_static_generator = new RngStream(); - RandomVariable::m_static_generator->InitializeStream(); +// RandomVariable::Initialize(); // sets the static package seed +// RandomVariable::m_static_generator = new RngStream(); +// RandomVariable::m_static_generator->InitializeStream(); } ~RandomVariableInitializer() { @@ -69,15 +69,20 @@ static class RandomVariableInitializer } random_variable_initializer; RandomVariable::RandomVariable() + : m_generator(NULL) { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(RandomVariable::runNumber); +// m_generator = new RngStream(); +// m_generator->InitializeStream(); +// m_generator->ResetNthSubstream(RandomVariable::runNumber); } RandomVariable::RandomVariable(const RandomVariable& r) + :m_generator(0) { - m_generator = new RngStream(*r.m_generator); + if(r.m_generator) + { + m_generator = new RngStream(*r.m_generator); + } } RandomVariable::~RandomVariable() @@ -97,6 +102,12 @@ void RandomVariable::UseDevRandom(bool udr) void RandomVariable::GetSeed(uint32_t seed[6]) { + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } m_generator->GetState(seed); } @@ -202,6 +213,16 @@ UniformVariable::UniformVariable(const UniformVariable& c) double UniformVariable::GetValue() { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } return m_min + m_generator->RandU01() * (m_max - m_min); } @@ -212,6 +233,12 @@ RandomVariable* UniformVariable::Copy() const double UniformVariable::GetSingleValue(double s, double l) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } return s + m_static_generator->RandU01() * (l - s);; } @@ -305,6 +332,16 @@ ExponentialVariable::ExponentialVariable(const ExponentialVariable& c) double ExponentialVariable::GetValue() { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } double r = -m_mean*log(m_generator->RandU01()); if (m_bound != 0 && r > m_bound) return m_bound; return r; @@ -316,6 +353,12 @@ RandomVariable* ExponentialVariable::Copy() const } double ExponentialVariable::GetSingleValue(double m, double b/*=0*/) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } double r = -m*log(m_static_generator->RandU01()); if (b != 0 && r > b) return b; return r; @@ -341,6 +384,16 @@ ParetoVariable::ParetoVariable(const ParetoVariable& c) double ParetoVariable::GetValue() { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } double scale = m_mean * ( m_shape - 1.0) / m_shape; double r = (scale * ( 1.0 / pow(m_generator->RandU01(), 1.0 / m_shape))); if (m_bound != 0 && r > m_bound) return m_bound; @@ -354,6 +407,12 @@ RandomVariable* ParetoVariable::Copy() const double ParetoVariable::GetSingleValue(double m, double s, double b/*=0*/) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } double scale = m * ( s - 1.0) / s; double r = (scale * ( 1.0 / pow(m_static_generator->RandU01(), 1.0 / s))); if (b != 0 && r > b) return b; @@ -375,6 +434,16 @@ WeibullVariable::WeibullVariable(const WeibullVariable& c) double WeibullVariable::GetValue() { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } double exponent = 1.0 / m_alpha; double r = m_mean * pow( -log(m_generator->RandU01()), exponent); if (m_bound != 0 && r > m_bound) return m_bound; @@ -388,6 +457,12 @@ RandomVariable* WeibullVariable::Copy() const double WeibullVariable::GetSingleValue(double m, double s, double b/*=0*/) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } double exponent = 1.0 / s; double r = m * pow( -log(m_static_generator->RandU01()), exponent); if (b != 0 && r > b) return b; @@ -412,6 +487,16 @@ NormalVariable::NormalVariable(const NormalVariable& c) double NormalVariable::GetValue() { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } if (m_nextValid) { // use previously generated m_nextValid = false; @@ -445,6 +530,12 @@ RandomVariable* NormalVariable::Copy() const double NormalVariable::GetSingleValue(double m, double v, double b) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } if (m_static_nextValid) { // use previously generated m_static_nextValid = false; @@ -495,6 +586,16 @@ EmpiricalVariable::~EmpiricalVariable() { } double EmpiricalVariable::GetValue() { // Return a value from the empirical distribution // This code based (loosely) on code by Bruce Mah (Thanks Bruce!) + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } if (emp.size() == 0) return 0.0; // HuH? No empirical data if (!validated) Validate(); // Insure in non-decreasing double r = m_generator->RandU01(); @@ -642,6 +743,16 @@ LogNormalVariable::LogNormalVariable (double mu, double sigma) double LogNormalVariable::GetValue () { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } double u, v, r2, normal, z; do @@ -665,6 +776,12 @@ LogNormalVariable::GetValue () double LogNormalVariable::GetSingleValue (double mu, double sigma) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } double u, v, r2, normal, z; do { @@ -698,6 +815,16 @@ TriangularVariable::TriangularVariable(const TriangularVariable& c) double TriangularVariable::GetValue() { + if(!RandomVariable::initialized) + { + RandomVariable::Initialize(); + } + if(!m_generator) + { + m_generator = new RngStream(); + m_generator->InitializeStream(); + m_generator->ResetNthSubstream(RandomVariable::runNumber); + } double u = m_generator->RandU01(); if(u <= (m_mode - m_min) / (m_max - m_min) ) return m_min + sqrt(u * (m_max - m_min) * (m_mode - m_min) ); @@ -712,6 +839,12 @@ RandomVariable* TriangularVariable::Copy() const double TriangularVariable::GetSingleValue(double s, double l, double mean) { + if(!RandomVariable::m_static_generator) + { + RandomVariable::Initialize(); // sets the static package seed + RandomVariable::m_static_generator = new RngStream(); + RandomVariable::m_static_generator->InitializeStream(); + } double mode = 3.0*mean-s-l; double u = m_static_generator->RandU01(); if(u <= (mode - s) / (l - s) ) diff --git a/src/core/random-variable.h b/src/core/random-variable.h index ce4cebd4d..ccc5caa34 100644 --- a/src/core/random-variable.h +++ b/src/core/random-variable.h @@ -71,7 +71,7 @@ public: * \brief Returns a random double from the underlying distribution * \return A floating point random value */ - virtual double GetValue() = 0; + virtual double GetValue() = 0; /** * \brief Returns a random integer integer from the underlying distribution @@ -173,19 +173,19 @@ public: */ static void SetRunNumber(uint32_t n); private: - static void Initialize(); // Initialize the RNG system static void GetRandomSeeds(uint32_t seeds[6]); private: - static bool initialized; // True if package seed is set static bool useDevRandom; // True if using /dev/random desired static bool globalSeedSet; // True if global seed has been specified static int devRandom; // File handle for /dev/random static uint32_t globalSeed[6]; // The global seed to use - static uint32_t runNumber; friend class RandomVariableInitializer; protected: static unsigned long heuristic_sequence; static RngStream* m_static_generator; + static uint32_t runNumber; + static void Initialize(); // Initialize the RNG system + static bool initialized; // True if package seed is set RngStream* m_generator; //underlying generator being wrapped }; diff --git a/src/devices/csma/csma-channel.cc b/src/devices/csma/csma-channel.cc index 598884104..63ca27ea7 100644 --- a/src/devices/csma/csma-channel.cc +++ b/src/devices/csma/csma-channel.cc @@ -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 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 device) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << device << ")"); + NS_LOG_PARAMS (this << device); NS_ASSERT(device != 0); std::vector::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 device) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << device << ")"); + NS_LOG_PARAMS (this << device); NS_ASSERT(device != 0); std::vector::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); diff --git a/src/devices/csma/csma-net-device.cc b/src/devices/csma/csma-net-device.cc index e4fd05a1b..fef638271 100644 --- a/src/devices/csma/csma-net-device.cc +++ b/src/devices/csma/csma-net-device.cc @@ -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) : 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) CsmaNetDevice::CsmaNetDevice (Ptr 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, 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 ch) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << &ch << ")"); + NS_LOG_PARAMS (this << &ch); m_channel = ch; @@ -526,11 +532,20 @@ void CsmaNetDevice::AddQueue (Ptr q) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << q << ")"); + NS_LOG_PARAMS (this << q); m_queue = q; } +void CsmaNetDevice::AddReceiveErrorModel (Ptr 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 diff --git a/src/devices/csma/csma-net-device.h b/src/devices/csma/csma-net-device.h index bbe5259ed..1ce38d098 100644 --- a/src/devices/csma/csma-net-device.h +++ b/src/devices/csma/csma-net-device.h @@ -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); + /** + * 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 em); /** * Receive a packet from a connected CsmaChannel. * @@ -453,6 +464,12 @@ private: * @see class DropTailQueue */ Ptr m_queue; + + /** + * Error model for receive packet events + */ + Ptr m_receiveErrorModel; + /** * NOT TESTED * The trace source for the packet reception events that the device can diff --git a/src/devices/point-to-point/point-to-point-channel.cc b/src/devices/point-to-point/point-to-point-channel.cc index d224a8df8..3760848fb 100644 --- a/src/devices/point-to-point/point-to-point-channel.cc +++ b/src/devices/point-to-point/point-to-point-channel.cc @@ -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 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); diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc index ce3a253eb..e28b2350c 100644 --- a/src/devices/point-to-point/point-to-point-net-device.cc +++ b/src/devices/point-to-point/point-to-point-net-device.cc @@ -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, const DataRate& rate) @@ -73,10 +94,12 @@ PointToPointNetDevice::PointToPointNetDevice (Ptr 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 ch) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << &ch << ")"); + NS_LOG_PARAMS (this << &ch); m_channel = ch; @@ -257,21 +289,38 @@ PointToPointNetDevice::Attach (Ptr ch) void PointToPointNetDevice::AddQueue (Ptr q) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << q << ")"); + NS_LOG_PARAMS (this << q); m_queue = q; } +void PointToPointNetDevice::AddReceiveErrorModel (Ptr 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 PointToPointNetDevice::GetQueue(void) const diff --git a/src/devices/point-to-point/point-to-point-net-device.h b/src/devices/point-to-point/point-to-point-net-device.h index b85a2a66b..e597773ad 100644 --- a/src/devices/point-to-point/point-to-point-net-device.h +++ b/src/devices/point-to-point/point-to-point-net-device.h @@ -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); + /** + * 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 em); /** * Receive a packet from a connected PointToPointChannel. * @@ -288,11 +310,23 @@ private: * @see class TraceResolver */ CallbackTraceSource m_rxTrace; + /** + * The trace source for the packet drop events that the device can + * fire. + * + * @see class CallBackTraceSource + * @see class TraceResolver + */ + CallbackTraceSource m_dropTrace; /** * Default data rate. Used for all newly created p2p net devices */ static DataRateDefaultValue g_defaultRate; + /** + * Error model for receive packet events + */ + Ptr m_receiveErrorModel; }; }; // namespace ns3 diff --git a/src/devices/point-to-point/point-to-point-topology.cc b/src/devices/point-to-point/point-to-point-topology.cc index 7e0fd4efd..e6b10a82f 100644 --- a/src/devices/point-to-point/point-to-point-topology.cc +++ b/src/devices/point-to-point/point-to-point-topology.cc @@ -62,6 +62,30 @@ PointToPointTopology::AddPointToPointLink( return channel; } +Ptr +PointToPointTopology::GetNetDevice (Ptr n, Ptr chan) +{ + Ptr found = 0; + + // The PointToPoint channel is used to find the relevant NetDevice + NS_ASSERT (chan->GetNDevices () == 2); + Ptr nd1 = chan->GetDevice (0); + Ptr 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 chan, diff --git a/src/devices/point-to-point/point-to-point-topology.h b/src/devices/point-to-point/point-to-point-topology.h index 35a452269..29b0419a0 100644 --- a/src/devices/point-to-point/point-to-point-topology.h +++ b/src/devices/point-to-point/point-to-point-topology.h @@ -55,6 +55,17 @@ public: static Ptr AddPointToPointLink( Ptr n1, Ptr 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 GetNetDevice( + Ptr n, Ptr chan); + /** * \param chan PointToPointChannel to use * \param n1 Node diff --git a/src/devices/wifi/dcf-manager-test.cc b/src/devices/wifi/dcf-manager-test.cc index e275d91c8..3517c9531 100644 --- a/src/devices/wifi/dcf-manager-test.cc +++ b/src/devices/wifi/dcf-manager-test.cc @@ -6,6 +6,7 @@ #include "dcf-manager.h" #include "mac-parameters.h" + namespace ns3 { class DcfManagerTest; @@ -14,12 +15,25 @@ class DcfStateTest : public DcfState { public: DcfStateTest (DcfManagerTest *test, uint32_t i); + void QueueTx (uint64_t txTime, uint64_t expectedGrantTime); private: + friend class DcfManagerTest; virtual bool NeedsAccess (void) const; virtual void NotifyAccessGranted (void); virtual void NotifyInternalCollision (void); virtual void NotifyCollision (void); + typedef std::pair ExpectedGrant; + typedef std::list ExpectedGrants; + struct ExpectedCollision { + uint64_t at; + uint32_t nSlots; + }; + typedef std::list ExpectedCollisions; + + ExpectedCollisions m_expectedInternalCollision; + ExpectedCollisions m_expectedCollision; + ExpectedGrants m_expectedGrants; DcfManagerTest *m_test; uint32_t m_i; }; @@ -39,27 +53,23 @@ public: private: void StartTest (uint64_t slotTime, uint64_t sifs, uint64_t ackTxDuration); - void AddDcfState (uint32_t cwMin, uint32_t cwMax, uint32_t aifsn); + void AddDcfState (uint32_t aifsn); void EndTest (void); - void ExpectAccessGranted (uint64_t time, uint32_t from); - void ExpectInternalCollision (uint64_t time, uint32_t from); - void ExpectCollision (uint64_t time, uint32_t from); + void ExpectInternalCollision (uint64_t time, uint32_t from, uint32_t nSlots); + void ExpectCollision (uint64_t time, uint32_t from, uint32_t nSlots); void AddRxOkEvt (uint64_t at, uint64_t duration); void AddRxErrorEvt (uint64_t at, uint64_t duration); - void AddTxEvt (uint64_t at, uint64_t duration); void AddNavReset (uint64_t at, uint64_t duration); void AddNavStart (uint64_t at, uint64_t duration); - void AddAccessRequest (uint64_t time, uint32_t from); + void AddAccessRequest (uint64_t at, uint64_t txTime, + uint64_t expectedGrantTime, uint32_t from); + void DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state); typedef std::vector DcfStates; - typedef std::list > ExpectedEvent; DcfManager *m_dcfManager; MacParameters *m_parameters; DcfStates m_dcfStates; - ExpectedEvent m_expectedAccessGranted; - ExpectedEvent m_expectedInternalCollision; - ExpectedEvent m_expectedCollision; bool m_result; }; @@ -68,10 +78,15 @@ private: DcfStateTest::DcfStateTest (DcfManagerTest *test, uint32_t i) : m_test (test), m_i(i) {} +void +DcfStateTest::QueueTx (uint64_t txTime, uint64_t expectedGrantTime) +{ + m_expectedGrants.push_back (std::make_pair (txTime, expectedGrantTime)); +} bool DcfStateTest::NeedsAccess (void) const { - return true; + return !m_expectedGrants.empty (); } void DcfStateTest::NotifyAccessGranted (void) @@ -81,15 +96,11 @@ DcfStateTest::NotifyAccessGranted (void) void DcfStateTest::NotifyInternalCollision (void) { - UpdateFailedCw (); - StartBackoffNow (0); m_test->NotifyInternalCollision (m_i); } void DcfStateTest::NotifyCollision (void) { - UpdateFailedCw (); - StartBackoffNow (0); m_test->NotifyCollision (m_i); } @@ -102,12 +113,13 @@ DcfManagerTest::DcfManagerTest () void DcfManagerTest::NotifyAccessGranted (uint32_t i) { + DcfStateTest *state = m_dcfStates[i]; bool result = true; - NS_TEST_ASSERT (!m_expectedAccessGranted.empty ()); - std::pair expected = m_expectedAccessGranted.front (); - m_expectedAccessGranted.pop_front (); - NS_TEST_ASSERT_EQUAL (MicroSeconds (expected.first), Simulator::Now ()); - NS_TEST_ASSERT_EQUAL (expected.second, i); + NS_TEST_ASSERT (!state->m_expectedGrants.empty ()); + std::pair expected = state->m_expectedGrants.front (); + state->m_expectedGrants.pop_front (); + NS_TEST_ASSERT_EQUAL (Simulator::Now (), MicroSeconds (expected.second)); + m_dcfManager->NotifyTxStartNow (MicroSeconds (expected.first)); if (!result) { m_result = result; @@ -116,12 +128,13 @@ DcfManagerTest::NotifyAccessGranted (uint32_t i) void DcfManagerTest::NotifyInternalCollision (uint32_t i) { + DcfStateTest *state = m_dcfStates[i]; bool result = true; - NS_TEST_ASSERT (!m_expectedInternalCollision.empty ()); - std::pair expected = m_expectedInternalCollision.front (); - m_expectedInternalCollision.pop_front (); - NS_TEST_ASSERT_EQUAL (MicroSeconds (expected.first), Simulator::Now ()); - NS_TEST_ASSERT_EQUAL (expected.second, i); + NS_TEST_ASSERT (!state->m_expectedInternalCollision.empty ()); + struct DcfStateTest::ExpectedCollision expected = state->m_expectedInternalCollision.front (); + state->m_expectedInternalCollision.pop_front (); + NS_TEST_ASSERT_EQUAL (Simulator::Now (), MicroSeconds (expected.at)); + state->StartBackoffNow (expected.nSlots); if (!result) { m_result = result; @@ -130,12 +143,13 @@ DcfManagerTest::NotifyInternalCollision (uint32_t i) void DcfManagerTest::NotifyCollision (uint32_t i) { + DcfStateTest *state = m_dcfStates[i]; bool result = true; - NS_TEST_ASSERT (!m_expectedCollision.empty ()); - std::pair expected = m_expectedCollision.front (); - m_expectedCollision.pop_front (); - NS_TEST_ASSERT_EQUAL (MicroSeconds (expected.first), Simulator::Now ()); - NS_TEST_ASSERT_EQUAL (expected.second, i); + NS_TEST_ASSERT (!state->m_expectedCollision.empty ()); + struct DcfStateTest::ExpectedCollision expected = state->m_expectedCollision.front (); + state->m_expectedCollision.pop_front (); + NS_TEST_ASSERT_EQUAL (Simulator::Now (), MicroSeconds (expected.at)); + state->StartBackoffNow (expected.nSlots); if (!result) { m_result = result; @@ -144,19 +158,22 @@ DcfManagerTest::NotifyCollision (uint32_t i) void -DcfManagerTest::ExpectAccessGranted (uint64_t time, uint32_t from) +DcfManagerTest::ExpectInternalCollision (uint64_t time, uint32_t nSlots, uint32_t from) { - m_expectedAccessGranted.push_back (std::make_pair (time, from)); + DcfStateTest *state = m_dcfStates[from]; + struct DcfStateTest::ExpectedCollision col; + col.at = time; + col.nSlots = nSlots; + state->m_expectedInternalCollision.push_back (col); } void -DcfManagerTest::ExpectInternalCollision (uint64_t time, uint32_t from) +DcfManagerTest::ExpectCollision (uint64_t time, uint32_t nSlots, uint32_t from) { - m_expectedInternalCollision.push_back (std::make_pair (time, from)); -} -void -DcfManagerTest::ExpectCollision (uint64_t time, uint32_t from) -{ - m_expectedCollision.push_back (std::make_pair (time, from)); + DcfStateTest *state = m_dcfStates[from]; + struct DcfStateTest::ExpectedCollision col; + col.at = time; + col.nSlots = nSlots; + state->m_expectedCollision.push_back (col); } void @@ -169,10 +186,9 @@ DcfManagerTest::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t ackTxDurat } void -DcfManagerTest::AddDcfState (uint32_t cwMin, uint32_t cwMax, uint32_t aifsn) +DcfManagerTest::AddDcfState (uint32_t aifsn) { DcfStateTest *state = new DcfStateTest (this, m_dcfStates.size ()); - state->SetCwBounds (cwMin, cwMax); state->SetAifsn (aifsn); m_dcfStates.push_back (state); m_dcfManager->Add (state); @@ -183,13 +199,14 @@ DcfManagerTest::EndTest (void) { bool result = true; Simulator::Run (); - NS_TEST_ASSERT (m_expectedAccessGranted.empty ()); - NS_TEST_ASSERT (m_expectedInternalCollision.empty ()); - NS_TEST_ASSERT (m_expectedCollision.empty ()); Simulator::Destroy (); for (DcfStates::const_iterator i = m_dcfStates.begin (); i != m_dcfStates.end (); i++) { - delete *i; + DcfStateTest *state = *i; + NS_TEST_ASSERT (state->m_expectedGrants.empty ()); + NS_TEST_ASSERT (state->m_expectedInternalCollision.empty ()); + NS_TEST_ASSERT (state->m_expectedCollision.empty ()); + delete state; } m_dcfStates.clear (); delete m_dcfManager; @@ -218,13 +235,7 @@ DcfManagerTest::AddRxErrorEvt (uint64_t at, uint64_t duration) Simulator::Schedule (MicroSeconds (at+duration) - Now (), &DcfManager::NotifyRxEndErrorNow, m_dcfManager); } -void -DcfManagerTest::AddTxEvt (uint64_t at, uint64_t duration) -{ - Simulator::Schedule (MicroSeconds (at) - Now (), - &DcfManager::NotifyTxStartNow, m_dcfManager, - MicroSeconds (duration)); -} + void DcfManagerTest::AddNavReset (uint64_t at, uint64_t duration) { @@ -240,11 +251,19 @@ DcfManagerTest::AddNavStart (uint64_t at, uint64_t duration) MicroSeconds (duration)); } void -DcfManagerTest::AddAccessRequest (uint64_t time, uint32_t from) +DcfManagerTest::AddAccessRequest (uint64_t at, uint64_t txTime, + uint64_t expectedGrantTime, uint32_t from) { - Simulator::Schedule (MicroSeconds (time) - Now (), - &DcfManager::RequestAccess, - m_dcfManager, m_dcfStates[from]); + Simulator::Schedule (MicroSeconds (at) - Now (), + &DcfManagerTest::DoAccessRequest, this, + txTime, expectedGrantTime, m_dcfStates[from]); +} + +void +DcfManagerTest::DoAccessRequest (uint64_t txTime, uint64_t expectedGrantTime, DcfStateTest *state) +{ + state->QueueTx (txTime, expectedGrantTime); + m_dcfManager->RequestAccess (state); } @@ -255,14 +274,145 @@ DcfManagerTest::RunTests (void) { m_result = true; - StartTest (1 /* slot time */, 3 /* sifs */, 10 /* ack tx dur */); - AddDcfState (8 /* cwmin */, 64 /* cwmax */, 1 /* aifsn */); - AddAccessRequest (1 /* at */ , 0 /* from */); - ExpectAccessGranted (4 /* at */, 0 /* from */); - AddAccessRequest (10 /* at */ , 0 /* from */); - ExpectAccessGranted (10 /* at */, 0 /* from */); + // 0 3 4 5 8 9 10 12 + // | sifs | aifsn | tx | sifs | aifsn | | tx | + // + StartTest (1, 3, 10); + AddDcfState (1); + AddAccessRequest (1, 1, 4, 0); + AddAccessRequest (10, 2, 10, 0); EndTest (); + // The test below mainly intends to test the case where the medium + // becomes busy in the middle of a backoff slot: the backoff counter + // must not be decremented for this backoff slot. This is the case + // below for the backoff slot starting at time 78us. + // + // 20 60 66 70 74 78 80 100 106 110 114 118 120 + // | rx | sifs | aifsn | bslot0 | bslot1 | | rx | sifs | aifsn | bslot2 | bslot3 | tx | + // | + // 30 request access. backoff slots: 4 + StartTest (4, 6 , 10); + AddDcfState (1); + AddRxOkEvt (20, 40); + AddRxOkEvt (80, 20); + AddAccessRequest (30, 2, 118, 0); + ExpectCollision (30, 4, 0); // backoff: 4 slots + EndTest (); + + // Test the case where the backoff slots is zero. + // + // 20 60 66 70 72 + // | rx | sifs | aifsn | tx | + // | + // 30 request access. backoff slots: 0 + StartTest (4, 6 , 10); + AddDcfState (1); + AddRxOkEvt (20, 40); + AddAccessRequest (30, 2, 70, 0); + ExpectCollision (30, 0, 0); // backoff: 0 slots + EndTest (); + + // The test below is subject to some discussion because I am + // not sure I understand the intent of the spec here. + // i.e., what happens if you make a request to get access + // to the medium during the difs idle time after a busy period ? + // do you need to start a backoff ? Or do you need to wait until + // the end of difs and access the medium ? + // Here, we wait until the end of difs and access the medium. + // + // 20 60 66 70 72 + // | rx | sifs | aifsn | tx | + // | + // 62 request access. + // + StartTest (4, 6 , 10); + AddDcfState (1); + AddRxOkEvt (20, 40); + AddAccessRequest (62, 2, 70, 0); + EndTest (); + + + // Test an EIFS + // + // 20 60 66 76 80 84 88 92 96 98 + // | rx | sifs | acktxttime | aifsn | bslot0 | bslot1 | bslot2 | bslot3 | tx | + // | | <---------eifs----------->| + // 30 request access. backoff slots: 4 + StartTest (4, 6, 10); + AddDcfState (1); + AddRxErrorEvt (20, 40); + AddAccessRequest (30, 2, 96, 0); + ExpectCollision (30, 4, 0); // backoff: 4 slots + EndTest (); + + // Test an EIFS which is interupted by a successfull transmission. + // + // 20 60 66 69 75 81 85 89 93 97 101 103 + // | rx | sifs | | rx | sifs | aifsn | bslot0 | bslot1 | bslot2 | bslot3 | tx | + // | | <--eifs-->| + // 30 request access. backoff slots: 4 + StartTest (4, 6, 10); + AddDcfState (1); + AddRxErrorEvt (20, 40); + AddAccessRequest (30, 2, 101, 0); + ExpectCollision (30, 4, 0); // backoff: 4 slots + AddRxOkEvt (69, 6); + EndTest (); + + + // Test two DCFs which suffer an internal collision. the first DCF has a higher + // priority than the second DCF. + // + // 20 60 66 70 74 78 88 + // DCF0 | rx | sifs | aifsn | bslot0 | bslot1 | tx | + // DCF1 | rx | sifs | aifsn | aifsn | aifsn | | sifs | aifsn | aifsn | aifsn | bslot | tx | + // 94 98 102 106 110 112 + StartTest (4, 6, 10); + AddDcfState (1); // high priority DCF + AddDcfState (3); // low priority DCF + AddRxOkEvt (20, 40); + AddAccessRequest (30, 10, 78, 0); + ExpectCollision (30, 2, 0); // backoff: 2 slot + + AddAccessRequest (40, 2, 110, 1); + ExpectCollision (40, 0, 1); // backoff: 0 slot + ExpectInternalCollision (78, 1, 1); // backoff: 1 slot + EndTest (); + + + // + // test simple NAV count. This scenario modelizes a simple DATA+ACK handshake + // where the data rate used for the ACK is higher than expected by the DATA source + // so, the data exchange completes before the end of nav. + // + StartTest (4, 6, 10); + AddDcfState (1); + AddRxOkEvt (20, 40); + AddNavStart (60, 15); + AddRxOkEvt (66, 5); + AddNavStart (71, 0); + AddAccessRequest (30, 10, 93, 0); + ExpectCollision (30, 2, 0); // backoff: 2 slot + EndTest (); + + + // + // test more complex NAV handling by a CF-poll. This scenario modelizes a + // simple DATA+ACK handshake interrupted by a CF-poll which resets the + // NAV counter. + // + StartTest (4, 6, 10); + AddDcfState (1); + AddRxOkEvt (20, 40); + AddNavStart (60, 15); + AddRxOkEvt (66, 5); + AddNavReset (71, 2); + AddAccessRequest (30, 10, 91, 0); + ExpectCollision (30, 2, 0); // backoff: 2 slot + EndTest (); + + return m_result; } diff --git a/src/devices/wifi/dcf-manager.cc b/src/devices/wifi/dcf-manager.cc index 9ffbb75db..9126c1585 100644 --- a/src/devices/wifi/dcf-manager.cc +++ b/src/devices/wifi/dcf-manager.cc @@ -55,16 +55,18 @@ DcfState::UpdateFailedCw (void) m_cw = cw; } void -DcfState::UpdateBackoffSlotsNow (uint32_t nSlots) +DcfState::UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound) { uint32_t n = std::min (nSlots, m_backoffSlots); m_backoffSlots -= n; + m_backoffStart = backoffUpdateBound; } void DcfState::StartBackoffNow (uint32_t nSlots) { NS_ASSERT (m_backoffSlots == 0); + MY_DEBUG ("start backoff="<GetBackoffSlots () == 0 && IsBusy ()) { MY_DEBUG ("medium is busy: collision"); @@ -205,7 +198,6 @@ DcfManager::RequestAccess (DcfState *state) */ state->NotifyCollision (); } - DoGrantAccess (); DoRestartAccessTimeoutIfNeeded (); } @@ -220,21 +212,21 @@ DcfManager::DoGrantAccess (void) { DcfState *state = *i; if (state->NeedsAccess () && - GetBackoffEndFor (state) < Simulator::Now ()) + GetBackoffEndFor (state) <= Simulator::Now ()) { /** * This is the first dcf we find with an expired backoff and which * needs access to the medium. i.e., it has data to send. */ MY_DEBUG ("dcf " << k << " needs access. backoff expired. access granted."); - state->NotifyAccessGranted (); i++; // go to the next item in the list. k++; + std::vector internalCollisionStates; for (States::const_iterator j = i; j != m_states.end (); j++, k++) { - DcfState *state = *j; - if (state->NeedsAccess () && - GetBackoffEndFor (state) < Simulator::Now ()) + DcfState *otherState = *j; + if (otherState->NeedsAccess () && + GetBackoffEndFor (otherState) <= Simulator::Now ()) { MY_DEBUG ("dcf " << k << " needs access. backoff expired. internal collision."); /** @@ -242,9 +234,23 @@ DcfManager::DoGrantAccess (void) * has expired and which needed access to the medium * must be notified that we did get an internal collision. */ - state->NotifyInternalCollision (); + internalCollisionStates.push_back (otherState); } } + + /** + * Now, we notify all of these changes in one go. It is necessary to + * perform first the calculations of which states are colliding and then + * only apply the changes because applying the changes through notification + * could change the global state of the manager, and, thus, could change + * the result of the calculations. + */ + state->NotifyAccessGranted (); + for (std::vector::const_iterator k = internalCollisionStates.begin (); + k != internalCollisionStates.end (); k++) + { + (*k)->NotifyInternalCollision (); + } break; } i++; @@ -318,7 +324,7 @@ DcfManager::UpdateBackoff (void) if (backoffStart <= Simulator::Now ()) { Scalar nSlots = (Simulator::Now () - backoffStart) / m_slotTime; - uint32_t nIntSlots = lrint (nSlots.GetDouble ()); + uint32_t nIntSlots = lrint (nSlots.GetDouble ()); /** * For each DcfState, calculate how many backoff slots elapsed since * the last time its backoff counter was updated. If the number of @@ -328,7 +334,8 @@ DcfManager::UpdateBackoff (void) if (nIntSlots > state->GetAifsn ()) { MY_DEBUG ("dcf " << k << " dec backoff slots=" << nIntSlots); - state->UpdateBackoffSlotsNow (nIntSlots); + Time backoffUpdateBound = backoffStart + Scalar (nIntSlots) * m_slotTime; + state->UpdateBackoffSlotsNow (nIntSlots, backoffUpdateBound); } } } @@ -348,29 +355,30 @@ DcfManager::DoRestartAccessTimeoutIfNeeded (void) DcfState *state = *i; if (state->NeedsAccess ()) { - accessTimeoutNeeded = true; - expectedBackoffEnd = std::min (expectedBackoffEnd, GetBackoffEndFor (state)); + Time tmp = GetBackoffEndFor (state); + if (tmp > Simulator::Now ()) + { + accessTimeoutNeeded = true; + expectedBackoffEnd = std::min (expectedBackoffEnd, tmp); + } } } if (accessTimeoutNeeded) { MY_DEBUG ("expected backoff end="< Simulator::Now ()) + Time expectedBackoffDelay = expectedBackoffEnd - Simulator::Now (); + if (m_accessTimeout.IsRunning () && + Simulator::GetDelayLeft (m_accessTimeout) > expectedBackoffDelay) { - Time expectedBackoffDelay = expectedBackoffEnd - Simulator::Now (); - if (m_accessTimeout.IsRunning () && - Simulator::GetDelayLeft (m_accessTimeout) > expectedBackoffDelay) - { - m_accessTimeout.Cancel (); - } - if (m_accessTimeout.IsExpired ()) - { - m_accessTimeout = Simulator::Schedule (expectedBackoffDelay, - &DcfManager::AccessTimeout, this); - } + m_accessTimeout.Cancel (); + } + if (m_accessTimeout.IsExpired ()) + { + m_accessTimeout = Simulator::Schedule (expectedBackoffDelay, + &DcfManager::AccessTimeout, this); } } -} + } void DcfManager::NotifyRxStartNow (Time duration) diff --git a/src/devices/wifi/dcf-manager.h b/src/devices/wifi/dcf-manager.h index 1c70519eb..4db1c2acd 100644 --- a/src/devices/wifi/dcf-manager.h +++ b/src/devices/wifi/dcf-manager.h @@ -29,7 +29,7 @@ private: uint32_t GetBackoffSlots (void) const; Time GetBackoffStart (void) const; - void UpdateBackoffSlotsNow (uint32_t nSlots); + void UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound); virtual bool NeedsAccess (void) const = 0; virtual void NotifyAccessGranted (void) = 0; @@ -38,6 +38,9 @@ private: uint32_t m_aifsn; uint32_t m_backoffSlots; + // the backoffStart variable is used to keep track of the + // time at which a backoff was started or the time at which + // the backoff counter was last updated. Time m_backoffStart; uint32_t m_cwMin; uint32_t m_cwMax; diff --git a/src/devices/wifi/propagation-loss-model.cc b/src/devices/wifi/propagation-loss-model.cc index ba97e060f..98490c738 100644 --- a/src/devices/wifi/propagation-loss-model.cc +++ b/src/devices/wifi/propagation-loss-model.cc @@ -288,8 +288,8 @@ LogDistancePropagationLossModel::GetRxPower (double txPowerDbm, * * rx = rx0(tx) - 10 * n * log (d/d0) */ - static Ptr zero = Create (Position (0.0, 0.0, 0.0)); - static Ptr reference = Create (Position (m_referenceDistance, 0.0, 0.0)); + static Ptr zero = Create (Vector (0.0, 0.0, 0.0)); + static Ptr reference = Create (Vector (m_referenceDistance, 0.0, 0.0)); double rx0 = m_reference->GetRxPower (txPowerDbm, zero, reference); double pathLossDb = 10 * m_exponent * log10 (distance / m_referenceDistance); double rxPowerDbm = rx0 - pathLossDb; diff --git a/src/internet-node/arp-ipv4-interface.cc b/src/internet-node/arp-ipv4-interface.cc index 8d80c5711..3dc95f5a4 100644 --- a/src/internet-node/arp-ipv4-interface.cc +++ b/src/internet-node/arp-ipv4-interface.cc @@ -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 ()) diff --git a/src/internet-node/ipv4-end-point-demux.cc b/src/internet-node/ipv4-end-point-demux.cc index 8ad8c6a3f..ddf64cc51 100644 --- a/src/internet-node/ipv4-end-point-demux.cc +++ b/src/internet-node/ipv4-end-point-demux.cc @@ -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++) { diff --git a/src/internet-node/ipv4-interface.cc b/src/internet-node/ipv4-interface.cc index bcc346394..81e6bca65 100644 --- a/src/internet-node/ipv4-interface.cc +++ b/src/internet-node/ipv4-interface.cc @@ -41,7 +41,7 @@ Ipv4Interface::Ipv4Interface (Ptr 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; } diff --git a/src/internet-node/ipv4-l3-protocol.cc b/src/internet-node/ipv4-l3-protocol.cc index 908a7bb99..367a03895 100644 --- a/src/internet-node/ipv4-l3-protocol.cc +++ b/src/internet-node/ipv4-l3-protocol.cc @@ -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 routingProtocol, int priority) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << &routingProtocol << ", " << priority << ")"); + NS_LOG_PARAMS (this << &routingProtocol << priority); m_routingProtocols.push_back (std::pair > (-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 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 device) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << &device << ")"); + NS_LOG_PARAMS (this << &device); Ptr interface = Create (m_node, device); return AddIpv4Interface (interface); } @@ -446,7 +441,7 @@ uint32_t Ipv4L3Protocol::AddIpv4Interface (Ptrinterface) { 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 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 Ipv4L3Protocol::FindInterfaceForDevice (Ptr 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 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 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 incomingInterface) { NS_LOG_FUNCTION; - NS_LOG_PARAM ("(" << &p << ", " << &ip << ")"); + NS_LOG_PARAMS (this << &p << &ip); Ptr demux = m_node->QueryInterface (Ipv4L4Demux::iid); Ptr 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 (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 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 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 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 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 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 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 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 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 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 interface = GetInterface (ifaceIndex); interface->SetDown (); diff --git a/src/internet-node/ipv4-loopback-interface.cc b/src/internet-node/ipv4-loopback-interface.cc index eb59a662d..30f18ad9e 100644 --- a/src/internet-node/ipv4-loopback-interface.cc +++ b/src/internet-node/ipv4-loopback-interface.cc @@ -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 ipv4 = m_node->QueryInterface (Ipv4L3Protocol::iid); diff --git a/src/internet-node/ipv4-static-routing.cc b/src/internet-node/ipv4-static-routing.cc index 6b7d8671d..8636631d8 100644 --- a/src/internet-node/ipv4-static-routing.cc +++ b/src/internet-node/ipv4-static-routing.cc @@ -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. diff --git a/src/internet-node/udp-l4-protocol.cc b/src/internet-node/udp-l4-protocol.cc index cbf8cbf52..cd7246536 100644 --- a/src/internet-node/udp-l4-protocol.cc +++ b/src/internet-node/udp-l4-protocol.cc @@ -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 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); diff --git a/src/internet-node/udp-socket.cc b/src/internet-node/udp-socket.cc index d6c968d80..ff695cbfd 100644 --- a/src/internet-node/udp-socket.cc +++ b/src/internet-node/udp-socket.cc @@ -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) { diff --git a/src/mobility/grid-topology.cc b/src/mobility/grid-topology.cc index 625cb49ae..1e33a70cd 100644 --- a/src/mobility/grid-topology.cc +++ b/src/mobility/grid-topology.cc @@ -46,7 +46,7 @@ GridTopology::LayoutOneRowFirst (Ptr object, uint32_t i) Ptr mobility = ComponentManager::Create (m_positionClassId, MobilityModel::iid); object->AddInterface (mobility); - mobility->Set (Position (x, y, 0.0)); + mobility->SetPosition (Vector (x, y, 0.0)); } void @@ -58,7 +58,7 @@ GridTopology::LayoutOneColumnFirst (Ptr object, uint32_t i) Ptr mobility = ComponentManager::Create (m_positionClassId, MobilityModel::iid); object->AddInterface (mobility); - mobility->Set (Position (x, y, 0.0)); + mobility->SetPosition (Vector (x, y, 0.0)); } diff --git a/src/mobility/hierarchical-mobility-model.cc b/src/mobility/hierarchical-mobility-model.cc index 00f4643c2..3f72ba1e7 100644 --- a/src/mobility/hierarchical-mobility-model.cc +++ b/src/mobility/hierarchical-mobility-model.cc @@ -56,34 +56,34 @@ HierarchicalMobilityModel::GetParent (void) const return m_parent; } -Position -HierarchicalMobilityModel::DoGet (void) const +Vector +HierarchicalMobilityModel::DoGetPosition (void) const { - Position parentPosition = m_parent->Get (); - Position childPosition = m_child->Get (); - return Position (parentPosition.x + childPosition.x, + Vector parentPosition = m_parent->GetPosition (); + Vector childPosition = m_child->GetPosition (); + return Vector (parentPosition.x + childPosition.x, parentPosition.y + childPosition.y, parentPosition.z + childPosition.z); } void -HierarchicalMobilityModel::DoSet (const Position &position) +HierarchicalMobilityModel::DoSetPosition (const Vector &position) { - // This implementation of DoSet is really an arbitraty choice. + // This implementation of DoSetPosition is really an arbitraty choice. // anything else would have been ok. - Position parentPosition = m_parent->Get (); - Position childPosition (position.x - parentPosition.x, + Vector parentPosition = m_parent->GetPosition (); + Vector childPosition (position.x - parentPosition.x, position.y - parentPosition.y, position.z - parentPosition.z); - m_child->Set (childPosition); + m_child->SetPosition (childPosition); } -Speed -HierarchicalMobilityModel::DoGetSpeed (void) const +Vector +HierarchicalMobilityModel::DoGetVelocity (void) const { - Speed parentSpeed = m_parent->GetSpeed (); - Speed childSpeed = m_child->GetSpeed (); - Speed speed (parentSpeed.dx + childSpeed.dx, - parentSpeed.dy + childSpeed.dy, - parentSpeed.dz + childSpeed.dz); + Vector parentSpeed = m_parent->GetVelocity (); + Vector childSpeed = m_child->GetVelocity (); + Vector speed (parentSpeed.x + childSpeed.x, + parentSpeed.y + childSpeed.y, + parentSpeed.z + childSpeed.z); return speed; } diff --git a/src/mobility/hierarchical-mobility-model.h b/src/mobility/hierarchical-mobility-model.h index 44623244d..f864289f5 100644 --- a/src/mobility/hierarchical-mobility-model.h +++ b/src/mobility/hierarchical-mobility-model.h @@ -58,9 +58,9 @@ public: Ptr GetParent (void) const; private: - virtual Position DoGet (void) const; - virtual void DoSet (const Position &position); - virtual Speed DoGetSpeed (void) const; + virtual Vector DoGetPosition (void) const; + virtual void DoSetPosition (const Vector &position); + virtual Vector DoGetVelocity (void) const; void ParentChanged (const TraceContext &context, Ptr model); void ChildChanged (const TraceContext &context, Ptr model); diff --git a/src/mobility/mobility-model.cc b/src/mobility/mobility-model.cc index 50965d800..c08d51619 100644 --- a/src/mobility/mobility-model.cc +++ b/src/mobility/mobility-model.cc @@ -33,28 +33,28 @@ MobilityModel::MobilityModel () MobilityModel::~MobilityModel () {} -Position -MobilityModel::Get (void) const +Vector +MobilityModel::GetPosition (void) const { - return DoGet (); + return DoGetPosition (); } -Speed -MobilityModel::GetSpeed (void) const +Vector +MobilityModel::GetVelocity (void) const { - return DoGetSpeed (); + return DoGetVelocity (); } void -MobilityModel::Set (const Position &position) +MobilityModel::SetPosition (const Vector &position) { - DoSet (position); + DoSetPosition (position); } double MobilityModel::GetDistanceFrom (Ptr other) const { - Position oPosition = other->DoGet (); - Position position = DoGet (); + Vector oPosition = other->DoGetPosition (); + Vector position = DoGetPosition (); return CalculateDistance (position, oPosition); } diff --git a/src/mobility/mobility-model.h b/src/mobility/mobility-model.h index 07fd171ea..e55b27988 100644 --- a/src/mobility/mobility-model.h +++ b/src/mobility/mobility-model.h @@ -21,8 +21,7 @@ #define MOBILITY_MODEL_H #include "ns3/object.h" -#include "position.h" -#include "speed.h" +#include "vector.h" namespace ns3 { @@ -43,15 +42,15 @@ public: /** * \returns the current position */ - Position Get (void) const; + Vector GetPosition (void) const; /** * \param position the position to set. */ - void Set (const Position &position); + void SetPosition (const Vector &position); /** - * \returns the current position. + * \returns the current velocity. */ - Speed GetSpeed (void) const; + Vector GetVelocity (void) const; /** * \param position a reference to another mobility model * \returns the distance between the two objects. Unit is meters. @@ -70,21 +69,21 @@ private: * Concrete subclasses of this base class must * implement this method. */ - virtual Position DoGet (void) const = 0; + virtual Vector DoGetPosition (void) const = 0; /** * \param position the position to set. * * Concrete subclasses of this base class must * implement this method. */ - virtual void DoSet (const Position &position) = 0; + virtual void DoSetPosition (const Vector &position) = 0; /** - * \returns the current speed. + * \returns the current velocity. * * Concrete subclasses of this base class must * implement this method. */ - virtual Speed DoGetSpeed (void) const = 0; + virtual Vector DoGetVelocity (void) const = 0; }; }; // namespace ns3 diff --git a/src/mobility/ns2-mobility-file-topology.cc b/src/mobility/ns2-mobility-file-topology.cc index 2b2a32f92..44a31d8a3 100644 --- a/src/mobility/ns2-mobility-file-topology.cc +++ b/src/mobility/ns2-mobility-file-topology.cc @@ -97,7 +97,7 @@ Ns2MobilityFileTopology::LayoutObjectStore (const ObjectStore &store) const { double value = ReadDouble (line.substr (endNodeId + 9, std::string::npos)); std::string coordinate = line.substr (endNodeId + 6, 1); - Position position = model->Get (); + Vector position = model->GetPosition (); if (coordinate == "X") { position.x = value; @@ -117,7 +117,7 @@ Ns2MobilityFileTopology::LayoutObjectStore (const ObjectStore &store) const { continue; } - model->Set (position); + model->SetPosition (position); } else { @@ -129,7 +129,7 @@ Ns2MobilityFileTopology::LayoutObjectStore (const ObjectStore &store) const double zSpeed = ReadDouble (line.substr (ySpeedEnd + 1, std::string::npos)); NS_LOG_DEBUG ("at=" << at << "xSpeed=" << xSpeed << ", ySpeed=" << ySpeed << ", zSpeed=" << zSpeed); Simulator::Schedule (Seconds (at), &StaticSpeedMobilityModel::SetSpeed, model, - Speed (xSpeed, ySpeed, zSpeed)); + Vector (xSpeed, ySpeed, zSpeed)); } } file.close(); diff --git a/src/mobility/random-direction-2d-mobility-model.cc b/src/mobility/random-direction-2d-mobility-model.cc index 9df80874c..cb91c7144 100644 --- a/src/mobility/random-direction-2d-mobility-model.cc +++ b/src/mobility/random-direction-2d-mobility-model.cc @@ -153,12 +153,12 @@ RandomDirection2dMobilityModel::SetDirectionAndSpeed (double direction) { NS_LOG_FUNCTION; double speed = m_parameters->m_speedVariable->GetValue (); - const Speed vector (std::cos (direction) * speed, - std::sin (direction) * speed, - 0.0); - Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds); + const Vector vector (std::cos (direction) * speed, + std::sin (direction) * speed, + 0.0); + Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds); m_helper.Reset (vector); - Position next = m_parameters->m_bounds.CalculateIntersection (position, vector); + Vector next = m_parameters->m_bounds.CalculateIntersection (position, vector); Time delay = Seconds (CalculateDistance (position, next) / speed); m_event = Simulator::Schedule (delay, &RandomDirection2dMobilityModel::BeginPause, this); @@ -169,7 +169,7 @@ RandomDirection2dMobilityModel::ResetDirectionAndSpeed (void) { double direction = UniformVariable::GetSingleValue (0, PI); - Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds); + Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds); switch (m_parameters->m_bounds.GetClosestSide (position)) { case Rectangle::RIGHT: @@ -187,22 +187,22 @@ RandomDirection2dMobilityModel::ResetDirectionAndSpeed (void) } SetDirectionAndSpeed (direction); } -Position -RandomDirection2dMobilityModel::DoGet (void) const +Vector +RandomDirection2dMobilityModel::DoGetPosition (void) const { return m_helper.GetCurrentPosition (m_parameters->m_bounds); } void -RandomDirection2dMobilityModel::DoSet (const Position &position) +RandomDirection2dMobilityModel::DoSetPosition (const Vector &position) { m_helper.InitializePosition (position); Simulator::Remove (m_event); m_event = Simulator::ScheduleNow (&RandomDirection2dMobilityModel::Start, this); } -Speed -RandomDirection2dMobilityModel::DoGetSpeed (void) const +Vector +RandomDirection2dMobilityModel::DoGetVelocity (void) const { - return m_helper.GetSpeed (); + return m_helper.GetVelocity (); } diff --git a/src/mobility/random-direction-2d-mobility-model.h b/src/mobility/random-direction-2d-mobility-model.h index 9087a6e74..1d0773e50 100644 --- a/src/mobility/random-direction-2d-mobility-model.h +++ b/src/mobility/random-direction-2d-mobility-model.h @@ -110,9 +110,9 @@ class RandomDirection2dMobilityModel : public MobilityModel void SetDirectionAndSpeed (double direction); void InitializeDirectionAndSpeed (void); virtual void DoDispose (void); - virtual Position DoGet (void) const; - virtual void DoSet (const Position &position); - virtual Speed DoGetSpeed (void) const; + virtual Vector DoGetPosition (void) const; + virtual void DoSetPosition (const Vector &position); + virtual Vector DoGetVelocity (void) const; static const double PI; Ptr m_parameters; diff --git a/src/mobility/random-position.cc b/src/mobility/random-position.cc index 4e2a79f69..2dab23144 100644 --- a/src/mobility/random-position.cc +++ b/src/mobility/random-position.cc @@ -91,12 +91,12 @@ RandomRectanglePosition::~RandomRectanglePosition () m_x = 0; m_y = 0; } -Position +Vector RandomRectanglePosition::Get (void) const { double x = m_x->GetValue (); double y = m_y->GetValue (); - return Position (x, y, 0.0); + return Vector (x, y, 0.0); } RandomDiscPosition::RandomDiscPosition () @@ -120,7 +120,7 @@ RandomDiscPosition::~RandomDiscPosition () m_theta = 0; m_rho = 0; } -Position +Vector RandomDiscPosition::Get (void) const { double theta = m_theta->GetValue (); @@ -128,7 +128,7 @@ RandomDiscPosition::Get (void) const double x = m_x + std::cos (theta) * rho; double y = m_y + std::sin (theta) * rho; NS_LOG_DEBUG ("Disc position x=" << x << ", y=" << y); - return Position (x, y, 0.0); + return Vector (x, y, 0.0); } diff --git a/src/mobility/random-position.h b/src/mobility/random-position.h index 69b2b3190..27559844d 100644 --- a/src/mobility/random-position.h +++ b/src/mobility/random-position.h @@ -22,7 +22,7 @@ #include "ns3/object.h" #include "ns3/component-manager.h" -#include "position.h" +#include "vector.h" namespace ns3 { @@ -42,7 +42,7 @@ public: /** * \returns the next randomly-choosen position. */ - virtual Position Get (void) const = 0; + virtual Vector Get (void) const = 0; }; /** @@ -68,7 +68,7 @@ public: RandomRectanglePosition (const RandomVariable &x, const RandomVariable &y); virtual ~RandomRectanglePosition (); - virtual Position Get (void) const; + virtual Vector Get (void) const; private: RandomVariable *m_x; RandomVariable *m_y; @@ -106,7 +106,7 @@ public: const RandomVariable &rho, double x, double y); virtual ~RandomDiscPosition (); - virtual Position Get (void) const; + virtual Vector Get (void) const; private: RandomVariable *m_theta; RandomVariable *m_rho; diff --git a/src/mobility/random-topology.cc b/src/mobility/random-topology.cc index f04ce2b56..64469053b 100644 --- a/src/mobility/random-topology.cc +++ b/src/mobility/random-topology.cc @@ -70,8 +70,8 @@ RandomTopology::LayoutOne (Ptr object) Ptr mobility = ComponentManager::Create (m_mobilityModel, MobilityModel::iid); object->AddInterface (mobility); - Position position = m_positionModel->Get (); - mobility->Set (position); + Vector position = m_positionModel->Get (); + mobility->SetPosition (position); } diff --git a/src/mobility/random-walk-2d-mobility-model.cc b/src/mobility/random-walk-2d-mobility-model.cc index 07aa948d0..bf24e9003 100644 --- a/src/mobility/random-walk-2d-mobility-model.cc +++ b/src/mobility/random-walk-2d-mobility-model.cc @@ -143,9 +143,9 @@ RandomWalk2dMobilityModel::Start (void) { double speed = m_parameters->m_speed->GetValue (); double direction = m_parameters->m_direction->GetValue (); - Speed vector (std::cos (direction) * speed, - std::sin (direction) * speed, - 0.0); + Vector vector (std::cos (direction) * speed, + std::sin (direction) * speed, + 0.0); m_helper.Reset (vector); Time delayLeft; @@ -163,11 +163,11 @@ RandomWalk2dMobilityModel::Start (void) void RandomWalk2dMobilityModel::DoWalk (Time delayLeft) { - Position position = m_helper.GetCurrentPosition (); - Speed speed = m_helper.GetSpeed (); - Position nextPosition = position; - nextPosition.x += speed.dx * delayLeft.GetSeconds (); - nextPosition.y += speed.dy * delayLeft.GetSeconds (); + Vector position = m_helper.GetCurrentPosition (); + Vector speed = m_helper.GetVelocity (); + Vector nextPosition = position; + nextPosition.x += speed.x * delayLeft.GetSeconds (); + nextPosition.y += speed.y * delayLeft.GetSeconds (); if (m_parameters->m_bounds.IsInside (nextPosition)) { m_event = Simulator::Schedule (delayLeft, &RandomWalk2dMobilityModel::Start, this); @@ -175,7 +175,7 @@ RandomWalk2dMobilityModel::DoWalk (Time delayLeft) else { nextPosition = m_parameters->m_bounds.CalculateIntersection (position, speed); - Time delay = Seconds ((nextPosition.x - position.x) / speed.dx); + Time delay = Seconds ((nextPosition.x - position.x) / speed.x); m_event = Simulator::Schedule (delay, &RandomWalk2dMobilityModel::Rebound, this, delayLeft - delay); } @@ -185,17 +185,17 @@ RandomWalk2dMobilityModel::DoWalk (Time delayLeft) void RandomWalk2dMobilityModel::Rebound (Time delayLeft) { - Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds); - Speed speed = m_helper.GetSpeed (); + Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds); + Vector speed = m_helper.GetVelocity (); switch (m_parameters->m_bounds.GetClosestSide (position)) { case Rectangle::RIGHT: case Rectangle::LEFT: - speed.dx = - speed.dx; + speed.x = - speed.x; break; case Rectangle::TOP: case Rectangle::BOTTOM: - speed.dy = - speed.dy; + speed.y = - speed.y; break; } m_helper.Reset (speed); @@ -209,23 +209,23 @@ RandomWalk2dMobilityModel::DoDispose (void) // chain up MobilityModel::DoDispose (); } -Position -RandomWalk2dMobilityModel::DoGet (void) const +Vector +RandomWalk2dMobilityModel::DoGetPosition (void) const { return m_helper.GetCurrentPosition (m_parameters->m_bounds); } void -RandomWalk2dMobilityModel::DoSet (const Position &position) +RandomWalk2dMobilityModel::DoSetPosition (const Vector &position) { NS_ASSERT (m_parameters->m_bounds.IsInside (position)); m_helper.InitializePosition (position); Simulator::Remove (m_event); m_event = Simulator::ScheduleNow (&RandomWalk2dMobilityModel::Start, this); } -Speed -RandomWalk2dMobilityModel::DoGetSpeed (void) const +Vector +RandomWalk2dMobilityModel::DoGetVelocity (void) const { - return m_helper.GetSpeed (); + return m_helper.GetVelocity (); } diff --git a/src/mobility/random-walk-2d-mobility-model.h b/src/mobility/random-walk-2d-mobility-model.h index 2341cffb3..72def7ade 100644 --- a/src/mobility/random-walk-2d-mobility-model.h +++ b/src/mobility/random-walk-2d-mobility-model.h @@ -141,9 +141,9 @@ class RandomWalk2dMobilityModel : public MobilityModel void Rebound (Time timeLeft); void DoWalk (Time timeLeft); virtual void DoDispose (void); - virtual Position DoGet (void) const; - virtual void DoSet (const Position &position); - virtual Speed DoGetSpeed (void) const; + virtual Vector DoGetPosition (void) const; + virtual void DoSetPosition (const Vector &position); + virtual Vector DoGetVelocity (void) const; StaticSpeedHelper m_helper; EventId m_event; diff --git a/src/mobility/random-waypoint-mobility-model.cc b/src/mobility/random-waypoint-mobility-model.cc index 0078a35c2..01478cc6a 100644 --- a/src/mobility/random-waypoint-mobility-model.cc +++ b/src/mobility/random-waypoint-mobility-model.cc @@ -117,15 +117,15 @@ RandomWaypointMobilityModel::RandomWaypointMobilityModel (Ptrm_position->Get (); + Vector m_current = m_helper.GetCurrentPosition (); + Vector destination = m_parameters->m_position->Get (); double speed = m_parameters->m_speed->GetValue (); double dx = (destination.x - m_current.x); double dy = (destination.y - m_current.y); double dz = (destination.z - m_current.z); double k = speed / std::sqrt (dx*dx + dy*dy + dz*dz); - m_helper.Reset (Speed (k*dx, k*dy, k*dz)); + m_helper.Reset (Vector (k*dx, k*dy, k*dz)); Time travelDelay = Seconds (CalculateDistance (destination, m_current) / speed); m_event = Simulator::Schedule (travelDelay, &RandomWaypointMobilityModel::Start, this); @@ -141,22 +141,22 @@ RandomWaypointMobilityModel::Start (void) m_event = Simulator::Schedule (pause, &RandomWaypointMobilityModel::BeginWalk, this); } -Position -RandomWaypointMobilityModel::DoGet (void) const +Vector +RandomWaypointMobilityModel::DoGetPosition (void) const { return m_helper.GetCurrentPosition (); } void -RandomWaypointMobilityModel::DoSet (const Position &position) +RandomWaypointMobilityModel::DoSetPosition (const Vector &position) { m_helper.InitializePosition (position); Simulator::Remove (m_event); Simulator::ScheduleNow (&RandomWaypointMobilityModel::Start, this); } -Speed -RandomWaypointMobilityModel::DoGetSpeed (void) const +Vector +RandomWaypointMobilityModel::DoGetVelocity (void) const { - return m_helper.GetSpeed (); + return m_helper.GetVelocity (); } diff --git a/src/mobility/random-waypoint-mobility-model.h b/src/mobility/random-waypoint-mobility-model.h index 6e96d1462..273d38a02 100644 --- a/src/mobility/random-waypoint-mobility-model.h +++ b/src/mobility/random-waypoint-mobility-model.h @@ -100,9 +100,9 @@ public: private: void Start (void); void BeginWalk (void); - virtual Position DoGet (void) const; - virtual void DoSet (const Position &position); - virtual Speed DoGetSpeed (void) const; + virtual Vector DoGetPosition (void) const; + virtual void DoSetPosition (const Vector &position); + virtual Vector DoGetVelocity (void) const; StaticSpeedHelper m_helper; Ptr m_parameters; diff --git a/src/mobility/rectangle.cc b/src/mobility/rectangle.cc index 2f10a7d43..e39f8ae74 100644 --- a/src/mobility/rectangle.cc +++ b/src/mobility/rectangle.cc @@ -18,8 +18,7 @@ * Author: Mathieu Lacage */ #include "rectangle.h" -#include "position.h" -#include "speed.h" +#include "vector.h" #include "ns3/assert.h" #include #include @@ -42,7 +41,7 @@ Rectangle::Rectangle () {} bool -Rectangle::IsInside (const Position &position) const +Rectangle::IsInside (const Vector &position) const { return position.x <= this->xMax && position.x >= this->xMin && @@ -50,7 +49,7 @@ Rectangle::IsInside (const Position &position) const } Rectangle::Side -Rectangle::GetClosestSide (const Position &position) const +Rectangle::GetClosestSide (const Vector &position) const { double xMinDist = std::abs (position.x - this->xMin); double xMaxDist = std::abs (this->xMax - position.x); @@ -82,38 +81,38 @@ Rectangle::GetClosestSide (const Position &position) const } } -Position -Rectangle::CalculateIntersection (const Position ¤t, const Speed &speed) const +Vector +Rectangle::CalculateIntersection (const Vector ¤t, const Vector &speed) const { - double xMaxY = current.y + (this->xMax - current.x) / speed.dx * speed.dy; - double xMinY = current.y + (this->xMin - current.x) / speed.dx * speed.dy; - double yMaxX = current.x + (this->yMax - current.y) / speed.dy * speed.dx; - double yMinX = current.x + (this->yMin - current.y) / speed.dy * speed.dx; + double xMaxY = current.y + (this->xMax - current.x) / speed.x * speed.y; + double xMinY = current.y + (this->xMin - current.x) / speed.x * speed.y; + double yMaxX = current.x + (this->yMax - current.y) / speed.y * speed.x; + double yMinX = current.x + (this->yMin - current.y) / speed.y * speed.x; bool xMaxYOk = (xMaxY <= this->yMax && xMaxY >= this->yMin); bool xMinYOk = (xMinY <= this->yMax && xMinY >= this->yMin); bool yMaxXOk = (yMaxX <= this->xMax && yMaxX >= this->xMin); bool yMinXOk = (yMinX <= this->xMax && yMinX >= this->xMin); - if (xMaxYOk && speed.dx >= 0) + if (xMaxYOk && speed.x >= 0) { - return Position (this->xMax, xMaxY, 0.0); + return Vector (this->xMax, xMaxY, 0.0); } - else if (xMinYOk && speed.dx <= 0) + else if (xMinYOk && speed.x <= 0) { - return Position (this->xMin, xMinY, 0.0); + return Vector (this->xMin, xMinY, 0.0); } - else if (yMaxXOk && speed.dy >= 0) + else if (yMaxXOk && speed.y >= 0) { - return Position (yMaxX, this->yMax, 0.0); + return Vector (yMaxX, this->yMax, 0.0); } - else if (yMinXOk && speed.dy <= 0) + else if (yMinXOk && speed.y <= 0) { - return Position (yMinX, this->yMin, 0.0); + return Vector (yMinX, this->yMin, 0.0); } else { NS_ASSERT (false); // quiet compiler - return Position (0.0, 0.0, 0.0); + return Vector (0.0, 0.0, 0.0); } } diff --git a/src/mobility/rectangle.h b/src/mobility/rectangle.h index df519b545..d61620960 100644 --- a/src/mobility/rectangle.h +++ b/src/mobility/rectangle.h @@ -22,8 +22,7 @@ namespace ns3 { -class Position; -class Speed; +class Vector; /** * \brief a 2d rectangle @@ -51,9 +50,9 @@ public: * Create a zero-sized rectangle located at coordinates (0.0,0.0) */ Rectangle (); - bool IsInside (const Position &position) const; - Side GetClosestSide (const Position &position) const; - Position CalculateIntersection (const Position ¤t, const Speed &speed) const; + bool IsInside (const Vector &position) const; + Side GetClosestSide (const Vector &position) const; + Vector CalculateIntersection (const Vector ¤t, const Vector &speed) const; double xMin; double xMax; diff --git a/src/mobility/speed.h b/src/mobility/speed.h deleted file mode 100644 index d64b1e63b..000000000 --- a/src/mobility/speed.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2007 INRIA - * - * 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: Mathieu Lacage - */ -#ifndef SPEED_H -#define SPEED_H - -namespace ns3 { - -/** - * \brief keep track of 3d cartesian speed vectors - * - * Unit is meters/s. - */ -class Speed -{ -public: - /** - * \param _dx x coordinate of speed vector - * \param _dy y coordinate of speed vector - * \param _dz z coordinate of speed vector - * - * Create speed vector (_dx, _dy, _dz) - */ - Speed (double _dx, double _dy, double _dz); - /** - * Create speed vector (0.0, 0.0, 0.0) - */ - Speed (); - /** - * x coordinate of speed vector - */ - double dx; - /** - * y coordinate of speed vector - */ - double dy; - /** - * z coordinate of speed vector - */ - double dz; -}; - -} // namespace ns3 - -#endif /* SPEED_H */ diff --git a/src/mobility/static-mobility-model.cc b/src/mobility/static-mobility-model.cc index 5142b8178..6e39678df 100644 --- a/src/mobility/static-mobility-model.cc +++ b/src/mobility/static-mobility-model.cc @@ -28,7 +28,7 @@ StaticMobilityModel::StaticMobilityModel () { SetInterfaceId (StaticMobilityModel::iid); } -StaticMobilityModel::StaticMobilityModel (const Position &position) +StaticMobilityModel::StaticMobilityModel (const Vector &position) : m_position (position) { SetInterfaceId (StaticMobilityModel::iid); @@ -36,21 +36,21 @@ StaticMobilityModel::StaticMobilityModel (const Position &position) StaticMobilityModel::~StaticMobilityModel () {} -Position -StaticMobilityModel::DoGet (void) const +Vector +StaticMobilityModel::DoGetPosition (void) const { return m_position; } void -StaticMobilityModel::DoSet (const Position &position) +StaticMobilityModel::DoSetPosition (const Vector &position) { m_position = position; NotifyCourseChange (); } -Speed -StaticMobilityModel::DoGetSpeed (void) const +Vector +StaticMobilityModel::DoGetVelocity (void) const { - return Speed (); + return Vector (0.0, 0.0, 0.0); } }; // namespace ns3 diff --git a/src/mobility/static-mobility-model.h b/src/mobility/static-mobility-model.h index a1215c08a..995cad598 100644 --- a/src/mobility/static-mobility-model.h +++ b/src/mobility/static-mobility-model.h @@ -44,15 +44,15 @@ public: * Create a position located at coordinates (x,y,z). * Unit is meters */ - StaticMobilityModel (const Position &position); + StaticMobilityModel (const Vector &position); virtual ~StaticMobilityModel (); private: - virtual Position DoGet (void) const; - virtual void DoSet (const Position &position); - virtual Speed DoGetSpeed (void) const; + virtual Vector DoGetPosition (void) const; + virtual void DoSetPosition (const Vector &position); + virtual Vector DoGetVelocity (void) const; - Position m_position; + Vector m_position; }; }; // namespace ns3 diff --git a/src/mobility/static-speed-helper.cc b/src/mobility/static-speed-helper.cc index b2d806ab8..d781494f6 100644 --- a/src/mobility/static-speed-helper.cc +++ b/src/mobility/static-speed-helper.cc @@ -25,40 +25,40 @@ namespace ns3 { StaticSpeedHelper::StaticSpeedHelper () {} -StaticSpeedHelper::StaticSpeedHelper (const Position &position) +StaticSpeedHelper::StaticSpeedHelper (const Vector &position) : m_position (position) {} -StaticSpeedHelper::StaticSpeedHelper (const Position &position, - const Speed &speed) +StaticSpeedHelper::StaticSpeedHelper (const Vector &position, + const Vector &speed) : m_position (position), m_speed (speed), m_paused (true) {} void -StaticSpeedHelper::InitializePosition (const Position &position) +StaticSpeedHelper::InitializePosition (const Vector &position) { m_position = position; - m_speed.dx = 0.0; - m_speed.dy = 0.0; - m_speed.dz = 0.0; + m_speed.x = 0.0; + m_speed.y = 0.0; + m_speed.z = 0.0; m_lastUpdate = Simulator::Now (); m_paused = true; } -Position +Vector StaticSpeedHelper::GetCurrentPosition (void) const { Update (); return m_position; } -Speed -StaticSpeedHelper::GetSpeed (void) const +Vector +StaticSpeedHelper::GetVelocity (void) const { - return m_paused? Speed (0, 0, 0) : m_speed; + return m_paused? Vector (0.0, 0.0, 0.0) : m_speed; } void -StaticSpeedHelper::SetSpeed (const Speed &speed) +StaticSpeedHelper::SetSpeed (const Vector &speed) { Update (); m_speed = speed; @@ -76,13 +76,13 @@ StaticSpeedHelper::Update (void) const Time deltaTime = now - m_lastUpdate; m_lastUpdate = now; double deltaS = deltaTime.GetSeconds (); - m_position.x += m_speed.dx * deltaS; - m_position.y += m_speed.dy * deltaS; - m_position.z += m_speed.dz * deltaS; + m_position.x += m_speed.x * deltaS; + m_position.y += m_speed.y * deltaS; + m_position.z += m_speed.z * deltaS; } void -StaticSpeedHelper::Reset (const Speed &speed) +StaticSpeedHelper::Reset (const Vector &speed) { Update (); m_speed = speed; @@ -98,7 +98,7 @@ StaticSpeedHelper::UpdateFull (const Rectangle &bounds) const m_position.y = std::max (bounds.yMin, m_position.y); } -Position +Vector StaticSpeedHelper::GetCurrentPosition (const Rectangle &bounds) const { UpdateFull (bounds); diff --git a/src/mobility/static-speed-helper.h b/src/mobility/static-speed-helper.h index 343898f22..d743460f4 100644 --- a/src/mobility/static-speed-helper.h +++ b/src/mobility/static-speed-helper.h @@ -21,8 +21,7 @@ #define STATIC_SPEED_HELPER_H #include "ns3/nstime.h" -#include "position.h" -#include "speed.h" +#include "vector.h" namespace ns3 { @@ -32,16 +31,16 @@ class StaticSpeedHelper { public: StaticSpeedHelper (); - StaticSpeedHelper (const Position &position); - StaticSpeedHelper (const Position &position, - const Speed &speed); - void InitializePosition (const Position &position); + StaticSpeedHelper (const Vector &position); + StaticSpeedHelper (const Vector &position, + const Vector &speed); + void InitializePosition (const Vector &position); - void Reset (const Speed &speed); - Position GetCurrentPosition (const Rectangle &bounds) const; - Position GetCurrentPosition (void) const; - Speed GetSpeed (void) const; - void SetSpeed (const Speed &speed); + void Reset (const Vector &speed); + Vector GetCurrentPosition (const Rectangle &bounds) const; + Vector GetCurrentPosition (void) const; + Vector GetVelocity (void) const; + void SetSpeed (const Vector &speed); void Pause (void); void Unpause (void); @@ -49,8 +48,8 @@ class StaticSpeedHelper void Update (void) const; void UpdateFull (const Rectangle &rectangle) const; mutable Time m_lastUpdate; - mutable Position m_position; - Speed m_speed; + mutable Vector m_position; + Vector m_speed; bool m_paused; }; diff --git a/src/mobility/static-speed-mobility-model.cc b/src/mobility/static-speed-mobility-model.cc index 3f0dd3229..779aeae9a 100644 --- a/src/mobility/static-speed-mobility-model.cc +++ b/src/mobility/static-speed-mobility-model.cc @@ -33,13 +33,13 @@ StaticSpeedMobilityModel::StaticSpeedMobilityModel () { SetInterfaceId (StaticSpeedMobilityModel::iid); } -StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position) +StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Vector &position) : m_helper (position) { SetInterfaceId (StaticSpeedMobilityModel::iid); } -StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position, - const Speed &speed) +StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Vector &position, + const Vector &speed) : m_helper (position, speed) { SetInterfaceId (StaticSpeedMobilityModel::iid); @@ -49,28 +49,28 @@ StaticSpeedMobilityModel::~StaticSpeedMobilityModel () {} void -StaticSpeedMobilityModel::SetSpeed (const Speed speed) +StaticSpeedMobilityModel::SetSpeed (const Vector &speed) { m_helper.SetSpeed (speed); NotifyCourseChange (); } -Position -StaticSpeedMobilityModel::DoGet (void) const +Vector +StaticSpeedMobilityModel::DoGetPosition (void) const { return m_helper.GetCurrentPosition (); } void -StaticSpeedMobilityModel::DoSet (const Position &position) +StaticSpeedMobilityModel::DoSetPosition (const Vector &position) { m_helper.InitializePosition (position); NotifyCourseChange (); } -Speed -StaticSpeedMobilityModel::DoGetSpeed (void) const +Vector +StaticSpeedMobilityModel::DoGetVelocity (void) const { - return m_helper.GetSpeed (); + return m_helper.GetVelocity (); } }; // namespace ns3 diff --git a/src/mobility/static-speed-mobility-model.h b/src/mobility/static-speed-mobility-model.h index 85d4793d7..81198d735 100644 --- a/src/mobility/static-speed-mobility-model.h +++ b/src/mobility/static-speed-mobility-model.h @@ -25,7 +25,6 @@ #include "ns3/nstime.h" #include "ns3/component-manager.h" #include "static-speed-helper.h" -#include "speed.h" namespace ns3 { @@ -48,15 +47,15 @@ public: * Create a position located at coordinates (x,y,z) with * speed (0,0,0). */ - StaticSpeedMobilityModel (const Position &position); + StaticSpeedMobilityModel (const Vector &position); /** * * Create a position located at coordinates (x,y,z) with * speed (dx,dy,dz). * Unit is meters and meters/s */ - StaticSpeedMobilityModel (const Position &position, - const Speed &speed); + StaticSpeedMobilityModel (const Vector &position, + const Vector &speed); virtual ~StaticSpeedMobilityModel (); /** @@ -65,11 +64,11 @@ public: * Set the current speed now to (dx,dy,dz) * Unit is meters/s */ - void SetSpeed (const Speed speed); + void SetSpeed (const Vector &speed); private: - virtual Position DoGet (void) const; - virtual void DoSet (const Position &position); - virtual Speed DoGetSpeed (void) const; + virtual Vector DoGetPosition (void) const; + virtual void DoSetPosition (const Vector &position); + virtual Vector DoGetVelocity (void) const; void Update (void) const; StaticSpeedHelper m_helper; }; diff --git a/src/mobility/position.cc b/src/mobility/vector.cc similarity index 87% rename from src/mobility/position.cc rename to src/mobility/vector.cc index 2418cb61e..79917c16e 100644 --- a/src/mobility/position.cc +++ b/src/mobility/vector.cc @@ -17,26 +17,26 @@ * * Author: Mathieu Lacage */ -#include "position.h" +#include "vector.h" #include namespace ns3 { -Position::Position (double _x, double _y, double _z) +Vector::Vector (double _x, double _y, double _z) : x (_x), y (_y), z (_z) {} -Position::Position () +Vector::Vector () : x (0.0), y (0.0), z (0.0) {} double -CalculateDistance (const Position &a, const Position &b) +CalculateDistance (const Vector &a, const Vector &b) { double dx = b.x - a.x; double dy = b.y - a.y; diff --git a/src/mobility/position.h b/src/mobility/vector.h similarity index 65% rename from src/mobility/position.h rename to src/mobility/vector.h index 08ab9a134..6bc277f27 100644 --- a/src/mobility/position.h +++ b/src/mobility/vector.h @@ -17,8 +17,8 @@ * * Author: Mathieu Lacage */ -#ifndef POSITION_H -#define POSITION_H +#ifndef VECTOR_H +#define VECTOR_H namespace ns3 { @@ -27,37 +27,37 @@ namespace ns3 { * * Unit is meters. */ -class Position +class Vector { public: /** - * \param _x x coordinate of position vector - * \param _y y coordinate of position vector - * \param _z z coordinate of position vector + * \param _x x coordinate of vector vector + * \param _y y coordinate of vector vector + * \param _z z coordinate of vector vector * - * Create position vector (_x, _y, _z) + * Create vector vector (_x, _y, _z) */ - Position (double _x, double _y, double _z); + Vector (double _x, double _y, double _z); /** - * Create position vector (0.0, 0.0, 0.0) + * Create vector vector (0.0, 0.0, 0.0) */ - Position (); + Vector (); /** - * x coordinate of position vector + * x coordinate of vector vector */ double x; /** - * y coordinate of position vector + * y coordinate of vector vector */ double y; /** - * z coordinate of position vector + * z coordinate of vector vector */ double z; }; -double CalculateDistance (const Position &a, const Position &b); +double CalculateDistance (const Vector &a, const Vector &b); } // namespace ns3 -#endif /* POSITION_H */ +#endif /* VECTOR_H */ diff --git a/src/mobility/wscript b/src/mobility/wscript index f630a4b71..8b5256a77 100644 --- a/src/mobility/wscript +++ b/src/mobility/wscript @@ -3,16 +3,15 @@ def build(bld): mobility = bld.create_ns3_module('mobility', ['core', 'simulator']) mobility.source = [ + 'vector.cc', 'grid-topology.cc', 'hierarchical-mobility-model.cc', 'mobility-model.cc', 'mobility-model-notifier.cc', - 'position.cc', 'random-position.cc', 'random-topology.cc', 'rectangle.cc', 'rectangle-default-value.cc', - 'speed.cc', 'static-mobility-model.cc', 'static-speed-helper.cc', 'static-speed-mobility-model.cc', @@ -24,16 +23,15 @@ def build(bld): headers = bld.create_obj('ns3header') headers.source = [ + 'vector.h', 'grid-topology.h', 'hierarchical-mobility-model.h', 'mobility-model.h', 'mobility-model-notifier.h', - 'position.h', 'random-position.h', 'random-topology.h', 'rectangle.h', 'rectangle-default-value.h', - 'speed.h', 'static-mobility-model.h', 'static-speed-helper.h', 'static-speed-mobility-model.h', diff --git a/src/node/channel.cc b/src/node/channel.cc index b571e6123..740b8edec 100644 --- a/src/node/channel.cc +++ b/src/node/channel.cc @@ -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; } diff --git a/src/node/drop-tail-queue.cc b/src/node/drop-tail-queue.cc index 8b5ceea79..7b88231ab 100644 --- a/src/node/drop-tail-queue.cc +++ b/src/node/drop-tail-queue.cc @@ -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 */ + diff --git a/src/node/ipv4.cc b/src/node/ipv4.cc index f8a852149..b0e5f9349 100644 --- a/src/node/ipv4.cc +++ b/src/node/ipv4.cc @@ -36,13 +36,11 @@ Ipv4::~Ipv4 () {} uint32_t -Ipv4::GetIfIndexByAddress (Ptr node, Ipv4Address a, Ipv4Mask amask) +Ipv4::GetIfIndexByAddress (Ipv4Address addr, Ipv4Mask mask) { - Ptr ipv4 = node->QueryInterface (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, 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, - Ipv4Route& route, - Ipv4Address a, - Ipv4Mask amask) -{ - Ipv4Route tempRoute; - Ptr ipv4 = node->QueryInterface (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 diff --git a/src/node/ipv4.h b/src/node/ipv4.h index 00f14f7ba..0cd1d129e 100644 --- a/src/node/ipv4.h +++ b/src/node/ipv4.h @@ -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, Ipv4Address a, - Ipv4Mask amask = Ipv4Mask("255.255.255.255")); - - static bool GetRouteToDestination (Ptr 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 diff --git a/src/node/packet-socket.cc b/src/node/packet-socket.cc index 448b84334..000d95966 100644 --- a/src/node/packet-socket.cc +++ b/src/node/packet-socket.cc @@ -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 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 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; } diff --git a/src/node/queue.cc b/src/node/queue.cc index 4a622c2b0..ab7f8f894 100644 --- a/src/node/queue.cc +++ b/src/node/queue.cc @@ -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 (); diff --git a/src/routing/global-routing/candidate-queue.cc b/src/routing/global-routing/candidate-queue.cc index e6d3b552e..403c2e9b7 100644 --- a/src/routing/global-routing/candidate-queue.cc +++ b/src/routing/global-routing/candidate-queue.cc @@ -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 (); diff --git a/src/routing/global-routing/global-route-manager-impl.cc b/src/routing/global-routing/global-route-manager-impl.cc index ed61f7f5c..57a17f828 100644 --- a/src/routing/global-routing/global-route-manager-impl.cc +++ b/src/routing/global-routing/global-route-manager-impl.cc @@ -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) ); } } // diff --git a/src/routing/global-routing/global-router-interface.cc b/src/routing/global-routing/global-router-interface.cc index ee49733c1..9ade5d010 100644 --- a/src/routing/global-routing/global-router-interface.cc +++ b/src/routing/global-routing/global-router-interface.cc @@ -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) diff --git a/src/routing/olsr/olsr-agent-impl.cc b/src/routing/olsr/olsr-agent-impl.cc index b2acdad7d..48c30d029 100644 --- a/src/routing/olsr/olsr-agent-impl.cc +++ b/src/routing/olsr/olsr-agent-impl.cc @@ -2112,40 +2112,3 @@ AgentImpl::IfaceAssocTupleTimerExpire (IfaceAssocTuple tuple) }} // namespace olsr, ns3 - -#ifdef RUN_SELF_TESTS - - -#include "ns3/test.h" - -namespace ns3 { - -class OlsrTest : public ns3::Test { -private: -public: - OlsrTest (); - virtual bool RunTests (void); - - -}; - -OlsrTest::OlsrTest () - : ns3::Test ("Olsr") -{} - - -bool -OlsrTest::RunTests (void) -{ - bool result = true; - - - return result; -} - -static OlsrTest gOlsrTest; - -} - - -#endif /* RUN_SELF_TESTS */ diff --git a/src/routing/olsr/olsr-agent-impl.h b/src/routing/olsr/olsr-agent-impl.h index 1b561c821..5c21264af 100644 --- a/src/routing/olsr/olsr-agent-impl.h +++ b/src/routing/olsr/olsr-agent-impl.h @@ -48,8 +48,6 @@ namespace olsr { class AgentImpl : public Agent { - friend class OlsrTest; - public: AgentImpl (Ptr node); diff --git a/src/simulator/scheduler-list.cc b/src/simulator/scheduler-list.cc index 8fa57f473..191eb49b0 100644 --- a/src/simulator/scheduler-list.cc +++ b/src/simulator/scheduler-list.cc @@ -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 diff --git a/src/simulator/scheduler-map.cc b/src/simulator/scheduler-map.cc index 5e20ff8d6..078167ec4 100644 --- a/src/simulator/scheduler-map.cc +++ b/src/simulator/scheduler-map.cc @@ -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 diff --git a/src/simulator/time.cc b/src/simulator/time.cc index 045e4cded..565828ce9 100644 --- a/src/simulator/time.cc +++ b/src/simulator/time.cc @@ -360,62 +360,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); @@ -426,7 +426,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) diff --git a/tutorial/ipv4-address-generator.cc b/tutorial/ipv4-address-generator.cc new file mode 100644 index 000000000..dc28b4ddc --- /dev/null +++ b/tutorial/ipv4-address-generator.cc @@ -0,0 +1,255 @@ +/* -*- 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 + */ + +#include "ns3/assert.h" +#include "ns3/log.h" +#include "ns3/simulation-singleton.h" +#include "ipv4-address-generator.h" + +NS_LOG_COMPONENT_DEFINE("Ipv4AddressGenerator"); + +namespace ns3 { + +class Ipv4NetworkGeneratorImpl +{ +public: + Ipv4NetworkGeneratorImpl (); + virtual ~Ipv4NetworkGeneratorImpl (); + + Ipv4Address Allocate (const Ipv4Mask mask); + void Seed (const Ipv4Mask mask, const Ipv4Address network); + +private: + static const uint32_t N_BITS = 32; + class State + { + public: + uint32_t mask; + uint32_t network; + }; + State m_state[N_BITS]; +}; + +Ipv4NetworkGeneratorImpl::Ipv4NetworkGeneratorImpl () +{ + NS_LOG_FUNCTION; + + uint32_t mask = 0; + + for (uint32_t i = 0; i < N_BITS; ++i) + { + m_state[i].mask = mask; + mask >>= 1; + mask |= 0x80000000; + m_state[i].network = 0; + NS_LOG_LOGIC ("m_state[" << i << "]"); + NS_LOG_LOGIC ("mask = " << std::hex << m_state[i].mask); + NS_LOG_LOGIC ("network = " << std::hex << m_state[i].network); + } +} + +Ipv4NetworkGeneratorImpl::~Ipv4NetworkGeneratorImpl () +{ + NS_LOG_FUNCTION; +} + + void +Ipv4NetworkGeneratorImpl::Seed ( + const Ipv4Mask mask, + const Ipv4Address network) +{ + NS_LOG_FUNCTION; + + uint32_t maskBits = mask.GetHostOrder (); + uint32_t networkBits = network.GetHostOrder (); + + for (uint32_t i = 0; i < N_BITS; ++i) + { + if (maskBits & 1) + { + uint32_t nMaskBits = N_BITS - i; + NS_ASSERT(nMaskBits >= 0 && nMaskBits < N_BITS); + m_state[nMaskBits].network = networkBits >> (N_BITS - i); + return; + } + maskBits >>= 1; + } + NS_ASSERT_MSG(false, "Impossible"); + return; +} + + Ipv4Address +Ipv4NetworkGeneratorImpl::Allocate (const Ipv4Mask mask) +{ + NS_LOG_FUNCTION; + + uint32_t bits = mask.GetHostOrder (); + + for (uint32_t i = 0; i < N_BITS; ++i) + { + if (bits & 1) + { + uint32_t nBits = N_BITS - i; + NS_ASSERT(nBits >= 0 && nBits < N_BITS); + Ipv4Address addr (m_state[nBits].network << i); + ++m_state[nBits].network; + return addr; + } + bits >>= 1; + } + NS_ASSERT_MSG(false, "Impossible"); + return Ipv4Address (bits); +} + +class Ipv4AddressGeneratorImpl +{ +public: + Ipv4AddressGeneratorImpl (); + virtual ~Ipv4AddressGeneratorImpl (); + + Ipv4Address Allocate (const Ipv4Mask mask, const Ipv4Address network); + void Seed (const Ipv4Mask mask, const Ipv4Address address); + +private: + static const uint32_t N_BITS = 32; + class State + { + public: + uint32_t mask; + uint32_t address; + }; + State m_state[N_BITS]; +}; + +Ipv4AddressGeneratorImpl::Ipv4AddressGeneratorImpl () +{ + NS_LOG_FUNCTION; + + uint32_t mask = 0; + + for (uint32_t i = 0; i < N_BITS; ++i) + { + m_state[i].mask = mask; + mask >>= 1; + mask |= 0x80000000; + m_state[i].address = 0; + NS_LOG_LOGIC ("m_state[" << i << "]"); + NS_LOG_LOGIC ("mask = " << std::hex << m_state[i].mask); + NS_LOG_LOGIC ("address = " << std::hex << m_state[i].address); + } +} + +Ipv4AddressGeneratorImpl::~Ipv4AddressGeneratorImpl () +{ + NS_LOG_FUNCTION; +} + + void +Ipv4AddressGeneratorImpl::Seed ( + const Ipv4Mask mask, + const Ipv4Address address) +{ + NS_LOG_FUNCTION; + + uint32_t maskBits = mask.GetHostOrder (); + uint32_t addressBits = address.GetHostOrder (); + + for (uint32_t i = 0; i < N_BITS; ++i) + { + if (maskBits & 1) + { + uint32_t nMaskBits = N_BITS - i; + NS_ASSERT(nMaskBits >= 0 && nMaskBits < N_BITS); + m_state[nMaskBits].address = addressBits; + return; + } + maskBits >>= 1; + } + NS_ASSERT_MSG(false, "Impossible"); + return; +} + + Ipv4Address +Ipv4AddressGeneratorImpl::Allocate ( + const Ipv4Mask mask, + const Ipv4Address network) +{ + NS_LOG_FUNCTION; + + uint32_t bits = mask.GetHostOrder (); + uint32_t net = network.GetHostOrder (); + + for (uint32_t i = 0; i < N_BITS; ++i) + { + if (bits & 1) + { + uint32_t nBits = N_BITS - i; + NS_ASSERT(nBits >= 0 && nBits < N_BITS); + Ipv4Address addr (net | m_state[nBits].address); + ++m_state[nBits].address; + NS_ASSERT_MSG((m_state[nBits].mask & m_state[nBits].address) == 0, + "Ipv4AddressGeneratorImpl::Allocate(): Overflow"); + return addr; + } + bits >>= 1; + } + NS_ASSERT_MSG(false, "Impossible"); + return Ipv4Address (bits); +} + + void +Ipv4AddressGenerator::SeedAddress ( + const Ipv4Mask mask, + const Ipv4Address address) +{ + NS_LOG_FUNCTION; + + SimulationSingleton::Get ()->Seed (mask, address); +} + + Ipv4Address +Ipv4AddressGenerator::AllocateAddress ( + const Ipv4Mask mask, + const Ipv4Address network) +{ + NS_LOG_FUNCTION; + + return SimulationSingleton::Get ()-> + Allocate (mask, network); +} + + void +Ipv4AddressGenerator::SeedNetwork ( + const Ipv4Mask mask, + const Ipv4Address address) +{ + NS_LOG_FUNCTION; + + SimulationSingleton::Get ()->Seed (mask, address); +} + + Ipv4Address +Ipv4AddressGenerator::AllocateNetwork (const Ipv4Mask mask) +{ + NS_LOG_FUNCTION; + + return SimulationSingleton::Get ()-> + Allocate (mask); +} + +}; // namespace ns3 diff --git a/src/mobility/speed.cc b/tutorial/ipv4-address-generator.h similarity index 55% rename from src/mobility/speed.cc rename to tutorial/ipv4-address-generator.h index c6abd0c1d..2962940d3 100644 --- a/src/mobility/speed.cc +++ b/tutorial/ipv4-address-generator.h @@ -1,6 +1,6 @@ /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ /* - * Copyright (c) 2007 INRIA + * 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 @@ -14,23 +14,32 @@ * 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: Mathieu Lacage */ -#include "speed.h" + +#ifndef IPV4_ADDRESS_GENERATOR_H +#define IPV4_ADDRESS_GENERATOR_H + +#include +#include + +#include "ns3/ipv4-address.h" namespace ns3 { -Speed::Speed (double _dx, double _dy, double _dz) - : dx (_dx), - dy (_dy), - dz (_dz) -{} +class Ipv4AddressGenerator { +public: + static void SeedAddress (const Ipv4Mask mask, + const Ipv4Address address); -Speed::Speed () - : dx (0.0), - dy (0.0), - dz (0.0) -{} + static Ipv4Address AllocateAddress (const Ipv4Mask mask, + const Ipv4Address network); -} // namespace ns3 + static void SeedNetwork (const Ipv4Mask mask, + const Ipv4Address address); + + static Ipv4Address AllocateNetwork (const Ipv4Mask mask); +}; + +}; // namespace ns3 + +#endif /* IPV4_ADDRESS_GENERATOR_H */ diff --git a/tutorial/ipv4-bus-network.cc b/tutorial/ipv4-bus-network.cc new file mode 100644 index 000000000..898816c1b --- /dev/null +++ b/tutorial/ipv4-bus-network.cc @@ -0,0 +1,79 @@ +/* -*- 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 + */ + +#include "ns3/mac48-address.h" +#include "ns3/csma-net-device.h" +#include "ns3/csma-topology.h" +#include "ns3/csma-ipv4-topology.h" + +#include "ipv4-bus-network.h" +#include "ipv4-address-generator.h" + +namespace ns3 { + +Ipv4Network::Ipv4Network ( + Ipv4Address network, + Ipv4Mask mask, + Ipv4Address address) +: + m_network (network), m_mask (mask), m_baseAddress (address) +{ +} + +Ipv4Network::~Ipv4Network () +{ +} + +Ipv4BusNetwork::Ipv4BusNetwork ( + Ipv4Address network, + Ipv4Mask mask, + Ipv4Address baseAddress, + DataRate bps, + Time delay, + uint32_t n) +: + Ipv4Network (network, mask, baseAddress) +{ + Ipv4AddressGenerator::SeedNetwork (mask, network); + Ipv4AddressGenerator::SeedAddress (mask, baseAddress); + + m_channel = CsmaTopology::CreateCsmaChannel (bps, delay); + + for (uint32_t i = 0; i < n; ++i) + { + Ptr node = Create (); + uint32_t nd = CsmaIpv4Topology::AddIpv4CsmaNetDevice (node, m_channel, + Mac48Address::Allocate ()); + Ipv4Address address = Ipv4AddressGenerator::AllocateAddress (mask, + network); + CsmaIpv4Topology::AddIpv4Address (node, nd, address, mask); + m_nodes.push_back (node); + } +} + +Ipv4BusNetwork::~Ipv4BusNetwork () +{ +} + + Ptr +Ipv4BusNetwork::GetNode (uint32_t n) +{ + return m_nodes[n]; +} + +}; // namespace ns3 diff --git a/tutorial/ipv4-bus-network.h b/tutorial/ipv4-bus-network.h new file mode 100644 index 000000000..de90f7bf7 --- /dev/null +++ b/tutorial/ipv4-bus-network.h @@ -0,0 +1,64 @@ +/* -*- 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 + */ + +#ifndef IPV4_BUS_NETWORK_H +#define IPV4_BUS_NETWORK_H + +#include +#include "ns3/ptr.h" +#include "ns3/node.h" +#include "ns3/ipv4-address.h" +#include "ns3/data-rate.h" +#include "ns3/csma-channel.h" + +namespace ns3 { + +class Ipv4Network +{ +public: + Ipv4Network (Ipv4Address network, Ipv4Mask mask, Ipv4Address address); + virtual ~Ipv4Network (); + + Ipv4Address m_network; + Ipv4Mask m_mask; + Ipv4Address m_baseAddress; +}; + +class Ipv4BusNetwork : public Ipv4Network +{ +public: + Ipv4BusNetwork ( + Ipv4Address network, + Ipv4Mask mask, + Ipv4Address baseAddress, + DataRate bps, + Time delay, + uint32_t n); + + virtual ~Ipv4BusNetwork (); + + Ptr GetNode (uint32_t n); + +private: + std::vector > m_nodes; + Ptr m_channel; +}; + +}; // namespace ns3 + +#endif /* IPV4_BUS_NETWORK_H */ diff --git a/tutorial/point-to-point-ipv4-topology.cc b/tutorial/point-to-point-ipv4-topology.cc new file mode 100644 index 000000000..d508f84d5 --- /dev/null +++ b/tutorial/point-to-point-ipv4-topology.cc @@ -0,0 +1,73 @@ +/* -*- 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 + */ + +#include "ns3/assert.h" +#include "ns3/log.h" +#include "ns3/nstime.h" +#include "ns3/internet-node.h" +#include "ns3/ipv4-address.h" +#include "ns3/ipv4.h" +#include "ns3/queue.h" + +#include "ns3/point-to-point-channel.h" +#include "ns3/point-to-point-net-device.h" +#include "point-to-point-ipv4-topology.h" + +namespace ns3 { + + Ptr +PointToPointIpv4Topology::CreateChannel ( + const DataRate& bps, + const Time& delay) +{ + return Create (bps, delay); +} + + uint32_t +PointToPointIpv4Topology::AddNetDevice ( + Ptr node, + Ptr channel) +{ + NS_ASSERT (channel->GetNDevices () <= 1); + + Ptr nd = Create (node); + + Ptr q = Queue::CreateDefault (); + nd->AddQueue(q); + nd->Attach (channel); + + return nd->GetIfIndex (); +} + + uint32_t +PointToPointIpv4Topology::AddAddress ( + Ptr node, + uint32_t netDeviceNumber, + Ipv4Address address, + Ipv4Mask mask) +{ + Ptr nd = node->GetDevice(netDeviceNumber); + Ptr ipv4 = node->QueryInterface (Ipv4::iid); + uint32_t ifIndex = ipv4->AddInterface (nd); + + ipv4->SetAddress (ifIndex, address); + ipv4->SetNetworkMask (ifIndex, mask); + ipv4->SetUp (ifIndex); + + return ifIndex; +} + +} // namespace ns3 diff --git a/tutorial/point-to-point-ipv4-topology.h b/tutorial/point-to-point-ipv4-topology.h new file mode 100644 index 000000000..c2a9a4391 --- /dev/null +++ b/tutorial/point-to-point-ipv4-topology.h @@ -0,0 +1,49 @@ +/* -*- 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 + */ + +#ifndef POINT_TO_POINT_IPV4_TOPOLOGY_H +#define POINT_TO_POINT_IPV4_TOPOLOGY_H + +#include "ns3/ptr.h" + +namespace ns3 { + +class PointToPointChannel; +class Node; +class Ipv4Address; +class Ipv4Mask; +class DataRate; + +class PointToPointIpv4Topology { +public: + static Ptr CreateChannel ( + const DataRate& dataRate, const Time& delay); + + static uint32_t AddNetDevice( + Ptr node, + Ptr channel); + + static uint32_t AddAddress( + Ptr node, + uint32_t ndIndex, + Ipv4Address address, + Ipv4Mask mask); +}; + +} // namespace ns3 + +#endif // POINT_TO_POINT_IPV4_TOPOLOGY_H + diff --git a/tutorial/testipv4.cc b/tutorial/testipv4.cc new file mode 100644 index 000000000..dcad2e387 --- /dev/null +++ b/tutorial/testipv4.cc @@ -0,0 +1,62 @@ +/* -*- 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 + */ + +#include "ns3/log.h" +#include "ipv4-address-generator.h" + +NS_LOG_COMPONENT_DEFINE ("TestIpv4"); + +using namespace ns3; + +int +main (int argc, char *argv[]) +{ + LogComponentEnable ("TestIpv4", LOG_LEVEL_ALL); + + NS_LOG_INFO ("Test Ipv4"); + + Ipv4Mask mask1 ("255.0.0.0"); + + for (uint32_t i = 0; i < 10; ++i) + { + Ipv4Address network = Ipv4AddressGenerator::AllocateNetwork (mask1); + Ipv4Address address = Ipv4AddressGenerator::AllocateAddress (mask1, + network); + NS_LOG_INFO ("address = " << address); + } + + Ipv4Mask mask2 ("255.255.0.0"); + Ipv4AddressGenerator::SeedNetwork (mask2, "192.168.0.0"); + Ipv4AddressGenerator::SeedAddress (mask2, "0.0.0.3"); + + Ipv4Address network1 = Ipv4AddressGenerator::AllocateNetwork (mask2); + for (uint32_t i = 0; i < 10; ++i) + { + Ipv4Address address = Ipv4AddressGenerator::AllocateAddress (mask2, + network1); + NS_LOG_INFO ("address = " << address); + } + + Ipv4Mask mask3 ("255.255.255.0"); + + for (uint32_t i = 0; i < 10; ++i) + { + Ipv4Address network = Ipv4AddressGenerator::AllocateNetwork (mask3); + Ipv4Address address = Ipv4AddressGenerator::AllocateAddress (mask3, + network); + NS_LOG_INFO ("address = " << address); + } +} diff --git a/tutorial/tutorial-bus-network.cc b/tutorial/tutorial-bus-network.cc new file mode 100644 index 000000000..7013eadbe --- /dev/null +++ b/tutorial/tutorial-bus-network.cc @@ -0,0 +1,62 @@ + +/* + * 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 + */ + +#include "ns3/log.h" +#include "ns3/ipv4-address.h" +#include "ns3/udp-echo-client.h" +#include "ns3/udp-echo-server.h" +#include "ns3/simulator.h" +#include "ns3/nstime.h" +#include "ns3/ascii-trace.h" + +#include "ipv4-bus-network.h" + +NS_LOG_COMPONENT_DEFINE ("BusNetworkSimulation"); + +using namespace ns3; + +int +main (int argc, char *argv[]) +{ + LogComponentEnable ("BusNetworkSimulation", LOG_LEVEL_ALL); + + NS_LOG_INFO ("Bus Network Simulation"); + + Ipv4BusNetwork bus ("10.1.0.0", "255.255.0.0", "0.0.0.3", + DataRate(10000000), MilliSeconds(20), 10); + + uint32_t port = 7; + + Ptr n0 = bus.GetNode (0); + Ptr client = Create (n0, "10.1.0.1", port, + 1, Seconds(1.), 1024); + + Ptr n1 = bus.GetNode (1); + Ptr server = Create (n1, port); + + server->Start(Seconds(1.)); + client->Start(Seconds(2.)); + + server->Stop (Seconds(10.)); + client->Stop (Seconds(10.)); + + AsciiTrace asciitrace ("tutorial.tr"); + asciitrace.TraceAllQueues (); + asciitrace.TraceAllNetDeviceRx (); + + Simulator::Run (); + Simulator::Destroy (); +} diff --git a/tutorial/tutorial-naive-dumbbell.cc b/tutorial/tutorial-linear-dumbbell.cc similarity index 72% rename from tutorial/tutorial-naive-dumbbell.cc rename to tutorial/tutorial-linear-dumbbell.cc index e203ef9f3..c39abd963 100644 --- a/tutorial/tutorial-naive-dumbbell.cc +++ b/tutorial/tutorial-linear-dumbbell.cc @@ -51,10 +51,11 @@ int main (int argc, char *argv[]) { LogComponentEnable ("DumbbellSimulation", LOG_LEVEL_INFO); -// LogComponentEnableAll (LOG_LEVEL_ALL, LOG_DECORATE_ALL); NS_LOG_INFO ("Dumbbell Topology Simulation"); - +// +// Create the lan on the left side of the dumbbell. +// Ptr n0 = Create (); Ptr n1 = Create (); Ptr n2 = Create (); @@ -79,7 +80,9 @@ main (int argc, char *argv[]) CsmaIpv4Topology::AddIpv4Address (n1, nd1, "10.1.1.2", "255.255.255.0"); CsmaIpv4Topology::AddIpv4Address (n2, nd2, "10.1.1.3", "255.255.255.0"); CsmaIpv4Topology::AddIpv4Address (n3, nd3, "10.1.1.4", "255.255.255.0"); - +// +// Create the lan on the right side of the dumbbell. +// Ptr n4 = Create (); Ptr n5 = Create (); Ptr n6 = Create (); @@ -104,31 +107,62 @@ main (int argc, char *argv[]) CsmaIpv4Topology::AddIpv4Address (n5, nd5, "10.1.2.2", "255.255.255.0"); CsmaIpv4Topology::AddIpv4Address (n6, nd6, "10.1.2.3", "255.255.255.0"); CsmaIpv4Topology::AddIpv4Address (n7, nd7, "10.1.2.4", "255.255.255.0"); - +// +// Create the point-to-point link to connect the two lans. +// Ptr link = PointToPointTopology::AddPointToPointLink ( n3, n4, DataRate (38400), MilliSeconds (20)); PointToPointTopology::AddIpv4Addresses (link, n3, "10.1.3.1", n4, "10.1.3.2"); - +// +// Create data flows across the link: +// n0 ==> n4 ==> n0 +// n1 ==> n5 ==> n1 +// n2 ==> n6 ==> n2 +// n3 ==> n7 ==> n3 +// uint16_t port = 7; - Ptr client = Create (n0, "10.1.2.4", port, - 1, Seconds(1.), 1024); + Ptr client0 = Create (n0, "10.1.2.1", port, + 100, Seconds(.01), 1024); + Ptr client1 = Create (n1, "10.1.2.2", port, + 100, Seconds(.01), 1024); + Ptr client2 = Create (n2, "10.1.2.3", port, + 100, Seconds(.01), 1024); + Ptr client3 = Create (n3, "10.1.2.4", port, + 100, Seconds(.01), 1024); - Ptr server = Create (n7, port); + Ptr server4 = Create (n4, port); + Ptr server5 = Create (n5, port); + Ptr server6 = Create (n6, port); + Ptr server7 = Create (n7, port); - server->Start(Seconds(1.)); - client->Start(Seconds(2.)); + server4->Start(Seconds(1.)); + server5->Start(Seconds(1.)); + server6->Start(Seconds(1.)); + server7->Start(Seconds(1.)); - server->Stop (Seconds(10.)); - client->Stop (Seconds(10.)); + client0->Start(Seconds(2.)); + client1->Start(Seconds(2.1)); + client2->Start(Seconds(2.2)); + client3->Start(Seconds(2.3)); - AsciiTrace asciitrace ("tutorial-4.tr"); + server4->Stop (Seconds(10.)); + server5->Stop (Seconds(10.)); + server6->Stop (Seconds(10.)); + server7->Stop (Seconds(10.)); + + client0->Stop (Seconds(10.)); + client1->Stop (Seconds(10.)); + client2->Stop (Seconds(10.)); + client3->Stop (Seconds(10.)); + + AsciiTrace asciitrace ("tutorial.tr"); asciitrace.TraceAllQueues (); asciitrace.TraceAllNetDeviceRx (); - PcapTrace pcaptrace ("tutorial-4.pcap"); + PcapTrace pcaptrace ("tutorial.pcap"); pcaptrace.TraceAllIp (); GlobalRouteManager::PopulateRoutingTables (); diff --git a/tutorial/tutorial-point-to-point.cc b/tutorial/tutorial-point-to-point.cc new file mode 100644 index 000000000..30e1b02d7 --- /dev/null +++ b/tutorial/tutorial-point-to-point.cc @@ -0,0 +1,78 @@ +/* -*- 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 + */ + +#include "ns3/log.h" +#include "ns3/ptr.h" +#include "ns3/internet-node.h" +#include "ns3/point-to-point-channel.h" +#include "ns3/mac48-address.h" +#include "ns3/point-to-point-net-device.h" +#include "ns3/point-to-point-topology.h" +#include "ns3/udp-echo-client.h" +#include "ns3/udp-echo-server.h" +#include "ns3/simulator.h" +#include "ns3/nstime.h" +#include "ns3/ascii-trace.h" +#include "ns3/pcap-trace.h" +#include "ns3/global-route-manager.h" + +NS_LOG_COMPONENT_DEFINE ("PointToPointSimulation"); + +using namespace ns3; + +// Network topology +// +// point to point +// +--------------+ +// | | +// n0 n1 +// +int +main (int argc, char *argv[]) +{ + LogComponentEnable ("PointToPointSimulation", LOG_LEVEL_INFO); + + NS_LOG_INFO ("Point to Point Topology Simulation"); + + Ptr n0 = Create (); + Ptr n1 = Create (); + + Ptr link = PointToPointTopology::AddPointToPointLink ( + n0, n1, DataRate (38400), MilliSeconds (20)); + + PointToPointTopology::AddIpv4Addresses (link, n0, "10.1.1.1", + n1, "10.1.1.2"); + + uint16_t port = 7; + + Ptr client = Create (n0, "10.1.1.2", port, + 1, Seconds(1.), 1024); + + Ptr server = Create (n1, port); + + server->Start(Seconds(1.)); + client->Start(Seconds(2.)); + + server->Stop (Seconds(10.)); + client->Stop (Seconds(10.)); + + AsciiTrace asciitrace ("tutorial.tr"); + asciitrace.TraceAllQueues (); + asciitrace.TraceAllNetDeviceRx (); + + Simulator::Run (); + Simulator::Destroy (); +} diff --git a/tutorial/tutorial-star-routing.cc b/tutorial/tutorial-star-routing.cc new file mode 100644 index 000000000..765b3ee4c --- /dev/null +++ b/tutorial/tutorial-star-routing.cc @@ -0,0 +1,167 @@ +/* -*- 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 + */ + +#include "ns3/log.h" +#include "ns3/ptr.h" +#include "ns3/internet-node.h" +#include "ns3/point-to-point-channel.h" +#include "ns3/mac48-address.h" +#include "ns3/point-to-point-net-device.h" +#include "ns3/udp-echo-client.h" +#include "ns3/udp-echo-server.h" +#include "ns3/simulator.h" +#include "ns3/nstime.h" +#include "ns3/ascii-trace.h" +#include "ns3/pcap-trace.h" +#include "ns3/global-route-manager.h" + +#include "point-to-point-ipv4-topology.h" + +NS_LOG_COMPONENT_DEFINE ("StarRoutingSimulation"); + +using namespace ns3; + +// Network topology +// +// n3 n2 +// | / +// | / +// n4 --- n0 --- n1 +// / | +// / | +// n5 n6 + +int +main (int argc, char *argv[]) +{ + LogComponentEnable ("StarRoutingSimulation", LOG_LEVEL_INFO); + + NS_LOG_INFO ("Star Topology with Routing Simulation"); + + Ptr n0 = Create (); + Ptr n1 = Create (); + Ptr n2 = Create (); + Ptr n3 = Create (); + Ptr n4 = Create (); + Ptr n5 = Create (); + Ptr n6 = Create (); + + Ptr link01 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd01 = PointToPointIpv4Topology::AddNetDevice (n0, + link01); + + Ptr link02 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd02 = PointToPointIpv4Topology::AddNetDevice (n0, + link02); + + Ptr link03 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd03 = PointToPointIpv4Topology::AddNetDevice (n0, + link03); + + Ptr link04 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd04 = PointToPointIpv4Topology::AddNetDevice (n0, + link04); + + Ptr link05 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd05 = PointToPointIpv4Topology::AddNetDevice (n0, + link05); + + Ptr link06 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd06 = PointToPointIpv4Topology::AddNetDevice (n0, link06); + + uint32_t nd1 = PointToPointIpv4Topology::AddNetDevice (n1, link01); + uint32_t nd2 = PointToPointIpv4Topology::AddNetDevice (n2, link02); + uint32_t nd3 = PointToPointIpv4Topology::AddNetDevice (n3, link03); + uint32_t nd4 = PointToPointIpv4Topology::AddNetDevice (n4, link04); + uint32_t nd5 = PointToPointIpv4Topology::AddNetDevice (n5, link05); + uint32_t nd6 = PointToPointIpv4Topology::AddNetDevice (n6, link06); + + PointToPointIpv4Topology::AddAddress (n0, nd01, "10.1.1.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n1, nd1, "10.1.1.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd02, "10.1.2.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n2, nd2, "10.1.2.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd03, "10.1.3.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n3, nd3, "10.1.2.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd04, "10.1.4.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n4, nd4, "10.1.4.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd05, "10.1.5.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n5, nd5, "10.1.5.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd06, "10.1.6.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n6, nd6, "10.1.6.2", + "255.255.255.252"); + + uint16_t port = 7; + + Ptr client = Create (n4, "10.1.1.2", port, + 1, Seconds(1.), 1024); + + Ptr server = Create (n1, port); + + server->Start(Seconds(1.)); + client->Start(Seconds(2.)); + + server->Stop (Seconds(10.)); + client->Stop (Seconds(10.)); + + AsciiTrace asciitrace ("tutorial.tr"); + asciitrace.TraceAllQueues (); + asciitrace.TraceAllNetDeviceRx (); + + GlobalRouteManager::PopulateRoutingTables (); + + Simulator::Run (); + Simulator::Destroy (); +} diff --git a/tutorial/tutorial-star.cc b/tutorial/tutorial-star.cc new file mode 100644 index 000000000..fbcccf5a9 --- /dev/null +++ b/tutorial/tutorial-star.cc @@ -0,0 +1,165 @@ +/* -*- 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 + */ + +#include "ns3/log.h" +#include "ns3/ptr.h" +#include "ns3/internet-node.h" +#include "ns3/point-to-point-channel.h" +#include "ns3/mac48-address.h" +#include "ns3/point-to-point-net-device.h" +#include "ns3/udp-echo-client.h" +#include "ns3/udp-echo-server.h" +#include "ns3/simulator.h" +#include "ns3/nstime.h" +#include "ns3/ascii-trace.h" +#include "ns3/pcap-trace.h" +#include "ns3/global-route-manager.h" + +#include "point-to-point-ipv4-topology.h" + +NS_LOG_COMPONENT_DEFINE ("StarSimulation"); + +using namespace ns3; + +// Network topology +// +// n3 n2 +// | / +// | / +// n4 --- n0 --- n1 +// / | +// / | +// n5 n6 + +int +main (int argc, char *argv[]) +{ + LogComponentEnable ("StarSimulation", LOG_LEVEL_INFO); + + NS_LOG_INFO ("Star Topology Simulation"); + + Ptr n0 = Create (); + Ptr n1 = Create (); + Ptr n2 = Create (); + Ptr n3 = Create (); + Ptr n4 = Create (); + Ptr n5 = Create (); + Ptr n6 = Create (); + + Ptr link01 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd01 = PointToPointIpv4Topology::AddNetDevice (n0, + link01); + + Ptr link02 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd02 = PointToPointIpv4Topology::AddNetDevice (n0, + link02); + + Ptr link03 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd03 = PointToPointIpv4Topology::AddNetDevice (n0, + link03); + + Ptr link04 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd04 = PointToPointIpv4Topology::AddNetDevice (n0, + link04); + + Ptr link05 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd05 = PointToPointIpv4Topology::AddNetDevice (n0, + link05); + + Ptr link06 = + PointToPointIpv4Topology::CreateChannel (DataRate (38400), + MilliSeconds (20)); + + uint32_t nd06 = PointToPointIpv4Topology::AddNetDevice (n0, link06); + + uint32_t nd1 = PointToPointIpv4Topology::AddNetDevice (n1, link01); + uint32_t nd2 = PointToPointIpv4Topology::AddNetDevice (n2, link02); + uint32_t nd3 = PointToPointIpv4Topology::AddNetDevice (n3, link03); + uint32_t nd4 = PointToPointIpv4Topology::AddNetDevice (n4, link04); + uint32_t nd5 = PointToPointIpv4Topology::AddNetDevice (n5, link05); + uint32_t nd6 = PointToPointIpv4Topology::AddNetDevice (n6, link06); + + PointToPointIpv4Topology::AddAddress (n0, nd01, "10.1.1.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n1, nd1, "10.1.1.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd02, "10.1.2.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n2, nd2, "10.1.2.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd03, "10.1.3.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n3, nd3, "10.1.2.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd04, "10.1.4.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n4, nd4, "10.1.4.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd05, "10.1.5.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n5, nd5, "10.1.5.2", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n0, nd06, "10.1.6.1", + "255.255.255.252"); + + PointToPointIpv4Topology::AddAddress (n6, nd6, "10.1.6.2", + "255.255.255.252"); + + uint16_t port = 7; + + Ptr client = Create (n0, "10.1.1.2", port, + 1, Seconds(1.), 1024); + + Ptr server = Create (n1, port); + + server->Start(Seconds(1.)); + client->Start(Seconds(2.)); + + server->Stop (Seconds(10.)); + client->Stop (Seconds(10.)); + + AsciiTrace asciitrace ("tutorial.tr"); + asciitrace.TraceAllQueues (); + asciitrace.TraceAllNetDeviceRx (); + + Simulator::Run (); + Simulator::Destroy (); +} diff --git a/tutorial/wscript b/tutorial/wscript index b7d90bdf5..388c9f21b 100644 --- a/tutorial/wscript +++ b/tutorial/wscript @@ -1,22 +1,36 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- def build(bld): - obj = bld.create_ns3_program('hello-simulator', - ['core']) + obj = bld.create_ns3_program('hello-simulator', ['core']) obj.source = 'hello-simulator.cc' - obj = bld.create_ns3_program('tutorial-csma-echo', - ['core']) + obj = bld.create_ns3_program('tutorial-csma-echo', ['core']) obj.source = 'tutorial-csma-echo.cc' - obj = bld.create_ns3_program('tutorial-csma-echo-ascii-trace', - ['core']) + obj = bld.create_ns3_program('tutorial-csma-echo-ascii-trace', ['core']) obj.source = 'tutorial-csma-echo-ascii-trace.cc' - obj = bld.create_ns3_program('tutorial-csma-echo-pcap-trace', - ['core']) + obj = bld.create_ns3_program('tutorial-csma-echo-pcap-trace', ['core']) obj.source = 'tutorial-csma-echo-pcap-trace.cc' - obj = bld.create_ns3_program('tutorial-naive-dumbbell', - ['core']) - obj.source = 'tutorial-naive-dumbbell.cc' + obj = bld.create_ns3_program('tutorial-point-to-point', ['core']) + obj.source = 'tutorial-point-to-point.cc' + + obj = bld.create_ns3_program('tutorial-star', ['core']) + obj.source = ['tutorial-star.cc', + 'point-to-point-ipv4-topology.cc'] + + obj = bld.create_ns3_program('tutorial-star-routing', ['core']) + obj.source = ['tutorial-star-routing.cc', + 'point-to-point-ipv4-topology.cc'] + + obj = bld.create_ns3_program('tutorial-linear-dumbbell', ['core']) + obj.source = 'tutorial-linear-dumbbell.cc' + + obj = bld.create_ns3_program('testipv4', ['core']) + obj.source = ['testipv4.cc', 'ipv4-address-generator.cc'] + + obj = bld.create_ns3_program('tutorial-bus-network', ['core']) + obj.source = ['tutorial-bus-network.cc', + 'ipv4-bus-network.cc', + 'ipv4-address-generator.cc'] diff --git a/utils/bench-packets.cc b/utils/bench-packets.cc index e16c17b02..b35a2379c 100644 --- a/utils/bench-packets.cc +++ b/utils/bench-packets.cc @@ -211,13 +211,19 @@ int main (int argc, char *argv[]) argc--; argv++; } + if (n == 0) + { + std::cerr << "Error-- number of packets must be specified " << + "by command-line argument --n=(number of packets)" << std::endl; + exit (1); + } + std::cout << "Running bench-packets with n=" << n << std::endl; - + Packet::EnableMetadata (); runBench (&benchPtrA, n, "a"); runBench (&benchPtrB, n, "b"); runBench (&benchPtrC, n, "c"); - Packet::EnableMetadata (); //runBench (&benchPrint, n, "print"); PacketMetadata::SetOptOne (false); runBench (&benchPtrA, n, "meta-a"); diff --git a/utils/mobility-visualizer-model.cc b/utils/mobility-visualizer-model.cc index 21cb007e4..8b48c6b69 100644 --- a/utils/mobility-visualizer-model.cc +++ b/utils/mobility-visualizer-model.cc @@ -48,15 +48,15 @@ Sample () { Ptr node = *nodeIter; Ptr mobility = node->QueryInterface (MobilityModel::iid); - Position pos = mobility->Get (); - Speed vel = mobility->GetSpeed (); + Vector pos = mobility->GetPosition (); + Vector vel = mobility->GetVelocity (); NodeUpdate update; update.node = PeekPointer (node); update.x = pos.x; update.y = pos.y; - update.vx = vel.dx; - update.vy = vel.dy; + update.vx = vel.x; + update.vy = vel.y; data->updateList.push_back (update); } data->time = Simulator::Now ().GetSeconds (); diff --git a/utils/run-tests.cc b/utils/run-tests.cc index f99f560c3..ce3b38c00 100644 --- a/utils/run-tests.cc +++ b/utils/run-tests.cc @@ -21,11 +21,13 @@ #include "ns3/test.h" #include "ns3/packet-metadata.h" +#include "ns3/random-variable.h" int main (int argc, char *argv[]) { #ifdef RUN_SELF_TESTS + ns3::RandomVariable::UseGlobalSeed(1,2,3,4,5,6); ns3::PacketMetadata::Enable (); ns3::TestManager::EnableVerbose (); bool success = ns3::TestManager::RunTests ();