new tag: nepi_v2
[nepi.git] / src / nepi / testbeds / ns3 / factories_metadata_v3_9_RC3.py
index 9021e54..990b6ca 100644 (file)
@@ -1,8 +1,45 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+from nepi.util import tags
 from nepi.util.constants import AF_INET, STATUS_NOT_STARTED, STATUS_RUNNING, \
         STATUS_FINISHED, STATUS_UNDETERMINED
+from nepi.util.tunchannel_impl import \
+    preconfigure_tunchannel, postconfigure_tunchannel, \
+    wait_tunchannel, create_tunchannel
+
+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
+})
+
+l4_protocols = dict({
+    "Icmpv4L4Protocol": 1,
+    "UdpL4Protocol": 17,
+    "TcpL4Protocol": 6,
+})
+
+service_flow_direction = dict({
+    "SF_DIRECTION_UP": 1,
+    "SF_DIRECTION_DOWN": 0,
+})
+
+service_flow_scheduling_type = dict ({
+    "SF_TYPE_NONE": 0,
+    "SF_TYPE_UNDEF": 1, 
+    "SF_TYPE_BE": 2,
+    "SF_TYPE_NRTPS": 3,
+    "SF_TYPE_RTPS": 4,
+    "SF_TYPE_UGS": 6, 
+    "SF_TYPE_ALL": 255
+})
 
 def _get_ipv4_protocol_guid(testbed_instance, node_guid):
     # search for the Ipv4L3Protocol asociated with the device
@@ -30,16 +67,29 @@ def _get_node_guid(testbed_instance, guid):
     return node_guid
 
 def _get_dev_number(testbed_instance, guid):
-    dev_guids = testbed_instance.get_connected(guid, "devs", "node")
+    node_guid = _get_node_guid(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
+        interface_number += 1
     return interface_number
 
 ### create traces functions ###
 
+def p2pascii_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-p2p-node-%d-dev-%d.tr" % (node_guid, interface_number)
+    testbed_instance.follow_trace(guid, trace_id, filename)
+    filepath = testbed_instance.trace_filename(guid, trace_id)
+    helper = testbed_instance.ns3.PointToPointHelper()
+    asciiHelper = testbed_instance.ns3.AsciiTraceHelper()
+    stream = asciiHelper.CreateFileStream (filepath)
+    helper.EnableAscii(stream, element)
+
 def p2ppcap_trace(testbed_instance, guid, trace_id):
     node_guid = _get_node_guid(testbed_instance, guid)
     interface_number = _get_dev_number(testbed_instance, guid)
@@ -54,7 +104,7 @@ 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)
+    filename = "trace-csma-node-%d-dev-%d.pcap" % (node_guid, interface_number)
     testbed_instance.follow_trace(guid, trace_id, filename)
     filepath = testbed_instance.trace_filename(guid, trace_id)
     helper = testbed_instance.ns3.CsmaHelper()
@@ -73,7 +123,7 @@ def fdpcap_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.pcap" % (node_name, interface_number)
+    filename = "trace-fd-node-%d-dev-%d.pcap" % (node_guid, interface_number)
     testbed_instance.follow_trace(guid, trace_id, filename)
     filepath = testbed_instance.trace_filename(guid, trace_id)
     helper = testbed_instance.ns3.FileDescriptorHelper()
@@ -84,34 +134,60 @@ def yanswifipcap_trace(testbed_instance, guid, trace_id):
     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)
+    filename = "trace-yanswifi-node-%d-dev-%d.pcap" % (node_guid, interface_number)
     testbed_instance.follow_trace(guid, trace_id, filename)
     filepath = testbed_instance.trace_filename(guid, trace_id)
     helper = testbed_instance.ns3.YansWifiPhyHelper()
     helper.EnablePcap(filepath, element, explicitFilename = True)
 
+def wimaxascii_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-wimax-node-%d-dev-%d.tr" % (node_guid, interface_number)
+    testbed_instance.follow_trace(guid, trace_id, filename)
+    filepath = testbed_instance.trace_filename(guid, trace_id)
+    helper = testbed_instance.ns3.WimaxHelper()
+    asciiHelper = testbed_instance.ns3.AsciiTraceHelper()
+    stream = asciiHelper.CreateFileStream (filepath)
+    helper.EnableAscii(stream, element)
+    #helper.EnableLogComponents()
+
+def wimaxpcap_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-wimax-node-%d-dev-%d.pcap" % (node_guid, interface_number)
+    testbed_instance.follow_trace(guid, trace_id, filename)
+    filepath = testbed_instance.trace_filename(guid, trace_id)
+    helper = testbed_instance.ns3.WimaxHelper()
+    helper.EnablePcap(filepath, element, explicitFilename = True)
+
+def rtt_trace(testbed_instance, guid, trace_id):
+    element = testbed_instance._elements[guid]
+    helper = testbed_instance.ns3.PlotHelper()
+    prefix = "trace-app-%d" % (guid, )
+    filename = helper.GetFilenameFromSource(prefix, element, trace_id)
+    testbed_instance.follow_trace(guid, trace_id, filename)
+    filepath = testbed_instance.trace_filename(guid, trace_id)
+    prefix = filepath[:filepath.find(prefix)+len(prefix)]
+    helper.EnableTrace(element, trace_id, prefix, "T")
+
+
 trace_functions = dict({
     "P2PPcapTrace": p2ppcap_trace,
+    "P2PAsciiTrace": p2pascii_trace,
     "CsmaPcapTrace": csmapcap_trace,
     "CsmaPcapPromiscTrace": csmapcap_promisc_trace,
     "FileDescriptorPcapTrace": fdpcap_trace,
-    "YansWifiPhyPcapTrace": yanswifipcap_trace
+    "YansWifiPhyPcapTrace": yanswifipcap_trace,
+    "WimaxPcapTrace": wimaxpcap_trace,
+    "WimaxAsciiTrace": wimaxascii_trace,
+    "Rtt": rtt_trace,
     })
 
 ### Creation functions ###
 
