[Ns-developers] OLSR/AODV routing fails with mobility induced path changes

Pavel Boyko boyko at iitp.ru
Sat Dec 19 08:18:14 PST 2009


  Hi, Abdul,

  I have reproduced your problems with OLSR (in a little bit simplified setup), 
see bug 780 http://www.nsnam.org/bugzilla/show_bug.cgi?id=780 . I believe that
this is OLSR implementation bug and will try to fix it asap.

  Please confirm that similar problems with AODV disappear after ns-3-dev 
update.

  Best regards,
  Pavel   

On Thursday 17 December 2009 12:10:43 am Abdul Jabbar wrote:
> Hi all,
> 
> I posted the following message to ns-3 users list, but realized that it is
> perhaps better suited to the developers list.
> 
> We have been running mobile adhoc simulations with ns3 in order to document
> baseline performance in certain mobility scenarios. Unfortunately, we are
> seeing very low performance (in terms of packet delivery ratios) in cases
> where the mobility results in one or more path changes.  We ruled out (or
>  so we think) the usual suspects by considering factors such as constant
>  rate controller, 1Mbps mode for 802.11b, unicast/non-unicast modes,
>  RTS/CTS, analytically calculated and experimentally verified transmission
>  ranges. The short description of the issue that we observed is that both
>  OLSR and AODV (using the latest ns-3-dev version) have very high route
>  reconvergence times (45 - 90 seconds) and in many cases don't converge at
>  all. Furthermore, the convergence seems flaky at best - meaning that in
>  some cases routes are discovered as intended, in some cases there is a
>  really long delay and in some case, no routes are found.
> 
> In a simulation scenario where paths between nodes change every so often
> (a.k.a MANETs), this reduces the throughput/PDR to almost zero.  We were
> wondering if any of the users or developers have tested a full fledged
> mobile adhoc scenario with success. By full fledged, we mean in terms of
> mobility - with more than a few mobile nodes such that routes change over
> the duration of the simulation.
> 
> Thats the short story. Now for the long one, here is an example that
> demonstrates this problem and the simulation script we are using.
> 
> We place 3 nodes in a linear fashion.
> 
>  1 ----------------- 2 ----------------- 3
> (0,0)         (250,0)             (500,0)
>      d=250 m         d=250m
> 
> After an initial settling time of 50 seconds (just to be safe), we start
> both the traffic and mobility (constant velocity mobility model via
> SetVelocity method).
> 
> The transmission range is set to 300-350 meters and we send traffic from
> every node to every other node (staggered in time, of course) at a rate of
>  1 pkt/sec. With a pkt size of 500 B, this results in an aggregate traffic
>  rate of 24Kbps , which is far less than (approx.) 0.5 Mbps expected
>  throughput from a 1 Mbps 802.11b network.
> 
> We then move nodes 2 and 3 such that they end up interchanging their
> positions...
> 
> First we bring node 3 very close to node 2. In fact, we bring 2 to the same
> node coordinates as 3.
> 
>  1 ----------------- 2 -3
> 
> And then move the node 2 away until it reaches the original position of
>  node 3.
> 
>  1 ----------------- 3 ----------------- 2
> (0,0)            (250,0)         (500,0)
> 
> At this point, we set the velocity of all the nodes to zero, till the end
>  of the simulation. We let the simulation run for couple hundred seconds
>  after this point. And OLSR still doesn't converge on the routes! Note that
>  throughout the simulation, there are no network partitions. There is
>  always a path between every node pair.
> 
> We expected to see 100% packet delivery ratio in this case. However, what
>  we see is much less. We used both flow monitor as well as our own scripts
>  to process the ascii trace files to calculate PDRs. The exact number
>  depends on the specific scenario. During the mobility part of the
>  simulation, the PDR is as low as 0.5. AODV ultimately reconverges after 70
>  seconds and OLSR never reconverges and PDR remains 0.666 throughout the
>  simulation. Again, this behaviour is flaky.
> 
> I am assuming that we are making some fundamental mistake in the
>  simulation. Could anyone please point us to what we are doing wrong? Any
>  help is highly appreciated. Below is our simulation script:
> 
> Thanks,
> Abdul.
> 
> ======================
> 
> /*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 Texport
> 'NS_LOG=*=level_function|prefix_func|prefix_time'emple Place, Suite
> 330,
> Boston, MA  02111-1307  USA
> *
> */
> 
> #include <fstream>
> #include <iostream>
> #include "ns3/core-module.h"
> #include "ns3/common-module.h"
> #include "ns3/node-module.h"
> #include "ns3/helper-module.h"
> #include "ns3/mobility-module.h"
> #include "ns3/contrib-module.h"
> #include "ns3/wifi-module.h"
> #include "ns3/global-route-manager.h"
> 
> using namespace ns3;
> NS_LOG_COMPONENT_DEFINE ("adhoc_simple_test");
> 
> static void
> SetVelocity (Ptr<Node> node, Vector vel)
> {
> Ptr<ConstantVelocityMobilityModel> mobility =
> node->GetObject<ConstantVelocityMobilityModel> ();
> mobility->SetVelocity (vel);
> }
> 
> 
> int main (int argc, char *argv[])
> {
> 
> //srand(time(NULL));
> SeedManager::SetSeed(time(NULL));
> 
> int nWifis = 3;
> double SimTime = 200.0;
> std::string phyMode ("wifib-1mbs");
> 
> //sending one packets per sec
> 
> Config::SetDefault  ("ns3::OnOffApplication::PacketSize",StringValue
> ("500"));
> Config::SetDefault ("ns3::OnOffApplication::DataRate",  StringValue
> ("4kb/s"));
> 
> // Fix non-unicast data rate to be the same as that of unicast
> Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
> StringValue ("400"));
> 
> //Set Non-unicastMode rate to unicast mode
> //Config::SetDefault
> ("ns3::WifiRemoteStationManager::NonUnicastMode",StringValue (phyMode));
> 
> NS_LOG_INFO ("creating nodes");
> CommandLine cmd;
> cmd.AddValue ("nWifis", "Number of wifi networks", nWifis);
> cmd.AddValue ("SimTime", "Total Simulation time", SimTime);
> cmd.Parse (argc, argv);
> 
> NodeContainer adhocNodes;
> adhocNodes.Create (nWifis);
> 
> NS_LOG_INFO ("setting the default phy and channel parameters ");
> WifiHelper wifi;
> YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
> YansWifiChannelHelper wifiChannel ;
> wifiChannel.SetPropagationDelay
>  ("ns3::ConstantSpeedPropagationDelayModel");
>  wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel");
>  wifiPhy.SetChannel (wifiChannel.Create ());
> 
> // Add a non-QoS upper mac, and disable rate control
> NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
> wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
>                               "DataMode",StringValue(phyMode),
>                                  "ControlMode",StringValue(phyMode));
> 
> //set the tx range to 300
> wifiPhy.Set ("TxPowerStart",DoubleValue (-0.1615));
> wifiPhy.Set ("TxPowerEnd", DoubleValue (-0.1615));
> 
> // Set it to adhoc mode
> wifiMac.SetType ("ns3::AdhocWifiMac");
> NetDeviceContainer adhocDevices = wifi.Install (wifiPhy, wifiMac,
> adhocNodes);
> 
> AodvHelper aodv;
> OlsrHelper olsr;
> Ipv4StaticRoutingHelper staticRouting;
> 
> Ipv4ListRoutingHelper list;
> list.Add (staticRouting, 0);
> list.Add (olsr, 10);
> //list.Add (aodv,10);
> 
> InternetStackHelper internet;
> internet.SetRoutingHelper (list);
> internet.Install (adhocNodes);
> 
> NS_LOG_INFO ("setting the address");
> Ipv4AddressHelper addressAdhoc;
> addressAdhoc.SetBase ("10.1.1.0", "255.255.255.0");
> Ipv4InterfaceContainer adhocInterfaces;
> adhocInterfaces = addressAdhoc.Assign (adhocDevices);
> 
> MobilityHelper mobilityAdhoc;
> NS_LOG_INFO ("Installing the mobility model");
> 
> Ptr<ListPositionAllocator> positionAlloc_Adhoc =
> CreateObject<ListPositionAllocator>();
> double distance = 0.0;
> for (uint32_t i = 0;i <= adhocNodes.GetN();i++){
> positionAlloc_Adhoc->Add(Vector(distance,0.0,0.0));
> distance += 250.0;
> }
> 
> mobilityAdhoc.SetMobilityModel ("ns3::ConstantVelocityMobilityModel");
> mobilityAdhoc.SetPositionAllocator(positionAlloc_Adhoc);
> mobilityAdhoc.Install (adhocNodes);
> 
> //At 50 sec node 3 moves towards node 2
> Simulator::Schedule (Seconds (50.0), &SetVelocity, adhocNodes.Get(2)
> ,Vector(-5.0,0.0,0.0));
> 
> //AT 100 sec set node 3 with zero velocity
> Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get(2)
> ,Vector(0.0,0.0,0.0));
> 
> //Move node2 away from node 3
> Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get(1)
> ,Vector(5.0,0.0,0.0));
> 
> //AT 150 sec set node 2 with zero velocity
> Simulator::Schedule (Seconds (150.0), &SetVelocity, adhocNodes.Get(1) ,
> Vector(0.0,0.0,0.0));
> 
> //Configure the application on each node
> 
> uint16_t port = 9;
> 
> for(int i =0; i< nWifis-1; i++)
> {
>  PacketSinkHelper sink ("ns3::UdpSocketFactory",
> InetSocketAddress(Ipv4Address::GetAny (), port));
>  ApplicationContainer apps_sink = sink.Install (adhocNodes.Get (i));
>  apps_sink.Start (Seconds (0.0));
>  apps_sink.Stop (Seconds (SimTime));
> }
> 
> 
> for(int clientNode=0; clientNode <= nWifis-1;clientNode++)
> {
>  for (int j=0;j<=nWifis-1;j++)
>  {
>   std::cout << "J::" << j << std::endl;
>  OnOffHelper onoff1 ("ns3::UdpSocketFactory",Address (InetSocketAddress
> (adhocInterfaces.GetAddress (j), port)));
>  onoff1.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable
>  (1)));
>  onoff1.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable
> (0)));
> 
>   if (j!= clientNode)
>     {
>       std::cout << "cleint node:" << clientNode << std::endl;
>     ApplicationContainer apps1 = onoff1.Install (adhocNodes.Get
> (clientNode));
>       //apps1.Start (Seconds (90.0));
>        UniformVariable var;
>        //std::cout <<"random :" << var.GetValue(50.0,51.0) <<std::endl;
>        apps1.Start (Seconds (var.GetValue(50.0,51.0)));
>       apps1.Stop (Seconds (SimTime));
>     }
>   }
> }
> 
> //configure flowmonitor
> 
> Ptr<FlowMonitor> flowmon;
> FlowMonitorHelper flowmonHelper;
> flowmon = flowmonHelper.InstallAll ();
> 
> NS_LOG_INFO ("Configure Tracing.");
> std::ofstream ascii;
> ascii.open ("adhoc_olsr_mob_test.tr");
> YansWifiPhyHelper::EnableAsciiAll (ascii);
> MobilityHelper::EnableAsciiAll (ascii);
> //YansWifiPhyHelper::EnablePcapAll ("adhoc_test_case1_200");
> 
> NS_LOG_INFO ("Run Simulation.");
> Simulator::Stop (Seconds (SimTime));
> Simulator::Run ();
> flowmon->SerializeToXmlFile ("mobtest_aovd-flowmon.xml", true, true);
> Simulator::Destroy ();
> }
> =========================================
> 


More information about the Ns-developers mailing list