type = Types.Bool,
flags = Flags.Design)
+ build_mode = Attribute("buildMode",
+ "Mode used to build ns-3 with waf. One if: debug, release, oprimized ",
+ default = "release",
+ allowed = ["debug", "release", "optimized"],
+ type = Types.Enumerate,
+ flags = Flags.Design)
+
+ ns3_version = Attribute("ns3Version",
+ "Version of ns-3 to install from nsam repo",
+ default = "ns-3.19",
+ flags = Flags.Design)
+
+ pybindgen_version = Attribute("pybindgenVersion",
+ "Version of pybindgen to install from bazar repo",
+ default = "834",
+ flags = Flags.Design)
+
cls._register_attribute(impl_type)
cls._register_attribute(sched_type)
cls._register_attribute(check_sum)
cls._register_attribute(ns_log)
cls._register_attribute(verbose)
+ cls._register_attribute(build_mode)
+ cls._register_attribute(ns3_version)
+ cls._register_attribute(pybindgen_version)
def __init__(self, ec, guid):
LinuxApplication.__init__(self, ec, guid)
@property
def ns3_repo(self):
- return "http://code.nsnam.org"
-
- @property
- def ns3_version(self):
- return "ns-3.19"
-
- @property
- def pybindgen_version(self):
- return "834"
+ return "http://code.nsnam.org"
@property
def pygccxml_version(self):
- return "pygccxml-1.0.0"
+ return "pygccxml-1.0.0"
@property
def _build(self):
# Test if ns-3 is alredy installed
" ( "
" (( "
- " ( test -d ${SRC}/%(ns3_version)s ) || (test -d ${NS3BINDINGS:='None'} && test -d ${NS3LIBRARIES:='None'}) ) && "
- " echo 'binaries found, nothing to do' )"
+ " ( test -d ${SRC}/ns-3/%(ns3_version)s ) || "
+ " ( test -d ${NS3BINDINGS:='None'} && test -d ${NS3LIBRARIES:='None'}) "
+ " ) && echo 'binaries found, nothing to do' )"
" ) "
" || "
# If not, install ns-3 and its dependencies
" && "
" ( "
" ( "
- " test -d ${BIN}/pybindgen && "
+ " test -d ${BIN}/pybindgen/%(pybindgen_version)s && "
" echo 'binaries found, nothing to do' "
" ) "
" || "
# If not, clone and build
" ( cd ${SRC} && "
- " bzr checkout lp:pybindgen -r %(pybindgen_version)s && "
- " cd ${SRC}/pybindgen && "
+ " mkdir -p ${SRC}/pybindgen && "
+ " bzr checkout lp:pybindgen -r %(pybindgen_version)s ${SRC}/pybindgen/%(pybindgen_version)s && "
+ " cd ${SRC}/pybindgen/%(pybindgen_version)s && "
" ./waf configure && "
" ./waf "
" ) "
" && "
# Clone and build ns-3
" ( "
- " hg clone %(ns3_repo)s/%(ns3_version)s ${SRC}/%(ns3_version)s && "
- " cd ${SRC}/%(ns3_version)s && "
- " ./waf configure -d optimized && "
- " ./waf "
- " ) "
+ " hg clone %(ns3_repo)s/%(ns3_version)s ${SRC}/ns-3/%(ns3_version)s"
+ " ) "
" ) "
) % ({
'ns3_repo': self.ns3_repo,
- 'ns3_version': self.ns3_version,
- 'pybindgen_version': self.pybindgen_version,
- 'pygccxml_version': self.pygccxml_version
+ 'ns3_version': self.get("ns3Version"),
+ 'pybindgen_version': self.get("pybindgenVersion"),
+ 'pygccxml_version': self.pygccxml_version,
})
@property
return (
# Test if ns-3 is alredy cloned
" ( "
- " ( ( (test -d ${BIN}/%(ns3_version)s/build ) || "
+ " ( ( (test -d ${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build ) || "
" (test -d ${NS3BINDINGS:='None'} && test -d ${NS3LIBRARIES:='None'}) ) && "
" echo 'binaries found, nothing to do' )"
" ) "
" ||"
" ( "
# If not, copy ns-3 build to bin
- " mkdir -p ${BIN}/%(ns3_version)s && "
- " mv ${SRC}/%(ns3_version)s/build ${BIN}/%(ns3_version)s/build "
+ " cd ${SRC}/ns-3/%(ns3_version)s && "
+ " ./waf configure -d %(build_mode)s --with-pybindgen=${SRC}/pybindgen/%(pybindgen_version)s && "
+ " ./waf && "
+ " mkdir -p ${BIN}/ns-3/%(ns3_version)s/%(build_mode)s && "
+ " mv ${SRC}/ns-3/%(ns3_version)s/build ${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build "
" )"
) % ({
- 'ns3_version': self.ns3_version
+ 'ns3_version': self.get("ns3Version"),
+ 'pybindgen_version': self.get("pybindgenVersion"),
+ 'build_mode': self.get("buildMode"),
})
@property
def _environment(self):
env = []
- env.append("NS3BINDINGS=${NS3BINDINGS:=${BIN}/%(ns3_version)s/build/bindings/python/}" % ({
- 'ns3_version': self.ns3_version,
+ env.append("NS3BINDINGS=${NS3BINDINGS:=${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build/bindings/python/}" % ({
+ 'ns3_version': self.get("ns3Version"),
+ 'build_mode': self.get("buildMode")
}))
- env.append("NS3LIBRARIES=${NS3LIBRARIES:=${BIN}/%(ns3_version)s/build/}" % ({
- 'ns3_version': self.ns3_version,
+ env.append("NS3LIBRARIES=${NS3LIBRARIES:=${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build/}" % ({
+ 'ns3_version': self.get("ns3Version"),
+ 'build_mode': self.get("buildMode")
}))
return " ".join(env)
return dev
+def add_csma_device(ec, ns3_node, address, prefix):
+ dev = ec.register_resource("ns3::CsmaNetDevice")
+ ec.set(dev, "ip", address)
+ ec.set(dev, "prefix", prefix)
+ ec.register_connection(ns3_node, dev)
+
+ queue = ec.register_resource("ns3::DropTailQueue")
+ ec.register_connection(dev, queue)
+
+ return dev
+
class LinuxNS3ClientTest(unittest.TestCase):
def setUp(self):
self.fedora_host = "nepi2.pl.sophia.inria.fr"
+ #self.fedora_host = "peeramide.irisa.fr"
self.fedora_user = "inria_test"
+ #self.fedora_user = "inria_alina"
+ self.fedora_identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
- def test_simple_ping(self):
- ec = ExperimentController(exp_id = "test-ns3-ping")
+ def test_simple_p2p_ping(self):
+ ec = ExperimentController(exp_id = "test-ns3-p2p-ping")
node = ec.register_resource("LinuxNode")
ec.set(node, "hostname", self.fedora_host)
ec.set(node, "username", self.fedora_user)
+ ec.set(node, "identity", self.fedora_identity)
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.register_connection(simu, node)
nsnode1 = add_ns3_node(ec, simu)
- p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+ dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
nsnode2 = add_ns3_node(ec, simu)
- p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
+ dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
# Create channel
chan = ec.register_resource("ns3::PointToPointChannel")
ec.set(chan, "Delay", "0s")
- ec.register_connection(chan, p1)
- ec.register_connection(chan, p2)
+ ec.register_connection(chan, dev1)
+ ec.register_connection(chan, dev2)
+
+ ### create pinger
+ ping = ec.register_resource("ns3::V4Ping")
+ ec.set (ping, "Remote", "10.0.0.2")
+ ec.set (ping, "Interval", "1s")
+ ec.set (ping, "Verbose", True)
+ ec.set (ping, "StartTime", "0s")
+ ec.set (ping, "StopTime", "20s")
+ ec.register_connection(ping, nsnode1)
+
+ ec.deploy()
+
+ ec.wait_finished([ping])
+
+ stdout = ec.trace(simu, "stdout")
+
+ expected = "20 packets transmitted, 20 received, 0% packet loss"
+ self.assertTrue(stdout.find(expected) > -1)
+
+ ec.shutdown()
+
+ def test_simple_cmsa_ping(self):
+ ec = ExperimentController(exp_id = "test-ns3-csma-ping")
+
+ node = ec.register_resource("LinuxNode")
+ ec.set(node, "hostname", self.fedora_host)
+ ec.set(node, "username", self.fedora_user)
+ ec.set(node, "identity", self.fedora_identity)
+ ec.set(node, "cleanProcesses", True)
+ #ec.set(node, "cleanHome", True)
+
+ simu = ec.register_resource("LinuxNS3Simulation")
+ ec.set(simu, "verbose", True)
+ ec.set(simu, "nsLog", "V4Ping:Node")
+ ec.set(simu, "buildMode", "debug")
+ ec.register_connection(simu, node)
+
+ nsnode1 = add_ns3_node(ec, simu)
+ dev1 = add_csma_device(ec, nsnode1, "10.0.0.1", "30")
+
+ nsnode2 = add_ns3_node(ec, simu)
+ dev2 = add_csma_device(ec, nsnode2, "10.0.0.2", "30")
+
+ # Create channel
+ chan = ec.register_resource("ns3::CsmaChannel")
+ ec.set(chan, "Delay", "0s")
+ ec.register_connection(chan, dev1)
+ ec.register_connection(chan, dev2)
### create pinger
ping = ec.register_resource("ns3::V4Ping")
node = ec.register_resource("LinuxNode")
ec.set(node, "hostname", self.fedora_host)
ec.set(node, "username", self.fedora_user)
+ ec.set(node, "identity", self.fedora_identity)
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.register_connection(simu, node)
nsnode1 = add_ns3_node(ec, simu)
- p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+ dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
nsnode2 = add_ns3_node(ec, simu)
- p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
+ dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
# Create channel
chan = ec.register_resource("ns3::PointToPointChannel")
ec.set(chan, "Delay", "0s")
- ec.register_connection(chan, p1)
- ec.register_connection(chan, p2)
+ ec.register_connection(chan, dev1)
+ ec.register_connection(chan, dev2)
### create pinger
ping = ec.register_resource("ns3::V4Ping")
ec.shutdown()
- def test_p2p_traces(self):
- ec = ExperimentController(exp_id = "test-ns3-p2p-traces")
+ def test_dev2p_traces(self):
+ ec = ExperimentController(exp_id = "test-ns3-dev2p-traces")
node = ec.register_resource("LinuxNode")
ec.set(node, "hostname", self.fedora_host)
ec.set(node, "username", self.fedora_user)
+ ec.set(node, "identity", self.fedora_identity)
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.register_connection(simu, node)
nsnode1 = add_ns3_node(ec, simu)
- p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+ dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
nsnode2 = add_ns3_node(ec, simu)
- p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
+ dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
# Create channel
chan = ec.register_resource("ns3::PointToPointChannel")
ec.set(chan, "Delay", "0s")
- ec.register_connection(chan, p1)
- ec.register_connection(chan, p2)
+ ec.register_connection(chan, dev1)
+ ec.register_connection(chan, dev2)
### create pinger
ping = ec.register_resource("ns3::V4Ping")
ec.register_connection(ping, nsnode1)
# enable traces
- ec.enable_trace(p1, "pcap")
- ec.enable_trace(p1, "promiscPcap")
- ec.enable_trace(p1, "ascii")
+ ec.enable_trace(dev1, "pcap")
+ ec.enable_trace(dev1, "promiscPcap")
+ ec.enable_trace(dev1, "ascii")
- ec.enable_trace(p2, "pcap")
- ec.enable_trace(p2, "promiscPcap")
- ec.enable_trace(p2, "ascii")
+ ec.enable_trace(dev2, "pcap")
+ ec.enable_trace(dev2, "promiscPcap")
+ ec.enable_trace(dev2, "ascii")
ec.deploy()
#
#for trace in ["pcap", "promiscPcap", "ascii"]:
for trace in ["ascii"]:
- for guid in [p1, p2]:
+ for guid in [dev1, dev2]:
output = ec.trace(guid, trace)
size = ec.trace(guid, trace, attr = TraceAttr.SIZE)