examples/multi-rate-second.cc
author Duy Nguyen <duy@soe.ucsc.edu>
Thu Aug 13 09:06:17 2009 +0200 (2009-08-13)
changeset 4706 c1c7c44be568
child 4738 bfc0ffd9cf7c
permissions -rw-r--r--
add minstrel examples
duy@4706
     1
/* 
duy@4706
     2
 * Instructions:
duy@4706
     3
 * ./waf --run multi-rate-second
duy@4706
     4
 * gnuplot multi-rate-second.plt 
duy@4706
     5
 *
duy@4706
     6
 * Output: multi-rate-second.eps 
duy@4706
     7
 *
duy@4706
     8
 */
duy@4706
     9
duy@4706
    10
#include "ns3/core-module.h"
duy@4706
    11
#include "ns3/common-module.h"
duy@4706
    12
#include "ns3/node-module.h"
duy@4706
    13
#include "ns3/helper-module.h"
duy@4706
    14
#include "ns3/mobility-module.h"
duy@4706
    15
#include "ns3/contrib-module.h"
duy@4706
    16
duy@4706
    17
#include <iostream>
duy@4706
    18
#include <fstream>
duy@4706
    19
#include <vector>
duy@4706
    20
#include <string>
duy@4706
    21
duy@4706
    22
NS_LOG_COMPONENT_DEFINE ("Main");
duy@4706
    23
duy@4706
    24
using namespace ns3;
duy@4706
    25
duy@4706
    26
class Experiment
duy@4706
    27
{
duy@4706
    28
public:
duy@4706
    29
  Experiment ();
duy@4706
    30
  Experiment (std::string name);
duy@4706
    31
  Gnuplot2dDataset Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
duy@4706
    32
                        const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel);
duy@4706
    33
private:
duy@4706
    34
  void ReceivePacket (Ptr<Socket> socket);
duy@4706
    35
  void SetPosition (Ptr<Node> node, Vector position);
duy@4706
    36
  Vector GetPosition (Ptr<Node> node);
duy@4706
    37
  Ptr<Socket> SetupPacketReceive (Ptr<Node> node);
duy@4706
    38
  void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize, 
duy@4706
    39
                        uint32_t pktCount, Time pktInterval , Ptr<Node> node);
duy@4706
    40
duy@4706
    41
  uint32_t m_pktsTotal;
duy@4706
    42
  Gnuplot2dDataset m_output;
duy@4706
    43
  bool advanceStep; 
duy@4706
    44
};
duy@4706
    45
duy@4706
    46
Experiment::Experiment ()
duy@4706
    47
{
duy@4706
    48
  advanceStep= true;
duy@4706
    49
}
duy@4706
    50
duy@4706
    51
Experiment::Experiment (std::string name)
duy@4706
    52
  : m_output (name)
duy@4706
    53
{
duy@4706
    54
  m_output.SetStyle (Gnuplot2dDataset::LINES);
duy@4706
    55
}
duy@4706
    56
duy@4706
    57
void
duy@4706
    58
Experiment::SetPosition (Ptr<Node> node, Vector position)
duy@4706
    59
{
duy@4706
    60
  Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
duy@4706
    61
  mobility->SetPosition (position);
duy@4706
    62
}
duy@4706
    63
duy@4706
    64
Vector
duy@4706
    65
Experiment::GetPosition (Ptr<Node> node)
duy@4706
    66
{
duy@4706
    67
  Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
duy@4706
    68
  return mobility->GetPosition ();
duy@4706
    69
}
duy@4706
    70
duy@4706
    71
void
duy@4706
    72
Experiment::ReceivePacket (Ptr<Socket> socket)
duy@4706
    73
{
duy@4706
    74
  Ptr<Packet> packet;
duy@4706
    75
  while (packet = socket->Recv ())
duy@4706
    76
    {
duy@4706
    77
      m_pktsTotal ++;
duy@4706
    78
    }
duy@4706
    79
}
duy@4706
    80
duy@4706
    81
Ptr<Socket>
duy@4706
    82
Experiment::SetupPacketReceive (Ptr<Node> node)
duy@4706
    83
{
duy@4706
    84
  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
duy@4706
    85
  Ptr<Socket> sink = Socket::CreateSocket (node, tid);
duy@4706
    86
  InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), 80);
duy@4706
    87
  sink->Bind (local);
duy@4706
    88
  sink->SetRecvCallback (MakeCallback (&Experiment::ReceivePacket, this));
