vlc wireless hybrid experiment example added
[nepi.git] / src / nepi / testbeds / ns3 / metadata_v3_9_RC3.py
index 2ad786d..9ce7f03 100644 (file)
@@ -5,234 +5,99 @@ from constants import TESTBED_ID
 from nepi.core import metadata
 from nepi.core.attributes import Attribute
 from nepi.util import validation
-from nepi.util.constants import AF_INET, STATUS_NOT_STARTED, STATUS_RUNNING, \
-        STATUS_FINISHED
-
-wifi_standards = dict({
-    "WIFI_PHY_STANDARD_holland": 5,
-    "WIFI_PHY_STANDARD_80211p_SCH": 7,
-    "WIFI_PHY_STANDARD_80211_5Mhz": 4,
-    "WIFI_PHY_UNKNOWN": 8,
-    "WIFI_PHY_STANDARD_80211_10Mhz": 3,
-    "WIFI_PHY_STANDARD_80211g": 2,
-    "WIFI_PHY_STANDARD_80211p_CCH": 6,
-    "WIFI_PHY_STANDARD_80211a": 0,
-    "WIFI_PHY_STANDARD_80211b": 1
-})
 
 ### Connection functions ####
 
-def connect_node_device(testbed_instance, node, device):
+def connect_node_device(testbed_instance, node_guid, device_guid):
+    node = testbed_instance._elements[node_guid]
+    device = testbed_instance._elements[device_guid]
     node.AddDevice(device)
 
-def connect_queue_device(testbed_instance, queue, device):
+def connect_queue_device(testbed_instance, queue_guid, device_guid):
+    queue = testbed_instance._elements[queue_guid]
+    device = testbed_instance._elements[device_guid]
     device.SetQueue(queue)
 
-def connect_manager_device(testbed_instance, manager, device):
+def connect_manager_device(testbed_instance, manager_guid, device_guid):
+    manager = testbed_instance._elements[manager_guid]
+    device = testbed_instance._elements[device_guid]
     device.SetRemoteStationManager(manager)
 
-def connect_phy_device(testbed_instance, phy, device):
+def connect_phy_device(testbed_instance, phy_guid, device_guid):
+    phy = testbed_instance._elements[phy_guid]
+    device = testbed_instance._elements[device_guid]
     device.SetPhy(phy)
     phy.SetDevice(device)
     # search for the node asociated with the device
-    node_guid = testbed_instance.get_connected(guid, "node", "devs")
+    node_guid = testbed_instance.get_connected(device_guid, "node", "devs")
     if len(node_guid) == 0:
         raise RuntimeError("Can't instantiate interface %d outside netns \
-                node" % guid)
+                node" % device_guid)
     node = testbed_instance.elements[node_guid[0]]
     phy.SetMobility(node)
 
-def connect_mac_device(testbed_instance, mac, device):
+def connect_mac_device(testbed_instance, mac_guid, device_guid):
+    mac = testbed_instance._elements[mac_guid]
+    device = testbed_instance._elements[device_guid]
     device.SetMac(mac)
 
-def connect_errormodel_device(testbed_instance, model, device):
+def connect_errormodel_device(testbed_instance, model_guid, device_guid):
+    model = testbed_instance._elements[model_guid]
+    device = testbed_instance._elements[device_guid]
     device.SetReceiveErrorModel(model)
 
-def connect_errormodel_phy(testbed_instance, err, phy):
+def connect_errormodel_phy(testbed_instance, err_guid, phy_guid):
+    err = testbed_instance._elements[err_guid]
+    phy = testbed_instance._elements[phy_guid]
     phy.SetErrorRateModel(err)
 
-def connect_channel_device(testbed_instance, channel, device):
+def connect_channel_device(testbed_instance, channel_guid, device_guid):
+    channel = testbed_instance._elements[channel_guid]
+    device = testbed_instance._elements[device_guid]
     device.Attach(channel)
 
-def connect_simple_channel_device(testbed_instance, channel, device):
+def connect_simple_channel_device(testbed_instance, channel_guid, device_guid):
+    channel = testbed_instance._elements[channel_guid]
+    device = testbed_instance._elements[device_guid]
     device.SetChannel(channel)
 
-def connect_loss_channel(testbed_instance, loss, channel):
+def connect_loss_channel(testbed_instance, loss_guid, channel_guid):
+    loss = testbed_instance._elements[loss_guid]
+    channel = testbed_instance._elements[channel_guid]
     channel.SetPropagationLossModel(loss)
 
