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 ("SocketOptionsIpv6");
36
ReceivePacket(Ptr<Socket> socket)37 void ReceivePacket (Ptr<Socket> socket)
38 {
39 NS_LOG_INFO ("Received one packet!");
40 Ptr<Packet> packet = socket->Recv ();
41 SocketIpv6TclassTag tclassTag;
42 if (packet->RemovePacketTag (tclassTag))
43 {
44 NS_LOG_INFO (" TCLASS = " << (uint32_t)tclassTag.GetTclass ());
45 }
46 SocketIpv6HopLimitTag hoplimitTag;
47 if (packet->RemovePacketTag (hoplimitTag))
48 {
49 NS_LOG_INFO (" HOPLIMIT = " << (uint32_t)hoplimitTag.GetHopLimit ());
50 }
51 }
52
SendPacket(Ptr<Socket> socket,uint32_t pktSize,uint32_t pktCount,Time pktInterval)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
main(int argc,char * argv[])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 IPv6, currently TCLASS, HOPLIMIT, RECVTCLASS, and RECVHOPLIMIT
80 uint32_t ipv6Tclass = 0;
81 bool ipv6RecvTclass = true;
82 uint32_t ipv6Hoplimit = 0;
83 bool ipv6RecvHoplimit = true;
84
85 CommandLine cmd (__FILE__);
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 ("IPV6_TCLASS", "IPV6_TCLASS", ipv6Tclass);
90 cmd.AddValue ("IPV6_RECVTCLASS", "IPV6_RECVTCLASS", ipv6RecvTclass);
91 cmd.AddValue ("IPV6_HOPLIMIT", "IPV6_HOPLIMIT", ipv6Hoplimit);
92 cmd.AddValue ("IPV6_RECVHOPLIMIT", "IPV6_RECVHOPLIMIT", ipv6RecvHoplimit);
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 Ipv6AddressHelper ipv6;
114 ipv6.SetBase ("2001:0000:f00d:cafe::", Ipv6Prefix (64));
115 Ipv6InterfaceContainer i6 = ipv6.Assign (d);
116 serverAddress = Address(i6.GetAddress (1,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 Inet6SocketAddress local = Inet6SocketAddress (Ipv6Address::GetAny (), 4477);
123 recvSink->SetIpv6RecvTclass (ipv6RecvTclass);
124 recvSink->SetIpv6RecvHopLimit (ipv6RecvHoplimit);
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 Inet6SocketAddress remote = Inet6SocketAddress (i6.GetAddress (1,1), 4477);
131 //Set socket options, it is also possible to set the options after the socket has been created/connected.
132 if (ipv6Tclass != 0)
133 {
134 source->SetIpv6Tclass (ipv6Tclass);
135 }
136
137 if (ipv6Hoplimit > 0)
138 {
139 source->SetIpv6HopLimit (ipv6Hoplimit);
140 }
141 source->Connect (remote);
142
143 AsciiTraceHelper ascii;
144 csma.EnableAsciiAll (ascii.CreateFileStream ("socket-options-ipv6.tr"));
145 csma.EnablePcapAll ("socket-options-ipv6", false);
146
147 //Schedule SendPacket
148 Time interPacketInterval = Seconds (packetInterval);
149 Simulator::ScheduleWithContext (source->GetNode ()->GetId (),
150 Seconds (1.0), &SendPacket,
151 source, packetSize, packetCount, interPacketInterval);
152
153 NS_LOG_INFO ("Run Simulation.");
154 Simulator::Run ();
155 Simulator::Destroy ();
156 NS_LOG_INFO ("Done.");
157 }
158