-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
-})
-
 def create_element(testbed_instance, guid):
     element_factory = testbed_instance.ns3.ObjectFactory()
     factory_id = testbed_instance._create[guid]
@@ -122,35 +198,20 @@ def create_element(testbed_instance, guid):
         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, trace_id)
 
 def create_node(testbed_instance, guid):
     create_element(testbed_instance, guid)
     element = testbed_instance._elements[guid]
     element.AggregateObject(testbed_instance.ns3.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" in parameters:
+        standard = parameters["Standard"]
         if standard:
-            elements.ConfigureStandard(wifi_standards[standard])
+            element.ConfigureStandard(wifi_standards[standard])
 
 def create_ipv4protocol(testbed_instance, guid):
     create_element(testbed_instance, guid)
@@ -160,6 +221,144 @@ def create_ipv4protocol(testbed_instance, guid):
     static_routing = testbed_instance.ns3.Ipv4StaticRouting()
     list_routing.AddRoutingProtocol(static_routing, 1)
 
+def create_element_no_constructor(testbed_instance, guid):
+    """ Create function for ns3 classes for which 
+        TypeId.HasConstructor == False"""
+    factory_id = testbed_instance._create[guid]
+    factory_name = factory_id.replace("ns3::", "")
+    constructor = getattr(testbed_instance.ns3, factory_name)
+    element = constructor()
+    testbed_instance._elements[guid] = element
+
+def create_base_station(testbed_instance, guid):
+    node_guid = _get_node_guid(testbed_instance, guid)
+    node = testbed_instance._elements[node_guid]
+    phy_guids = testbed_instance.get_connected(guid, "phy", "dev")
+    if len(phy_guids) == 0:
+        raise RuntimeError("No PHY was found for station %d" % guid)
+    phy = testbed_instance._elements[phy_guids[0]]
+    uplnk_guids = testbed_instance.get_connected(guid, "uplnk", "dev")
+    if len(uplnk_guids) == 0:
+        raise RuntimeError("No uplink scheduler was found for station %d" % guid)
+    uplnk = testbed_instance._elements[uplnk_guids[0]]
+    dwnlnk_guids = testbed_instance.get_connected(guid, "dwnlnk", "dev")
+    if len(dwnlnk_guids) == 0:
+        raise RuntimeError("No downlink scheduler was found for station %d" % guid)
+    dwnlnk = testbed_instance._elements[dwnlnk_guids[0]]
+    element = testbed_instance.ns3.BaseStationNetDevice(node, phy, uplnk, dwnlnk)
+    testbed_instance._elements[guid] = element
+
+def create_subscriber_station(testbed_instance, guid):
+    node_guid = _get_node_guid(testbed_instance, guid)
+    node = testbed_instance._elements[node_guid]
+    phy_guids = testbed_instance.get_connected(guid, "phy", "dev")
+    if len(phy_guids) == 0:
+        raise RuntimeError("No PHY was found for station %d" % guid)
+    phy = testbed_instance._elements[phy_guids[0]]
+    element = testbed_instance.ns3.SubscriberStationNetDevice(node, phy)
+    element.SetModulationType(testbed_instance.ns3.WimaxPhy.MODULATION_TYPE_QAM16_12)
+    testbed_instance._elements[guid] = element
+
+def create_wimax_channel(testbed_instance, guid):
+    element = testbed_instance.ns3.SimpleOfdmWimaxChannel(testbed_instance.ns3.SimpleOfdmWimaxChannel.COST231_PROPAGATION)
+    testbed_instance._elements[guid] = element
+
+def create_wimax_phy(testbed_instance, guid):
+    element = testbed_instance.ns3.SimpleOfdmWimaxPhy()
+    testbed_instance._elements[guid] = element
+
+def create_service_flow(testbed_instance, guid):
+    parameters = testbed_instance._get_parameters(guid)
+    direction = None
+    if "Direction" in parameters:
+        direction = parameters["Direction"]
+    if direction == None:
+        raise RuntimeError("No SchedulingType was found for service flow %d" % guid)
+    sched = None
+    if "SchedulingType" in parameters:
+        sched = parameters["SchedulingType"]
+    if sched == None:
+        raise RuntimeError("No SchedulingType was found for service flow %d" % guid)
+    ServiceFlow = testbed_instance.ns3.ServiceFlow
+    direction = service_flow_direction[direction]
+    sched = service_flow_scheduling_type[sched]
+    element = ServiceFlow(direction)
+    element.SetCsSpecification(ServiceFlow.IPV4)
+    element.SetServiceSchedulingType(sched) 
+    element.SetMaxSustainedTrafficRate(100)
+    element.SetMinReservedTrafficRate(1000000)
+    element.SetMinTolerableTrafficRate(1000000)
+    element.SetMaximumLatency(100)
+    element.SetMaxTrafficBurst(2000)
+    element.SetTrafficPriority(1)
+    element.SetUnsolicitedGrantInterval(1)
+    element.SetMaxSustainedTrafficRate(70)
+    element.SetToleratedJitter(10)
+    element.SetSduSize(49)
+    element.SetRequestTransmissionPolicy(0)
+    testbed_instance._elements[guid] = element
+
+def create_ipcs_classifier_record(testbed_instance, guid):
+    parameters = testbed_instance._get_parameters(guid)
+    src_address = None
+    if "SrcAddress" in parameters:
+        src_address = parameters["SrcAddress"]
+    if src_address == None:
+        raise RuntimeError("No SrcAddress was found for classifier %d" % guid)
+    src_address = testbed_instance.ns3.Ipv4Address(src_address)
+    src_mask= None
+    if "SrcMask" in parameters:
+        src_mask = parameters["SrcMask"]
+    if src_mask == None:
+        raise RuntimeError("No SrcMask was found for classifier %d" % guid)
+    src_mask = testbed_instance.ns3.Ipv4Mask(src_mask)
+    dst_address = None
+    if "DstAddress" in parameters:
+        dst_address = parameters["DstAddress"]
+    if dst_address == None:
+        raise RuntimeError("No Dstddress was found for classifier %d" % guid)
+    dst_address = testbed_instance.ns3.Ipv4Address(dst_address)
+    dst_mask= None
+    if "DstMask" in parameters:
+        dst_mask = parameters["DstMask"]
+    if dst_mask == None:
+        raise RuntimeError("No DstMask was found for classifier %d" % guid)
+    dst_mask = testbed_instance.ns3.Ipv4Mask(dst_mask)
+    src_port_low = None
+    if "SrcPortLow" in parameters:
+        src_port_low = parameters["SrcPortLow"]
+    if src_port_low == None:
+        raise RuntimeError("No SrcPortLow was found for classifier %d" % guid)
+    src_port_high= None
+    if "SrcPortHigh" in parameters:
+        src_port_high = parameters["SrcPortHigh"]
+    if src_port_high == None:
+        raise RuntimeError("No SrcPortHigh was found for classifier %d" % guid)
+    dst_port_low = None
+    if "DstPortLow" in parameters:
+        dst_port_low = parameters["DstPortLow"]
+    if dst_port_low == None:
+        raise RuntimeError("No DstPortLow was found for classifier %d" % guid)
+    dst_port_high = None
+    if "DstPortHigh" in parameters:
+        dst_port_high = parameters["DstPortHigh"]
+    if dst_port_high == None:
+        raise RuntimeError("No DstPortHigh was found for classifier %d" % guid)
+    protocol = None
+    if "Protocol" in parameters:
+        protocol = parameters["Protocol"]
+    if protocol == None or protocol not in l4_protocols:
+        raise RuntimeError("No Protocol was found for classifier %d" % guid)
+    priority = None
+    if "Priority" in parameters:
+        priority = parameters["Priority"]
+    if priority == None:
+        raise RuntimeError("No Priority was found for classifier %d" % guid)
+    element = testbed_instance.ns3.IpcsClassifierRecord(src_address, src_mask,
+        dst_address, dst_mask, src_port_low, src_port_high, dst_port_low, 
+        dst_port_high, l4_protocols[protocol], priority)
+    testbed_instance._elements[guid] = element
+
 ### Start/Stop functions ###
 
 def start_application(testbed_instance, guid):
@@ -187,7 +386,7 @@ def status_application(testbed_instance, guid):
         start_value = parameters["StartTime"]
         start_time = testbed_instance.ns3.Time(start_value)
         if now.Compare(start_time) < 0:
-            return STATUS_NOT_RUNNING
+            return STATUS_NOT_STARTED
     if "StopTime" in parameters and parameters["StopTime"]:
         stop_value = parameters["StopTime"]
         stop_time = testbed_instance.ns3.Time(stop_value)
@@ -199,8 +398,28 @@ def status_application(testbed_instance, guid):
 
 ### Configure functions ###
 
+def configure_traces(testbed_instance, guid):
+    traces = testbed_instance._get_traces(guid)
+    for trace_id in traces:
+        trace_func = trace_functions[trace_id]
+        trace_func(testbed_instance, guid, trace_id)
+
+def configure_element(testbed_instance, guid):
+    configure_traces(testbed_instance, guid)
+
 def configure_device(testbed_instance, guid):
+    configure_traces(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)
+
     if not guid in testbed_instance._add_address:
         return
     # search for the node asociated with the device
@@ -222,7 +441,35 @@ def configure_device(testbed_instance, guid):
         ipv4.SetMetric(ifindex, 1)
         ipv4.SetUp(ifindex)
 
+def _add_static_route(ns3, static_routing, 
+        address, netprefix, nexthop_address, ifindex):
+    if netprefix == 0:
+        # Default route: 0.0.0.0/0
+        static_routing.SetDefaultRoute(nexthop_address, ifindex) 
+    elif netprefix == 32:
+        # Host route: x.y.z.w/32
+        static_routing.AddHostRouteTo(address, nexthop_address, ifindex) 
+    else:
+        # Network route: x.y.z.w/n
+        mask = ns3.Ipv4Mask("/%d" % netprefix) 
+        static_routing.AddNetworkRouteTo(address, mask, nexthop_address, 
+                ifindex) 
+
+def _add_static_route_if(ns3, static_routing, address, netprefix, ifindex):
+    if netprefix == 0:
+        # Default route: 0.0.0.0/0
+        static_routing.SetDefaultRoute(ifindex) 
+    elif netprefix == 32:
+        # Host route: x.y.z.w/32
+        static_routing.AddHostRouteTo(address, ifindex) 
+    else:
+        # Network route: x.y.z.w/n
+        mask = ns3.Ipv4Mask("/%d" % netprefix) 
+        static_routing.AddNetworkRouteTo(address, mask, ifindex) 
+
 def configure_node(testbed_instance, guid):
+    configure_traces(testbed_instance, guid)
+
     element = testbed_instance._elements[guid]
     if not guid in testbed_instance._add_route:
         return
@@ -236,31 +483,221 @@ def configure_node(testbed_instance, guid):
     for route in routes:
         (destination, netprefix, nexthop) = route
         address = ns3.Ipv4Address(destination)
-        mask = ns3.Ipv4Mask("/%d" % netprefix) 
         if nexthop:
             nexthop_address = ns3.Ipv4Address(nexthop)
             ifindex = -1
             # TODO: HACKISH way of getting the ifindex... improve this
             nifaces = ipv4.GetNInterfaces()
-            for ifidx in range(nifaces):
+            for ifidx in xrange(nifaces):
                 iface = ipv4.GetInterface(ifidx)
                 naddress = iface.GetNAddresses()
-                for addridx in range(naddress):
+                for addridx in xrange(naddress):
                     ifaddr = iface.GetAddress(addridx)
                     ifmask = ifaddr.GetMask()
                     ifindex = ipv4.GetInterfaceForPrefix(nexthop_address, ifmask)
                     if ifindex == ifidx:
                         break
-            static_routing.AddNetworkRouteTo(address, mask, nexthop_address, 
-                    ifindex) 
+            if ifindex < 0:
+                # Check previous ptp routes
+                for chaindest, chainprefix, chainhop in routes:
+                    if chaindest == nexthop and chainprefix == 32:
+                        chainhop_address = ns3.Ipv4Address(chainhop)
+                        for ifidx in xrange(nifaces):
+                            iface = ipv4.GetInterface(ifidx)
+                            naddress = iface.GetNAddresses()
+                            for addridx in xrange(naddress):
+                                ifaddr = iface.GetAddress(addridx)
+                                ifmask = ifaddr.GetMask()
+                                ifindex = ipv4.GetInterfaceForPrefix(chainhop_address, ifmask)
+                                if ifindex == ifidx:
+                                    break
+            if ifindex < 0:
+                raise RuntimeError, "Cannot associate interface for routing entry:" \
+                    "%s/%s -> %s. At node %s" % (destination, netprefix, nexthop, guid)
+            _add_static_route(ns3, static_routing, 
+                address, netprefix, nexthop_address, ifindex)
         else:
+            mask = ns3.Ipv4Mask("/%d" % netprefix) 
             ifindex = ipv4.GetInterfaceForPrefix(address, mask)
-            static_routing.AddNetworkRouteTo(address, mask, ifindex) 
+            if ifindex < 0:
+                raise RuntimeError, "Cannot associate interface for routing entry:" \
+                    "%s/%s -> %s. At node %s" % (destination, netprefix, nexthop, guid)
+            _add_static_route_if(ns3, static_routing, 
+                address, netprefix, nexthop_address, ifindex)
+
+def configure_station(testbed_instance, guid):
+    configure_device(testbed_instance, guid)
+    element = testbed_instance._elements[guid]
+    element.Start()
+
+###  Factories  ###
+
+factories_order = ["ns3::BasicEnergySource",
+    "ns3::WifiRadioEnergyModel",
+    "ns3::BSSchedulerRtps",
+    "ns3::BSSchedulerSimple",
+    "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",
+    "ns3::BSSchedulerRtps",
+    "ns3::BSSchedulerSimple",
+    "ns3::SimpleOfdmWimaxChannel",
+    "ns3::SimpleOfdmWimaxPhy",
+    "ns3::UplinkSchedulerMBQoS",
+    "ns3::UplinkSchedulerRtps",
+    "ns3::UplinkSchedulerSimple",
+    "ns3::IpcsClassifierRecord",
+    "ns3::ServiceFlow",
+    "ns3::BaseStationNetDevice",
+    "ns3::SubscriberStationNetDevice",
+ ]
 
 factories_info = dict({
     "ns3::Ping6": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "stop_function": stop_application,
@@ -277,6 +714,7 @@ factories_info = dict({
      "ns3::UdpL4Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["ProtocolNumber"],
@@ -284,12 +722,14 @@ factories_info = dict({
      "ns3::RandomDiscPositionAllocator": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Theta",
             "Rho",
             "X",
             "Y"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::Node": dict({
         "category": "Topology",
@@ -303,6 +743,7 @@ factories_info = dict({
      "ns3::GridPositionAllocator": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["GridWidth",
@@ -311,10 +752,12 @@ factories_info = dict({
             "DeltaX",
             "DeltaY",
             "LayoutType"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::TapBridge": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "allow_addresses": True,
@@ -330,6 +773,7 @@ factories_info = dict({
      "ns3::FlowMonitor": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MaxPerHopDelay",
@@ -342,14 +786,17 @@ factories_info = dict({
      "ns3::ConstantVelocityMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Position",
            "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::V4Ping": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "stop_function": stop_application,
@@ -361,10 +808,12 @@ factories_info = dict({
             "Size",
             "StartTime",
             "StopTime"],
+        "traces": ["rtt"],
     }),
      "ns3::dot11s::PeerLink": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["RetryTimeout",
@@ -376,7 +825,7 @@ factories_info = dict({
     }),
      "ns3::PointToPointNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
         "configure_function": configure_device,
         "help": "",
         "connector_types": ["node", "err", "queue", "chan"],
@@ -385,11 +834,12 @@ factories_info = dict({
             "Address",
             "DataRate",
             "InterframeGap"],
-        "traces": ["p2ppcap"]
+        "traces": ["p2ppcap", "p2pascii"]
     }),
      "ns3::NakagamiPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Distance1",
@@ -401,6 +851,7 @@ factories_info = dict({
      "ns3::AarfWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["SuccessK",
@@ -418,6 +869,7 @@ factories_info = dict({
      "ns3::Ipv6OptionJumbogram": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["OptionNumber"],
@@ -425,6 +877,7 @@ factories_info = dict({
      "ns3::TwoRayGroundPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Lambda",
@@ -435,6 +888,7 @@ factories_info = dict({
      "ns3::OnOffApplication": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "stop_function": stop_application,
@@ -453,6 +907,7 @@ factories_info = dict({
      "ns3::AdhocWifiMac": dict({
         "category": "Mac",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["CtsTimeout",
@@ -469,14 +924,17 @@ factories_info = dict({
      "ns3::ConstantAccelerationMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::GaussMarkovMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Bounds",
@@ -490,10 +948,12 @@ factories_info = dict({
             "NormalPitch",
             "Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::dot11s::HwmpProtocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["RandomStart",
@@ -516,6 +976,7 @@ factories_info = dict({
      "ns3::NscTcpL4Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Library",
@@ -524,6 +985,7 @@ factories_info = dict({
      "ns3::dot11s::AirtimeLinkMetricCalculator": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Dot11sMeshHeaderLength"],
@@ -531,6 +993,7 @@ factories_info = dict({
      "ns3::UanMacCw": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["CW",
@@ -539,6 +1002,7 @@ factories_info = dict({
      "ns3::AthstatsWifiTraceSink": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Interval"],
@@ -546,6 +1010,7 @@ factories_info = dict({
      "ns3::FlameStack": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -553,6 +1018,7 @@ factories_info = dict({
      "ns3::UanMacRc": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["RetryRate",
@@ -568,25 +1034,41 @@ factories_info = dict({
      "ns3::WaypointMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["WaypointsLeft",
             "Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::FileDescriptorNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
         "configure_function": configure_device,
         "help": "Network interface associated to a file descriptor",
-        "connector_types": ["node", "fd"],
+        "connector_types": ["node", "->fd"],
         "allow_addresses": True,
-        "box_attributes": ["Address"],
+        "box_attributes": ["Address", 
+            "LinuxSocketAddress",
+            "tun_proto", "tun_addr", "tun_port", "tun_key"],
         "traces": ["fdpcap"]
+    }),
+     "ns3::Nepi::TunChannel": dict({
+        "category": "Channel",
+        "create_function": create_tunchannel,
+        "preconfigure_function": preconfigure_tunchannel,
+        "configure_function": postconfigure_tunchannel,
+        "start_function": wait_tunchannel,
+        "help": "Channel to forward FileDescriptorNetDevice data to "
+                "other TAP interfaces supporting the NEPI tunneling protocol.",
+        "connector_types": ["fd->", "udp", "tcp"],
+        "allow_addresses": False,
+        "box_attributes": ["tun_proto", "tun_addr", "tun_port", "tun_key"]
     }),
      "ns3::CsmaNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
         "configure_function": configure_device,
         "help": "CSMA (carrier sense, multiple access) interface",
         "connector_types": ["node", "chan", "err", "queue"],
@@ -600,6 +1082,7 @@ factories_info = dict({
      "ns3::UanPropModelThorp": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["SpreadCoef"],
@@ -607,6 +1090,7 @@ factories_info = dict({
      "ns3::NqstaWifiMac": dict({
         "category": "Mac",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ProbeRequestTimeout",
@@ -626,14 +1110,16 @@ factories_info = dict({
      "ns3::Icmpv6L4Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
-        "connector_types": [],
+        "connector_types": ["node"],
         "box_attributes": ["DAD",
             "ProtocolNumber"],
     }),
      "ns3::SimpleNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node", "chan"],
         "allow_addresses": True,
@@ -642,6 +1128,7 @@ factories_info = dict({
      "ns3::FriisPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Lambda",
@@ -651,6 +1138,7 @@ factories_info = dict({
      "ns3::Ipv6OptionRouterAlert": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["OptionNumber"],
@@ -658,31 +1146,37 @@ factories_info = dict({
      "ns3::UniformDiscPositionAllocator": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["rho",
             "X",
             "Y"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::RandomBoxPositionAllocator": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["X",
             "Y",
             "Z"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::Ipv6ExtensionDestination": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
     }),
      "ns3::LoopbackNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -690,6 +1184,7 @@ factories_info = dict({
      "ns3::ConstantSpeedPropagationDelayModel": dict({
         "category": "Delay",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["chan"],
         "box_attributes": ["Speed"],
@@ -697,6 +1192,7 @@ factories_info = dict({
      "ns3::Ipv6ExtensionHopByHop": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
@@ -704,6 +1200,7 @@ factories_info = dict({
      "ns3::BridgeChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -711,6 +1208,7 @@ factories_info = dict({
      "ns3::Radvd": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["StartTime",
@@ -719,6 +1217,7 @@ factories_info = dict({
      "ns3::PacketSocket": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["RcvBufSize"],
@@ -726,6 +1225,7 @@ factories_info = dict({
      "ns3::flame::FlameProtocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["BroadcastInterval",
@@ -734,6 +1234,7 @@ factories_info = dict({
      "ns3::Cost231PropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Lambda",
@@ -745,6 +1246,7 @@ factories_info = dict({
      "ns3::Ipv6ExtensionESP": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
@@ -752,6 +1254,7 @@ factories_info = dict({
      "ns3::CaraWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ProbeThreshold",
@@ -769,6 +1272,7 @@ factories_info = dict({
      "ns3::RttMeanDeviation": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Gain",
@@ -779,6 +1283,7 @@ factories_info = dict({
      "ns3::Icmpv4L4Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["ProtocolNumber"],
@@ -786,6 +1291,7 @@ factories_info = dict({
      "ns3::WaveformGenerator": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Period",
@@ -794,6 +1300,7 @@ factories_info = dict({
      "ns3::YansWifiChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["phys", "delay", "loss"],
         "box_attributes": [],
@@ -801,6 +1308,7 @@ factories_info = dict({
      "ns3::SimpleChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["devs"],
         "box_attributes": [],
@@ -808,6 +1316,7 @@ factories_info = dict({
      "ns3::Ipv6ExtensionFragment": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
@@ -815,6 +1324,7 @@ factories_info = dict({
      "ns3::Dot11sStack": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Root"],
@@ -822,6 +1332,7 @@ factories_info = dict({
      "ns3::FriisSpectrumPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -829,14 +1340,17 @@ factories_info = dict({
      "ns3::RandomRectanglePositionAllocator": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["X",
            "Y"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::NqapWifiMac": dict({
-        "category": "",
+        "category": "Mac",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["BeaconInterval",
@@ -855,14 +1369,17 @@ factories_info = dict({
      "ns3::HierarchicalMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::ThreeLogDistancePropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Distance0",
@@ -876,6 +1393,7 @@ factories_info = dict({
      "ns3::UanNoiseModelDefault": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Wind",
@@ -884,6 +1402,7 @@ factories_info = dict({
      "ns3::dot11s::HwmpRtable": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -891,6 +1410,7 @@ factories_info = dict({
      "ns3::PacketBurst": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -898,6 +1418,7 @@ factories_info = dict({
      "ns3::RandomPropagationDelayModel": dict({
         "category": "Delay",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Variable"],
@@ -905,6 +1426,7 @@ factories_info = dict({
      "ns3::ArpL3Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": [],
@@ -912,6 +1434,7 @@ factories_info = dict({
      "ns3::SteadyStateRandomWaypointMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MinSpeed",
@@ -924,13 +1447,14 @@ factories_info = dict({
             "MaxY",
             "Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::BaseStationNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
-        "configure_function": configure_device,
-        "help": "",
-        "connector_types": [],
+        "create_function": create_base_station,
+        "configure_function": configure_station,
+        "help": "Base station for wireless mobile network",
+        "connector_types": ["node", "chan", "phy", "uplnk", "dwnlnk"],
         "allow_addresses": True,
         "box_attributes": ["InitialRangInterval",
             "DcdInterval",
@@ -942,12 +1466,14 @@ factories_info = dict({
             "Mtu",
             "RTG",
             "TTG"],
+        "traces": ["wimaxpcap", "wimaxascii"],
     }),
      "ns3::UdpServer": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
-        "connector_types": [],
+        "connector_types": ["node"],
         "stop_function": stop_application,
         "start_function": start_application,
         "status_function": status_application,
@@ -959,6 +1485,7 @@ factories_info = dict({
      "ns3::AarfcdWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["SuccessK",
@@ -980,6 +1507,7 @@ factories_info = dict({
      "ns3::UanTransducerHd": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -987,6 +1515,7 @@ factories_info = dict({
      "ns3::LogDistancePropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["prev", "next"],
         "box_attributes": ["Exponent",
@@ -995,7 +1524,8 @@ factories_info = dict({
     }),
      "ns3::EmuNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node", "queue"],
         "box_attributes": ["Mtu",
@@ -1006,8 +1536,9 @@ factories_info = dict({
             "RxQueueSize"],
     }),
      "ns3::Ipv6ExtensionLooseRouting": dict({
-        "category": "",
+        "category": "Routing",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
@@ -1015,16 +1546,19 @@ factories_info = dict({
      "ns3::RandomWaypointMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Speed",
             "Pause",
             "Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::RangePropagationLossModel": dict({
-        "category": "",
+        "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MaxRange"],
@@ -1032,6 +1566,7 @@ factories_info = dict({
      "ns3::AlohaNoackNetDevice": dict({
         "category": "Device",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Address",
@@ -1040,13 +1575,14 @@ factories_info = dict({
      "ns3::MatrixPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["DefaultLoss"],
     }),
      "ns3::WifiNetDevice": dict({
-        "category": "Device",
-        "create_function": create_device,
+        "category": "Wifi",
+        "create_function": create_element,
         "configure_function": configure_device,
         "help": "",
         "connector_types": ["node", "mac", "phy", "manager"],
@@ -1054,8 +1590,9 @@ factories_info = dict({
         "box_attributes": ["Mtu"],
     }),
      "ns3::CsmaChannel": dict({
-        "category": "Channel",
+        "category": "Topology",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["devs"],
         "box_attributes": ["DataRate",
@@ -1063,7 +1600,8 @@ factories_info = dict({
     }),
      "ns3::BridgeNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "allow_addresses": True,
@@ -1072,8 +1610,9 @@ factories_info = dict({
            "ExpirationTime"],
     }),
      "ns3::Ipv6ExtensionRouting": dict({
-        "category": "",
+        "category": "Routing",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
@@ -1081,6 +1620,7 @@ factories_info = dict({
      "ns3::QstaWifiMac": dict({
         "category": "Mac",
         "create_function": create_wifi_standard_model,
+        "configure_function": configure_element,
         "help": "Station Wifi MAC Model",
         "connector_types": ["dev"],
         "box_attributes": ["ProbeRequestTimeout",
@@ -1095,11 +1635,13 @@ factories_info = dict({
             "Slot",
             "Pifs",
             "MaxPropagationDelay",
-            "Ssid"],
+            "Ssid",
+            "Standard"],
     }),
      "ns3::UdpEchoClient": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "stop_function": stop_application,
@@ -1116,8 +1658,9 @@ factories_info = dict({
      "ns3::UdpClient": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
-        "connector_types": [],
+        "connector_types": ["node"],
         "stop_function": stop_application,
         "start_function": start_application,
         "status_function": status_application,
@@ -1132,20 +1675,23 @@ factories_info = dict({
      "ns3::PointToPointChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["dev2"],
         "box_attributes": ["Delay"],
     }),
      "ns3::Ipv6StaticRouting": dict({
-        "category": "",
+        "category": "Routing",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
     }),
      "ns3::DropTailQueue": dict({
-        "category": "Device",
+        "category": "Queue",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["dev"],
         "box_attributes": ["MaxPackets",
@@ -1154,21 +1700,25 @@ factories_info = dict({
      "ns3::ConstantPositionMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::FixedRssLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Rss"],
     }),
      "ns3::EnergySourceContainer": dict({
-        "category": "",
+        "category": "Energy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1176,6 +1726,7 @@ factories_info = dict({
      "ns3::RandomWalk2dMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Bounds",
@@ -1186,10 +1737,12 @@ factories_info = dict({
             "Speed",
             "Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::ListPositionAllocator": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1197,6 +1750,7 @@ factories_info = dict({
      "ns3::dot11s::PeerManagementProtocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MaxNumberOfPeerLinks",
@@ -1204,16 +1758,18 @@ factories_info = dict({
             "EnableBeaconCollisionAvoidance"],
     }),
      "ns3::MeshPointDevice": dict({
-        "category": "Device",
-        "create_function": create_device,
+        "category": "Topology",
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "allow_addresses": True,
         "box_attributes": ["Mtu"],
     }),
      "ns3::BasicEnergySource": dict({
-        "category": "",
+        "category": "Energy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["BasicEnergySourceInitialEnergyJ",
@@ -1223,6 +1779,7 @@ factories_info = dict({
      "ns3::Ipv6OptionPadn": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["OptionNumber"],
@@ -1230,6 +1787,7 @@ factories_info = dict({
      "ns3::QapWifiMac": dict({
         "category": "Mac",
         "create_function": create_wifi_standard_model,
+        "configure_function": configure_element,
         "help": "Access point Wifi MAC Model",
         "connector_types": ["dev"],
         "box_attributes": ["BeaconInterval",
@@ -1243,18 +1801,21 @@ factories_info = dict({
             "Slot",
             "Pifs",
             "MaxPropagationDelay",
-            "Ssid"],
+            "Ssid",
+            "Standard"],
     }),
      "ns3::YansErrorRateModel": dict({
         "category": "Error",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
     }),
      "ns3::WifiMacQueue": dict({
-        "category": "",
+        "category": "Queue",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MaxPacketNumber",
@@ -1262,7 +1823,8 @@ factories_info = dict({
     }),
      "ns3::NonCommunicatingNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "allow_addresses": True,
@@ -1271,6 +1833,7 @@ factories_info = dict({
      "ns3::RateErrorModel": dict({
         "category": "Error",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ErrorUnit",
@@ -1279,8 +1842,9 @@ factories_info = dict({
             "IsEnabled"],
     }),
      "ns3::MeshWifiInterfaceMac": dict({
-        "category": "",
+        "category": "Mac",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["BeaconInterval",
@@ -1300,6 +1864,7 @@ factories_info = dict({
      "ns3::UanPhyCalcSinrDual": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1307,6 +1872,7 @@ factories_info = dict({
      "ns3::Ipv6ExtensionAH": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["ExtensionNumber"],
@@ -1314,13 +1880,15 @@ factories_info = dict({
      "ns3::SingleModelSpectrumChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
     }),
      "ns3::YansWifiPhy": dict({
         "category": "Phy",
-        "create_function": create_element,
+        "create_function": create_wifi_standard_model,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["dev", "err", "chan"],
         "box_attributes": ["EnergyDetectionThreshold",
@@ -1332,12 +1900,14 @@ factories_info = dict({
             "TxPowerStart",
             "RxNoiseFigure",
             "ChannelSwitchDelay",
-            "ChannelNumber"],
+            "ChannelNumber",
+            "Standard"],
         "traces": ["yanswifipcap"]
     }),
      "ns3::WifiRadioEnergyModel": dict({
-        "category": "",
+        "category": "Energy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["TxCurrentA",
@@ -1348,6 +1918,7 @@ factories_info = dict({
      "ns3::EdcaTxopN": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["BlockAckThreshold",
@@ -1358,6 +1929,7 @@ factories_info = dict({
      "ns3::UanPhyPerGenDefault": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Threshold"],
@@ -1365,6 +1937,7 @@ factories_info = dict({
      "ns3::IdealWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["BerThreshold",
@@ -1378,6 +1951,7 @@ factories_info = dict({
      "ns3::MultiModelSpectrumChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1385,6 +1959,7 @@ factories_info = dict({
      "ns3::HalfDuplexIdealPhy": dict({
         "category": "Phy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Rate"],
@@ -1392,6 +1967,7 @@ factories_info = dict({
      "ns3::UanPhyCalcSinrDefault": dict({
         "category": "Phy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1399,6 +1975,7 @@ factories_info = dict({
      "ns3::ReceiveListErrorModel": dict({
         "category": "Error",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["IsEnabled"],
@@ -1406,6 +1983,7 @@ factories_info = dict({
      "ns3::SpectrumAnalyzer": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Resolution",
@@ -1414,6 +1992,7 @@ factories_info = dict({
      "ns3::ConstantRateWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["dev"],
         "box_attributes": ["DataMode",
@@ -1428,6 +2007,7 @@ factories_info = dict({
      "ns3::Ipv6OptionPad1": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["OptionNumber"],
@@ -1435,6 +2015,7 @@ factories_info = dict({
      "ns3::UdpTraceClient": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["RemoteAddress",
@@ -1446,6 +2027,7 @@ factories_info = dict({
      "ns3::RraaWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Basic",
@@ -1482,6 +2064,7 @@ factories_info = dict({
      "ns3::RandomPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Variable"],
@@ -1489,6 +2072,7 @@ factories_info = dict({
      "ns3::UanChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1496,6 +2080,7 @@ factories_info = dict({
      "ns3::MinstrelWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["UpdateStatistics",
@@ -1514,6 +2099,7 @@ factories_info = dict({
      "ns3::UanPhyDual": dict({
         "category": "Phy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["CcaThresholdPhy1",
@@ -1528,13 +2114,15 @@ factories_info = dict({
      "ns3::ListErrorModel": dict({
         "category": "Error",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["dev"],
         "box_attributes": ["IsEnabled"],
     }),
      "ns3::VirtualNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
+        "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "allow_addresses": True,
@@ -1543,6 +2131,7 @@ factories_info = dict({
      "ns3::UanPhyGen": dict({
         "category": "Phy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["CcaThreshold",
@@ -1554,14 +2143,16 @@ factories_info = dict({
      "ns3::Ipv6L3Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
-        "connector_types": [],
+        "connector_types": ["node"],
         "box_attributes": ["DefaultTtl",
             "IpForward"],
     }),
      "ns3::PointToPointRemoteChannel": dict({
         "category": "Channel",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Delay"],
@@ -1569,6 +2160,7 @@ factories_info = dict({
      "ns3::UanPhyPerUmodem": dict({
         "category": "Phy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1576,6 +2168,7 @@ factories_info = dict({
      "ns3::OnoeWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["UpdatePeriod",
@@ -1591,6 +2184,7 @@ factories_info = dict({
      "ns3::QadhocWifiMac": dict({
         "category": "Mac",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["CtsTimeout",
@@ -1607,6 +2201,7 @@ factories_info = dict({
      "ns3::JakesPropagationLossModel": dict({
         "category": "Loss",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["NumberOfRaysPerPath",
@@ -1617,6 +2212,7 @@ factories_info = dict({
      "ns3::PacketSink": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "stop_function": stop_application,
@@ -1630,17 +2226,20 @@ factories_info = dict({
      "ns3::RandomDirection2dMobilityModel": dict({
         "category": "Mobility",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["Bounds",
-            "Speed",
+            "RndSpeed",
             "Pause",
             "Position",
             "Velocity"],
+        "tags": [tags.MOBILE],
     }),
      "ns3::UanMacAloha": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1648,6 +2247,7 @@ factories_info = dict({
      "ns3::MsduStandardAggregator": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MaxAmsduSize"],
@@ -1655,6 +2255,7 @@ factories_info = dict({
      "ns3::DcaTxop": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MinCw",
@@ -1664,6 +2265,7 @@ factories_info = dict({
      "ns3::UanPhyCalcSinrFhFsk": dict({
         "category": "Phy",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["NumberOfHops"],
@@ -1671,6 +2273,7 @@ factories_info = dict({
      "ns3::UanPropModelIdeal": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": [],
@@ -1678,6 +2281,7 @@ factories_info = dict({
      "ns3::UanMacRcGw": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["MaxReservations",
@@ -1696,6 +2300,7 @@ factories_info = dict({
      "ns3::NistErrorRateModel": dict({
         "category": "Error",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["phy"],
         "box_attributes": [],
@@ -1703,6 +2308,7 @@ factories_info = dict({
      "ns3::Ipv4L3Protocol": dict({
         "category": "Protocol",
         "create_function": create_ipv4protocol,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["DefaultTtl",
@@ -1712,6 +2318,7 @@ factories_info = dict({
      "ns3::aodv::RoutingProtocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["HelloInterval",
@@ -1738,6 +2345,7 @@ factories_info = dict({
      "ns3::TcpL4Protocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "box_attributes": ["RttEstimatorFactory",
@@ -1746,6 +2354,7 @@ factories_info = dict({
      "ns3::olsr::RoutingProtocol": dict({
         "category": "Protocol",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["HelloInterval",
@@ -1757,6 +2366,7 @@ factories_info = dict({
      "ns3::UdpEchoServer": dict({
         "category": "Application",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["node"],
         "stop_function": stop_application,
@@ -1769,6 +2379,7 @@ factories_info = dict({
      "ns3::AmrrWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["UpdatePeriod",
@@ -1786,6 +2397,7 @@ factories_info = dict({
      "ns3::ArfWifiManager": dict({
         "category": "Manager",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": ["dev"],
         "box_attributes": ["TimerThreshold",
@@ -1799,9 +2411,10 @@ factories_info = dict({
     }),
      "ns3::SubscriberStationNetDevice": dict({
         "category": "Device",
-        "create_function": create_device,
-        "help": "",
-        "connector_types": [],
+        "create_function": create_subscriber_station,
+        "configure_function": configure_station,
+        "help": "Subscriber station for mobile wireless network",
+        "connector_types": ["node", "chan", "phy", "sflows"],
         "allow_addresses": True,
         "box_attributes": ["LostDlMapInterval",
             "LostUlMapInterval",
@@ -1818,12 +2431,89 @@ factories_info = dict({
             "Mtu",
             "RTG",
             "TTG"],
+        "traces": ["wimaxpcap", "wimaxascii"],
     }),
-     "ns3::flame::FlameRtable": dict({
+    "ns3::flame::FlameRtable": dict({
         "category": "",
         "create_function": create_element,
+        "configure_function": configure_element,
         "help": "",
         "connector_types": [],
         "box_attributes": ["Lifetime"],
     }),
+    "ns3::BSSchedulerRtps": dict({
+        "category": "Service Flow",
+        "create_function": create_element,
+        "configure_function": configure_element,
+        "help": "Simple downlink scheduler for rtPS flows",
+        "connector_types": ["dev"],
+        "box_attributes": [],
+    }),
+    "ns3::BSSchedulerSimple": dict({
+        "category": "Service Flow",
+        "create_function": create_element,
+        "configure_function": configure_element,
+        "help": "simple downlink scheduler for service flows",
+        "connector_types": ["dev"],
+        "box_attributes": [],
+    }),
+    "ns3::SimpleOfdmWimaxChannel": dict({
+        "category": "Channel",
+        "create_function": create_wimax_channel,
+        "configure_function": configure_element,
+        "help": "Wimax channel",
+        "connector_types": ["devs"],
+        "box_attributes": [],
+    }),
+    "ns3::SimpleOfdmWimaxPhy": dict({
+        "category": "Phy",
+        "create_function": create_wimax_phy,
+        "configure_function": configure_element,
+        "help": "Wimax Phy",
+        "connector_types": ["dev"],
+        "box_attributes": [],
+    }),
+    "ns3::UplinkSchedulerSimple": dict({
+        "category": "Service Flow",
+        "create_function": create_element_no_constructor,
+        "configure_function": configure_element,
+        "help": "Simple uplink scheduler for service flows",
+        "connector_types": ["dev"],
+        "box_attributes": [],
+    }),
+    "ns3::UplinkSchedulerRtps": dict({
+        "category": "Service Flow",
+        "create_function": create_element_no_constructor,
+        "configure_function": configure_element,
+        "help": "Simple uplink scheduler for rtPS flows",
+        "connector_types": ["dev"],
+        "box_attributes": [],
+    }),
+    "ns3::IpcsClassifierRecord": dict({
+        "category": "Service Flow",
+        "create_function": create_ipcs_classifier_record,
+        "configure_function": configure_element,
+        "help": "Classifier record for service flow",
+        "connector_types": ["sflow"],
+        "box_attributes": ["ClassifierSrcAddress", 
+            "ClassifierSrcMask", 
+            "ClassifierDstAddress",
+            "ClassifierDstMask",
+            "ClassifierSrcPortLow",
+            "ClassifierSrcPortHigh",
+            "ClassifierDstPortLow",
+            "ClassifierDstPortHigh",
+            "ClassifierProtocol",
+            "ClassifierPriority"],
+    }),   
+    "ns3::ServiceFlow": dict({
+        "category": "Service Flow",
+        "create_function": create_service_flow,
+        "configure_function": configure_element,
+        "help": "Service flow for QoS",
+        "connector_types": ["classif", "dev"],
+        "box_attributes": ["ServiceFlowDirection", 
+            "ServiceFlowSchedulingType"],
+    }),   
 })
+