-def connect_next_loss(testbed_instance, prev, next):
+def connect_next_loss(testbed_instance, prev_guid, next_guid):
+    prev = testbed_instance._elements[prev_guid]
+    next = testbed_instance._elements[next_guid]
     prev.SetNext(next)
 
-def connect_delay_channel(testbed_instance, delay, channel):
+def connect_delay_channel(testbed_instance, delay_guid, channel_guid):
+    delay = testbed_instance._elements[delay_guid]
+    channel = testbed_instance._elements[channel_guid]
     channel.SetPropagationDelayModel(delay)
 
-def connect_node_application(testbed_instance, node, application):
+def connect_node_application(testbed_instance, node_guid, application_guid):
+    node = testbed_instance._elements[node_guid]
+    application = testbed_instance._elements[application_guid]
     node.AddApplication(application)
 # works for ArpL3Protocol, Ipv4L3Protocol, UdpL4Protocol, TcpL4Protocol,
 # NscTcpL4Protocol, MobilityModel (every subclass), 
 # RoutingProtocol (every subclass)
 
-def connect_node_other(tesbed_instance, node, other):
+def connect_node_other(testbed_instance, node_guid, other_guid):
+    node = testbed_instance._elements[node_guid]
+    other = testbed_instance._elements[other_guid]
     node.AggregateObject(other)
 
-def connect_fd_tap(tesbed_instance, fd, tap):
-    # TODO!
-    pass
-
- ### create traces functions ###
-
-def get_node_guid(testbed_instance, guid):
-    node_guid = testbed_instance.get_connected(guid, "node", "devs")[0]
-    return node_guid
-
-def get_dev_number(testbed_instance, guid):
-    dev_guids = testbed_instance.get_connected(node_guid, "devs", "node")
-    interface_number = 0
-    for guid_ in dev_guids:
-        if guid_ == guid:
-            break
-        inteface_number += 1
-    return interface_number
-
-def p2ppcap_trace(testbed_instance, guid):
-    trace_id = "p2ppcap"
-    node_guid = get_node_guid(testbed_instance, guid)
-    interface_number = get_dev_number(testbed_instance, guid)
-    element = testbed_instance._elements[guid]
-    filename = "trace-p2p-node-%d-dev-%d.pcap" % (node_name, interface_number)
-    testbed_instance.follow_trace(guid, trace_id, filename)
-    filepath = testbed_instance.trace_filename(self, guid, trace_id)
-    helper = testbed_instance.ns3.PointToPointHelper()
-    helper.EnablePcap(filepath, element, explicitFilename = True)
-
-def _csmapcap_trace(testbed_instance, guid, trace_id, promisc):
-    node_guid = get_node_guid(testbed_instance, guid)
-    interface_number = get_dev_number(testbed_instance, guid)
-    element = testbed_instance._elements[guid]
-    filename = "trace-csma-node-%d-dev-%d.pcap" % (node_name, interface_number)
-    testbed_instance.follow_trace(guid, trace_id, filename)
-    filepath = testbed_instance.trace_filename(self, guid, trace_id)
-    helper = testbed_instance.ns3.CsmaHelper()
-    helper.EnablePcap(filepath, element, promiscuous = promisc, 
-            explicitFilename = True)
-
-def csmapcap_trace(testbed_instance, guid):
-    trace_id = "csmapcap"
-    promisc = False
-    _csmapcap_trace(testbed_instance, guid, trace_id, promisc)
-
-def csmapcap_promisc_trace(testbed_instance, guid):
-    trace_id = "csmapcap_promisc"
-    promisc = True
-    _csmapcap_trace(testbed_instance, guid, trace_id, promisc)
-
-def fdpcap_trace(testbed_instance, guid):
-    trace_id = "fdpcap"
-    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.pcap" % (node_name, interface_number)
-    testbed_instance.follow_trace(guid, trace_id, filename)
-    filepath = testbed_instance.trace_filename(self, guid, trace_id)
-    helper = testbed_instance.ns3.FileDescriptorHelper()
-    helper.EnablePcap(filepath, element, explicitFilename = True)
-
-def yanswifipcap_trace(testbed_instance, guid):
-    trace_id = "yanswifipcap"
-    dev_guid = testbed_instance.get_connected(guid, "dev", "phy")[0]
-    node_guid = get_node_guid(testbed_instance, dev_guid)
-    interface_number = get_dev_number(testbed_instance, dev_guid)
-    element = testbed_instance._elements[dev_guid]
-    filename = "trace-yanswifi-node-%d-dev-%d.pcap" % (node_name, interface_number)
-    testbed_instance.follow_trace(guid, trace_id, filename)
-    filepath = testbed_instance.trace_filename(self, guid, trace_id)
-    helper = testbed_instance.ns3.YansWifiPhyHelper()
-    helper.EnablePcap(filepath, element, explicitFilename = True)
-
-trace_functions = dict({
-    "p2ppcap": p2ppcap_trace,
-    "csmapcap": csmapcap_trace,
-    "csmapcap_promisc": csmapcap_promisc_trace,
-    "fdpcap": fdpcap_trace,
-    "yanswifipcap": yanswifipcap_trace
-    })
+def connect_fd(testbed_instance, fdnd_guid, cross_data):
+    fdnd = testbed_instance._elements[fdnd_guid]
+    endpoint = fdnd.GetEndpoint()
+    # XXX: check the method StringToBuffer of ns3::FileDescriptorNetDevice
+    # to see how the address should be decoded
+    address = endpoint.replace(":", "").decode('hex')[2:]
+    testbed_instance.set(fdnd_guid, "LinuxSocketAddress", address)
 
