1.1 --- a/CHANGES.html Thu Jul 02 15:33:27 2009 +0200
1.2 +++ b/CHANGES.html Thu Jul 02 15:35:52 2009 +0200
1.3 @@ -85,6 +85,23 @@
1.4 </p>
1.5 </li>
1.6
1.7 +<li><b>GlobalRouteManager::PopulateRoutingTables () and RecomputeRoutingTables () are deprecated </b>
1.8 + <p>This API has been moved to the helper API and the above functions will
1.9 +be removed in ns-3.6. The new API is:
1.10 +<pre>
1.11 +Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
1.12 +Ipv4GlobalRoutingHelper::RecomputeRoutingTables ();
1.13 +</pre>
1.14 +Additionally, these low-level functions in GlobalRouteManager are now public,
1.15 +allowing more API flexibility at the low level ns-3 API:
1.16 +<pre>
1.17 +GlobalRouteManager::DeleteGlobalRoutes ();
1.18 +GlobalRouteManager::BuildGlobalRoutingDatabase ();
1.19 +GlobalRouteManager::InitializeRoutes ();
1.20 +</pre>
1.21 + </p>
1.22 +</li>
1.23 +
1.24 <li><b>CalcChecksum attribute changes</b>
1.25 <p>Four IPv4 CalcChecksum attributes (which enable the computation of
1.26 checksums that are disabled by default) have been collapsed into one global
2.1 --- a/doc/tutorial/building-topologies.texi Thu Jul 02 15:33:27 2009 +0200
2.2 +++ b/doc/tutorial/building-topologies.texi Thu Jul 02 15:35:52 2009 +0200
2.3 @@ -61,7 +61,6 @@
2.4 #include "ns3/simulator-module.h"
2.5 #include "ns3/node-module.h"
2.6 #include "ns3/helper-module.h"
2.7 - #include "ns3/global-routing-module.h"
2.8 @end verbatim
2.9
2.10 One thing that can be surprisingly useful is a small bit of ASCII art that
2.11 @@ -294,10 +293,11 @@
2.12 @end verbatim
2.13
2.14 Since we have actually built an internetwork here, we need some form of
2.15 -internetwork routing. @command{ns-3} provides what we call a global route
2.16 -manager to set up the routing tables on nodes. This route manager has a
2.17 -global function that runs through the nodes created for the simulation and does
2.18 -the hard work of setting up routing for you.
2.19 +internetwork routing. @command{ns-3} provides what we call global routing to
2.20 +help you out. Global routing takes advantage of the fact that the entire
2.21 +internetwork is accessible in the simulation and runs through the all of the
2.22 +nodes created for the simulation --- it does the hard work of setting up routing
2.23 +for you without having to configure routers.
2.24
2.25 Basically, what happens is that each node behaves as if it were an OSPF router
2.26 that communicates instantly and magically with all other routers behind the
2.27 @@ -307,7 +307,7 @@
2.28 is a one-liner:
2.29
2.30 @verbatim
2.31 - GlobalRouteManager::PopulateRoutingTables ();
2.32 + Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
2.33 @end verbatim
2.34
2.35 Next we enable pcap tracing. The first line of code to enable pcap tracing
2.36 @@ -329,8 +329,8 @@
2.37 one of the devices and place it in promiscuous mode. That single device
2.38 then ``sniffs'' the network for all packets and stores them in a single
2.39 pcap file. This is how @code{tcpdump}, for example, works. That final
2.40 -parameter tells the CSMA helper whether or not to capture packets in
2.41 -promiscuous mode.
2.42 +parameter tells the CSMA helper whether or not to arrange to capture
2.43 +packets in promiscuous mode.
2.44
2.45 In this example, we are going to select one of the devices on the CSMA
2.46 network and ask it to perform a promiscuous sniff of the network, thereby
2.47 @@ -350,10 +350,10 @@
2.48 }
2.49 @end verbatim
2.50
2.51 -In order to run this example, you have to copy the @code{second.cc} example
2.52 -script into the scratch directory and use waf to build just as you did with
2.53 +In order to run this example, copy the @code{second.cc} example script into
2.54 +the scratch directory and use waf to build just as you did with
2.55 the @code{first.cc} example. If you are in the top-level directory of the
2.56 -repository you would type,
2.57 +repository you just type,
2.58
2.59 @verbatim
2.60 cp examples/second.cc scratch/mysecond.cc
2.61 @@ -380,18 +380,19 @@
2.62 @code{first.cc}, you will see similar output when you run the script.
2.63
2.64 @verbatim
2.65 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
2.66 - Build finished successfully (00:00:00)
2.67 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.68 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.69 + 'build' finished successfully (0.415s)
2.70 Sent 1024 bytes to 10.1.2.4
2.71 Received 1024 bytes from 10.1.1.1
2.72 Received 1024 bytes from 10.1.2.4
2.73 @end verbatim
2.74
2.75 -Recall that the first message, @code{Sent 1024 bytes to 10.1.2.4} is the
2.76 +Recall that the first message, ``@code{Sent 1024 bytes to 10.1.2.4},'' is the
2.77 UDP echo client sending a packet to the server. In this case, the server
2.78 -is on a different network (10.1.2.0). The second message, @code{Received 1024
2.79 -bytes from 10.1.1.1}, is from the UDP echo server, generated when it receives
2.80 -the echo packet. The final message, @code{Received 1024 bytes from 10.1.2.4}
2.81 +is on a different network (10.1.2.0). The second message, ``@code{Received 1024
2.82 +bytes from 10.1.1.1},'' is from the UDP echo server, generated when it receives
2.83 +the echo packet. The final message, ``@code{Received 1024 bytes from 10.1.2.4},''
2.84 is from the echo client, indicating that it has received its echo back from
2.85 the server.
2.86
2.87 @@ -483,8 +484,8 @@
2.88 doesn't know the MAC address of the corresponding node. It broadcasts on the
2.89 CSMA network (ff:ff:ff:ff:ff:ff) asking for the device that has IP address
2.90 10.1.2.4. In this case, the rightmost node replies saying it is at MAC address
2.91 -00:00:00:00:00:06. (Note that node two is not directly involved in this
2.92 -exchange, but is sniffing the network and reporting all of the traffic it sees.)
2.93 +00:00:00:00:00:06. Note that node two is not directly involved in this
2.94 +exchange, but is sniffing the network and reporting all of the traffic it sees.
2.95
2.96 This exchange is seen in the following lines,
2.97
2.98 @@ -559,8 +560,9 @@
2.99 You should now see,
2.100
2.101 @verbatim
2.102 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
2.103 - Build finished successfully (00:00:00)
2.104 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.105 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.106 + 'build' finished successfully (0.405s)
2.107 Sent 1024 bytes to 10.1.2.5
2.108 Received 1024 bytes from 10.1.1.1
2.109 Received 1024 bytes from 10.1.2.5
2.110 @@ -572,7 +574,7 @@
2.111 It is possible that you may not be satisfied with a trace file generated by
2.112 a bystander in the CSMA network. You may really want to get a trace from
2.113 a single device and you may not be interested in any other traffic on the
2.114 -network. You can do this,
2.115 +network. You can do this fairly easily/
2.116
2.117 Let's take a look at @code{scratch/mysecond.cc} and add that code enabling us
2.118 to be more specific. @code{ns-3} helpers provide methods that take a node
2.119 @@ -615,6 +617,14 @@
2.120 documentation for the method. Using the @code{GetId} method can make
2.121 determining node numbers much easier in complex topologies.
2.122
2.123 +Let's clear the old trace files out of the top-level directory to avoid confusion
2.124 +about what is going on,
2.125 +
2.126 +@verbatim
2.127 + rm *.pcap
2.128 + rm *.tr
2.129 +@end verbatim
2.130 +
2.131 If you build the new script and run the simulation setting @code{nCsma} to 100,
2.132
2.133 @verbatim
2.134 @@ -624,8 +634,9 @@
2.135 you will see the following output:
2.136
2.137 @verbatim
2.138 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
2.139 - Build finished successfully (00:00:00)
2.140 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.141 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.142 + 'build' finished successfully (0.407s)
2.143 Sent 1024 bytes to 10.1.2.101
2.144 Received 1024 bytes from 10.1.1.1
2.145 Received 1024 bytes from 10.1.2.101
2.146 @@ -659,9 +670,27 @@
2.147 entire CSMA network.
2.148
2.149 @verbatim
2.150 -reading from file second-100-0.pcap, link-type EN10MB (Ethernet)
2.151 -2.003696 arp who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1
2.152 -2.003811 arp who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101
2.153 + reading from file second-100-0.pcap, link-type EN10MB (Ethernet)
2.154 + 2.003696 arp who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1
2.155 + 2.003811 arp who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101
2.156 +@end verbatim
2.157 +
2.158 +Now take a look at the @code{tcpdump} for @code{second-101-0.pcap}.
2.159 +
2.160 +@verbatim
2.161 + tcpdump -nn -tt -r second-101-0.pcap
2.162 +@end verbatim
2.163 +
2.164 +You can now see that node 101 is really the participant in the echo exchange.
2.165 +
2.166 +@verbatim
2.167 + reading from file second-101-0.pcap, link-type EN10MB (Ethernet)
2.168 + 2.003696 arp who-has 10.1.2.101 (ff:ff:ff:ff:ff:ff) tell 10.1.2.1
2.169 + 2.003696 arp reply 10.1.2.101 is-at 00:00:00:00:00:67
2.170 + 2.003801 IP 10.1.1.1.49153 > 10.1.2.101.9: UDP, length 1024
2.171 + 2.003801 arp who-has 10.1.2.1 (ff:ff:ff:ff:ff:ff) tell 10.1.2.101
2.172 + 2.003822 arp reply 10.1.2.1 is-at 00:00:00:00:00:03
2.173 + 2.003822 IP 10.1.2.101.9 > 10.1.1.1.49153: UDP, length 1024
2.174 @end verbatim
2.175
2.176 @c ========================================================================
2.177 @@ -714,7 +743,6 @@
2.178 #include "ns3/simulator-module.h"
2.179 #include "ns3/node-module.h"
2.180 #include "ns3/helper-module.h"
2.181 -#include "ns3/global-routing-module.h"
2.182 #include "ns3/wifi-module.h"
2.183 #include "ns3/mobility-module.h"
2.184 @end verbatim
2.185 @@ -1035,14 +1063,15 @@
2.186 just as we did in the @code{second.cc} example script.
2.187
2.188 @verbatim
2.189 - GlobalRouteManager::PopulateRoutingTables ();
2.190 + Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
2.191 @end verbatim
2.192
2.193 One thing that can surprise some users is the fact that the simulation we just
2.194 created will never ``naturally'' stop. This is because we asked the wireless
2.195 -access point to generate beacons. It will generate beacons forever, so we must
2.196 -tell the simulator to stop even though it may have beacon generation events
2.197 -scheduled. The following line of code tells the simulator to stop so that
2.198 +access point to generate beacons. It will generate beacons forever, and this
2.199 +will result in simulator events being scheduled into the future indefinitely,
2.200 +so we must tell the simulator to stop even though it may have beacon generation
2.201 +events scheduled. The following line of code tells the simulator to stop so that
2.202 we don't simulate beacons forever and enter what is essentially an endless
2.203 loop.
2.204
2.205 @@ -1054,7 +1083,7 @@
2.206
2.207 @verbatim
2.208 PointToPointHelper::EnablePcapAll ("third");
2.209 - YansWifiPhyHelper::EnablePcap ("third", apDevices.Get (0));
2.210 + phy.EnablePcap ("third", apDevices.Get (0));
2.211 CsmaHelper::EnablePcap ("third", csmaDevices.Get (0), true);
2.212 @end verbatim
2.213
2.214 @@ -1084,27 +1113,28 @@
2.215 ./waf --run scratch/mythird
2.216 @end verbatim
2.217
2.218 -Since we have set up the UDP echo applications just as we did in the
2.219 +Again, since we have set up the UDP echo applications just as we did in the
2.220 @code{second.cc} script, you will see similar output.
2.221
2.222 @verbatim
2.223 - Entering directory `repos/ns-3-allinone-dev/ns-3-dev/build'
2.224 - Build finished successfully (00:00:00)
2.225 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.226 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
2.227 + 'build' finished successfully (0.407s)
2.228 Sent 1024 bytes to 10.1.2.4
2.229 Received 1024 bytes from 10.1.3.3
2.230 Received 1024 bytes from 10.1.2.4
2.231 @end verbatim
2.232
2.233 -Recall that the first message, @code{Sent 1024 bytes to 10.1.2.4} is the
2.234 +Recall that the first message, ``@code{Sent 1024 bytes to 10.1.2.4},'' is the
2.235 UDP echo client sending a packet to the server. In this case, the client
2.236 is on the wireless network (10.1.3.0). The second message,
2.237 -@code{Received 1024 bytes from 10.1.3.3}, is from the UDP echo server,
2.238 +``@code{Received 1024 bytes from 10.1.3.3},'' is from the UDP echo server,
2.239 generated when it receives the echo packet. The final message,
2.240 -@code{Received 1024 bytes from 10.1.2.4} is from the echo client, indicating
2.241 +``@code{Received 1024 bytes from 10.1.2.4},'' is from the echo client, indicating
2.242 that it has received its echo back from the server.
2.243
2.244 If you now go and look in the top level directory, you will find four trace
2.245 -files, two from node zero and two from node one:
2.246 +files from this simulation, two from node zero and two from node one:
2.247
2.248 @verbatim
2.249 third-0-0.pcap third-0-1.pcap third-1-0.pcap third-1-1.pcap
2.250 @@ -1223,8 +1253,8 @@
2.251
2.252 Now, we spent a lot of time setting up mobility models for the wireless network
2.253 and so it would be a shame to finish up without even showing that the STA
2.254 -nodes are actually moving around. Let's do this by hooking into the
2.255 -@code{MobilityModel} course change trace source. This is usually considered
2.256 +nodes are actually moving around during the simulation. Let's do this by hooking
2.257 +into the @code{MobilityModel} course change trace source. This is usually considered
2.258 a fairly advanced topic, but let's just go for it.
2.259
2.260 As mentioned in the ``Tweaking ns-3'' section, the @command{ns-3} tracing system
2.261 @@ -1273,8 +1303,8 @@
2.262 /NodeList/7/$ns3::MobilityModel/CourseChange
2.263 @end verbatim
2.264
2.265 -Based on the discussion in the tracing section, you can easily infer that
2.266 -this trace path references the seventh node in the NodeList. It specifies
2.267 +Based on the discussion in the tracing section, you may infer that this trace
2.268 +path references the seventh node in the global NodeList. It specifies
2.269 what is called an aggregated object of type @code{ns3::MobilityModel}. The
2.270 dollar sign prefix implies that the MobilityModel is aggregated to node seven.
2.271 The last component of the path means that we are hooking into the
2.272 @@ -1336,6 +1366,6 @@
2.273 discussed.
2.274
2.275 We have just scratched the surface of @command{ns-3} in this tutorial, but we
2.276 -hope we have covered enough to get you started doing useful work.
2.277 +hope we have hopefully covered enough to get you started doing useful work.
2.278
2.279 -- The @command{ns-3} development team.
3.1 --- a/doc/tutorial/conceptual-overview.texi Thu Jul 02 15:33:27 2009 +0200
3.2 +++ b/doc/tutorial/conceptual-overview.texi Thu Jul 02 15:35:52 2009 +0200
3.3 @@ -110,7 +110,7 @@
3.4 you had to buy a specific kind of network cable and a hardware device called
3.5 (in PC terminology) a @emph{peripheral card} that needed to be installed in
3.6 your computer. If the peripheral card implemented some networking function,
3.7 -theys were called Network Interface Cards, or @emph{NICs}. Today most
3.8 +they were called Network Interface Cards, or @emph{NICs}. Today most
3.9 computers come with the network interface hardware built in and users don't
3.10 see these building blocks.
3.11
3.12 @@ -174,9 +174,10 @@
3.13 directory structure something like the following:
3.14
3.15 @verbatim
3.16 - AUTHORS examples/ README samples/ utils/ waf.bat*
3.17 - build/ LICENSE regression/ scratch/ VERSION wscript
3.18 - doc/ ns3/ RELEASE_NOTES src/ waf*
3.19 + AUTHORS doc/ README RELEASE_NOTES utils/ wscript
3.20 + bindings/ examples/ regression/ samples/ VERSION wutils.py
3.21 + build/ LICENSE regression.py scratch/ waf* wutils.pyc
3.22 + CHANGES.html ns3/ regression.pyc src/ waf.bat*
3.23 @end verbatim
3.24
3.25 @cindex first.cc
3.26 @@ -276,7 +277,7 @@
3.27 @end verbatim
3.28
3.29 to build the project. So now if you look in the directory
3.30 -@code{build/debug/ns3} you will find the four module include files shown
3.31 +@code{../build/debug/ns3} you will find the four module include files shown
3.32 above. You can take a look at the contents of these files and find that they
3.33 do include all of the public include files in their respective modules.
3.34
3.35 @@ -310,16 +311,18 @@
3.36 documentation system. If you look at the project web site,
3.37 @uref{http://www.nsnam.org,,ns-3 project}, you will find a link to ``Doxygen
3.38 (ns-3-dev)'' in the navigation bar. If you select this link, you will be
3.39 -taken to our documentation page.
3.40 +taken to our documentation page for the current development release. There
3.41 +is also a link to ``Doxygen (stable)'' that will take you to the documentation
3.42 +for the latest stable release of @code{ns-3}.
3.43
3.44 Along the left side, you will find a graphical representation of the structure
3.45 of the documentation. A good place to start is the @code{NS-3 Modules}
3.46 -``book.'' If you expand @code{Modules} you will see a list of @command{ns-3}
3.47 -module documentation. The concept of module here ties directly into the
3.48 -module include files discussed above. It turns out that the @command{ns-3}
3.49 -logging subsystem is part of the @code{core} module, so go ahead and expand
3.50 -that documentation node. Now, expand the @code{Debugging} book and then
3.51 -select the @code{Logging} page.
3.52 +``book'' in the @code{ns-3} navigation tree. If you expand @code{Modules}
3.53 +you will see a list of @command{ns-3} module documentation. The concept of
3.54 +module here ties directly into the module include files discussed above. It
3.55 +turns out that the @command{ns-3} logging subsystem is part of the @code{core}
3.56 +module, so go ahead and expand that documentation node. Now, expand the
3.57 +@code{Debugging} book and then select the @code{Logging} page.
3.58
3.59 You should now be looking at the Doxygen documentation for the Logging module.
3.60 In the list of @code{#define}s at the top of the page you will see the entry
3.61 @@ -437,7 +440,7 @@
3.62 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
3.63 @end verbatim
3.64
3.65 -tells the @code{PointToPointHelper} object to use the value ``5mbps''
3.66 +tells the @code{PointToPointHelper} object to use the value ``5Mbps''
3.67 (five megabits per second) as the ``DataRate'' when it creates a
3.68 @code{PointToPointNetDevice} object.
3.69
3.70 @@ -492,7 +495,7 @@
3.71 created objects.
3.72
3.73 After executing the @code{pointToPoint.Install (nodes)} call we will have
3.74 -two nodes, each with an installed point-to-point net device and a
3.75 +two nodes, each with an installed point-to-point net device and a single
3.76 point-to-point channel between them. Both devices will be configured to
3.77 transmit data at five megabits per second over the channel which has a two
3.78 millisecond transmission delay.
3.79 @@ -576,13 +579,13 @@
3.80 The first line of code in the above snippet declares the
3.81 @code{UdpEchoServerHelper}. As usual, this isn't the application itself, it
3.82 is an object used to help us create the actual applications. One of our
3.83 -conventions is to place required @code{Attributes} in the helper constructor.
3.84 +conventions is to place @emph{required} @code{Attributes} in the helper constructor.
3.85 In this case, the helper can't do anything useful unless it is provided with
3.86 a port number that the client also knows about. Rather than just picking one
3.87 and hoping it all works out, we require the port number as a parameter to the
3.88 constructor. The constructor, in turn, simply does a @code{SetAttribute}
3.89 -with the passed value. You can, if desired, set the ``Port'' @code{Attribute}
3.90 -to another value later.
3.91 +with the passed value. If you want, you can set the ``Port'' @code{Attribute}
3.92 +to another value later using @code{SetAttribute}.
3.93
3.94 Similar to many other helper objects, the @code{UdpEchoServerHelper} object
3.95 has an @code{Install} method. It is the execution of this method that actually
3.96 @@ -591,7 +594,11 @@
3.97 @code{NodeContainter} as a parameter just as the other @code{Install} methods
3.98 we have seen. This is actually what is passed to the method even though it
3.99 doesn't look so in this case. There is a C++ @emph{implicit conversion} at
3.100 -work here.
3.101 +work here that takes the result of @code{nodes.Get (1)} (which returns a smart
3.102 +pointer to a node object --- @code{Ptr<Node>}) and uses that in a constructor
3.103 +for an unnamed @code{NodeContainer} that is then passed to @code{Install}.
3.104 +If you are ever at a loss to find a particular method signature in C++ code
3.105 +that compiles and runs just fine, look for these kinds of implicit conversions.
3.106
3.107 We now see that @code{echoServer.Install} is going to install a
3.108 @code{UdpEchoServerApplication} on the node found at index number one of the
3.109 @@ -603,9 +610,12 @@
3.110 Applications require a time to ``start'' generating traffic and may take an
3.111 optional time to ``stop''. We provide both. These times are set using the
3.112 @code{ApplicationContainer} methods @code{Start} and @code{Stop}. These
3.113 -methods take @code{Time} parameters. In this case, we use an explicit C++
3.114 -conversion sequence to take the C++ double 1.0 and convert it to an
3.115 -@command{ns-3} @code{Time} object using a @code{Seconds} cast. The two lines,
3.116 +methods take @code{Time} parameters. In this case, we use an @emph{explicit}
3.117 +C++ conversion sequence to take the C++ double 1.0 and convert it to an
3.118 +@command{ns-3} @code{Time} object using a @code{Seconds} cast. Be aware that
3.119 +the conversion rules may be controlled by the model author, and C++ has its
3.120 +own rules, so you can't always just assume that parameters will be happily
3.121 +converted for you. The two lines,
3.122
3.123 @verbatim
3.124 serverApps.Start (Seconds (1.0));
3.125 @@ -614,9 +624,9 @@
3.126
3.127 will cause the echo server application to @code{Start} (enable itself) at one
3.128 second into the simulation and to @code{Stop} (disable itself) at ten seconds
3.129 -into the simulation. By virtue of the fact that we have implicilty declared
3.130 -a simulation event (the application stop event) to be executed at ten seconds,
3.131 -the simulation will last at least ten seconds.
3.132 +into the simulation. By virtue of the fact that we have declared a simulation
3.133 +event (the application stop event) to be executed at ten seconds, the simulation
3.134 +will last @emph{at least} ten seconds.
3.135
3.136 @subsubsection UdpEchoClientHelper
3.137
3.138 @@ -682,25 +692,27 @@
3.139 @end verbatim
3.140
3.141 we actually scheduled events in the simulator at 1.0 seconds, 2.0 seconds and
3.142 -10.0 seconds. When @code{Simulator::Run} is called, the system will begin
3.143 -looking through the list of scheduled events and executing them. First it
3.144 -will run the event at 1.0 seconds, which will enable the echo server
3.145 -application. Then it will run the event scheduled for t=2.0 seconds which
3.146 -will start the echo client application. The start event implementation in
3.147 -the echo client application will begin the data transfer phase of the
3.148 -simulation by sending a packet to the server.
3.149 +two events at 10.0 seconds. When @code{Simulator::Run} is called, the system
3.150 +will begin looking through the list of scheduled events and executing them.
3.151 +First it will run the event at 1.0 seconds, which will enable the echo server
3.152 +application (this event may, in turn, schedule many other events). Then it
3.153 +will run the event scheduled for t=2.0 seconds which will start the echo client
3.154 +application. Again, this event may schedule many more events. The start event
3.155 +implementation in the echo client application will begin the data transfer phase
3.156 +of the simulation by sending a packet to the server.
3.157
3.158 The act of sending the packet to the server will trigger a chain of events
3.159 that will be automatically scheduled behind the scenes and which will perform
3.160 the mechanics of the packet echo according to the various timing parameters
3.161 that we have set in the script.
3.162
3.163 -Eventually, since we only send one packet, the chain of events triggered by
3.164 +Eventually, since we only send one packet (recall the @code{MaxPackets}
3.165 +@code{Attribute} was set to one), the chain of events triggered by
3.166 that single client echo request will taper off and the simulation will go
3.167 idle. Once this happens, the remaining events will be the @code{Stop} events
3.168 for the server and the client. When these events are executed, there are
3.169 no further events to process and @code{Simulator::Run} returns. The simulation
3.170 -is complete.
3.171 +is then complete.
3.172
3.173 All that remains is to clean up. This is done by calling the global function
3.174 @code{Simulator::Destroy}. As the helper functions (or low level
3.175 @@ -721,10 +733,11 @@
3.176 We have made it trivial to build your simple scripts. All you have to do is
3.177 to drop your script into the scratch directory and it will automatically be
3.178 built if you run Waf. Let's try it. Copy @code{examples/first.cc} into
3.179 -the @code{scratch} directory.
3.180 +the @code{scratch} directory after changing back into the top level directory.
3.181
3.182 @verbatim
3.183 - ~/repos/ns-3-dev > cp examples/first.cc scratch/myfirst.cc
3.184 + cd ..
3.185 + cp examples/first.cc scratch/myfirst.cc
3.186 @end verbatim
3.187
3.188 Now build your first example script using waf:
3.189 @@ -737,10 +750,11 @@
3.190 successfully.
3.191
3.192 @verbatim
3.193 - Entering directory `repos/ns-3-allinone-dev/ns-3-dev/build'
3.194 - [563/648] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
3.195 - [646/648] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
3.196 - Build finished successfully (00:00:02)
3.197 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
3.198 + [614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
3.199 + [706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
3.200 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
3.201 + 'build' finished successfully (2.357s)
3.202 @end verbatim
3.203
3.204 You can now run the example (note that if you build your program in the scratch
3.205 @@ -753,8 +767,9 @@
3.206 You should see some output:
3.207
3.208 @verbatim
3.209 - Entering directory `repos/ns-3-allinone-dev/ns-3-dev/build'
3.210 - Build finished successfully (00:00:00)
3.211 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
3.212 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
3.213 + 'build' finished successfully (0.418s)
3.214 Sent 1024 bytes to 10.1.1.2
3.215 Received 1024 bytes from 10.1.1.1
3.216 Received 1024 bytes from 10.1.1.2
3.217 @@ -778,49 +793,57 @@
3.218 Now that you have used some of the @command{ns-3} helpers you may want to
3.219 have a look at some of the source code that implements that functionality.
3.220 The most recent code can be browsed on our web server at the following link:
3.221 -@uref{http://code.nsnam.org/?sort=lastchange}. If you click on the bold
3.222 -repository names on the left of the page, you will see @emph{changelogs} for
3.223 -these repositories, and links to the @emph{manifest}. From the manifest
3.224 -links, one can browse the source tree.
3.225 +@uref{http://code.nsnam.org/ns-3-dev}. There, you will see the Mercurial
3.226 +summary page for our @command{ns-3} development tree.
3.227
3.228 -The top-level directory for one of our @emph{repositories} will look
3.229 -something like:
3.230 +At the top of the page, you will see a number of links,
3.231
3.232 @verbatim
3.233 -drwxr-xr-x [up]
3.234 -drwxr-xr-x bindings python files
3.235 -drwxr-xr-x doc files
3.236 -drwxr-xr-x examples files
3.237 -drwxr-xr-x ns3 files
3.238 -drwxr-xr-x regression files
3.239 -drwxr-xr-x samples files
3.240 -drwxr-xr-x scratch files
3.241 -drwxr-xr-x src files
3.242 -drwxr-xr-x utils files
3.243 --rw-r--r-- 2009-03-24 00:51 -0700 505 .hgignore file | revisions | annotate
3.244 --rw-r--r-- 2009-03-24 00:51 -0700 1682 .hgtags file | revisions | annotate
3.245 --rw-r--r-- 2009-03-24 00:51 -0700 686 AUTHORS file | revisions | annotate
3.246 --rw-r--r-- 2009-03-24 00:51 -0700 14893 CHANGES.html file | revisions | annotate
3.247 --rw-r--r-- 2009-03-24 00:51 -0700 17987 LICENSE file | revisions | annotate
3.248 --rw-r--r-- 2009-03-24 00:51 -0700 3742 README file | revisions | annotate
3.249 --rw-r--r-- 2009-03-24 00:51 -0700 13505 RELEASE_NOTES file | revisions | annotate
3.250 --rw-r--r-- 2009-03-24 00:51 -0700 6 VERSION file | revisions | annotate
3.251 --rw-r--r-- 2009-03-24 00:51 -0700 9257 regression.py file | revisions | annotate
3.252 --rwxr-xr-x 2009-03-24 00:51 -0700 81285 waf file | revisions | annotate
3.253 --rwxr-xr-x 2009-03-24 00:51 -0700 28 waf.bat file | revisions | annotate
3.254 --rw-r--r-- 2009-03-24 00:51 -0700 26270 wscript file | revisions | annotate
3.255 --rw-r--r-- 2009-03-24 00:51 -0700 6636 wutils.py file | revisions | annotate
3.256 + summary | shortlog | changelog | graph | tags | files
3.257 @end verbatim
3.258
3.259 +Go ahead and select the @code{files} link. This is what the top-level of
3.260 +most of our @emph{repositories} will look:
3.261 +
3.262 +@verbatim
3.263 +drwxr-xr-x [up]
3.264 +drwxr-xr-x bindings python files
3.265 +drwxr-xr-x doc files
3.266 +drwxr-xr-x examples files
3.267 +drwxr-xr-x ns3 files
3.268 +drwxr-xr-x regression files
3.269 +drwxr-xr-x samples files
3.270 +drwxr-xr-x scratch files
3.271 +drwxr-xr-x src files
3.272 +drwxr-xr-x utils files
3.273 +-rw-r--r-- 2009-07-01 12:47 +0200 560 .hgignore file | revisions | annotate
3.274 +-rw-r--r-- 2009-07-01 12:47 +0200 1886 .hgtags file | revisions | annotate
3.275 +-rw-r--r-- 2009-07-01 12:47 +0200 1276 AUTHORS file | revisions | annotate
3.276 +-rw-r--r-- 2009-07-01 12:47 +0200 30961 CHANGES.html file | revisions | annotate
3.277 +-rw-r--r-- 2009-07-01 12:47 +0200 17987 LICENSE file | revisions | annotate
3.278 +-rw-r--r-- 2009-07-01 12:47 +0200 3742 README file | revisions | annotate
3.279 +-rw-r--r-- 2009-07-01 12:47 +0200 16171 RELEASE_NOTES file | revisions | annotate
3.280 +-rw-r--r-- 2009-07-01 12:47 +0200 6 VERSION file | revisions | annotate
3.281 +-rw-r--r-- 2009-07-01 12:47 +0200 10946 regression.py file | revisions | annotate
3.282 +-rwxr-xr-x 2009-07-01 12:47 +0200 88110 waf file | revisions | annotate
3.283 +-rwxr-xr-x 2009-07-01 12:47 +0200 28 waf.bat file | revisions | annotate
3.284 +-rw-r--r-- 2009-07-01 12:47 +0200 35395 wscript file | revisions | annotate
3.285 +-rw-r--r-- 2009-07-01 12:47 +0200 7673 wutils.py file | revisions | annotate
3.286 +@end verbatim
3.287 +
3.288 +Our example scripts are in the @code{examples} directory. If you click on @code{examples}
3.289 +you will see a list of files. One of the files in that directory is @code{first.cc}. If
3.290 +you click on @code{first.cc} you will find the code you just walked through.
3.291 +
3.292 The source code is mainly in the @code{src} directory. You can view source
3.293 code either by clicking on the directory name or by clicking on the @code{files}
3.294 link to the right of the directory name. If you click on the @code{src}
3.295 directory, you will be taken to the listing of the @code{src} subdirectories. If you
3.296 -click on @code{core} subdirectory, you will find a list of files. The first file
3.297 -you will find (as of this writing) is @code{abort.h}. If you
3.298 -click on @code{abort.h} link, you will be sent to the source file for @code{abort.h}.
3.299 +then click on @code{core} subdirectory, you will find a list of files. The first file
3.300 +you will find (as of this writing) is @code{abort.h}. If you click on the
3.301 +@code{abort.h} link, you will be sent to the source file for @code{abort.h} which
3.302 +contains useful macros for exiting scripts if abnormal conditions are detected.
3.303
3.304 -Our example scripts are in the @code{examples} directory. The source code for
3.305 -the helpers we have used in this chapter can be found in the
3.306 +The source code for the helpers we have used in this chapter can be found in the
3.307 @code{src/helper} directory. Feel free to poke around in the directory tree to
3.308 get a feel for what is there and the style of @command{ns-3} programs.
4.1 --- a/doc/tutorial/getting-started.texi Thu Jul 02 15:33:27 2009 +0200
4.2 +++ b/doc/tutorial/getting-started.texi Thu Jul 02 15:35:52 2009 +0200
4.3 @@ -80,7 +80,7 @@
4.4 adding changesets
4.5 adding manifests
4.6 adding file changes
4.7 - added 26 changesets with 40 changes to 7 files
4.8 + added 31 changesets with 45 changes to 7 files
4.9 7 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.10 @end verbatim
4.11
4.12 @@ -126,8 +126,8 @@
4.13
4.14 Since the release numbers are going to be changing, I will stick with
4.15 the more constant ns-3-dev here in the tutorial, but you can replace the
4.16 -string ``ns-3-dev'' with your choice of release (e.g., ns-3.4 and
4.17 -ns-3.4-ref-traces) in the text below. You can find the latest version of the
4.18 +string ``ns-3-dev'' with your choice of release (e.g., ns-3.5 and
4.19 +ns-3.5-ref-traces) in the text below. You can find the latest version of the
4.20 code either by inspection of the repository list or by going to the
4.21 @uref{http://www.nsnam.org/getting_started.html,,``Getting Started''}
4.22 web page and looking for the latest release identifier.
4.23 @@ -138,13 +138,23 @@
4.24
4.25 Go ahead and type the following into your shell (remember you can substitute
4.26 the name of your chosen release number instead of @code{ns-3-dev} -- like
4.27 -@code{"ns-3.4"} and @code{"ns-3.4-ref-traces"} if you want to work with a
4.28 +@code{"ns-3.5"} and @code{"ns-3.5-ref-traces"} if you want to work with a
4.29 stable release).
4.30
4.31 @verbatim
4.32 ./download.py -n ns-3-dev -r ns-3-dev-ref-traces
4.33 @end verbatim
4.34
4.35 +Note that the default for the @code{-n} option is @code{ns-3-dev} and the
4.36 +default for the @code{-r} option is @code{ns-3-dev-ref-traces} and so the
4.37 +above is actually redundant. We provide this example to illustrate how to
4.38 +specify alternate repositories. In order to download @code{ns-3-dev} you
4.39 +can actually use the defaults and simply type,
4.40 +
4.41 +@verbatim
4.42 + ./download.py
4.43 +@end verbatim
4.44 +
4.45 As the hg (Mercurial) command executes, you should see something like the
4.46 following,
4.47
4.48 @@ -152,15 +162,15 @@
4.49 #
4.50 # Get NS-3
4.51 #
4.52 -
4.53 +
4.54 Cloning ns-3 branch
4.55 => hg clone http://code.nsnam.org/ns-3-dev ns-3-dev
4.56 requesting all changes
4.57 adding changesets
4.58 adding manifests
4.59 adding file changes
4.60 - added 4292 changesets with 15368 changes to 1671 files
4.61 - 823 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.62 + added 4634 changesets with 16500 changes to 1762 files
4.63 + 870 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.64 @end verbatim
4.65
4.66 This is output by the download script as it fetches the actual @code{ns-3}
4.67 @@ -177,8 +187,8 @@
4.68 adding changesets
4.69 adding manifests
4.70 adding file changes
4.71 - added 79 changesets with 1102 changes to 222 files
4.72 - 206 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.73 + added 86 changesets with 1178 changes to 259 files
4.74 + 208 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.75 @end verbatim
4.76
4.77 This is the download script fetching the reference trace files for you.
4.78 @@ -191,10 +201,10 @@
4.79 #
4.80 # Get PyBindGen
4.81 #
4.82 -
4.83 - Required pybindgen version: 0.10.0.630
4.84 +
4.85 + Required pybindgen version: 0.10.0.640
4.86 Trying to fetch pybindgen; this will fail if no network connection is available. Hit Ctrl-C to skip.
4.87 - => bzr checkout -rrevno:630 https://launchpad.net/pybindgen pybindgen
4.88 + => bzr checkout -rrevno:640 https://launchpad.net/pybindgen pybindgen
4.89 Fetch was successful.
4.90 @end verbatim
4.91
4.92 @@ -205,7 +215,7 @@
4.93 #
4.94 # Get NSC
4.95 #
4.96 -
4.97 +
4.98 Required NSC version: nsc-0.5.0
4.99 Retrieving nsc from https://secure.wand.net.nz/mercurial/nsc
4.100 => hg clone https://secure.wand.net.nz/mercurial/nsc nsc
4.101 @@ -213,8 +223,8 @@
4.102 adding changesets
4.103 adding manifests
4.104 adding file changes
4.105 - added 270 changesets with 17375 changes to 14991 files
4.106 - 10614 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.107 + added 273 changesets with 17565 changes to 15175 files
4.108 + 10622 files updated, 0 files merged, 0 files removed, 0 files unresolved
4.109 @end verbatim
4.110
4.111 This part of the process is the script downloading the Network Simulation
4.112 @@ -257,16 +267,16 @@
4.113 cd
4.114 mkdir tarballs
4.115 cd tarballs
4.116 - wget http://www.nsnam.org/releases/ns-allinone-3.4.tar.bz2
4.117 - tar xjf ns-allinone-3.4.tar.bz2
4.118 + wget http://www.nsnam.org/releases/ns-allinone-3.5.tar.bz2
4.119 + tar xjf ns-allinone-3.5.tar.bz2
4.120 @end verbatim
4.121
4.122 -If you change into the directory @code{ns-allinone-3.4} you should see a
4.123 +If you change into the directory @code{ns-allinone-3.5} you should see a
4.124 number of files:
4.125
4.126 @verbatim
4.127 -build.py* ns-3.4/ nsc-0.5.0/ README
4.128 -constants.py ns-3.4-ref-traces/ pybindgen-0.10.0.630/ util.py
4.129 +build.py* ns-3.5/ nsc-0.5.0/ README
4.130 +constants.py ns-3.5-ref-traces/ pybindgen-0.10.0.640/ util.py
4.131 @end verbatim
4.132
4.133 You are now ready to build the @command{ns-3} distribution.
4.134 @@ -288,7 +298,7 @@
4.135 downloaded using Mercurial you should have a directory called
4.136 @code{ns-3-allinone} under your @code{~/repos} directory. If you downloaded
4.137 using a tarball you should have a directory called something like
4.138 -@code{ns-3-allinone-3.4} under your @code{~/tarballs} directory. Take a deep
4.139 +@code{ns-allinone-3.5} under your @code{~/tarballs} directory. Take a deep
4.140 breath and type the following:
4.141
4.142 @verbatim
4.143 @@ -300,13 +310,13 @@
4.144 following magic words:
4.145
4.146 @verbatim
4.147 - Build finished successfully (00:02:37)
4.148 - Leaving directory `./ns-3-dev'
4.149 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
4.150 + 'build' finished successfully (2m30.586s)
4.151 @end verbatim
4.152
4.153 Once the project has built you can say goodbye to your old friends, the
4.154 @code{ns-3-allinone} scripts. You got what you needed from them and will now
4.155 -interact directly with Waf and we do it in the @code{ns-3-dev} directory and
4.156 +interact directly with Waf and we do it in the @code{ns-3-dev} directory,
4.157 not in the @code{ns-3-allinone} directory. Go ahead and change into the
4.158 @code{ns-3-dev} directory (or the directory for the appropriate release you
4.159 downloaded.
4.160 @@ -340,76 +350,72 @@
4.161 output that looks similar to the following,
4.162
4.163 @verbatim
4.164 -Checking for program g++ : ok /usr/bin/g++
4.165 -Checking for program cpp : ok /usr/bin/cpp
4.166 -Checking for program ar : ok /usr/bin/ar
4.167 -Checking for program ranlib : ok /usr/bin/ranlib
4.168 -Checking for g++ : ok
4.169 -Checking for program pkg-config : ok /usr/bin/pkg-config
4.170 -Checking for regression reference traces : ok ../ns-3-dev-ref-traces (guessed)
4.171 -Checking for -Wno-error=deprecated-declarations support : yes
4.172 -Checking for header stdlib.h : ok
4.173 -Checking for header signal.h : ok
4.174 -Checking for header pthread.h : ok
4.175 -Checking for high precision time implementation : 128-bit integer
4.176 -Checking for header stdint.h : ok
4.177 -Checking for header inttypes.h : ok
4.178 -Checking for header sys/inttypes.h : not found
4.179 -Checking for library rt : ok
4.180 -Checking for header netpacket/packet.h : ok
4.181 -Checking for header linux/if_tun.h : ok
4.182 -Checking for pkg-config flags for GTK_CONFIG_STORE : ok
4.183 -Package libxml-2.0 was not found in the pkg-config search path.
4.184 -Perhaps you should add the directory containing `libxml-2.0.pc'
4.185 -to the PKG_CONFIG_PATH environment variable
4.186 -No package 'libxml-2.0' found
4.187 -Checking for pkg-config flags for LIBXML2 : not found
4.188 -Checking for library sqlite3 : ok
4.189 -Checking for NSC location : ok ../nsc (guessed)
4.190 -Checking for library dl : ok
4.191 -Checking for NSC supported architecture x86_64 : ok
4.192 -Package goocanvas was not found in the pkg-config search path.
4.193 -Perhaps you should add the directory containing `goocanvas.pc'
4.194 -to the PKG_CONFIG_PATH environment variable
4.195 -No package 'goocanvas' found
4.196 -Checking for pkg-config flags for MOBILITY_VISUALIZER : not found
4.197 -Checking for program python : ok /usr/bin/python
4.198 -Checking for Python version >= 2.3 : ok 2.5.2
4.199 -Checking for library python2.5 : ok
4.200 -Checking for program python2.5-config : ok /usr/bin/python2.5-config
4.201 -Checking for header Python.h : ok
4.202 -Checking for -fvisibility=hidden support : yes
4.203 -Checking for pybindgen location : ok ../pybindgen (guessed)
4.204 -Checking for Python module pybindgen : ok
4.205 -Checking for pybindgen version : ok 0.10.0.630
4.206 -Checking for Python module pygccxml : ok
4.207 -Checking for pygccxml version : ok 0.9.5
4.208 -Checking for program gccxml : ok /usr/local/bin/gccxml
4.209 -Checking for gccxml version : ok 0.9.0
4.210 -Checking for program sudo : ok /usr/bin/sudo
4.211 -Checking for program hg : ok /usr/bin/hg
4.212 -Checking for program valgrind : ok /usr/bin/valgrind
4.213 ----- Summary of optional NS-3 features:
4.214 -Threading Primitives : enabled
4.215 -Real Time Simulator : enabled
4.216 -Emulated Net Device : enabled
4.217 -Tap Bridge : enabled
4.218 -GtkConfigStore : enabled
4.219 -XmlIo : not enabled (library 'libxml-2.0 >= 2.7' not found)
4.220 -SQlite stats data output : enabled
4.221 -Network Simulation Cradle : enabled
4.222 -Python Bindings : enabled
4.223 -Python API Scanning Support : enabled
4.224 -Use sudo to set suid bit : not enabled (option --enable-sudo not selected)
4.225 -Configuration finished successfully (00:00:02); project is now ready to build.
4.226 + Checking for program g++ : ok /usr/bin/g++
4.227 + Checking for program cpp : ok /usr/bin/cpp
4.228 + Checking for program ar : ok /usr/bin/ar
4.229 + Checking for program ranlib : ok /usr/bin/ranlib
4.230 + Checking for g++ : ok
4.231 + Checking for program pkg-config : ok /usr/bin/pkg-config
4.232 + Checking for regression reference traces : ok ../ns-3-dev-ref-traces (guessed)
4.233 + Checking for -Wno-error=deprecated-declarations support : yes
4.234 + Checking for -Wl,--soname=foo support : yes
4.235 + Checking for header stdlib.h : ok
4.236 + Checking for header signal.h : ok
4.237 + Checking for header pthread.h : ok
4.238 + Checking for high precision time implementation : 128-bit integer
4.239 + Checking for header stdint.h : ok
4.240 + Checking for header inttypes.h : ok
4.241 + Checking for header sys/inttypes.h : not found
4.242 + Checking for library rt : ok
4.243 + Checking for header netpacket/packet.h : ok
4.244 + Checking for pkg-config flags for GSL : ok
4.245 + Checking for header linux/if_tun.h : ok
4.246 + Checking for pkg-config flags for GTK_CONFIG_STORE : ok
4.247 + Checking for pkg-config flags for LIBXML2 : ok
4.248 + Checking for library sqlite3 : ok
4.249 + Checking for NSC location : ok ../nsc (guessed)
4.250 + Checking for library dl : ok
4.251 + Checking for NSC supported architecture x86_64 : ok
4.252 + Checking for program python : ok /usr/bin/python
4.253 + Checking for Python version >= 2.3 : ok 2.5.2
4.254 + Checking for library python2.5 : ok
4.255 + Checking for program python2.5-config : ok /usr/bin/python2.5-config
4.256 + Checking for header Python.h : ok
4.257 + Checking for -fvisibility=hidden support : yes
4.258 + Checking for pybindgen location : ok ../pybindgen (guessed)
4.259 + Checking for Python module pybindgen : ok
4.260 + Checking for pybindgen version : ok 0.10.0.640
4.261 + Checking for Python module pygccxml : ok
4.262 + Checking for pygccxml version : ok 0.9.5
4.263 + Checking for program gccxml : ok /usr/local/bin/gccxml
4.264 + Checking for gccxml version : ok 0.9.0
4.265 + Checking for program sudo : ok /usr/bin/sudo
4.266 + Checking for program hg : ok /usr/bin/hg
4.267 + Checking for program valgrind : ok /usr/bin/valgrind
4.268 + ---- Summary of optional NS-3 features:
4.269 + Threading Primitives : enabled
4.270 + Real Time Simulator : enabled
4.271 + Emulated Net Device : enabled
4.272 + GNU Scientific Library (GSL) : enabled
4.273 + Tap Bridge : enabled
4.274 + GtkConfigStore : enabled
4.275 + XmlIo : enabled
4.276 + SQlite stats data output : enabled
4.277 + Network Simulation Cradle : enabled
4.278 + Python Bindings : enabled
4.279 + Python API Scanning Support : enabled
4.280 + Use sudo to set suid bit : not enabled (option --enable-sudo not selected)
4.281 + Static build : not enabled (option --enable-static not selected)
4.282 + 'configure' finished successfully (2.870s)
4.283 @end verbatim
4.284
4.285 Note the last part of the above output. Some ns-3 options are not enabled by
4.286 default or require support from the underlying system to work properly.
4.287 For instance, to enable XmlTo, the library libxml-2.0 must be found on the
4.288 -system. in the example above, this library was not found and the corresponding
4.289 -feature was not enabled. There is a feature to use sudo to set the suid bit of
4.290 -certain programs. This was not enabled by default.
4.291 +system. If this library were not found, the corresponding @command{ns-3} feature
4.292 +would not be enabled and a message would be displayed. Note further that there is
4.293 +a feature to use the progarm @code{sudo} to set the suid bit of certain programs.
4.294 +This is not enabled by default and so this feature is reported as ``not enabled.''
4.295
4.296 Now go ahead and switch back to the debug build.
4.297
4.298 @@ -427,15 +433,15 @@
4.299 Some waf commands are meaningful during the build phase and some commands are valid
4.300 in the configuration phase. For example, if you wanted to use the emulation
4.301 features of @command{ns-3} you might want to enable setting the suid bit using
4.302 -sudo. This is a configuration command, and so you could have run the following
4.303 -command
4.304 +sudo as described above. This turns out to be a configuration-time command, and so
4.305 +you could reconfigure using the following command
4.306
4.307 @verbatim
4.308 ./waf -d debug --enable-sudo configure
4.309 @end verbatim
4.310
4.311 -If you had done this, waf would have run sudo to change the socket creator
4.312 -programs to run as root. There are many other configure- and build-time options
4.313 +If you do this, waf will have run sudo to change the socket creator programs of the
4.314 +emulation code to run as root. There are many other configure- and build-time options
4.315 available in waf. To explore these options, type:
4.316
4.317 @verbatim
4.318 @@ -462,26 +468,45 @@
4.319 ./waf --check
4.320 @end verbatim
4.321
4.322 -You should see a report from each unit test that executes indicating that the
4.323 -test has passed.
4.324 +These tests are run in parallel by waf, so the summary, ``Ran n tests'' will
4.325 +appear as soon as all of the tasks are launched, but you should eventually
4.326 +see a report saying that,
4.327
4.328 @verbatim
4.329 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
4.330 - Build finished successfully (00:00:00)
4.331 - -- Running NS-3 C++ core unit tests...
4.332 - PASS AddressHelper
4.333 - PASS Wifi
4.334 - PASS DcfManager
4.335 - ...
4.336 - PASS Object
4.337 - PASS Ptr
4.338 - PASS Callback
4.339 - -- Running NS-3 Python bindings unit tests...
4.340 + C++ UNIT TESTS: all 33 tests passed.
4.341 +@end verbatim
4.342 +
4.343 +This is the important message.
4.344 +
4.345 +You will also see output from the test runner and waf task sequence numbers
4.346 +the output will actually look something like,
4.347 +
4.348 +@verbatim
4.349 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
4.350 + [707/709] get-unit-tests-list
4.351 + [708/709] run-python-unit-tests
4.352 + [709/709] print-introspected-doxygen
4.353 + [710/743] run-unit-test(AddressHelper)
4.354 + [711/743] run-unit-test(Wifi)
4.355 ...........
4.356 ----------------------------------------------------------------------
4.357 Ran 11 tests in 0.003s
4.358 +
4.359 + OK
4.360 + [712/743] run-unit-test(DcfManager)
4.361 + [713/743] run-unit-test(MacRxMiddle)
4.362 + [714/743] run-unit-test(Ipv4ListRouting)
4.363
4.364 - OK
4.365 + ...
4.366 +
4.367 + [739/743] run-unit-test(RandomVariable)
4.368 + [740/743] run-unit-test(Object)
4.369 + [741/743] run-unit-test(Ptr)
4.370 + [742/743] run-unit-test(Callback)
4.371 + [743/743] collect-unit-tests-results
4.372 + C++ UNIT TESTS: all 33 tests passed.
4.373 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
4.374 + 'build' finished successfully (1.799s)
4.375 @end verbatim
4.376
4.377 This command is typically run by @code{users} to quickly verify that an
4.378 @@ -491,10 +516,10 @@
4.379 You can also run our regression test suite to ensure that your distribution and
4.380 toolchain have produced binaries that generate output that is identical to
4.381 known-good reference output files. You downloaded these reference traces to
4.382 -your machine during the download process above. (Warning: The @code{ns-3.2}
4.383 -and @code{ns-3.3} releases do not use the @code{ns-3-allinone} environment
4.384 -and require you to be online when you run regression tests because they
4.385 -dynamically synchronize the reference traces directory with an online
4.386 +your machine during the @code{./download.py} process above. (Warning: The
4.387 +@code{ns-3.2} and @code{ns-3.3} releases do not use the @code{ns-3-allinone}
4.388 +environment and require you to be online when you run regression tests because
4.389 +hey dynamically synchronize the reference traces directory with an online
4.390 repository immediately prior to the run).
4.391
4.392 During regression testing Waf will run a number of tests that generate what we
4.393 @@ -509,6 +534,9 @@
4.394 Some regression tests may be SKIPped if the required support
4.395 is not present.
4.396
4.397 +Note that the regression tests are also run in parallel and so the messages
4.398 +may be interleaved.
4.399 +
4.400 To run the regression tests, you provide Waf with the regression flag.
4.401
4.402 @verbatim
4.403 @@ -530,7 +558,8 @@
4.404 ...
4.405 Regression testing summary:
4.406 PASS: 22 of 22 tests passed
4.407 - Build finished successfully (00:00:23)
4.408 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
4.409 + 'build' finished successfully (25.826s)
4.410 @end verbatim
4.411
4.412 If you want to take a look at an example of what might be checked during
5.1 --- a/doc/tutorial/introduction.texi Thu Jul 02 15:33:27 2009 +0200
5.2 +++ b/doc/tutorial/introduction.texi Thu Jul 02 15:35:52 2009 +0200
5.3 @@ -75,7 +75,7 @@
5.4 generates pcap packet trace files, other utilities can be used to
5.5 analyze traces as well.
5.6 In this tutorial, we will first concentrate on scripting
5.7 -directly in C++ and interpreting results via ascii trace files.
5.8 +directly in C++ and interpreting results via trace files.
5.9
5.10 But there are similarities as well (both, for example, are based on C++
5.11 objects, and some code from ns-2 has already been ported to @command{ns-3}).
5.12 @@ -256,8 +256,8 @@
5.13 software toolchain is the set of programming tools available in the given
5.14 environment. For a quick review of what is included in the GNU toolchain see,
5.15 @uref{http://en.wikipedia.org/wiki/GNU_toolchain}. @command{ns-3} uses gcc,
5.16 -GNU binutils, and gdb. However, we do not use the GNU build system,
5.17 -either make or autotools, using Waf instead.
5.18 +GNU binutils, and gdb. However, we do not use the GNU build system tools,
5.19 +neither make nor autotools. We use Waf for these functions.
5.20
5.21 @cindex Linux
5.22 Typically an @command{ns-3} author will work in Linux or a Linux-like
5.23 @@ -265,11 +265,11 @@
5.24 which simulate the Linux environment to various degrees. The @command{ns-3}
5.25 project supports development in the Cygwin environment for
5.26 these users. See @uref{http://www.cygwin.com/}
5.27 -for details on downloading (MinGW is presently not supported).
5.28 -Cygwin provides many of the popular Linux system commands.
5.29 -It can, however, sometimes be problematic due to the way it actually does its
5.30 -emulation, and sometimes interactions with other Windows software can cause
5.31 -problems.
5.32 +for details on downloading (MinGW is presently not officially supported,
5.33 +although some of the project maintainers to work with it). Cygwin provides
5.34 +many of the popular Linux system commands. It can, however, sometimes be
5.35 +problematic due to the way it actually does its emulation, and sometimes
5.36 +interactions with other Windows software can cause problems.
5.37
5.38 @cindex Cygwin
5.39 @cindex MinGW
6.1 --- a/doc/tutorial/tweaking.texi Thu Jul 02 15:33:27 2009 +0200
6.2 +++ b/doc/tutorial/tweaking.texi Thu Jul 02 15:35:52 2009 +0200
6.3 @@ -89,7 +89,8 @@
6.4 @subsection Enabling Logging
6.5 @cindex NS_LOG
6.6 Let's use the NS_LOG environment variable to turn on some more logging, but
6.7 -to get our bearings, go ahead and run the script just as you did previously,
6.8 +first, just to get our bearings, go ahead and run the last script just as you
6.9 +did previously,
6.10
6.11 @verbatim
6.12 ./waf --run scratch/myfirst
6.13 @@ -99,8 +100,9 @@
6.14 program
6.15
6.16 @verbatim
6.17 - Entering directory `repos/ns-3-dev/build'
6.18 - Compilation finished successfully
6.19 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.20 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.21 + 'build' finished successfully (0.413s)
6.22 Sent 1024 bytes to 10.1.1.2
6.23 Received 1024 bytes from 10.1.1.1
6.24 Received 1024 bytes from 10.1.1.2
6.25 @@ -148,15 +150,17 @@
6.26 system will pick up the change and you should see the following output:
6.27
6.28 @verbatim
6.29 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.30 - Build finished successfully (00:00:00)
6.31 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build
6.32 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.33 + 'build' finished successfully (0.404s)
6.34 UdpEchoClientApplication:UdpEchoClient()
6.35 + UdpEchoClientApplication:SetDataSize(1024)
6.36 UdpEchoClientApplication:StartApplication()
6.37 UdpEchoClientApplication:ScheduleTransmit()
6.38 UdpEchoClientApplication:Send()
6.39 Sent 1024 bytes to 10.1.1.2
6.40 Received 1024 bytes from 10.1.1.1
6.41 - UdpEchoClientApplication:HandleRead(0x638180, 0x6389b0)
6.42 + UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
6.43 Received 1024 bytes from 10.1.1.2
6.44 UdpEchoClientApplication:StopApplication()
6.45 UdpEchoClientApplication:DoDispose()
6.46 @@ -186,7 +190,7 @@
6.47 It turns out that in some cases, it can be hard to determine which method
6.48 actually generates a log message. If you look in the text above, you may
6.49 wonder where the string ``@code{Received 1024 bytes from 10.1.1.2}'' comes
6.50 -from. You can resolve this by ORing the @code{prefix_func} level into the
6.51 +from. You can resolve this by OR'ing the @code{prefix_func} level into the
6.52 @code{NS_LOG} environment variable. Try doing the following,
6.53
6.54 @verbatim
6.55 @@ -201,15 +205,17 @@
6.56 name.
6.57
6.58 @verbatim
6.59 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.60 - Build finished successfully (00:00:00)
6.61 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.62 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.63 + 'build' finished successfully (0.417s)
6.64 UdpEchoClientApplication:UdpEchoClient()
6.65 + UdpEchoClientApplication:SetDataSize(1024)
6.66 UdpEchoClientApplication:StartApplication()
6.67 UdpEchoClientApplication:ScheduleTransmit()
6.68 UdpEchoClientApplication:Send()
6.69 UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
6.70 Received 1024 bytes from 10.1.1.1
6.71 - UdpEchoClientApplication:HandleRead(0x638180, 0x6389b0)
6.72 + UdpEchoClientApplication:HandleRead(0x6241e0, 0x624a20)
6.73 UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
6.74 UdpEchoClientApplication:StopApplication()
6.75 UdpEchoClientApplication:DoDispose()
6.76 @@ -236,10 +242,12 @@
6.77 in debugging problems.
6.78
6.79 @verbatim
6.80 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.81 - Build finished successfully (00:00:00)
6.82 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.83 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.84 + 'build' finished successfully (0.406s)
6.85 UdpEchoServerApplication:UdpEchoServer()
6.86 UdpEchoClientApplication:UdpEchoClient()
6.87 + UdpEchoClientApplication:SetDataSize(1024)
6.88 UdpEchoServerApplication:StartApplication()
6.89 UdpEchoClientApplication:StartApplication()
6.90 UdpEchoClientApplication:ScheduleTransmit()
6.91 @@ -247,7 +255,7 @@
6.92 UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
6.93 UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
6.94 UdpEchoServerApplication:HandleRead(): Echoing packet
6.95 - UdpEchoClientApplication:HandleRead(0x638320, 0x638b50)
6.96 + UdpEchoClientApplication:HandleRead(0x624920, 0x625160)
6.97 UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
6.98 UdpEchoServerApplication:StopApplication()
6.99 UdpEchoClientApplication:StopApplication()
6.100 @@ -269,10 +277,12 @@
6.101 you should see the following output:
6.102
6.103 @verbatim
6.104 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.105 - Build finished successfully (00:00:00)
6.106 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.107 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.108 + 'build' finished successfully (0.418s)
6.109 0s UdpEchoServerApplication:UdpEchoServer()
6.110 0s UdpEchoClientApplication:UdpEchoClient()
6.111 + 0s UdpEchoClientApplication:SetDataSize(1024)
6.112 1s UdpEchoServerApplication:StartApplication()
6.113 2s UdpEchoClientApplication:StartApplication()
6.114 2s UdpEchoClientApplication:ScheduleTransmit()
6.115 @@ -280,7 +290,7 @@
6.116 2s UdpEchoClientApplication:Send(): Sent 1024 bytes to 10.1.1.2
6.117 2.00369s UdpEchoServerApplication:HandleRead(): Received 1024 bytes from 10.1.1.1
6.118 2.00369s UdpEchoServerApplication:HandleRead(): Echoing packet
6.119 - 2.00737s UdpEchoClientApplication:HandleRead(0x638490, 0x638cc0)
6.120 + 2.00737s UdpEchoClientApplication:HandleRead(0x624290, 0x624ad0)
6.121 2.00737s UdpEchoClientApplication:HandleRead(): Received 1024 bytes from 10.1.1.2
6.122 10s UdpEchoServerApplication:StopApplication()
6.123 10s UdpEchoClientApplication:StopApplication()
6.124 @@ -292,22 +302,22 @@
6.125
6.126 You can see that the constructor for the UdpEchoServer was called at a
6.127 simulation time of 0 seconds. This is actually happening before the
6.128 -simulation starts. The same for the UdpEchoClient constructor.
6.129 +simulation starts, but the time is displayed as zero seconds. The same is true
6.130 +for the UdpEchoClient constructor message.
6.131
6.132 Recall that the @code{scratch/first.cc} script started the echo server
6.133 application at one second into the simulation. You can now see that the
6.134 -@code{StartApplication} method of the server is, in fact, called at one second
6.135 -(or one billion nanoseconds). You can also see that the echo client
6.136 -application is started at a simulation time of two seconds as we requested in
6.137 -the script.
6.138 +@code{StartApplication} method of the server is, in fact, called at one second.
6.139 +You can also see that the echo client application is started at a simulation
6.140 +time of two seconds as we requested in the script.
6.141
6.142 You can now follow the progress of the simulation from the
6.143 @code{ScheduleTransmit} call in the client that calls @code{Send} to the
6.144 @code{HandleRead} callback in the echo server application. Note that the
6.145 -elapsed time as the packet is sent across the point-to-point link is 3.6864
6.146 +elapsed time for the packet to be sent across the point-to-point link is 3.69
6.147 milliseconds. You see the echo server logging a message telling you that it
6.148 -has echoed the packet and then, after a delay, you see the echo client receive
6.149 -the echoed packet in its @code{HandleRead} method.
6.150 +has echoed the packet and then, after another channel delay, you see the echo
6.151 +client receive the echoed packet in its @code{HandleRead} method.
6.152
6.153 There is a lot that is happening under the covers in this simulation that you
6.154 are not seeing as well. You can very easily follow the entire process by
6.155 @@ -320,7 +330,7 @@
6.156
6.157 The asterisk above is the logging component wildcard. This will turn on all
6.158 of the logging in all of the components used in the simulation. I won't
6.159 -reproduce the output here (as of this writing it produces 974 lines of output
6.160 +reproduce the output here (as of this writing it produces 1265 lines of output
6.161 for the single packet echo) but you can redirect this information into a file
6.162 and look through it with your favorite editor if you like,
6.163
6.164 @@ -328,15 +338,16 @@
6.165 ./waf --run scratch/myfirst > log.out 2>&1
6.166 @end verbatim
6.167
6.168 -I personally use this volume of logging quite a bit when I am presented with
6.169 -a problem and I have no idea where things are going wrong. I can follow the
6.170 +I personally use this extremely verbose version of logging when I am presented
6.171 +with a problem and I have no idea where things are going wrong. I can follow the
6.172 progress of the code quite easily without having to set breakpoints and step
6.173 -through code in a debugger. When I have a general idea about what is going
6.174 -wrong, I transition into a debugger for fine-grained examination of the
6.175 -problem. This kind of output can be especially useful when your script does
6.176 -something completely unexpected. If you are stepping using a debugger you
6.177 -may miss an unexpected excursion completely. Logging the excursion makes it
6.178 -quickly visible.
6.179 +through code in a debugger. I can just edit up the output in my favorite editor
6.180 +and search around for things I expect, and see things happening that I don't
6.181 +expect. When I have a general idea about what is going wrong, I transition into
6.182 +a debugger for a fine-grained examination of the problem. This kind of output
6.183 +can be especially useful when your script does something completely unexpected.
6.184 +If you are stepping using a debugger you may miss an unexpected excursion
6.185 +completely. Logging the excursion makes it quickly visible.
6.186
6.187 @node Adding Logging to your Code
6.188 @subsection Adding Logging to your Code
6.189 @@ -399,8 +410,9 @@
6.190 message,
6.191
6.192 @verbatim
6.193 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.194 - Build finished successfully (00:00:00)
6.195 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.196 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.197 + 'build' finished successfully (0.404s)
6.198 Creating Topology
6.199 Sent 1024 bytes to 10.1.1.2
6.200 Received 1024 bytes from 10.1.1.1
6.201 @@ -453,8 +465,11 @@
6.202 now see the @code{--PrintHelp} argument and respond with,
6.203
6.204 @verbatim
6.205 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.206 - Build finished successfully (00:00:00)
6.207 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.208 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.209 + 'build' finished successfully (0.413s)
6.210 + TcpL4Protocol:TcpStateMachine()
6.211 + CommandLine:HandleArgument(): Handle arg name=PrintHelp value=
6.212 --PrintHelp: Print this help message.
6.213 --PrintGroups: Print the list of groups.
6.214 --PrintTypeIds: Print all TypeIds.
6.215 @@ -527,7 +542,9 @@
6.216 If you run the script, you should now see the following output,
6.217
6.218 @verbatim
6.219 - Build finished successfully (00:00:00)
6.220 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.221 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.222 + 'build' finished successfully (0.405s)
6.223 0s UdpEchoServerApplication:UdpEchoServer()
6.224 1s UdpEchoServerApplication:StartApplication()
6.225 Sent 1024 bytes to 10.1.1.2
6.226 @@ -589,8 +606,9 @@
6.227 @code{DataRate} and @code{Delay} in the script:
6.228
6.229 @verbatim
6.230 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.231 - Build finished successfully (00:00:00)
6.232 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/bu
6.233 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/bui
6.234 + 'build' finished successfully (0.417s)
6.235 0s UdpEchoServerApplication:UdpEchoServer()
6.236 1s UdpEchoServerApplication:StartApplication()
6.237 Sent 1024 bytes to 10.1.1.2
6.238 @@ -608,13 +626,13 @@
6.239 to some other value than one.
6.240
6.241 How would you go about that? Give it a try. Remember you have to comment
6.242 -out the place we override the default @code{Attribute} in the script. Then you
6.243 -have to rebuild the script using the default. You will also have to find the
6.244 -syntax for actually setting the new default atribute value using the command
6.245 -line help facility. Once you have this figured out you should be able to
6.246 -control the number of packets echoed from the command line. Since we're nice
6.247 -folks, we'll tell you that your command line should end up looking something
6.248 -like,
6.249 +out the place we override the default @code{Attribute} and explicitly set
6.250 +@code{MaxPackets} in the script. Then you have to rebuild the script. You
6.251 +will also have to find the syntax for actually setting the new default atribute
6.252 +value using the command line help facility. Once you have this figured out
6.253 +you should be able to control the number of packets echoed from the command
6.254 +line. Since we're nice folks, we'll tell you that your command line should
6.255 +end up looking something like,
6.256
6.257 @verbatim
6.258 ./waf --run "scratch/myfirst
6.259 @@ -666,8 +684,9 @@
6.260 @end verbatim
6.261
6.262 @verbatim
6.263 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.264 - Build finished successfully (00:00:00)
6.265 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.266 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.267 + 'build' finished successfully (0.403s)
6.268 --PrintHelp: Print this help message.
6.269 --PrintGroups: Print the list of groups.
6.270 --PrintTypeIds: Print all TypeIds.
6.271 @@ -688,8 +707,9 @@
6.272 You should now see
6.273
6.274 @verbatim
6.275 - Entering directory `repos/ns-3-allinone/ns-3-dev/build'
6.276 - Build finished successfully (00:00:00)
6.277 + Waf: Entering directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.278 + Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone-3.5-tutorial/ns-3-dev/build'
6.279 + 'build' finished successfully (0.404s)
6.280 0s UdpEchoServerApplication:UdpEchoServer()
6.281 1s UdpEchoServerApplication:StartApplication()
6.282 Sent 1024 bytes to 10.1.1.2
6.283 @@ -705,7 +725,7 @@
6.284 UdpEchoServerApplication:~UdpEchoServer()
6.285 @end verbatim
6.286
6.287 -You have now echoed two packets.
6.288 +You have now echoed two packets. Pretty easy, isn't it?
6.289
6.290 You can see that if you are an @command{ns-3} user, you can use the command
6.291 line argument system to control global values and @code{Attributes}. If you are
6.292 @@ -827,7 +847,7 @@
6.293
6.294 @cindex myfirst.tr
6.295 Just as you have seen many times before, you will see some messages from Waf and then
6.296 -the ``Build finished successfully'' with some number of messages from
6.297 +``'build' finished successfully'' with some number of messages from
6.298 the running program.
6.299
6.300 When it ran, the program will have created a file named @code{myfirst.tr}.