|
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 } |