-### Creation functions ###
-
-def create_element(testbed_instance, guid):
-    element_factory = testbed_instance.ns3.ObjectFactory()
-    factory_id = testbed_instance._create[guid]
-    element_factory.SetTypeId(factory_id) 
-    construct_parameters = testbed_instance._get_construct_parameters(guid)
-    for name, value in construct_parameters.iteritems():
-        ns3_value = testbed_instance._to_ns3_value(factory_id, name, value)
-        element_factory.Set(name, ns3_value)
-    element = element_factory.Create()
-    testbed_instance._elements[guid] = element
-    traces = testbed_instance._get_traces(guid)
-    for trace_id in traces:
-        trace_func = trace_functions[trace_id]
-        trace_func(testbed_instance, guid)
-
-def create_node(testbed_instance, guid):
-    create_element(testbed_instance, guid)
-    element = testbed_instance._elements[guid]
-    element.AggregateObject(testbed_instance.PacketSocketFactory())
-
-def create_device(testbed_instance, guid):
-    create_element(testbed_instance, guid)
-    element = testbed_instance._elements[guid]
-    parameters = testbed_instance._get_parameters(guid)
-    if "macAddress" in parameters:
-        address = parameters["macAddress"]
-        macaddr = testbed_instance.ns3.Mac48Address(address)
-    else:
-        macaddr = testbed_instance.ns3.Mac48Address.Allocate()
-    element.SetAddress(macaddr)
-
-def create_wifi_standard_model(testbed_instance, guid):
-    create_element(testbed_instance, guid)
-    element = testbed_instance._elements[guid]
-    parameters = testbed_instance._get_parameters(guid)
-    if "standard" in parameters:
-        standard = parameters["standard"]
-        if standard:
-            elements.ConfigureStandard(wifi_standards[standard])
-
-def create_ipv4protocol(testbed_instance, guid):
-    create_element(testbed_instance, guid)
-    element = testbed_instance._elements[guid]
-    list_routing = testbed_instance.ns3.Ipv4ListRouting()
-    element.SetRoutingProtocol(list_routing)
-    static_routing = testbed_instance.ns3.Ipv4StaticRouting()
-    list_routing.AddRoutingProtocol(static_routing, 1)
-
-### Start/Stop functions ###
-
-def start_application(testbed_instance, guid):
-    element = testbed_instance.elements[guid]
-    element.Start()
-
-def stop_application(testbed_instance, guid):
-    element = testbed_instance.elements[guid]
-    element.Stop()
-
-### Status functions ###
-
-def status_application(testbed_instance, guid):
-    if guid not in testbed_instance.elements.keys():
-        return STATUS_NOT_STARTED
-    app = testbed_instance.elements[guid]
-    parameters = testbed_instance._get_parameters(guid)
-    if "stopTime" in parameters:
-        stop = parameters["stopTime"]
-        if stop:
-            simTime = testbed_instance.ns3.Simulator.Now()
-            if simTime.Compare(stopTime) > 0:
-                return STATUS_RUNNING
-    return STATUS_FINISHED
-
-### Factory information ###
+### Connector information ###
 
 connector_types = dict({
     "node": dict({
@@ -355,272 +220,272 @@ connections = [
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::BridgeNetDevice", "node" ),
-            "code": connect_node_device,
+            "init_code": connect_node_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::CsmaNetDevice", "node" ),
-            "code": connect_node_device,
+            "init_code": connect_node_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::EmuNetDevice", "node" ),
-            "code": connect_node_device,
+            "init_code": connect_node_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::PointToPointNetDevice", "node" ),
-            "code": connect_node_device,
+            "init_code": connect_node_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::SimpleNetDevice", "node" ),
-            "code": connect_node_device,
+            "init_code": connect_node_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::FileDescriptorNetDevice", "node" ),
-            "code": connect_node_device,
+            "init_code": connect_node_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::WifiNetDevice", "node" ),
-            "code": connect_node_device,   
+            "init_code": connect_node_device,   
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
             "to":   ( "ns3", "ns3::CsmaNetDevice", "queue" ),
-            "code": connect_queue_device,
+            "init_code": connect_queue_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
             "to":   ( "ns3", "ns3::EmuNetDevice", "queue" ),
-            "code": connect_queue_device,
+            "init_code": connect_queue_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
             "to":   ( "ns3", "ns3::PointToPointNetDevice", "queue" ),
-            "code": connect_queue_device,
+            "init_code": connect_queue_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::ArfWifiManager", "dev" ),
             "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
-            "code": connect_manager_device,
+            "init_code": connect_manager_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::ConstantRateWifiManager", "dev" ),
             "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
-            "code": connect_manager_device,
+            "init_code": connect_manager_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::YansWifiPhy", "dev" ),
             "to":   ( "ns3", "ns3::WifiNetDevice", "phy" ),  
-            "code": connect_phy_device,
+            "init_code": connect_phy_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::QapWifiMac", "dev" ),
             "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
-            "code": connect_mac_device,
+            "init_code": connect_mac_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::QstaWifiMac", "dev" ),
             "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
-            "code": connect_mac_device,
+            "init_code": connect_mac_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
-            "code": connect_errormodel_device,
+            "init_code": connect_errormodel_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
-            "code": connect_errormodel_device,
+            "init_code": connect_errormodel_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
-            "code": connect_errormodel_device,
+            "init_code": connect_errormodel_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
-            "code": connect_errormodel_device,
+            "init_code": connect_errormodel_device,
             "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::NistErrorRateModel", "phy" ),        
         "to":   ( "ns3", "ns3::YansWifiPhy", "err" ),
-        "code": connect_errormodel_phy,
+        "init_code": connect_errormodel_phy,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::CsmaChannel", "devs" ),
         "to":   ( "ns3", "ns3::CsmaNetDevice", "chan" ),
-        "code": connect_channel_device,
+        "init_code": connect_channel_device,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::PointToPointChannel", "dev2" ),
         "to":   ( "ns3", "ns3::PointToPointNetDevice", "chan" ),
-        "code": connect_channel_device,
+        "init_code": connect_channel_device,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::SimpleChannel", "devs" ),
         "to":   ( "ns3", "ns3::SimpleNetDevice", "chan" ),
-        "code": connect_simple_channel_device,
+        "init_code": connect_simple_channel_device,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::YansWifiChannel", "phys" ),
         "to":   ( "ns3", "ns3::YansWifiPhy", "chan" ),  
-        "code": connect_simple_channel_device,
+        "init_code": connect_simple_channel_device,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
         "to":   ( "ns3", "ns3::YansWifiChannel", "loss" ),  
-        "code": connect_loss_channel,
+        "init_code": connect_loss_channel,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
         "to":   ( "ns3", "ns3::LogDistancePropagationLossModel", "next" ),  
-        "code": connect_next_loss,
+        "init_code": connect_next_loss,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::ConstantSpeedPropagationDelayModel", "chan" ),
         "to":   ( "ns3", "ns3::YansWifiChannel", "delay" ),  
-        "code": connect_delay_channel,
+        "init_code": connect_delay_channel,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "apps" ),
         "to":   ( "ns3", "ns3::OnOffApplication", "node" ),
-        "code": connect_node_application,
+        "init_code": connect_node_application,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "apps" ),
         "to":   ( "ns3", "ns3::PacketSink", "node" ),
-        "code": connect_node_application,
+        "init_code": connect_node_application,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "apps" ),
         "to":   ( "ns3", "ns3::UdpEchoClient", "node" ),
-        "code": connect_node_application,
+        "init_code": connect_node_application,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "apps" ),
         "to":   ( "ns3", "ns3::UdpEchoServer", "node" ),