duy@4706
    89
  return sink;
duy@4706
    90
}
duy@4706
    91
duy@4706
    92
void
duy@4706
    93
Experiment::GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize, 
duy@4706
    94
                             uint32_t pktCount, Time pktInterval, Ptr<Node> node )
duy@4706
    95
{
duy@4706
    96
  Vector pos = GetPosition(node);
duy@4706
    97
duy@4706
    98
  ///to offset the start time
duy@4706
    99
  double offSetTime = 100;
duy@4706
   100
duy@4706
   101
  if (pktCount > 0)
duy@4706
   102
    {
duy@4706
   103
      ///To simulate nodes moving in and out of transmission constantly
duy@4706
   104
      if(pos.x <= 305 && advanceStep)
duy@4706
   105
        {
duy@4706
   106
          ///keep moving away
duy@4706
   107
          pos.x += .1;
duy@4706
   108
          SetPosition(node, pos);
duy@4706
   109
        }
duy@4706
   110
      else
duy@4706
   111
        {
duy@4706
   112
          if(pos.x < 150)
duy@4706
   113
	    {
duy@4706
   114
              advanceStep=true;
duy@4706
   115
            }
duy@4706
   116
          else
duy@4706
   117
            {
duy@4706
   118
              advanceStep = false;
duy@4706
   119
            }			
duy@4706
   120
duy@4706
   121
          ///moving back in
duy@4706
   122
          pos.x -= .1;
duy@4706
   123
          SetPosition(node, pos);
duy@4706
   124
        }
duy@4706
   125
      socket->Send (Create<Packet> (pktSize));
duy@4706
   126
      Simulator::Schedule (pktInterval, &Experiment::GenerateTraffic, this, 
duy@4706
   127
                           socket, pktSize,pktCount-1, pktInterval, node);
duy@4706
   128
    }
duy@4706
   129
  else
duy@4706
   130
    {
duy@4706
   131
      m_output.Add((Simulator::Now()).GetSeconds() - offSetTime , m_pktsTotal); 
duy@4706
   132
    }
duy@4706
   133
}
duy@4706
   134
duy@4706
   135
Gnuplot2dDataset
duy@4706
   136
Experiment::Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
duy@4706
   137
                 const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
duy@4706
   138
{
duy@4706
   139
  m_pktsTotal = 0;
duy@4706
   140
duy@4706
   141
  NodeContainer c;
duy@4706
   142
  c.Create (2);
duy@4706
   143
duy@4706
   144
  YansWifiPhyHelper phy = wifiPhy;
duy@4706
   145
  phy.SetChannel (wifiChannel.Create ());
duy@4706
   146
duy@4706
   147
  NqosWifiMacHelper mac = wifiMac;
duy@4706
   148
  NetDeviceContainer devices = wifi.Install (phy, mac, c);
duy@4706
   149
duy@4706
   150
  MobilityHelper mobility;
duy@4706
   151
  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
duy@4706
   152
  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
duy@4706
   153
  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
duy@4706
   154
  mobility.SetPositionAllocator (positionAlloc);
duy@4706
   155
  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
duy@4706
   156
  mobility.Install (c);
duy@4706
   157
duy@4706
   158
  InternetStackHelper internet;
duy@4706
   159
  internet.Install (c);
duy@4706
   160
duy@4706
   161
  Ipv4AddressHelper ipv4;
duy@4706
   162
  NS_LOG_INFO ("Assign IP Addresses.");
duy@4706
   163
  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
duy@4706
   164
  Ipv4InterfaceContainer wifiNodesInterface = ipv4.Assign (devices);
duy@4706
   165
duy@4706
   166
duy@4706
   167
  Ptr<Socket> recvSink = SetupPacketReceive (c.Get (0));
duy@4706
   168
duy@4706
   169
  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
duy@4706
   170
  Ptr<Socket> source = Socket::CreateSocket (c.Get (1), tid);
duy@4706
   171
  InetSocketAddress remote = InetSocketAddress (Ipv4Address ("255.255.255.255"), 80);
duy@4706
   172
  source->Connect (remote);
duy@4706
   173
  uint32_t packetSize = 1014;
duy@4706
   174
  uint32_t maxPacketCount = 1000;
duy@4706
   175
  Time interPacketInterval = Seconds (.1);
duy@4706
   176
duy@4706
   177
  Ptr<Node> n1 = c.Get(0);
duy@4706
   178
  Ptr<Ipv4> ipv41 = n1->GetObject<Ipv4> ();
duy@4706
   179
duy@4706
   180
duy@4706
   181
duy@4706
   182
  for (int i= 1; i <= 100; i++) 
duy@4706
   183
    {
duy@4706
   184
duy@4706
   185
      Simulator::Schedule (Seconds (i), &Experiment::GenerateTraffic,
duy@4706
   186
                           this, source, packetSize, maxPacketCount,interPacketInterval, c.Get(1));
duy@4706
   187
duy@4706
   188
      if( i % 5 == 0 )
duy@4706
   189
        {
duy@4706
   190
          ///bring a network interface down 
duy@4706
   191
          Simulator::Schedule (Seconds (i+.5), &Ipv4::SetDown, ipv41, 1); 
duy@4706
   192
          i++;
duy@4706
   193
          Simulator::Schedule (Seconds (i), &Experiment::GenerateTraffic,
duy@4706
   194
                               this, source, packetSize, maxPacketCount,interPacketInterval, c.Get(1));
duy@4706
   195
	
duy@4706
   196
          ///bring a network interface up
duy@4706
   197
          Simulator::Schedule (Seconds (i+.2), &Ipv4::SetUp, ipv41, 1); 
duy@4706
   198
          i++;
duy@4706
   199
          Simulator::Schedule (Seconds (i), &Experiment::GenerateTraffic,
duy@4706
   200
                               this, source, packetSize, maxPacketCount,interPacketInterval, c.Get(1));
duy@4706
   201
        }
duy@4706
   202
    }
duy@4706
   203
duy@4706
   204
  Simulator::Run ();
duy@4706
   205
  Simulator::Destroy ();
duy@4706
   206
duy@4706
   207
  return m_output;
duy@4706
   208
}
duy@4706
   209
