1.1 --- a/doc/release_steps.txt Tue Apr 01 17:05:54 2008 -0700
1.2 +++ b/doc/release_steps.txt Wed Apr 02 21:33:31 2008 -0700
1.3 @@ -19,10 +19,25 @@
1.4 - cd /home/code/repos/ns-3.0.x/.hg and edit the hgrc appropriately:
1.5 "description = ns-3.0.x release
1.6 name = ns-3.0.x"
1.7 -6. upload "ns-3.0.x.tar.bz2" to the /var/www/html/releases/ directory on
1.8 +6. Run the regression tests on the new release and update the reference traces
1.9 + - cd regression
1.10 + - python regression.py
1.11 + - There should be no regressions at this time
1.12 + - tag ns-3-dev-ref-traces with "release ns-3.0.X"
1.13 + hg tag "release ns-3.0.x"
1.14 + hg push
1.15 + - clone the ns-3-dev-ref-traces and place it on the repository as in step
1.16 + 6 but use the name ns-3.0.x-ref-traces
1.17 +7. Create a reference traces tarball
1.18 + - cd regression
1.19 + - tar -cjf ns-3.0.x-ref-traces.tar.bz2 ns-3-dev-ref-traces/
1.20 +8. upload "ns-3.0.x.tar.bz2" to the /var/www/html/releases/ directory on
1.21 the www.nsnam.org server
1.22 - give it 644 file permissions, and user/group = apache
1.23 -7. update web pages on www.nsnam.org (source is in the www/ module)
1.24 +9. upload "ns-3.0.x-ref-traces.tar.bz2" to the /var/www/html/releases/
1.25 + directory on the www.nsnam.org server
1.26 + - give it 644 file permissions, and user/group = apache
1.27 +10. update web pages on www.nsnam.org (source is in the www/ module)
1.28 - add link to news.html
1.29 - update getting_started.html
1.30 - update documents.html
1.31 @@ -32,4 +47,4 @@
1.32 -- edit ~/bin/update-doxygen-release file and change RELEASE variable
1.33 to the right version number
1.34 -- run ~/bin/update-doxygen-release
1.35 -8. announce to ns-developers, with summary of release notes
1.36 +11. announce to ns-developers, with summary of release notes
2.1 --- a/examples/tcp-large-transfer.cc Tue Apr 01 17:05:54 2008 -0700
2.2 +++ b/examples/tcp-large-transfer.cc Wed Apr 02 21:33:31 2008 -0700
2.3 @@ -117,6 +117,11 @@
2.4 // LogComponentEnable("PacketSink", LOG_LEVEL_ALL);
2.5 // LogComponentEnable("TcpLargeTransfer", LOG_LEVEL_ALL);
2.6
2.7 + //
2.8 + // Make the random number generators generate reproducible results.
2.9 + //
2.10 + RandomVariable::UseGlobalSeed (1, 1, 2, 3, 5, 8);
2.11 +
2.12 // Allow the user to override any of the defaults and the above
2.13 // Bind()s at run-time, via command-line arguments
2.14 CommandLine cmd;
2.15 @@ -182,9 +187,9 @@
2.16
2.17 std::ofstream ascii;
2.18 ascii.open ("tcp-large-transfer.tr");
2.19 - PointToPointHelper::EnablePcap ("tcp-large-transfer");
2.20 PointToPointHelper::EnableAscii (ascii);
2.21
2.22 + InternetStackHelper::EnablePcap ("tcp-large-transfer");
2.23
2.24 Simulator::StopAt (Seconds(1000));
2.25 Simulator::Run ();
3.1 --- a/regression/regression.py Tue Apr 01 17:05:54 2008 -0700
3.2 +++ b/regression/regression.py Wed Apr 02 21:33:31 2008 -0700
3.3 @@ -36,20 +36,20 @@
3.4 # mercurial on the system. It is expected to be created using tar -cjf and
3.5 # will be extracted using tar -xjf
3.6 #
3.7 -refTarName = "ns-3-ref-traces.tar.bz2"
3.8 +refTarName = "ns-3.0.12-ref-traces.tar.bz2"
3.9
3.10 #
3.11 # The path to the Mercurial repository used to find the reference traces if
3.12 # we find "hg" on the system. We expect that the repository will be named
3.13 # identically to refDirName below
3.14 #
3.15 -refRepo = "http://code.nsnam.org/craigdo/"
3.16 +refRepo = "http://code.nsnam.org/"
3.17
3.18 #
3.19 # The local directory name into which the reference traces will go in either
3.20 # case (net or hg).
3.21 #
3.22 -refDirName = "ns-3-ref-traces"
3.23 +refDirName = "ns-3-dev-ref-traces"
3.24
3.25 def main(tests = None, testdir = None):
3.26 """Execute regression tests.
3.27 @@ -78,33 +78,6 @@
3.28 if o == '-v': verbose = 1
3.29 if o == '-g': generate = 1
3.30
3.31 - print "========== Running Unit Tests =========="
3.32 - os.system("./waf check")
3.33 -
3.34 - print "========== Running Regression Tests =========="
3.35 - if os.system("hg version > /dev/null 2>&1") == 0:
3.36 - print "Synchronizing reference traces using Mercurial."
3.37 - if not os.path.exists(refDirName):
3.38 - os.system("hg clone " + refRepo + refDirName +
3.39 - " > /dev/null 2>&1")
3.40 - else:
3.41 - os.chdir(refDirName)
3.42 - os.system("hg pull " + refRepo + refDirName +
3.43 - " > /dev/null 2>&1")
3.44 - os.chdir("..")
3.45 - else:
3.46 - print "Synchronizing reference traces from web."
3.47 - urllib.urlretrieve(refUrl + refTarName, refTarName)
3.48 - os.system("tar -xjf " + refTarName)
3.49 -
3.50 - print "Done."
3.51 -
3.52 - bad = []
3.53 -
3.54 - if not os.path.exists(refDirName):
3.55 - print "Reference traces directory does not exist"
3.56 - return 3
3.57 -
3.58 if not testdir:
3.59 testdir = os.path.join(os.curdir, "tests")
3.60
3.61 @@ -123,12 +96,39 @@
3.62
3.63 if not tests:
3.64 tests = findtests(testdir)
3.65 + if not generate:
3.66 + print "========== Running Unit Tests =========="
3.67 + os.system("./waf check")
3.68 +
3.69 + print "========== Running Regression Tests =========="
3.70 +
3.71 + if os.system("hg version > /dev/null 2>&1") == 0:
3.72 + print "Synchronizing reference traces using Mercurial."
3.73 + if not os.path.exists(refDirName):
3.74 + os.system("hg clone " + refRepo + refDirName + " > /dev/null 2>&1")
3.75 + else:
3.76 + os.chdir(refDirName)
3.77 + os.system("hg pull " + refRepo + refDirName + " > /dev/null 2>&1")
3.78 + os.chdir("..")
3.79 + else:
3.80 + print "Synchronizing reference traces from web."
3.81 + urllib.urlretrieve(refUrl + refTarName, refTarName)
3.82 + os.system("tar -xjf " + refTarName)
3.83 +
3.84 + print "Done."
3.85 +
3.86 + if not os.path.exists(refDirName):
3.87 + print "Reference traces directory does not exist"
3.88 + return 3
3.89 +
3.90 + bad = []
3.91 +
3.92
3.93 for test in tests:
3.94 result = run_test(test)
3.95 if result == 0:
3.96 if generate:
3.97 - print "GENERATE" + test
3.98 + print "GENERATE " + test
3.99 else:
3.100 print "PASS " + test
3.101 else:
4.1 --- a/regression/tracediff.py Tue Apr 01 17:05:54 2008 -0700
4.2 +++ b/regression/tracediff.py Wed Apr 02 21:33:31 2008 -0700
4.3 @@ -9,28 +9,24 @@
4.4 def run_test(verbose, generate, refDirName, testName):
4.5 """Execute a test."""
4.6
4.7 - repoName = "ns-3-ref-traces/"
4.8 - refDirName = testName + ".ref"
4.9 + refTestDirName = refDirName + "/" + testName + ".ref"
4.10
4.11 - if not os.path.exists(repoName):
4.12 + if not os.path.exists(refDirName):
4.13 print"No reference trace repository"
4.14 return 1
4.15
4.16 if generate:
4.17 - if not os.path.exists(repoName + refDirName):
4.18 - print "creating new " + repoName + refDirName
4.19 - os.mkdir(repoName + refDirName)
4.20 + if not os.path.exists(refTestDirName):
4.21 + print "creating new " + refTestDirName
4.22 + os.mkdir(refTestDirName)
4.23
4.24 - try:
4.25 - os.system("./waf --cwd regression/" + repoName + refDirName +
4.26 - " --run " + testName + " > /dev/null 2>&1")
4.27 - except:
4.28 - sys.exit(1)
4.29 + os.system("./waf --cwd regression/" + refTestDirName +
4.30 + " --run " + testName + " > /dev/null 2>&1")
4.31
4.32 - print "Remember to commit " + repoName + refDirName
4.33 + print "Remember to commit " + refTestDirName
4.34 return 0
4.35 else:
4.36 - if not os.path.exists(repoName + refDirName):
4.37 + if not os.path.exists(refTestDirName):
4.38 print "Cannot locate reference traces"
4.39 return 1
4.40
4.41 @@ -41,21 +37,20 @@
4.42 testName + " > /dev/null 2>&1")
4.43
4.44 if verbose:
4.45 - diffCmd = "diff traces " + repoName + refDirName + " | head"
4.46 + diffCmd = "diff traces " + refTestDirName + " | head"
4.47 else:
4.48 - diffCmd = "diff traces " + repoName + refDirName + \
4.49 + diffCmd = "diff traces " + refTestDirName + \
4.50 " > /dev/null 2>&1"
4.51
4.52 rc = os.system(diffCmd)
4.53 if rc:
4.54 print "----------"
4.55 print "Traces differ in test: test-" + testName
4.56 - print "Reference traces in directory: " + repoName + \
4.57 - refDirName
4.58 + print "Reference traces in directory: " + refTestDirName
4.59 print "Traces in directory: traces"
4.60 print "Rerun regression test as: " + \
4.61 "\"python regression.py test-" + testName + "\""
4.62 - print "Then do \"diff -u traces " + repoName + refDirName + \
4.63 + print "Then do \"diff -u traces " + refTestDirName + \
4.64 "\" for details"
4.65 print "----------"
4.66 return rc
5.1 --- a/src/helper/internet-stack-helper.cc Tue Apr 01 17:05:54 2008 -0700
5.2 +++ b/src/helper/internet-stack-helper.cc Wed Apr 02 21:33:31 2008 -0700
5.3 @@ -20,9 +20,13 @@
5.4 #include "internet-stack-helper.h"
5.5 #include "ns3/internet-stack.h"
5.6 #include "ns3/packet-socket-factory.h"
5.7 +#include "ns3/config.h"
5.8
5.9 namespace ns3 {
5.10
5.11 +std::vector<InternetStackHelper::Trace> InternetStackHelper::m_traces;
5.12 +std::string InternetStackHelper::m_pcapBaseFilename;
5.13 +
5.14 void
5.15 InternetStackHelper::Build (NodeContainer c)
5.16 {
5.17 @@ -35,5 +39,68 @@
5.18 }
5.19 }
5.20
5.21 +void
5.22 +InternetStackHelper::EnablePcap (std::string filename)
5.23 +{
5.24 + InternetStackHelper::m_pcapBaseFilename = filename;
5.25 + Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Tx",
5.26 + MakeCallback (&InternetStackHelper::LogTxIp));
5.27 + Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Rx",
5.28 + MakeCallback (&InternetStackHelper::LogRxIp));
5.29 +}
5.30 +
5.31 +uint32_t
5.32 +InternetStackHelper::GetNodeIndex (std::string context)
5.33 +{
5.34 + std::string::size_type pos;
5.35 + pos = context.find ("/NodeList/");
5.36 + NS_ASSERT (pos == 0);
5.37 + std::string::size_type afterNodeIndex = context.find ("/", 11);
5.38 + NS_ASSERT (afterNodeIndex != std::string::npos);
5.39 + std::string index = context.substr (10, afterNodeIndex - 10);
5.40 + std::istringstream iss;
5.41 + iss.str (index);
5.42 + uint32_t nodeIndex;
5.43 + iss >> nodeIndex;
5.44 + return nodeIndex;
5.45 +}
5.46 +
5.47 +void
5.48 +InternetStackHelper::LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex)
5.49 +{
5.50 + Ptr<PcapWriter> writer = InternetStackHelper::GetStream (GetNodeIndex (context), interfaceIndex);
5.51 + writer->WritePacket (packet);
5.52 +}
5.53 +
5.54 +void
5.55 +InternetStackHelper::LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex)
5.56 +{
5.57 + Ptr<PcapWriter> writer = InternetStackHelper::GetStream (GetNodeIndex (context), interfaceIndex);
5.58 + writer->WritePacket (packet);
5.59 +}
5.60 +
5.61 +Ptr<PcapWriter>
5.62 +InternetStackHelper::GetStream (uint32_t nodeId, uint32_t interfaceId)
5.63 +{
5.64 + for (std::vector<Trace>::iterator i = m_traces.begin ();
5.65 + i != m_traces.end (); i++)
5.66 + {
5.67 + if (i->nodeId == nodeId &&
5.68 + i->interfaceId == interfaceId)
5.69 + {
5.70 + return i->writer;
5.71 + }
5.72 + }
5.73 + InternetStackHelper::Trace trace;
5.74 + trace.nodeId = nodeId;
5.75 + trace.interfaceId = interfaceId;
5.76 + trace.writer = Create<PcapWriter> ();
5.77 + std::ostringstream oss;
5.78 + oss << m_pcapBaseFilename << "-" << nodeId << "-" << interfaceId << ".pcap";
5.79 + trace.writer->Open (oss.str ());
5.80 + trace.writer->WriteIpHeader ();
5.81 + m_traces.push_back (trace);
5.82 + return trace.writer;
5.83 +}
5.84
5.85 } // namespace ns3
6.1 --- a/src/helper/internet-stack-helper.h Tue Apr 01 17:05:54 2008 -0700
6.2 +++ b/src/helper/internet-stack-helper.h Wed Apr 02 21:33:31 2008 -0700
6.3 @@ -21,6 +21,9 @@
6.4 #define INTERNET_STACK_HELPER_H
6.5
6.6 #include "node-container.h"
6.7 +#include "net-device-container.h"
6.8 +#include "ns3/pcap-writer.h"
6.9 +#include "ns3/packet.h"
6.10
6.11 namespace ns3 {
6.12
6.13 @@ -37,6 +40,27 @@
6.14 * of the ns3::Ipv4, ns3::Udp, and, ns3::Tcp classes.
6.15 */
6.16 void Build (NodeContainer c);
6.17 +
6.18 + /**
6.19 + * \param filename filename prefix to use for pcap files.
6.20 + *
6.21 + * Enable pcap output on each protocol instance which is of the
6.22 + * ns3::Ipv4L3Protocol type. Both Tx and Rx events will be logged.
6.23 + */
6.24 + static void EnablePcap (std::string filename);
6.25 +
6.26 +private:
6.27 + static void LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t deviceId);
6.28 + static void LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t deviceId);
6.29 + static Ptr<PcapWriter> GetStream (uint32_t nodeId, uint32_t interfaceId);
6.30 + struct Trace {
6.31 + uint32_t nodeId;
6.32 + uint32_t interfaceId;
6.33 + Ptr<PcapWriter> writer;
6.34 + };
6.35 + static std::string m_pcapBaseFilename;
6.36 + static uint32_t GetNodeIndex (std::string context);
6.37 + static std::vector<Trace> m_traces;
6.38 };
6.39
6.40 } // namespace ns3