-        "code": connect_node_application,
+        "init_code": connect_node_application,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "apps" ),
         "to":   ( "ns3", "ns3::V4Ping", "node" ),
-        "code": connect_node_application,
+        "init_code": connect_node_application,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "protos" ),
         "to":   ( "ns3", "ns3::ArpL3Protocol", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "protos" ),
         "to":   ( "ns3", "ns3::Icmpv4L4Protocol", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "protos" ),
         "to":   ( "ns3", "ns3::Ipv4L3Protocol", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "protos" ),
         "to":   ( "ns3", "ns3::UdpL4Protocol", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "protos" ),
         "to":   ( "ns3", "ns3::TcpL4Protocol", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::ConstantPositionMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::ConstantVelocityMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::HierarchicalMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::RandomDirection2dMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::RandomWalk2dMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::RandomWaypointMobilityModel", "node" ),
-        "code": connect_node_other,
+        "init_code": connect_node_other,
         "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::FileDescriptorNetDevice", "fd" ),
         "to":   ( "netns", "TapNodeInterface", "fd" ),
-        "code": connect_fd_tap,
-        "can_cross": False
+        "init_code": connect_fd,
+        "can_cross": True
     }),
 ]
 
@@ -629,6 +494,10 @@ traces = dict({
                 "name": "P2PPcapTrace",
                 "help": "Trace to sniff packets from a P2P network device"
               }),
