Added support for ns-3 Wimax module. wimax_ns3.py example not working: SS never regis...
[nepi.git] / src / nepi / testbeds / ns3 / metadata_v3_9_RC3.py
index 0b280dd..1058aae 100644 (file)
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from constants import TESTBED_ID
 from nepi.core import metadata
-from nepi.core.attributes import Attribute
-from nepi.util import validation
-import os.path
-import functools
-
-from nepi.util.tunchannel_impl import \
-    crossconnect_tunchannel_peer_init, \
-    crossconnect_tunchannel_peer_compl
-
-
-### Connection functions ####
-
-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_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_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_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(device_guid, "node", "devs")
-    if len(node_guid) == 0:
-        raise RuntimeError("Can't instantiate interface %d outside netns \
-                node" % device_guid)
-    node = testbed_instance.elements[node_guid[0]]
-    phy.SetMobility(node)
-
-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_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_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_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_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_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_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_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_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(testbed_instance, node_guid, other_guid):
-    node = testbed_instance._elements[node_guid]
-    other = testbed_instance._elements[other_guid]
-    node.AggregateObject(other)
-
-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)
-    
-    # If it's a non-abstract socket, add the path
-    if not address.startswith('\x00'):
-        address = os.path.join( testbed_instance.root_directory, address )
-    
-    # Set tun standard contract attributes
-    testbed_instance.set(fdnd_guid, "tun_addr", address )
-    testbed_instance.set(fdnd_guid, "tun_proto", "fd")
-    testbed_instance.set(fdnd_guid, "tun_port", 0)
-    testbed_instance.set(fdnd_guid, "tun_key", "\xfa"*32) # unimportant, fds aren't encrypted
-
-def connect_tunchannel_fd(testbed_instance, tun_guid, fdnd_guid):
-    fdnd = testbed_instance._elements[fdnd_guid]
-    tun = testbed_instance._elements[tun_guid]
-
-    # XXX: check the method StringToBuffer of ns3::FileDescriptorNetDevice
-    # to see how the address should be decoded
-    endpoint = fdnd.GetEndpoint()
-    address = endpoint.replace(":", "").decode('hex')[2:]
-    testbed_instance.set(fdnd_guid, "LinuxSocketAddress", address)
-    
-    # Create socket pair to connect the FDND and the TunChannel with it
-    import socket
-    sock1, sock2 = socket.socketpair(
-        socket.AF_UNIX, socket.SOCK_SEQPACKET)
-
-    # Send one endpoint to the FDND
-    import passfd
-    import socket
-    sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
-    sock.connect(address)
-    passfd.sendfd(sock, sock1.fileno(), '0')
-    
-    # Store a reference to the endpoint to keep the socket alive
-    fdnd._endpoint_socket = sock1
-    
-    # Send the other endpoint to the TUN channel
-    tun.tun_socket = sock2
-    
-    # With this kind of tun_socket, NS3 will expect a PI header
-    # (sockets don't support the TUNGETIFF ioctl, so it will assume
-    # the default presence of PI headers)
-    tun.with_pi = True
-
-
-### Connector information ###
-
-connector_types = dict({
-    "node": dict({
-                "help": "Connector to a ns3::Node object (mandatory)",
-                "name": "node",
-                "max": 1,
-                "min": 1
-            }),
-    "devs": dict({
-                "help": "Connector to network interfaces",
-                "name": "devs",
-                "max": -1,
-                "min": 0
-            }),
-    "dev2": dict({
-                "help": "Connector to exactly two network interfaces (mandatory)",
-                "name": "dev2",
-                "max": 2,
-                "min": 2
-            }),
-    "dev": dict({
-                "help": "Connector to exactly one network interface (mandatory)",
-                "name": "dev",
-                "max": 1,
-                "min": 1
-            }),
-    "apps": dict({
-                "help": "Connector to applications", 
-                "name": "apps",
-                "max": -1,
-                "min": 0
-            }),
-    "protos": dict({
-                "help": "Connector to network stacks and protocols", 
-                "name": "protos",
-                "max": -1,
-                "min": 0
-            }),
-    "chan": dict({
-                "help": "Connector to a channel for the device (mandatory)", 
-                "name": "chan",
-                "max": 1,
-                "min": 1
-            }),
-    "queue": dict({
-                "help": "Connector to a queueing discipline (mandatory)", 
-                "name": "queue",
-                "max": 1,
-                "min": 1
-            }),
-    "err": dict({
-                "help": "Connector to an error model for the device", 
-                "name": "err",
-                "max": 1,
-                "min": 0
-            }),
-    "->fd": dict({
-                "help": "File descriptor receptor for devices with file descriptors",
-                "name": "->fd",
-                "max": 1,
-                "min": 0
-            }),
-    "fd->": dict({
-                "help": "File descriptor provider for devices with file descriptors",
-                "name": "fd->",
-                "max": 1,
-                "min": 0
-            }),
-    "phy": dict({
-                "help": "Connector to interconnect elements with a PHY wifi model", 
-                "name": "phy",
-                "max": 1,
-                "min": 0
-            }),
-    "phys": dict({
-                "help": "Connector to interconnect a wifi channel with PHY wifi models", 
-                "name": "phys",
-                "max": -1,
-                "min": 0
-            }),
-    "mac": dict({
-                "help": "Connector to interconnect a device with a MAC wifi model", 
-                "name": "mac",
-                "max": 1,
-                "min": 0
-            }),
-    "manager": dict({
-                "help": "Connector to interconnect a wifi device with a wifi manager", 
-                "name": "manager",
-                "max": 1,
-                "min": 0
-            }),
-    "delay": dict({
-                "help": "Connector to a delay model", 
-                "name": "delay",
-                "max": 1,
-                "min": 0
-            }),
-    "loss": dict({
-                "help": "Connector to a loss model", 
-                "name": "loss",
-                "max": 1,
-                "min": 0
-            }),
-    "prev": dict({
-                "help": "Connector to the previous loss model", 
-                "name": "prev",
-                "max": 1,
-                "min": 0
-            }),
-    "next": dict({
-                "help": "Connector to the next loss model", 
-                "name": "next",
-                "max": 1,
-                "min": 0
-            }),
-    "mobility": dict({
-                "help": "Connector to a mobility model for the node", 
-                "name": "mobility",
-                "max": 1,
-                "min": 0
-            }),
-    "tcp": dict({
-                "help": "ip-ip tunneling over TCP link", 
-                "name": "tcp",
-                "max": 1, 
-                "min": 0
-            }),
-    "udp": dict({
-                "help": "ip-ip tunneling over UDP datagrams", 
-                "name": "udp",
-                "max": 1, 
-                "min": 0
-            }),
-    })
-
-connections = [
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::BridgeNetDevice", "node" ),
-            "init_code": connect_node_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::CsmaNetDevice", "node" ),
-            "init_code": connect_node_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::EmuNetDevice", "node" ),
-            "init_code": connect_node_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::PointToPointNetDevice", "node" ),
-            "init_code": connect_node_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::SimpleNetDevice", "node" ),
-            "init_code": connect_node_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::FileDescriptorNetDevice", "node" ),
-            "init_code": connect_node_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::Node", "devs" ),
-            "to":   ( "ns3", "ns3::WifiNetDevice", "node" ),
-            "init_code": connect_node_device,   
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
-            "to":   ( "ns3", "ns3::CsmaNetDevice", "queue" ),
-            "init_code": connect_queue_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
-            "to":   ( "ns3", "ns3::EmuNetDevice", "queue" ),
-            "init_code": connect_queue_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
-            "to":   ( "ns3", "ns3::PointToPointNetDevice", "queue" ),
-            "init_code": connect_queue_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::ArfWifiManager", "dev" ),
-            "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
-            "init_code": connect_manager_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::ConstantRateWifiManager", "dev" ),
-            "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
-            "init_code": connect_manager_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::YansWifiPhy", "dev" ),
-            "to":   ( "ns3", "ns3::WifiNetDevice", "phy" ),  
-            "init_code": connect_phy_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::QapWifiMac", "dev" ),
-            "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
-            "init_code": connect_mac_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::QstaWifiMac", "dev" ),
-            "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
-            "init_code": connect_mac_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
-            "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
-            "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
-            "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
-            "can_cross": False
-    }),
-    dict({
-            "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
-            "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
-            "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::NistErrorRateModel", "phy" ),        
-        "to":   ( "ns3", "ns3::YansWifiPhy", "err" ),
-        "init_code": connect_errormodel_phy,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::CsmaChannel", "devs" ),
-        "to":   ( "ns3", "ns3::CsmaNetDevice", "chan" ),
-        "init_code": connect_channel_device,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::PointToPointChannel", "dev2" ),
-        "to":   ( "ns3", "ns3::PointToPointNetDevice", "chan" ),
-        "init_code": connect_channel_device,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::SimpleChannel", "devs" ),
-        "to":   ( "ns3", "ns3::SimpleNetDevice", "chan" ),
-        "init_code": connect_simple_channel_device,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::YansWifiChannel", "phys" ),
-        "to":   ( "ns3", "ns3::YansWifiPhy", "chan" ),  
-        "init_code": connect_simple_channel_device,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
-        "to":   ( "ns3", "ns3::YansWifiChannel", "loss" ),  
-        "init_code": connect_loss_channel,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
-        "to":   ( "ns3", "ns3::LogDistancePropagationLossModel", "next" ),  
-        "init_code": connect_next_loss,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::ConstantSpeedPropagationDelayModel", "chan" ),
-        "to":   ( "ns3", "ns3::YansWifiChannel", "delay" ),  
-        "init_code": connect_delay_channel,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "apps" ),
-        "to":   ( "ns3", "ns3::OnOffApplication", "node" ),
-        "init_code": connect_node_application,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "apps" ),
-        "to":   ( "ns3", "ns3::PacketSink", "node" ),
-        "init_code": connect_node_application,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "apps" ),
-        "to":   ( "ns3", "ns3::UdpEchoClient", "node" ),
-        "init_code": connect_node_application,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "apps" ),
-        "to":   ( "ns3", "ns3::UdpEchoServer", "node" ),
-        "init_code": connect_node_application,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "apps" ),
-        "to":   ( "ns3", "ns3::V4Ping", "node" ),
-        "init_code": connect_node_application,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::ArpL3Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::Icmpv4L4Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::Icmpv6L4Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::Ipv4L3Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::Ipv6L3Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::UdpL4Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "protos" ),
-        "to":   ( "ns3", "ns3::TcpL4Protocol", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::ConstantPositionMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::ConstantVelocityMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::HierarchicalMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::RandomDirection2dMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::RandomWalk2dMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Node", "mobility" ),
-        "to":   ( "ns3", "ns3::RandomWaypointMobilityModel", "node" ),
-        "init_code": connect_node_other,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::FileDescriptorNetDevice", "->fd" ),
-        "to":   ( None, None, "fd->" ),
-        "init_code": connect_fd,
-        "can_cross": True
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Nepi::TunChannel", "fd->" ),
-        "to":   ( "ns3", "ns3::FileDescriptorNetDevice", "->fd" ),
-        "init_code": connect_tunchannel_fd,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Nepi::TunChannel", "tcp"),
-        "to":   (None, None, "tcp"),
-        "init_code": functools.partial(crossconnect_tunchannel_peer_init,"tcp"),
-        "compl_code": functools.partial(crossconnect_tunchannel_peer_compl,"tcp"),
-        "can_cross": True
-    }),
-    dict({
-        "from": ( "ns3", "ns3::Nepi::TunChannel", "udp"),
-        "to":   (None, None, "udp"),
-        "init_code": functools.partial(crossconnect_tunchannel_peer_init,"udp"),
-        "compl_code": functools.partial(crossconnect_tunchannel_peer_compl,"udp"),
-        "can_cross": True
-    }),
-]
-
-traces = dict({
-    "p2ppcap": 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"
-              }),
-    "csmapcap": dict({
-                "name": "CsmaPcapTrace",
-                "help": "Trace to sniff packets from a Csma network device"
-              }),
-    "fdpcap": dict({
-                "name": "FileDescriptorPcapTrace",
-                "help": "Trace to sniff packets from a FileDescriptor network device"
-              }),
-    "yanswifipcap": dict({
-                "name": "YansWifiPhyPcapTrace",
-                "help": "Trace to sniff packets from a Wifi network device"
-              }),
-})
-
-factories_order = ["ns3::BasicEnergySource",
-    "ns3::WifiRadioEnergyModel",
-    "ns3::BSSchedulerRtps",
-    "ns3::BSSchedulerSimple",
-    "ns3::SubscriberStationNetDevice",
-    "ns3::BaseStationNetDevice",
-    "ns3::UdpTraceClient",
-    "ns3::UdpServer",
-    "ns3::UdpClient",
-    "ns3::FlowMonitor",
-    "ns3::Radvd",
-    "ns3::Ping6",
-    "ns3::flame::FlameProtocol",
-    "ns3::flame::FlameRtable",
-    "ns3::dot11s::AirtimeLinkMetricCalculator",
-    "ns3::dot11s::HwmpProtocol",
-    "ns3::dot11s::HwmpRtable",
-    "ns3::dot11s::PeerManagementProtocol",
-    "ns3::dot11s::PeerLink",
-    "ns3::MeshWifiInterfaceMac",
-    "ns3::MeshPointDevice",
-    "ns3::UanMacRcGw",
-    "ns3::UanMacRc",
-    "ns3::UanPhyCalcSinrDual",
-    "ns3::UanPhyPerGenDefault",
-    "ns3::UanPhyDual",
-    "ns3::UanPropModelThorp",
-    "ns3::UanMacCw",
-    "ns3::UanNoiseModelDefault",
-    "ns3::UanMacAloha",
-    "ns3::UanPropModelIdeal",
-    "ns3::UanTransducerHd",
-    "ns3::UanPhyCalcSinrDefault",
-    "ns3::UanPhyGen",
-    "ns3::UanPhyCalcSinrFhFsk",
-    "ns3::UanPhyPerUmodem",
-    "ns3::UanChannel",
-    "ns3::V4Ping",
-    "ns3::AthstatsWifiTraceSink",
-    "ns3::FlameStack",
-    "ns3::Dot11sStack",
-    "ns3::NonCommunicatingNetDevice",
-    "ns3::HalfDuplexIdealPhy",
-    "ns3::AlohaNoackNetDevice",
-    "ns3::SpectrumAnalyzer",
-    "ns3::WaveformGenerator",
-    "ns3::MultiModelSpectrumChannel",
-    "ns3::SingleModelSpectrumChannel",
-    "ns3::MsduStandardAggregator",
-    "ns3::EdcaTxopN",
-    "ns3::QstaWifiMac",
-    "ns3::QapWifiMac",
-    "ns3::QadhocWifiMac",
-    "ns3::MinstrelWifiManager",
-    "ns3::CaraWifiManager",
-    "ns3::AarfcdWifiManager",
-    "ns3::OnoeWifiManager",
-    "ns3::AmrrWifiManager",
-    "ns3::ConstantRateWifiManager",
-    "ns3::IdealWifiManager",
-    "ns3::AarfWifiManager",
-    "ns3::ArfWifiManager",
-    "ns3::WifiNetDevice",
-    "ns3::NqstaWifiMac",
-    "ns3::NqapWifiMac",
-    "ns3::AdhocWifiMac",
-    "ns3::DcaTxop",
-    "ns3::WifiMacQueue",
-    "ns3::YansWifiChannel",
-    "ns3::YansWifiPhy",
-    "ns3::NistErrorRateModel",
-    "ns3::YansErrorRateModel",
-    "ns3::WaypointMobilityModel",
-    "ns3::ConstantAccelerationMobilityModel",
-    "ns3::RandomDirection2dMobilityModel",
-    "ns3::RandomWalk2dMobilityModel",
-    "ns3::SteadyStateRandomWaypointMobilityModel",
-    "ns3::RandomWaypointMobilityModel",
-    "ns3::GaussMarkovMobilityModel",
-    "ns3::ConstantVelocityMobilityModel",
-    "ns3::ConstantPositionMobilityModel",
-    "ns3::ListPositionAllocator",
-    "ns3::GridPositionAllocator",
-    "ns3::RandomRectanglePositionAllocator",
-    "ns3::RandomBoxPositionAllocator",
-    "ns3::RandomDiscPositionAllocator",
-    "ns3::UniformDiscPositionAllocator",
-    "ns3::HierarchicalMobilityModel",
-    "ns3::aodv::RoutingProtocol",
-    "ns3::UdpEchoServer",
-    "ns3::UdpEchoClient",
-    "ns3::PacketSink",
-    "ns3::OnOffApplication",
-    "ns3::VirtualNetDevice",
-    "ns3::FileDescriptorNetDevice",
-    "ns3::Nepi::TunChannel",
-    "ns3::TapBridge",
-    "ns3::BridgeChannel",
-    "ns3::BridgeNetDevice",
-    "ns3::EmuNetDevice",
-    "ns3::CsmaChannel",
-    "ns3::CsmaNetDevice",
-    "ns3::PointToPointRemoteChannel",
-    "ns3::PointToPointChannel",
-    "ns3::PointToPointNetDevice",
-    "ns3::NscTcpL4Protocol",
-    "ns3::Icmpv6L4Protocol",
-    "ns3::Ipv6OptionPad1",
-    "ns3::Ipv6OptionPadn",
-    "ns3::Ipv6OptionJumbogram",
-    "ns3::Ipv6OptionRouterAlert",
-    "ns3::Ipv6ExtensionHopByHop",
-    "ns3::Ipv6ExtensionDestination",
-    "ns3::Ipv6ExtensionFragment",
-    "ns3::Ipv6ExtensionRouting",
-    "ns3::Ipv6ExtensionLooseRouting",
-    "ns3::Ipv6ExtensionESP",
-    "ns3::Ipv6ExtensionAH",
-    "ns3::Ipv6L3Protocol",
-    "ns3::LoopbackNetDevice",
-    "ns3::Icmpv4L4Protocol",
-    "ns3::RttMeanDeviation",
-    "ns3::ArpL3Protocol",
-    "ns3::TcpL4Protocol",
-    "ns3::UdpL4Protocol",
-    "ns3::Ipv4L3Protocol",
-    "ns3::SimpleNetDevice",
-    "ns3::SimpleChannel",
-    "ns3::PacketSocket",
-    "ns3::DropTailQueue",
-    "ns3::Node",
-    "ns3::FriisSpectrumPropagationLossModel",
-    "ns3::Cost231PropagationLossModel",
-    "ns3::JakesPropagationLossModel",
-    "ns3::RandomPropagationLossModel",
-    "ns3::FriisPropagationLossModel",
-    "ns3::TwoRayGroundPropagationLossModel",
-    "ns3::LogDistancePropagationLossModel",
-    "ns3::ThreeLogDistancePropagationLossModel",
-    "ns3::NakagamiPropagationLossModel",
-    "ns3::FixedRssLossModel",
-    "ns3::MatrixPropagationLossModel",
-    "ns3::RangePropagationLossModel",
-    "ns3::RandomPropagationDelayModel",
-    "ns3::ConstantSpeedPropagationDelayModel",
-    "ns3::RateErrorModel",
-    "ns3::ListErrorModel",
-    "ns3::ReceiveListErrorModel",
-    "ns3::PacketBurst",
-    "ns3::EnergySourceContainer"
- ]
-
-testbed_attributes = dict({
-     "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
     def connector_types(self):
+        from connection_metadata_v3_9_RC3 import connector_types
         return connector_types
 
     @property
     def connections(self):
+        from connection_metadata_v3_9_RC3 import connections
         return connections
 
     @property
@@ -803,14 +21,17 @@ class VersionedMetadataInfo(metadata.VersionedMetadataInfo):
 
     @property
     def traces(self):
+        from traces_metadata_v3_9_RC3 import traces
         return traces
 
     @property
     def create_order(self):
+        from factories_metadata_v3_9_RC3 import factories_order
         return factories_order
 
     @property
     def configure_order(self):
+        from factories_metadata_v3_9_RC3 import factories_order
         return factories_order
 
     @property
@@ -820,5 +41,6 @@ class VersionedMetadataInfo(metadata.VersionedMetadataInfo):
 
     @property
     def testbed_attributes(self):
+        from attributes_metadata_v3_9_RC3 import testbed_attributes
         return testbed_attributes