metric ns3

181 views
Skip to first unread message

ns3...@gmail.com

unread,
May 26, 2015, 7:31:37 AM5/26/15
to ns-3-...@googlegroups.com
Hi please i need help i want to do global routing (metric) but i want to change the metric (rand) each 10 seconds i trying to resolve these probleme but i ca't i need help please .
i tring with these :
while ( t1 != t2 ){
    ns3::RngSeedManager::SetRun( 1 );
Ptr<UniformRandomVariable> rand = CreateObject<UniformRandomVariable>();

rand->SetAttribute( "Min", DoubleValue( 0 ) );
rand->SetAttribute( "Max", DoubleValue( 10 ) );
    cout << rand->GetInteger() << " ";
      i1i2.SetMetric (0,rand->GetInteger());
      cout << endl;
     
       cout << "run reset to 2 " << endl;
Ptr<UniformRandomVariable> rand2 = CreateObject<UniformRandomVariable>();

rand2->SetAttribute( "Min", DoubleValue( 0 ) );
rand2->SetAttribute( "Max", DoubleValue( 10 ) );   

    cout << rand2->GetInteger() << " ";
      i1i3.SetMetric (0,rand2->GetInteger());
cout << endl;

 cout << "run reset to 3 " << endl;
Ptr<UniformRandomVariable> rand3 = CreateObject<UniformRandomVariable>();
rand3->SetAttribute( "Min", DoubleValue( 0 ) );
rand3->SetAttribute( "Max", DoubleValue( 10 ) );   

    cout << rand3->GetInteger() << " ";
      i1i4.SetMetric (0,rand3->GetInteger());
cout << endl;


    t1 +=  Seconds (2.0);

and these

i1i2.SetMetric (0,X[0]);

  //i1i2.SetMetric (1,X[1]);
  cout <<"la métric entre 1 --- 2 est"<< X[0] <<endl;

  //std::cout << std::fixed <<"la métric entre 1 --- 2 est"<< X[0]<<endl;
 i1i3.SetMetric (0,X[1]);

  cout <<"la métric entre 1 --- 3  est"<< X[1]<<endl;
   // std::cout << std::fixed  <<"la métric entre 1 --- 3  est"<< X[1]<<endl;
    i1i4.SetMetric (0,X[2]);

  cout <<"la métric entre 1 --- 4 est"<< X[2]<<endl;
 //std::cout << std::fixed <<"la métric entre 1 --- 4


int  entrer ()
{

    string const nomFichier("test.txt");
    ofstream monFlux(nomFichier.c_str());

    if(monFlux)   
    {
     for (int i=0;i<7;i++)
     {
         cout << "entrer le cout entre les liens MErci "<<endl;;
         cin >> X[i];
       
     }
    }
    else
    {
        cout << "ERREUR: Impossible d'ouvrir le fichier." << endl;
    }
    return 0;
}
the probleme with these two programme the simulator take 1 metric and dont change it with the time
Please help me
Thanks

ns3...@gmail.com

unread,
May 26, 2015, 7:36:08 AM5/26/15
to ns-3-...@googlegroups.com
My programme is these
random.cc

Tommaso Pecorella

unread,
May 28, 2015, 4:03:05 PM5/28/15
to ns-3-...@googlegroups.com
Hi,

sorry for the late reply. There are some relevant issues in your program.

Is this what you really want ? To have the same random number each time you do the while loop.

2) Time and events. It seems that you didn't understand how events work in ns-3. Please read carefully this manual section:

3) You need to manually trigger the GlobalRouting update after modifying the metrics. Use Ipv4GlobalRoutingHelper::RecomputeRoutingTables ().

Suggestion: build a function that changes the metric of a link and triggers a GlobalRouting re-compute. The function could have the link and the metric as arguments.
Then, before Simulator::Run, schedule manually a number of events that will change the metrics.

Try first with one single change, not random, then increase the simulation complexity.
If you have further issues feel free to post the code again.

Have a good coding,


T.

Tommaso Pecorella

unread,
May 28, 2015, 4:04:09 PM5/28/15
to ns-3-...@googlegroups.com
PS: this was a good way to ask things. Clear explanation and code attached.

T.


