examples/socket/socket-options-ipv4.cc
changeset 9145 5752b425cdf5
equal deleted inserted replaced
9144:6a15c50388bc 9145:5752b425cdf5
       
     1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
       
     2 /*
       
     3  * This program is free software; you can redistribute it and/or modify
       
     4  * it under the terms of the GNU General Public License version 2 as
       
     5  * published by the Free Software Foundation;
       
     6  *
       
     7  * This program is distributed in the hope that it will be useful,
       
     8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
     9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    10  * GNU General Public License for more details.
       
    11  *
       
    12  * You should have received a copy of the GNU General Public License
       
    13  * along with this program; if not, write to the Free Software
       
    14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    15  */
       
    16 
       
    17 // Network topology
       
    18 //
       
    19 //       n0              n1
       
    20 //       |               |
       
    21 //       =================
       
    22 //              LAN
       
    23 //
       
    24 // - UDP flows from n0 to n1
       
    25 
       
    26 #include <fstream>
       
    27 #include "ns3/core-module.h"
       
    28 #include "ns3/csma-module.h"
       
    29 #include "ns3/applications-module.h"
       
    30 #include "ns3/internet-module.h"
       
    31 #include "ns3/network-module.h"
       
    32 
       
    33 using namespace ns3;
       
    34 
       
    35 NS_LOG_COMPONENT_DEFINE ("SocketOptionsIpv4");
       
    36 
       
    37 void ReceivePacket (Ptr<Socket> socket)
       
    38 {
       
    39   NS_LOG_INFO ("Received one packet!");
       
    40   Ptr<Packet> packet = socket->Recv ();
       
    41   SocketIpTosTag tosTag;
       
    42   if (packet->RemovePacketTag (tosTag))
       
    43     {
       
    44       NS_LOG_INFO (" TOS = " << (uint32_t)tosTag.GetTos ());
       
    45     }
       
    46   SocketIpTtlTag ttlTag;
       
    47   if (packet->RemovePacketTag (ttlTag))
       
    48     {
       
    49       NS_LOG_INFO (" TTL = " << (uint32_t)ttlTag.GetTtl ());
       
    50     }
       
    51 }
       
    52 
       
    53 static void SendPacket (Ptr<Socket> socket, uint32_t pktSize, 
       
    54                         uint32_t pktCount, Time pktInterval )
       
    55 {
       
    56   if (pktCount > 0)
       
    57     {
       
    58       socket->Send (Create<Packet> (pktSize));
       
    59       Simulator::Schedule (pktInterval, &SendPacket, 
       
    60                            socket, pktSize,pktCount - 1, pktInterval);
       
    61     }
       
    62   else
       
    63     {
       
    64       socket->Close ();
       
    65     }
       
    66 }
       
    67 
       
    68 int 
       
    69 main (int argc, char *argv[])
       
    70 {
       
    71 //
       
    72 // Allow the user to override any of the defaults and the above Bind() at
       
    73 // run-time, via command-line arguments
       
    74 //
       
    75   uint32_t packetSize = 1024;
       
    76   uint32_t packetCount = 10;
       
    77   double packetInterval = 1.0;
       
    78 
       
    79   //Socket options for IPv4, currently TOS, TTL, RECVTOS, and RECVTTL
       
    80   uint32_t ipTos = 0;
       
    81   bool ipRecvTos = true;
       
    82   uint32_t ipTtl = 0;
       
    83   bool ipRecvTtl = true;
       
    84 
       
    85   CommandLine cmd;
       
    86   cmd.AddValue ("PacketSize", "Packet size in bytes", packetSize);
       
    87   cmd.AddValue ("PacketCount", "Number of packets to send", packetCount);
       
    88   cmd.AddValue ("Interval", "Interval between packets", packetInterval);
       
    89   cmd.AddValue ("IP_TOS", "IP_TOS", ipTos);
       
    90   cmd.AddValue ("IP_RECVTOS", "IP_RECVTOS", ipRecvTos);
       
    91   cmd.AddValue ("IP_TTL", "IP_TTL", ipTtl);
       
    92   cmd.AddValue ("IP_RECVTTL", "IP_RECVTTL", ipRecvTtl);
       
    93   cmd.Parse (argc, argv);
       
    94 
       
    95   NS_LOG_INFO ("Create nodes.");
       
    96   NodeContainer n;
       
    97   n.Create (2);
       
    98 
       
    99   InternetStackHelper internet;
       
   100   internet.Install (n);
       
   101 
       
   102   Address serverAddress;
       
   103 
       
   104   NS_LOG_INFO ("Create channels.");
       
   105   CsmaHelper csma;
       
   106   csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
       
   107   csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
       
   108   csma.SetDeviceAttribute ("Mtu", UintegerValue (1400));
       
   109   NetDeviceContainer d = csma.Install (n);
       
   110 
       
   111 
       
   112   NS_LOG_INFO ("Assign IP Addresses.");
       
   113   Ipv4AddressHelper ipv4;
       
   114   ipv4.SetBase ("10.1.1.0", "255.255.255.0");
       
   115   Ipv4InterfaceContainer i = ipv4.Assign (d);
       
   116   serverAddress = Address(i.GetAddress (1));
       
   117    
       
   118   NS_LOG_INFO ("Create sockets.");
       
   119   //Receiver socket on n1
       
   120   TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
       
   121   Ptr<Socket> recvSink = Socket::CreateSocket (n.Get (1), tid);
       
   122   InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), 4477);
       
   123   recvSink->SetIpRecvTos (ipRecvTos);
       
   124   recvSink->SetIpRecvTtl (ipRecvTtl);
       
   125   recvSink->Bind (local);
       
   126   recvSink->SetRecvCallback (MakeCallback (&ReceivePacket));
       
   127 
       
   128   //Sender socket on n0
       
   129   Ptr<Socket> source = Socket::CreateSocket (n.Get (0), tid);
       
   130   InetSocketAddress remote = InetSocketAddress (i.GetAddress (1), 4477);
       
   131 
       
   132   //Set socket options, it is also possible to set the options after the socket has been created/connected.
       
   133   if (ipTos > 0)
       
   134     {
       
   135       source->SetIpTos (ipTos);
       
   136     }
       
   137 
       
   138   if (ipTtl > 0)
       
   139     {
       
   140       source->SetIpTtl (ipTtl);
       
   141     }
       
   142   source->Connect (remote);
       
   143 
       
   144   AsciiTraceHelper ascii;
       
   145   csma.EnableAsciiAll (ascii.CreateFileStream ("socket-options-ipv4.tr"));
       
   146   csma.EnablePcapAll ("socket-options-ipv4", false);
       
   147 
       
   148   //Schedule SendPacket
       
   149   Time interPacketInterval = Seconds (packetInterval);
       
   150   Simulator::ScheduleWithContext (source->GetNode ()->GetId (),
       
   151                                   Seconds (1.0), &SendPacket, 
       
   152                                   source, packetSize, packetCount, interPacketInterval);
       
   153 
       
   154   NS_LOG_INFO ("Run Simulation.");
       
   155   Simulator::Run ();
       
   156   Simulator::Destroy ();
       
   157   NS_LOG_INFO ("Done.");
       
   158 }