X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fresource_manager_generator.py;h=d04cc067574e7fc7e4537d6100fff2dbe28e044f;hb=8ef508f12834ed9e8781edd692059b67e945b5f0;hp=5cb7cc18bd0ecedf8aceae62f8268f5307fd4728;hpb=ab601cf5f7775071e59c6bdbb3369889244f70a5;p=nepi.git diff --git a/src/nepi/resources/ns3/resource_manager_generator.py b/src/nepi/resources/ns3/resource_manager_generator.py index 5cb7cc18..d04cc067 100644 --- a/src/nepi/resources/ns3/resource_manager_generator.py +++ b/src/nepi/resources/ns3/resource_manager_generator.py @@ -17,66 +17,74 @@ # # Author: Alina Quereilhac +# +# Instructions to automatically generate ns-3 ResourceManagers +# +# Configure the ns-3 enviorment (e.g.): +# +# export PYTHONPATH=~/.nepi/nepi-usr/bin/ns-3/ns-3.20/optimized/build/lib/python/site-packages +# export LD_LIBRARY_PATH=~/.nepi/nepi-usr/bin/ns-3/ns-3.20/optimized/build/lib +# +# Run the RM generator: +# +# PYTHONPATH=$PYTHONPATH:~/repos/nepi/src python src/nepi/resources/ns3/resource_manager_generator.py +# + # Force the load of ns3 libraries from nepi.resources.ns3.ns3wrapper import load_ns3_module import os import re -def discard(ns3, tid): +adapted_types = ["ns3::Node", + "ns3::Icmpv4L4Protocol", + "ns3::ArpL3Protocol", + "ns3::Ipv4L3Protocol", + "ns3::PropagationLossModel", + "ns3::MobilityModel", + "ns3::PropagationDelayModel", + "ns3::WifiRemoteStationManager", + "ns3::WifiNetDevice", + "ns3::WifiChannel", + "ns3::WifiPhy", + "ns3::WifiMac", + "ns3::ErrorModel", + "ns3::ErrorRateModel", + "ns3::Application", + "ns3::FdNetDevice", + #"ns3::DceApplication", + "ns3::NetDevice", + "ns3::Channel", + "ns3::Queue"] + +base_types = ["ns3::IpL4Protocol"] + +def select_base_class(ns3, tid): + base_class_import = None + base_class = None + rtype = tid.GetName() - words = ["variable", "object", "probe", "adaptor", "wrapper", - "container", "derived", "simple"] - for word in words: - if rtype.lower().find(word) > -1: - return True - - bases = ["ns3::Scheduler", "ns3::SimulatorImpl"] type_id = ns3.TypeId() - for base in bases: - tid_base = type_id.LookupByName(base) - if tid.IsChildOf(tid_base): - return True - return False + for type_name in adapted_types: + tid_base = type_id.LookupByName(type_name) + if type_name == rtype or tid.IsChildOf(tid_base): + base_class = "NS3Base" + type_name.replace("ns3::", "") + base_module = "ns3" + type_name.replace("ns3::", "").lower() + base_class_import = "from nepi.resources.ns3.%s import %s " % ( + base_module, base_class) + return (base_class_import, base_class) -def select_base_class(ns3, tid): base_class_import = "from nepi.resources.ns3.ns3base import NS3Base" base_class = "NS3Base" - - rtype = tid.GetName() - if rtype == "ns3::Node": - base_class_import = "from nepi.resources.ns3.ns3node import NS3BaseNode" - base_class = "NS3BaseNode" - elif rtype == "ns3::Ipv4L3Protocol": - base_class_import = "from nepi.resources.ns3.ns3ipv4l3protocol import NS3BaseIpv4L3Protocol" - base_class = "NS3BaseIpv4L3Protocol" - else: - type_id = ns3.TypeId() - - bases = ["ns3::Application", - "ns3::NetDevice", - "ns3::Channel", - "ns3::Queue", - "ns3::PropagationLossModel", - "ns3::PropagationDelayModel", - "ns3::WifiRemoteStationManager", - "ns3::WifiPhy", - "ns3::WifiMac", - "ns3::ErrorModel", - "ns3::ErrorRateModel"] - - for base in bases: - tid_base = type_id.LookupByName(base) - if tid.IsChildOf(tid_base): - base_class = "NS3Base" + base.replace("ns3::", "") - base_module = "ns3" + base.replace("ns3::", "").lower() - base_class_import = "from nepi.resources.ns3.%s import %s " % ( - base_module, base_class) - - return (base_class_import, base_class) + for type_name in base_types: + tid_base = type_id.LookupByName(type_name) + if type_name == rtype or tid.IsChildOf(tid_base): + return (base_class_import, base_class) + + return (None, None) def create_ns3_rms(): ns3 = load_ns3_module() @@ -90,7 +98,8 @@ def create_ns3_rms(): for i in xrange(tid_count): tid = type_id.GetRegistered(i) - if discard(ns3, tid): + (base_class_import, base_class) = select_base_class(ns3, tid) + if not base_class: continue if tid.MustHideFromDocumentation() or \ @@ -109,8 +118,6 @@ def create_ns3_rms(): attributes = "\n" + attributes if attributes else "pass" traces = "\n" + traces if traces else "pass" - (base_class_import, base_class) = select_base_class(ns3, tid) - category = tid.GetGroupName() rtype = tid.GetName() @@ -156,12 +163,15 @@ def template_attributes(ns3, tid): if not attr_info.accessor.HasGetter(): continue - attr_flags = "None" + attr_flags = "Flags.Reserved" flags = attr_info.flags - if (flags & ns3.TypeId.ATTR_SET) != ns3.TypeId.ATTR_SET: - attr_flags = "Flags.Design" - elif (flags & ns3.TypeId.ATTR_CONSTRUCT) == ns3.TypeId.ATTR_CONSTRUCT: - attr_flags = "Flags.Construct" + if (flags & ns3.TypeId.ATTR_CONSTRUCT) == ns3.TypeId.ATTR_CONSTRUCT: + attr_flags += " | Flags.Construct" + else: + if (flags & ns3.TypeId.ATTR_GET) != ns3.TypeId.ATTR_GET: + attr_flags += " | Flags.NoRead" + elif (flags & ns3.TypeId.ATTR_SET) != ns3.TypeId.ATTR_SET: + attr_flags += " | Flags.NoWrite" attr_name = attr_info.name checker = attr_info.checker