+    "p2pascii": dict({
+                "name": "P2PAsciiTrace",
+                "help": "Ascii trace from a P2P network device"
+              }),
     "csmapcap_promisc": dict({
                 "name": "CsmaPromiscPcapTrace",
                 "help": "Trace to sniff packets from a Csma network device in promiscuous mode"
@@ -799,36 +668,22 @@ factories_order = ["ns3::BasicEnergySource",
  ]
 
 testbed_attributes = dict({
-        "ns3_bindings": dict({
-                "name": "ns3Bindings",
-                "help": "Location of the ns-3 python binding",
-                "type": Attribute.STRING,
-                "flags": Attribute.DesignOnly,
-                "validation_function": validation.is_string # TODO: validation.is_path
-            }),
-         "ns3_library": dict({
-                "name": "ns3Library",
-                "help": "Location of the ns-3 library .so file",
-                "type": Attribute.STRING,
-                "flags": Attribute.DesignOnly,
-                "validation_function": validation.is_string # TODO: validation.is_path
-            }),
-         "simu_impl_type": dict({
-                "name": "SimulatorImplementationType",
-                "help": "The object class to use as the simulator implementation",
-                "type": Attribute.STRING,
-                "flags": Attribute.DesignOnly,
-                "validation_function": validation.is_string
-            }),
-          "checksum": dict({
-                "name": "ChecksumEnabled",
-                "help": "A global switch to enable all checksums for all protocols",
-                "type": Attribute.BOOL,
-                "value": False,
-                "flags": Attribute.DesignOnly,
-                "validation_function": validation.is_bool
-            })
- })
+     "simu_impl_type": dict({
+            "name": "SimulatorImplementationType",
+            "help": "The object class to use as the simulator implementation",
+            "type": Attribute.STRING,
+            "flags": Attribute.DesignOnly,
+            "validation_function": validation.is_string
+        }),
+      "checksum": dict({
+            "name": "ChecksumEnabled",
+            "help": "A global switch to enable all checksums for all protocols",
+            "type": Attribute.BOOL,
+            "value": False,
+            "flags": Attribute.DesignOnly,
+            "validation_function": validation.is_bool
+        }),
+})
 
 class VersionedMetadataInfo(metadata.VersionedMetadataInfo):
     @property
@@ -849,7 +704,11 @@ class VersionedMetadataInfo(metadata.VersionedMetadataInfo):
         return traces
 
     @property
-    def factories_order(self):
+    def create_order(self):
+        return factories_order
+
+    @property
+    def configure_order(self):
         return factories_order
 
     @property