On Tuesday, May 26, 2015 at 1:36:08 PM UTC+2, ns3...@gmail.com wrote:

ns3...@gmail.com

unread,
Jun 1, 2015, 5:08:49 AM6/1/15
to ns-3-...@googlegroups.com
Hi sir Thanks for réponse
i try this but the probleme the routing table use 1 values i want to use anothere values values after 10 seconds
Think you


entrer();
    Simulator::Schedule(Seconds(10), &entrer);
 
  i1i2.SetMetric (1,::X[0]);


  //i1i2.SetMetric (1,X[1]);
  cout <<"la métric entre 1 --- 2 est"<< X[0] <<endl;
     
  //std::cout << std::fixed <<"la métric entre 1 --- 2 est"<< X[0]<<endl;
 i1i3.SetMetric (1,::X[1]);


  cout <<"la métric entre 1 --- 3  est"<< X[1]<<endl;
   // std::cout << std::fixed  <<"la métric entre 1 --- 3  est"<< X[1]<<endl;
    i1i4.SetMetric (1,::X[2]);


  cout <<"la métric entre 1 --- 4 est"<< X[2]<<endl;
 //std::cout << std::fixed <<"la métric entre 1 --- 4  est"<< X[2]<<endl;

 

void  entrer ()

{

    string const nomFichier("test.txt");
    ofstream monFlux(nomFichier.c_str());

    if(monFlux)   
    {
  
         cout << "entrer le cout entre les liens MErci "<<endl;;
        //X[i] =((double) rand() / (RAND_MAX)) + 1 - 1;
        ::X[0]=rand()% 10;
        cout << X[0];
        ::X[1]=rand()%10;
        cout << X[1];
        ::X[2]=rand()%10;
    cout << X[2];

ns3...@gmail.com

unread,
Jun 1, 2015, 5:18:02 AM6/1/15
to ns-3-...@googlegroups.com

/* -*- 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 <iostream>
#include <fstream>
#include <string>
#include <cassert>



#include "ns3/core-module.h"
#include "ns3/packet-sink.h"
#include "ns3/network-module.h"
#include "ns3/csma-module.h"

#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/flow-monitor-module.h"
#include "ns3/netanim-module.h"

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/netanim-module.h"
#include "ns3/applications-module.h"
#include "ns3/animation-interface.h"
#include "ns3/point-to-point-layout-module.h"
#include "ns3/ipv4-static-routing-helper.h"
#include "ns3/ipv4-list-routing-helper.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/flow-monitor-helper.h"
#include "ns3/flow-monitor-module.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>

#include "ns3/simulator.h"
#include "ns3/nstime.h"
#include "ns3/command-line.h"
#include <iostream>
/*
using namespace ns3;
int X[5];
class MyModel {
public:
  void Start (void);
 
private:
  void DealWithEvent (double eventValue);
};

void
MyModel::Start (void)
{
  Simulator::Schedule (Seconds (0.0),
                       &MyModel::DealWithEvent,
                       this, Simulator::Now ().GetSeconds ());
}
void
MyModel::DealWithEvent (double value)
{
 //std::cout << "Member method received event at " << Simulator::Now ().GetSeconds ()
            //<< "s started at " << value << "s" << std::endl;





     std::cout << "entrer le cout entre les liens MErci "<<std::endl;;

        //X[i] =((double) rand() / (RAND_MAX)) + 1 - 1;
        ::X[0]=rand()% 10;
        std::cout << ::X[0];
        ::X[1]=rand()% 10;
            ::X[2]=rand()% 10;
       
   
           
           
           
}

static void
random_function (MyModel *model)
{
  std::cout << "random function received event at " <<
      Simulator::Now ().GetSeconds () << "s" << std::endl;
  model->Start ();
 
}
*/


int X[5];



using namespace std;
using namespace ns3;

void entrer();
void premier();
void deux();

   
    int D[5];
    int F[5];
    int P[5];


NS_LOG_COMPONENT_DEFINE ("MyFirstScript");

int  main(int argc, char** argv)
{
 
// a varier doit etre dynamique
 
 

 


    uint16_t UDPport = 9;

std::string DataRate ("2Mbps");
  //double interval = 0.05;
 uint32_t PacketSize = 512;

  /*
  CommandLine cmd;
  cmd.AddValue ("latency", "P2P link Latency in miliseconds", lat);
  cmd.AddValue ("rate", "P2P data rate in bps", rate);
  cmd.AddValue ("interval", "UDP client packet interval D=0.9/I ", interval);
  cmd.AddValue ("packetsize", "size of all the packets", packetsize);
  cmd.AddValue ("maxpackets", "maximum number of packets", maxpackets);
*/
 



  // Users may find it convenient to turn on explicit debugging
  // for selected modules; the below lines suggest how to do this
#if 0
  LogComponentEnable ("SimpleGlobalRoutingExample", LOG_LEVEL_INFO);
#endif


 // LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
 // LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);


  // Set up some default values for the simulation.  Use the
   Config::SetDefault("ns3::OnOffApplication::PacketSize", UintegerValue(PacketSize));
    Config::SetDefault("ns3::OnOffApplication::DataRate", StringValue(DataRate));;


  // Allow the user to override any of the defaults and the above
  // Bind ()s at run-time, via command-line arguments
  //CommandLine cmd;
  //cmd.Parse (argc, argv);

   NS_LOG_INFO ("Create nodes.");  
  
  std::string animFile = "sma.xml";
   NodeContainer c;

  Time::SetResolution (Time::NS);


  NS_LOG_INFO ("Create nodes.");
 
  NodeContainer nodes;
  c.Create (7);
 
  // doit etre dynamique
  NodeContainer n0n1 = NodeContainer (c.Get (0), c.Get (1)); 
  NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
  NodeContainer n1n3 = NodeContainer (c.Get (1), c.Get (3));
  NodeContainer n1n4 = NodeContainer (c.Get (1), c.Get (4));
  NodeContainer n2n5 = NodeContainer (c.Get (2), c.Get (5));
  NodeContainer n3n5 = NodeContainer (c.Get (3), c.Get (5));
  NodeContainer n4n5 = NodeContainer (c.Get (4), c.Get (5));  
  NodeContainer n5n6 = NodeContainer (c.Get (5), c.Get (6));


  InternetStackHelper stack;
  stack.Install (nodes);

// We create the channels first without any IP addressing information
  NS_LOG_INFO ("Create channels.");

  PointToPointHelper p2p;
  p2p.SetDeviceAttribute("DataRate", StringValue("1Mbps"));
    p2p.SetChannelAttribute("Delay", StringValue("10ms"));

  NetDeviceContainer d0d1 = p2p.Install (n0n1);
  NetDeviceContainer d5d6 = p2p.Install (n5n6);
 
 
  
 NetDeviceContainer d1d2 = p2p.Install (n1n2);
  NetDeviceContainer d1d3 = p2p.Install (n1n3);
  NetDeviceContainer d1d4 = p2p.Install (n1n4);

   

  NetDeviceContainer d2d5 = p2p.Install (n2n5);
  NetDeviceContainer d3d5 = p2p.Install (n3n5);
  NetDeviceContainer d4d5 = p2p.Install (n4n5);


  InternetStackHelper internet;
  internet.Install (c);
entrer();
 // Later, we add IP addresses.
  NS_LOG_INFO ("Assign IP Addresses.");



  Ipv4AddressHelper ipv4;
  ipv4.SetBase ("10.0.0.0", "255.255.255.0");
  Ipv4InterfaceContainer i0i1 = ipv4.Assign (d0d1);
  Ipv4InterfaceContainer i = i0i1;
   i0i1.SetMetric (0,1);
   // std::cout << std::fixed <<"la métric entre nodes 0 -- 1  est"<< X[0]<<endl;
  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
  Ipv4InterfaceContainer i1i2 =ipv4.Assign (d1d2);
  Ipv4InterfaceContainer i1i3 =ipv4.Assign (d1d3);
  Ipv4InterfaceContainer i1i4 =ipv4.Assign (d1d4);
 

// dynalique

    // MyModel model;

  //Simulator::Schedule (Seconds (10.0), &random_function, &model);
  
  
    entrer();
    Simulator::Schedule(Seconds(10), &entrer); Simulator::Schedule(Seconds(15), &entrer);
   
   Simulator::Schedule (Seconds (20),
  &Ipv4GlobalRoutingHelper::RecomputeRoutingTables);

 
  i1i2.SetMetric (1,::X[0]);

  //i1i2.SetMetric (1,X[1]);
  cout <<"la métric entre 1 --- 2 est"<< X[0] <<endl;
     
  //std::cout << std::fixed <<"la métric entre 1 --- 2 est"<< X[0]<<endl;
 i1i3.SetMetric (1,::X[1]);

  cout <<"la métric entre 1 --- 3  est"<< X[1]<<endl;
   // std::cout << std::fixed  <<"la métric entre 1 --- 3  est"<< X[1]<<endl;
    i1i4.SetMetric (1,::X[2]);

  cout <<"la métric entre 1 --- 4 est"<< X[2]<<endl;
 //std::cout << std::fixed <<"la métric entre 1 --- 4  est"<< X[2]<<endl;

 




  ipv4.SetBase ("10.2.2.0", "255.255.255.0");
  Ipv4InterfaceContainer i2i5 = ipv4.Assign (d2d5);
  Ipv4InterfaceContainer i3i5 = ipv4.Assign(d3d5);
  Ipv4InterfaceContainer i4i5 = ipv4.Assign (d4d5);

 
  i2i5.SetMetric (0, 2);
 // i2i5.SetMetric (1, X[3]);
 //cout <<"la métric entre  2 --- 5  est"<< X[4]<<endl;
 
  i3i5.SetMetric (0,2);
 // i3i5.SetMetric (1, X[4]);
   //cout <<"la métric entre 3 --- 5  est"<< X[5]<<endl;
  i4i5.SetMetric (0,1);
  // i4i5.SetMetric (1, X[5]);
   //cout <<"la métric entre 4 --- 5 est"<< X[6]<<endl;

  ipv4.SetBase ("10.3.3.0", "255.255.255.0");
  Ipv4InterfaceContainer i5i6 = ipv4.Assign (d5d6);
  i5i6.SetMetric (0, 1);
   //cout <<"la métric entre 5 --- 6  est"<< X[7]<<endl;

// Create router nodes, initialize routing database and set up the routing
  // tables in the nodes.
  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
   GlobalRouteManager::BuildGlobalRoutingDatabase ();
   GlobalRouteManager::InitializeRoutes ();
   Simulator::Schedule (Seconds (10),
  &Ipv4GlobalRoutingHelper::RecomputeRoutingTables);
 
//---------------------------------------On-Off-Application------------------------


  PacketSinkHelper UDPsink("ns3::UdpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), UDPport));
    ApplicationContainer App;
    NodeContainer SourceNode = NodeContainer(c.Get(0));
    NodeContainer SinkNode = NodeContainer(c.Get(6));

    App = UDPsink.Install(SinkNode);
    App.Start(Seconds(0.0));
    App.Stop(Seconds(120.0));
    Address D_Address(InetSocketAddress(i5i6.GetAddress(1), UDPport));


    OnOffHelper UDPsource("ns3::UdpSocketFactory", D_Address);
    UDPsource.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
    UDPsource.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));   
    App = UDPsource.Install(SourceNode);
    App.Start(Seconds(0.0));
    App.Stop(Seconds(120.0));
   
   
//-------------------------------------------------------------------------------------------------
 

 
  //
// Tracing
/*
  AsciiTraceHelper ascii;
  p2p.EnableAscii(ascii.CreateFileStream ("maSimulation.tr"), d0d1);
  p2p.EnablePcap("maSimulation", d0d1, true);

*/
// Calculate Throughput using Flowmonitor
//
  FlowMonitorHelper flowmon;
  Ptr<FlowMonitor> monitor = flowmon.InstallAll();


//
// Now, do the actual simulation.
//



 NS_LOG_INFO ("Run Simulation.");
  Simulator::Stop (Seconds(120.0));
 
 
 
       AnimationInterface anim(animFile);
    Ptr<Node> n = c.Get(0);
    anim.SetConstantPosition(n, 3, 6);
    n = c.Get(1);
    anim.SetConstantPosition(n, 6, 6);
    n = c.Get(4);
    anim.SetConstantPosition(n, 9, 6);
    n = c.Get(3);
    anim.SetConstantPosition(n, 9, 9);
    n = c.Get(5);
    anim.SetConstantPosition(n, 12, 6);
    n = c.Get(6);
    anim.SetConstantPosition(n, 15, 6);
    n = c.Get(2);
    anim.SetConstantPosition(n, 9, 3);
   
   
    /*
 
  AnimationInterface anim ("animation.xml");
  anim.SetConstantPosition (c.Get(0),3.0, 6.0);
  anim.SetConstantPosition (c.Get(1),6.0, 6.0);
  anim.SetConstantPosition (c.Get(4),9.0, 6.0);
  anim.SetConstantPosition (c.Get(3),9.0, 9.0);
  anim.SetConstantPosition (c.Get(5),12.0, 6.0);
  anim.SetConstantPosition (c.Get(6),15.0, 6.0);
  anim.SetConstantPosition (c.Get(2),9.0, 3.0);
  */
    Simulator::Run ();
   
     monitor->CheckForLostPackets ();

  Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ());
  std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats ();

  for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i)
    {
      Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first);
      if ((t.sourceAddress=="10.1.1.1" && ( t.destinationAddress == "10.1.1.2" || t.destinationAddress == "10.1.4.2" ) ))
      {
          std::cout << "Flow " << i->first  << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n";
          std::cout << "  Tx Bytes:   " << i->second.txBytes << "\n";
          std::cout << "  Rx Bytes:   " << i->second.rxBytes << "\n";
            std::cout << "  Throughput: " << i->second.rxBytes * 8.0 / (i->second.timeLastRxPacket.GetSeconds() - i->second.timeFirstTxPacket.GetSeconds())/1024/1024  << " Mbps\n";
          std::cout << " Taux de pertes en bits :" << float(((i->second.txBytes - i->second.rxBytes)) / float(i->second.txBytes ) * 100) << " % \n";
      std::cout << " Latency :" << "unkown " << "\n";
      std::cout << " Jitter :" << "unkown " << "\n";
      std::cout << " All delay Sum :" << i->second.delaySum / 1000000000 << " sec \n";
      std::cout << " Average Delay :" << i->second.delaySum / float(i->second.rxPackets * 1000000)  << " ms \n";
      std::cout << " Jitter Sum :" << i->second.jitterSum  << "\n";
      std::cout << " Avg Jitter  :" << i->second.jitterSum / float(i->second.rxPackets * 1000000)   << "  ms \n";
      std::cout << " Last Delay (for calculating jitter) :" <<  i->second.lastDelay / 1000000 << " ms \n";
      std::cout << " Total number of Tx packets :" << i->second.txPackets << "\n";
      std::cout << " Total number of Rx packets :" << i->second.rxPackets << "\n";
      std::cout << " Total number of lost packets :" << i->second.txPackets - i->second.rxPackets  << "\n";
      std::cout << " Ratio lost packets :" << float(100*((i->second.txPackets - i->second.rxPackets))/float(i->second.txPackets))  << "\n";
   
     
      }
     }



  monitor->SerializeToXmlFile("hcen.xml", true, true);
   

    Simulator::Destroy ();
  return 0;

}

void  entrer ()
{

    string const nomFichier("test.txt");
    ofstream monFlux(nomFichier.c_str());

    if(monFlux)   
    {
  
         cout << "entrer le cout entre les liens MErci "<<endl;;
        //X[i] =((double) rand() / (RAND_MAX)) + 1 - 1;
        ::X[0]=rand()% 10;
        cout << X[0];
        ::X[1]=rand()%10;
        cout << X[1];
        ::X[2]=rand()%10;
    cout << X[2];
 }

}


/*
void  deux()
{

    string const nomFichier("test1.txt");
    ofstream monFlux(nomFichier.c_str());

    if(monFlux)   
    {
     for (int i=0;i<3;i++)

     {
         cout << "entrer le cout entre les liens MErci "<<endl;;
        //X[i] =((double) rand() / (RAND_MAX)) + 1 - 1;
        X[i]=rand()% 10;
        cout << D[i];
Reply all
Reply to author
Forward
0 new messages