duy@4706
   210
int main (int argc, char *argv[])
duy@4706
   211
{
duy@4706
   212
  std::vector <std::string> ratesControl;
duy@4706
   213
  ratesControl.push_back ("Ideal");
duy@4706
   214
  ratesControl.push_back ("Minstrel");
duy@4706
   215
duy@4706
   216
  std::vector <std::string> wifiManager;
duy@4706
   217
  wifiManager.push_back("ns3::IdealWifiManager");
duy@4706
   218
  wifiManager.push_back("ns3::MinstrelWifiManager");
duy@4706
   219
duy@4706
   220
  // disable fragmentation
duy@4706
   221
  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200"));
duy@4706
   222
  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200"));
duy@4706
   223
duy@4706
   224
  CommandLine cmd;
duy@4706
   225
  cmd.Parse (argc, argv);
duy@4706
   226
duy@4706
   227
  Gnuplot gnuplot = Gnuplot ("multi-rate-second.eps");
duy@4706
   228
  
duy@4706
   229
  for (uint32_t i = 0; i < ratesControl.size(); i++)
duy@4706
   230
  {
duy@4706
   231
    Gnuplot2dDataset dataset (ratesControl[i]);
duy@4706
   232
    dataset.SetStyle (Gnuplot2dDataset::LINES);
duy@4706
   233
    Experiment experiment;
duy@4706
   234
duy@4706
   235
duy@4706
   236
    WifiHelper wifi = WifiHelper::Default ();
duy@4706
   237
    NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
duy@4706
   238
    YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
duy@4706
   239
    YansWifiChannelHelper wifiChannel  = YansWifiChannelHelper::Default ();
duy@4706
   240
duy@4706
   241
    wifiMac.SetType ("ns3::AdhocWifiMac");
duy@4706
   242
duy@4706
   243
    NS_LOG_DEBUG (ratesControl[i]);
duy@4706
   244
duy@4706
   245
    experiment = Experiment (ratesControl[i]);
duy@4706
   246
    dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
duy@4706
   247
    gnuplot.AddDataset (dataset);
duy@4706
   248
duy@4706
   249
  }
duy@4706
   250
  gnuplot.SetTerminal ("postscript eps color enh \"Times-BoldItalic\"");
duy@4706
   251
  gnuplot.SetLegend ("Time (Seconds)", "Number of packets received");
duy@4706
   252
  gnuplot.SetExtra  ("set xrange [0:100]");
duy@4706
   253
  gnuplot.GenerateOutput (std::cout);
duy@4706
   254
duy@4706
   255
  return 0;
duy@4706
   256
}