OLD | NEW |
(Empty) | |
| 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
| 2 /* |
| 3 * Copyright (c) 2012 NICT |
| 4 * |
| 5 * This program is free software; you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 2 as |
| 7 * published by the Free Software Foundation; |
| 8 * |
| 9 * This program is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. |
| 13 * |
| 14 * You should have received a copy of the GNU General Public License |
| 15 * along with this program; if not, write to the Free Software |
| 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 17 * |
| 18 * Author: Hajime Tazaki <tazaki@nict.go.jp> |
| 19 */ |
| 20 |
| 21 #include "ns3/log.h" |
| 22 #include "ns3/core-module.h" |
| 23 #include "ns3/network-module.h" |
| 24 #include "ns3/internet-module.h" |
| 25 #include "ns3/point-to-point-module.h" |
| 26 #include "ns3/applications-module.h" |
| 27 #include "ns3/dce-module.h" |
| 28 #include "ns3/flow-monitor-module.h" |
| 29 |
| 30 using namespace ns3; |
| 31 |
| 32 NS_LOG_COMPONENT_DEFINE ("DceFirst"); |
| 33 |
| 34 std::string m_stack = "dce"; |
| 35 std::string sock_factory = "ns3::LinuxTcpSocketFactory"; |
| 36 int m_seed = 1; |
| 37 double startTime = 4.0; |
| 38 double stopTime = 20.0; |
| 39 int m_nNodes = 2; |
| 40 bool enablePcap = false; |
| 41 |
| 42 int |
| 43 main (int argc, char *argv[]) |
| 44 { |
| 45 // LogComponentEnable ("OnOffApplication", LOG_LEVEL_INFO); |
| 46 // LogComponentEnable ("PacketSink", LOG_LEVEL_INFO); |
| 47 |
| 48 CommandLine cmd; |
| 49 cmd.AddValue ("stack" , "choose network stack", m_stack); |
| 50 cmd.AddValue ("seed" , "randomize seed", m_seed); |
| 51 cmd.AddValue ("nNodes" , "the number of nodes in left side", m_nNodes); |
| 52 cmd.AddValue ("stopTime" , "duration", stopTime); |
| 53 cmd.AddValue ("enablePcap" , "pcap", enablePcap); |
| 54 cmd.Parse (argc, argv); |
| 55 |
| 56 SeedManager::SetSeed (m_seed); |
| 57 |
| 58 NodeContainer lefts, routers, rights, nodes; |
| 59 lefts.Create (m_nNodes); |
| 60 routers.Create (2); |
| 61 rights.Create (m_nNodes); |
| 62 nodes = NodeContainer (lefts, routers, rights); |
| 63 |
| 64 DceManagerHelper dceManager; |
| 65 LinuxStackHelper stack; |
| 66 InternetStackHelper internetStack;·· |
| 67 |
| 68 GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true)); |
| 69 if (m_stack == "dce") |
| 70 { |
| 71 internetStack.Install (routers); |
| 72 sock_factory = "ns3::LinuxTcpSocketFactory"; |
| 73 dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory", |
| 74 "Library", StringValue ("liblinux.so")); |
| 75 stack.Install (lefts); |
| 76 stack.Install (rights); |
| 77 } |
| 78 else if (m_stack == "dce-linux3") |
| 79 { |
| 80 internetStack.Install (routers); |
| 81 dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory", |
| 82 "Library", StringValue ("liblinux-stable.so")); |
| 83 stack.Install (lefts); |
| 84 stack.Install (rights); |
| 85 //stack.Install (routers); |
| 86 } |
| 87 else if (m_stack == "dce-dccp") |
| 88 { |
| 89 internetStack.Install (routers); |
| 90 dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory", |
| 91 "Library", StringValue ("liblinux.so")); |
| 92 sock_factory = "ns3::LinuxDccpSocketFactory"; |
| 93 stack.Install (lefts); |
| 94 stack.Install (rights); |
| 95 } |
| 96 else if (m_stack == "dce-dccp3") |
| 97 { |
| 98 internetStack.Install (routers); |
| 99 dceManager.SetNetworkStack("ns3::LinuxSocketFdFactory", |
| 100 "Library", StringValue ("liblinux-stable.so")); |
| 101 sock_factory = "ns3::LinuxDccpSocketFactory"; |
| 102 stack.Install (lefts); |
| 103 stack.Install (rights); |
| 104 } |
| 105 else if (m_stack == "ns3") |
| 106 { |
| 107 sock_factory = "ns3::TcpSocketFactory"; |
| 108 internetStack.Install (nodes); |
| 109 } |
| 110 else if (m_stack == "nsc-linux") |
| 111 { |
| 112 internetStack.Install (routers); |
| 113 sock_factory = "ns3::TcpSocketFactory"; |
| 114 internetStack.SetTcp ("ns3::NscTcpL4Protocol", |
| 115 "Library", StringValue ("liblinux2.6.26.so")); |
| 116 internetStack.Install (lefts); |
| 117 internetStack.Install (rights); |
| 118 // Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_c
ongestion_control",· |
| 119 // StringValue ("reno")); |
| 120 } |
| 121 else if (m_stack == "nsc-freebsd") |
| 122 { |
| 123 // didn't work under 64bit (12/11/13) |
| 124 sock_factory = "ns3::TcpSocketFactory"; |
| 125 internetStack.SetTcp ("ns3::NscTcpL4Protocol", |
| 126 "Library", StringValue ("libfreebsd5.3.so")); |
| 127 internetStack.Install (nodes); |
| 128 } |
| 129 else |
| 130 { |
| 131 NS_ASSERT_MSG (0, "no stack " << m_stack << " is available"); |
| 132 } |
| 133 |
| 134 PointToPointHelper pointToPoint; |
| 135 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); |
| 136 pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns")); |
| 137 |
| 138 Ipv4AddressHelper address; |
| 139 Ipv4InterfaceContainer interfaces; |
| 140 |
| 141 NetDeviceContainer dev0, dev1, dev2; |
| 142 for (uint32_t i = 0; i < m_nNodes; i++) |
| 143 { |
| 144 std::ostringstream oss; |
| 145 oss << "10.0." << i << ".0"; |
| 146 address.SetBase (oss.str ().c_str (), "255.255.255.0"); |
| 147 dev0 = pointToPoint.Install (NodeContainer (lefts.Get (i), routers.Get (0)
)); |
| 148 address.Assign (dev0); |
| 149 } |
| 150 |
| 151 // bottle neck link |
| 152 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps")); |
| 153 pointToPoint.SetChannelAttribute ("Delay", StringValue ("100ms")); |
| 154 dev1 = pointToPoint.Install (NodeContainer (routers.Get (0), routers.Get (1)))
; |
| 155 |
| 156 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); |
| 157 pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns")); |
| 158 // for right links |
| 159 for (uint32_t i = 0; i < m_nNodes; i++) |
| 160 { |
| 161 std::ostringstream oss; |
| 162 oss << "10.2." << i << ".0"; |
| 163 address.SetBase (oss.str ().c_str (), "255.255.255.0"); |
| 164 dev2 = pointToPoint.Install (NodeContainer (routers.Get (1), rights.Get (i
))); |
| 165 address.Assign (dev2); |
| 166 } |
| 167 |
| 168 // bottle neck link |
| 169 Ptr<RateErrorModel> em1 =· |
| 170 CreateObjectWithAttributes<RateErrorModel> ("RanVar", RandomVariableValue (U
niformVariable (0.0, 1.0)), |
| 171 "ErrorRate", DoubleValue (0.05), |
| 172 "ErrorUnit", EnumValue (RateErro
rModel::ERROR_UNIT_PACKET) |
| 173 ); |
| 174 dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em1)); |
| 175 |
| 176 address.SetBase ("10.1.0.0", "255.255.255.0"); |
| 177 address.Assign (dev1); |
| 178 Ipv4GlobalRoutingHelper::PopulateRoutingTables (); |
| 179 |
| 180 if (m_stack.find ("dce") != std::string::npos) |
| 181 { |
| 182 dceManager.Install (nodes); |
| 183 } |
| 184 |
| 185 ApplicationContainer apps; |
| 186 DceApplicationHelper process; |
| 187 |
| 188 OnOffHelper onoff = OnOffHelper (sock_factory, |
| 189 InetSocketAddress (Ipv4Address ("10.2.0.2"),
2000)); |
| 190 onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Consta
nt=1]")); |
| 191 onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Const
ant=0]")); |
| 192 |
| 193 // Flow 1 - n |
| 194 for (uint32_t i = 0; i < m_nNodes; i++) |
| 195 { |
| 196 std::ostringstream oss; |
| 197 oss << "10.2." << i << ".2"; |
| 198 onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address
(oss.str ().c_str ()), 2000))); |
| 199 onoff.SetAttribute ("PacketSize", StringValue ("1024")); |
| 200 onoff.SetAttribute ("DataRate", StringValue ("1Mbps")); |
| 201 onoff.SetAttribute ("StartTime", TimeValue (Seconds (startTime))); |
| 202 apps = onoff.Install (lefts.Get (i)); |
| 203 } |
| 204 |
| 205 PacketSinkHelper sink = PacketSinkHelper (sock_factory, |
| 206 InetSocketAddress (Ipv4Address::GetA
ny (), 2000)); |
| 207 apps = sink.Install (rights); |
| 208 apps.Start (Seconds (3.9999)); |
| 209 |
| 210 if (enablePcap) |
| 211 { |
| 212 pointToPoint.EnablePcapAll ("dce-tcp-comparison"); |
| 213 } |
| 214 |
| 215 Simulator::Stop (Seconds (stopTime)); |
| 216 Simulator::Run (); |
| 217 |
| 218 Ptr<PacketSink> pktsink; |
| 219 std::cout << "Total "; |
| 220 for (uint32_t i = 0; i < m_nNodes; i++) |
| 221 { |
| 222 pktsink = apps.Get (i)->GetObject<PacketSink> ();; |
| 223 std::cout << "Rx(" << i << ") = " << pktsink->GetTotalRx () <<· |
| 224 " bytes (" << pktsink->GetTotalRx () * 8 / (stopTime - startTime) << " b
ps), "; |
| 225 } |
| 226 std::cout << std::endl; |
| 227 |
| 228 Simulator::Destroy (); |
| 229 return 0; |
| 230 } |
OLD | NEW |