diff --git a/src/netanim/examples/uan-animation.cc b/src/netanim/examples/uan-animation.cc new file mode 100644 index 000000000..b5acc2e1a --- /dev/null +++ b/src/netanim/examples/uan-animation.cc @@ -0,0 +1,301 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2010 Andrea Sacco + * + * 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: Andrea Sacco + */ + + +/** + * \file uan-animation.cc + * \ingroup uan + * + * This example showcases the "CW-MAC" described in System Design Considerations for Undersea Networks + * article in the IEEE Journal on Selected Areas of Communications 2008 by Nathan Parrish, Leonard Tracy + * and Sumit Roy. The MAC protocol is implemented in the class UanMacCw. CW-MAC is similar in nature + * to the IEEE 802.11 DCF with a constant backoff window. It requires two parameters to be set, + * the slot time and the contention window size. The contention window size is the backoff window + * size in slots, and the slot time is the duration of each slot. These parameters should be set + * according to the overall network size, internode spacing and the number of nodes in the network. + * + * This example deploys nodes randomly (according to RNG seed of course) in a finite square region with + * the X and Y coordinates of the nodes distributed uniformly. The CW parameter is varied throughout + * the simulation in order to show the variation in throughput with respect to changes in CW. + */ + +#include "uan-animation.h" +#include "ns3/core-module.h" +#include "ns3/network-module.h" +#include "ns3/netanim-module.h" +#include "ns3/mobility-module.h" +#include "ns3/tools-module.h" +#include "ns3/applications-module.h" + +#include + +using namespace ns3; + +NS_LOG_COMPONENT_DEFINE ("UanCwExample"); + +NetAnimExperiment::NetAnimExperiment () + : m_numNodes (15), + m_dataRate (80), + m_depth (70), + m_boundary (500), + m_packetSize (32), + m_bytesTotal (0), + m_cwMin (10), + m_cwMax (400), + m_cwStep (10), + m_avgs (3), + m_slotTime (Seconds (0.2)), + m_simTime (Seconds (1000)) +{ +} + +void +NetAnimExperiment::ResetData () +{ + NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Resetting data"); + m_throughputs.push_back (m_bytesTotal * 8.0 / m_simTime.GetSeconds ()); + m_bytesTotal = 0; +} + +void +NetAnimExperiment::IncrementCw (uint32_t cw) +{ + NS_ASSERT (m_throughputs.size () == m_avgs); + + double avgThroughput = 0.0; + for (uint32_t i=0; i mp = (*it)->GetObject (); + mp->SetPosition (Vector (uv.GetValue (), uv.GetValue (), 70.0)); + } +} + +void +NetAnimExperiment::ReceivePacket (Ptr socket) +{ + Ptr packet; + + while ((packet = socket->Recv ())) + { + m_bytesTotal += packet->GetSize (); + } + packet = 0; +} + +void +NetAnimExperiment::Run (UanHelper &uan) +{ + uan.SetMac ("ns3::UanMacCw", "CW", UintegerValue (m_cwMin), "SlotTime", TimeValue (m_slotTime)); + NodeContainer nc = NodeContainer (); + NodeContainer sink = NodeContainer (); + nc.Create (m_numNodes); + sink.Create (1); + + PacketSocketHelper socketHelper; + socketHelper.Install (nc); + socketHelper.Install (sink); + +#ifdef UAN_PROP_BH_INSTALLED + Ptr prop = CreateObjectWithAttributes ("ConfigFile", StringValue ("exbhconfig.cfg")); +#else + Ptr prop = CreateObjectWithAttributes (); +#endif //UAN_PROP_BH_INSTALLED + Ptr channel = CreateObjectWithAttributes ("PropagationModel", PointerValue (prop)); + + //Create net device and nodes with UanHelper + NetDeviceContainer devices = uan.Install (nc, channel); + NetDeviceContainer sinkdev = uan.Install (sink, channel); + + MobilityHelper mobility; + Ptr pos = CreateObject (); + + { + UniformVariable urv (0, m_boundary); + pos->Add (Vector (m_boundary / 2.0, m_boundary / 2.0, m_depth)); + double rsum = 0; + + double minr = 2 * m_boundary; + for (uint32_t i = 0; i < m_numNodes; i++) + { + double x = urv.GetValue (); + double y = urv.GetValue (); + double newr = sqrt ((x - m_boundary / 2.0) * (x - m_boundary / 2.0) + + (y - m_boundary / 2.0) * (y - m_boundary / 2.0)); + rsum += newr; + minr = std::min (minr, newr); + pos->Add (Vector (x, y, m_depth)); + } + NS_LOG_DEBUG ("Mean range from gateway: " << rsum / m_numNodes + << " min. range " << minr); + + mobility.SetPositionAllocator (pos); + mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); + mobility.Install (sink); + + NS_LOG_DEBUG ("Position of sink: " + << sink.Get (0)->GetObject ()->GetPosition ()); + mobility.Install (nc); + + PacketSocketAddress socket; + socket.SetSingleDevice (sinkdev.Get (0)->GetIfIndex ()); + socket.SetPhysicalAddress (sinkdev.Get (0)->GetAddress ()); + socket.SetProtocol (0); + + OnOffHelper app ("ns3::PacketSocketFactory", Address (socket)); + app.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1))); + app.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0))); + app.SetAttribute ("DataRate", DataRateValue (m_dataRate)); + app.SetAttribute ("PacketSize", UintegerValue (m_packetSize)); + + ApplicationContainer apps = app.Install (nc); + apps.Start (Seconds (0.5)); + Time nextEvent = Seconds (0.5); + + + for (uint32_t cw = m_cwMin; cw <= m_cwMax; cw += m_cwStep) + { + + for (uint32_t an = 0; an < m_avgs; an++) + { + nextEvent += m_simTime; + Simulator::Schedule (nextEvent, &NetAnimExperiment::ResetData, this); + Simulator::Schedule (nextEvent, &NetAnimExperiment::UpdatePositions, this, nc); + } + Simulator::Schedule (nextEvent, &NetAnimExperiment::IncrementCw, this, cw); + } + apps.Stop (nextEvent + m_simTime); + + Ptr sinkNode = sink.Get (0); + TypeId psfid = TypeId::LookupByName ("ns3::PacketSocketFactory"); + if (sinkNode->GetObject (psfid) == 0) + { + Ptr psf = CreateObject (); + sinkNode->AggregateObject (psf); + } + Ptr sinkSocket = Socket::CreateSocket (sinkNode, psfid); + sinkSocket->Bind (socket); + sinkSocket->SetRecvCallback (MakeCallback (&NetAnimExperiment::ReceivePacket, this)); + + m_bytesTotal = 0; + + std::string traceFileName = "uan-animation.xml"; + AnimationInterface anim(traceFileName.c_str ()); + + Simulator::Run (); + sinkNode = 0; + sinkSocket = 0; + pos = 0; + channel = 0; + prop = 0; + for (uint32_t i=0; i < nc.GetN (); i++) + { + nc.Get (i) = 0; + } + for (uint32_t i=0; i < sink.GetN (); i++) + { + sink.Get (i) = 0; + } + + for (uint32_t i=0; i < devices.GetN (); i++) + { + devices.Get (i) = 0; + } + for (uint32_t i=0; i < sinkdev.GetN (); i++) + { + sinkdev.Get (i) = 0; + } + + Simulator::Destroy (); + } +} + +int +main (int argc, char **argv) +{ + + LogComponentEnable ("UanCwExample", LOG_LEVEL_ALL); + LogComponentEnable ("AnimationInterface", LOG_LEVEL_ALL); + + NetAnimExperiment exp; + + std::string perModel = "ns3::UanPhyPerGenDefault"; + std::string sinrModel = "ns3::UanPhyCalcSinrDefault"; + + CommandLine cmd; + cmd.AddValue ("NumNodes", "Number of transmitting nodes", exp.m_numNodes); + cmd.AddValue ("Depth", "Depth of transmitting and sink nodes", exp.m_depth); + cmd.AddValue ("RegionSize", "Size of boundary in meters", exp.m_boundary); + cmd.AddValue ("PacketSize", "Generated packet size in bytes", exp.m_packetSize); + cmd.AddValue ("DataRate", "DataRate in bps", exp.m_dataRate); + cmd.AddValue ("CwMin", "Min CW to simulate", exp.m_cwMin); + cmd.AddValue ("CwMax", "Max CW to simulate", exp.m_cwMax); + cmd.AddValue ("SlotTime", "Slot time duration", exp.m_slotTime); + cmd.AddValue ("Averages", "Number of topologies to test for each cw point", exp.m_avgs); + cmd.AddValue ("PerModel", "PER model name", perModel); + cmd.AddValue ("SinrModel", "SINR model name", sinrModel); + cmd.Parse (argc, argv); + + ObjectFactory obf; + obf.SetTypeId (perModel); + Ptr per = obf.Create (); + obf.SetTypeId (sinrModel); + Ptr sinr = obf.Create (); + + UanHelper uan; + UanTxMode mode; + mode = UanTxModeFactory::CreateMode (UanTxMode::FSK, exp.m_dataRate, + exp.m_dataRate, 12000, + exp.m_dataRate, 2, + "Default mode"); + UanModesList myModes; + myModes.AppendMode (mode); + + uan.SetPhy ("ns3::UanPhyGen", + "PerModel", PointerValue (per), + "SinrModel", PointerValue (sinr), + "SupportedModes", UanModesListValue (myModes)); + + exp.Run (uan); + + per = 0; + sinr = 0; + +} + diff --git a/src/netanim/examples/uan-animation.h b/src/netanim/examples/uan-animation.h new file mode 100644 index 000000000..164efa81d --- /dev/null +++ b/src/netanim/examples/uan-animation.h @@ -0,0 +1,62 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2010 Andrea Sacco + * + * 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: Andrea Sacco + */ + +#ifndef UAN_CW_EXAMPLE_H +#define UAN_CW_EXAMPLE_H + +#include "ns3/network-module.h" +#include "ns3/tools-module.h" +#include "ns3/uan-module.h" + +using namespace ns3; + +/** + * \class NetAnimExperiment + * \brief Helper class for UAN CW MAC example + * + */ +class NetAnimExperiment +{ +public: + void Run (UanHelper &uan); + void ReceivePacket (Ptr socket); + void UpdatePositions (NodeContainer &nodes); + void ResetData (); + void IncrementCw (uint32_t cw); + uint32_t m_numNodes; + uint32_t m_dataRate; + double m_depth; + double m_boundary; + uint32_t m_packetSize; + uint32_t m_bytesTotal; + uint32_t m_cwMin; + uint32_t m_cwMax; + uint32_t m_cwStep; + uint32_t m_avgs; + + Time m_slotTime; + Time m_simTime; + + std::vector m_throughputs; + + NetAnimExperiment (); +}; + +#endif /* UAN_CW_EXAMPLE_H */ diff --git a/src/netanim/examples/wscript b/src/netanim/examples/wscript index 3b390fc89..3366c58b0 100644 --- a/src/netanim/examples/wscript +++ b/src/netanim/examples/wscript @@ -16,3 +16,7 @@ def build(bld): obj = bld.create_ns3_program('wireless-animation', ['netanim', 'applications', 'point-to-point', 'csma', 'wifi', 'mobility', 'network']) obj.source = 'wireless-animation.cc' + + obj = bld.create_ns3_program('uan-animation', + ['netanim', 'internet', 'mobility', 'tools', 'applications', 'uan']) + obj.source = 'uan-animation.cc'