helper = testbed_instance.ns3.FdNetDeviceHelper()
helper.EnablePcap(filepath, element, explicitFilename = True)
+def fdascii_trace(testbed_instance, guid, trace_id):
+ node_guid = _get_node_guid(testbed_instance, guid)
+ interface_number = _get_dev_number(testbed_instance, guid)
+ element = testbed_instance._elements[guid]
+ filename = "trace-fd-node-%d-dev-%d.tr" % (node_guid, interface_number)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
+ helper = testbed_instance.ns3.FdNetDeviceHelper()
+ asciiHelper = testbed_instance.ns3.AsciiTraceHelper()
+ stream = asciiHelper.CreateFileStream(filepath)
+ helper.EnableAscii(stream, element)
+
def yanswifipcap_trace(testbed_instance, guid, trace_id):
dev_guid = testbed_instance.get_connected(guid, "dev", "phy")[0]
node_guid = _get_node_guid(testbed_instance, dev_guid)
"CsmaPcapTrace": csmapcap_trace,
"CsmaPcapPromiscTrace": csmapcap_promisc_trace,
"FdPcapTrace": fdpcap_trace,
+ "FdAsciiTrace": fdascii_trace,
"YansWifiPhyPcapTrace": yanswifipcap_trace,
"WimaxPcapTrace": wimaxpcap_trace,
"WimaxAsciiTrace": wimaxascii_trace,
"connector_types": ["node", "->fd"],
"box_attributes": ["Address",
"tun_proto", "tun_addr", "tun_port", "tun_key"],
- "traces": ["fdpcap"],
+ "traces": ["fdpcap", "fdascii"],
"tags": [tags.INTERFACE, tags.ALLOW_ADDRESSES],
}),
"ns3::Nepi::TunChannel": dict({
from nepi.util import proxy
from nepi.util.constants import DeploymentConfiguration as DC
import os
+import re
import shutil
import tempfile
import test_util
def setUp(self):
self.root_dir = tempfile.mkdtemp()
+ def _test_fd_net_device(self, daemonize_testbed,
+ controller_access_configuration):
+ exp_desc = ExperimentDescription()
+ testbed_id = "ns3"
+ ns3_provider = FactoriesProvider(testbed_id)
+ ns3_desc1 = exp_desc.add_testbed_description(ns3_provider)
+ root_dir1 = os.path.join(self.root_dir, "1")
+ ns3_desc1.set_attribute_value("homeDirectory", root_dir1)
+ ns3_desc1.set_attribute_value("SimulatorImplementationType",
+ "ns3::RealtimeSimulatorImpl")
+ ns3_desc1.set_attribute_value("ChecksumEnabled", True)
+ ns3_desc2 = exp_desc.add_testbed_description(ns3_provider)
+ root_dir2 = os.path.join(self.root_dir, "2")
+ ns3_desc2.set_attribute_value("homeDirectory", root_dir2)
+ ns3_desc2.set_attribute_value("SimulatorImplementationType",
+ "ns3::RealtimeSimulatorImpl")
+ ns3_desc2.set_attribute_value("ChecksumEnabled", True)
+
+ node1 = ns3_desc1.create("ns3::Node")
+ ipv41 = ns3_desc1.create("ns3::Ipv4L3Protocol")
+ arp1 = ns3_desc1.create("ns3::ArpL3Protocol")
+ icmp1 = ns3_desc1.create("ns3::Icmpv4L4Protocol")
+ node1.connector("protos").connect(ipv41.connector("node"))
+ node1.connector("protos").connect(arp1.connector("node"))
+ node1.connector("protos").connect(icmp1.connector("node"))
+ iface1 = ns3_desc1.create("ns3::FdNetDevice")
+ node1.connector("devs").connect(iface1.connector("node"))
+ ip1 = iface1.add_address()
+ ip1.set_attribute_value("Address", "10.0.0.1")
+ tc1 = ns3_desc1.create("ns3::Nepi::TunChannel")
+ tc1.connector("fd->").connect(iface1.connector("->fd"))
+
+ node2 = ns3_desc2.create("ns3::Node")
+ ipv42 = ns3_desc2.create("ns3::Ipv4L3Protocol")
+ arp2 = ns3_desc2.create("ns3::ArpL3Protocol")
+ icmp2 = ns3_desc2.create("ns3::Icmpv4L4Protocol")
+ node2.connector("protos").connect(ipv42.connector("node"))
+ node2.connector("protos").connect(arp2.connector("node"))
+ node2.connector("protos").connect(icmp2.connector("node"))
+ iface2 = ns3_desc2.create("ns3::FdNetDevice")
+ iface2.enable_trace("FdAsciiTrace")
+ node2.connector("devs").connect(iface2.connector("node"))
+ ip2 = iface2.add_address()
+ ip2.set_attribute_value("Address", "10.0.0.2")
+ tc2 = ns3_desc2.create("ns3::Nepi::TunChannel")
+ tc2.connector("fd->").connect(iface2.connector("->fd"))
+
+ tc2.connector("udp").connect(tc1.connector("udp"))
+
+ app = ns3_desc1.create("ns3::V4Ping")
+ app.set_attribute_value("Remote", "10.0.0.2")
+ app.set_attribute_value("StartTime", "0s")
+ app.set_attribute_value("StopTime", "2s")
+ app.connector("node").connect(node1.connector("apps"))
+
+ if daemonize_testbed:
+ ns3_desc1.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
+ inst_root_dir = os.path.join(root_dir1, "instance")
+ os.makedirs(inst_root_dir)
+ ns3_desc1.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
+ ns3_desc1.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
+
+ ns3_desc2.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
+ inst_root_dir = os.path.join(root_dir2, "instance")
+ os.makedirs(inst_root_dir)
+ ns3_desc2.set_attribute_value(DC.ROOT_DIRECTORY, inst_root_dir)
+ ns3_desc2.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
+
+ xml = exp_desc.to_xml()
+
+ if controller_access_configuration:
+ controller = ExperimentController(xml, self.root_dir)
+ else:
+ controller = proxy.create_experiment_controller(xml,
+ controller_access_configuration)
+
+ try:
+ controller.start()
+ while not controller.is_finished(app.guid):
+ time.sleep(0.5)
+ ping_result = controller.trace(iface2.guid, "FdAsciiTrace")
+ ping_exp_result = r"""r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=42\)
+r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=98\)
+r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=42\)
+r \d+\.\d+ /NodeList/0/DeviceList/0/\$ns3::FdNetDevice/Rx Payload \(size=98\)
+"""
+ if not re.match(ping_exp_result, ping_result):
+ self.fail("Unexpected trace: %s" % (ping_result,))
+
+ finally:
+ controller.stop()
+ controller.shutdown()
+
def _test_if(self, daemonize_testbed, controller_access_configuration):
exp_desc = ExperimentDescription()
testbed_id = "ns3"
controller.stop()
controller.shutdown()
+ @test_util.skipUnless(test_util.ns3_usable(),
+ "Test requires working ns-3 bindings")
+ def test_all_daemonized_fd_net_device(self):
+ access_config = proxy.AccessConfiguration()
+ access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
+ access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
+ access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
+
+ self._test_fd_net_device(
+ daemonize_testbed = True,
+ controller_access_configuration = access_config)
+
+ @test_util.skipUnless(test_util.ns3_usable(),
+ "Test requires working ns-3 bindings")
+ def test_all_ssh_daemonized_fd_net_device(self):
+ env = test_util.test_environment()
+
+ access_config = proxy.AccessConfiguration()
+ access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
+ access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
+ access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
+ access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
+ access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
+ access_config.set_attribute_value(DC.USE_AGENT, True)
+
+ self._test_fd_net_device(
+ daemonize_testbed = True,
+ controller_access_configuration = access_config)
+
@test_util.skipUnless(test_util.ns3_usable(),
"Test requires working ns-3 bindings")
def test_local_if(self):