From: Alina Quereilhac Date: Sun, 18 Mar 2012 19:43:52 +0000 (+0100) Subject: Added "Up" attribute to ns3::Node in the ns-3 testbed, to enable/disable traffic X-Git-Tag: nepi-3.0.0~163^2~38 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=ef8d6828add421180db7104e1393523b0b054082;p=nepi.git Added "Up" attribute to ns3::Node in the ns-3 testbed, to enable/disable traffic --- diff --git a/src/nepi/testbeds/ns3/attributes_metadata.py b/src/nepi/testbeds/ns3/attributes_metadata.py index a0c065a4..1441bef0 100644 --- a/src/nepi/testbeds/ns3/attributes_metadata.py +++ b/src/nepi/testbeds/ns3/attributes_metadata.py @@ -2554,4 +2554,11 @@ attributes = dict({ "flags" : Attribute.ExecImmutable | Attribute.Metadata, "validation_function" : validation.is_enum, }), + "Up" : dict({ + "name" : "Up", + "help" : "Flag to enable or disable interface", + "type" : Attribute.BOOL, + "value" : True, + "validation_function" : validation.is_integer, + }), }) diff --git a/src/nepi/testbeds/ns3/execute.py b/src/nepi/testbeds/ns3/execute.py index 9c60e057..6faf6da1 100644 --- a/src/nepi/testbeds/ns3/execute.py +++ b/src/nepi/testbeds/ns3/execute.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from util import _get_ipv4_protocol_guid, _get_node_guid, _get_dev_number from nepi.core import testbed_impl from nepi.core.attributes import Attribute from constants import TESTBED_ID, TESTBED_VERSION @@ -108,8 +109,22 @@ class TestbedController(testbed_impl.TestbedController): if factory_id in self.LOCAL_FACTORIES: setattr(element, name, value) elif not factory.box_attributes.is_attribute_metadata(name): - ns3_value = self._to_ns3_value(guid, name, value) - self._set_attribute(name, ns3_value, element) + if name == "Up": + ipv4_guid = _get_ipv4_protocol_guid(self, guid) + if not ipv4_guid in self._elements: + return + ipv4 = self._elements[ipv4_guid] + if value == False: + nint = ipv4.GetNInterfaces() + for i in xrange(0, nint): + ipv4.SetDown(i) + else: + nint = ipv4.GetNInterfaces() + for i in xrange(0, nint): + ipv4.SetUp(i) + else: + ns3_value = self._to_ns3_value(guid, name, value) + self._set_attribute(name, ns3_value, element) def get(self, guid, name, time = TIME_NOW): value = super(TestbedController, self).get(guid, name, time) @@ -122,6 +137,19 @@ class TestbedController(testbed_impl.TestbedController): return getattr(element, name) else: return value + else: + if name == "Up": + ipv4_guid = _get_ipv4_protocol_guid(self, guid) + if not ipv4_guid in self._elements: + return True + ipv4 = self._elements[ipv4_guid] + nint = ipv4.GetNInterfaces() + value = True + for i in xrange(0, nint): + value = ipv4.IsUp(i) + if not value: break + return value + if factory.box_attributes.is_attribute_metadata(name): return value @@ -136,6 +164,7 @@ class TestbedController(testbed_impl.TestbedController): self._get_attribute(name, ns3_value, element) value = ns3_value.SerializeToString(checker) attr_type = factory.box_attributes.get_attribute_type(name) + if attr_type == Attribute.INTEGER: return int(value) if attr_type == Attribute.DOUBLE: diff --git a/src/nepi/testbeds/ns3/factories_metadata.py b/src/nepi/testbeds/ns3/factories_metadata.py index 6f0d42f3..7132e31d 100644 --- a/src/nepi/testbeds/ns3/factories_metadata.py +++ b/src/nepi/testbeds/ns3/factories_metadata.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from util import _get_ipv4_protocol_guid, _get_node_guid, _get_dev_number from nepi.util import tags from nepi.util.constants import AF_INET, ApplicationStatus as AS, \ FactoryCategories as FC @@ -41,39 +42,6 @@ service_flow_scheduling_type = dict ({ "SF_TYPE_ALL": 255 }) -def _get_ipv4_protocol_guid(testbed_instance, node_guid): - # search for the Ipv4L3Protocol asociated with the device - protos_guids = testbed_instance.get_connected(node_guid, "protos", "node") - if len(protos_guids) == 0: - raise RuntimeError("No protocols where found for the node %d" % node_guid) - ipv4_guid = None - for proto_guid in protos_guids: - proto_factory_id = testbed_instance._create[proto_guid] - if proto_factory_id == "ns3::Ipv4L3Protocol": - ipv4_guid = proto_guid - break - if not ipv4_guid: - raise RuntimeError("No Ipv4L3Protocol associated to node %d. Can't add Ipv4 addresses" % node_guid) - return ipv4_guid - -def _get_node_guid(testbed_instance, guid): - # search for the node asociated with the device - node_guids = testbed_instance.get_connected(guid, "node", "devs") - if len(node_guids) == 0: - raise RuntimeError("Can't instantiate interface %d outside node" % guid) - node_guid = node_guids[0] - return node_guid - -def _get_dev_number(testbed_instance, guid): - 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 - interface_number += 1 - return interface_number - def _follow_trace(testbed_instance, guid, trace_id, filename): testbed_instance.follow_trace(guid, trace_id, filename) filepath = testbed_instance.trace_filepath(guid, trace_id) @@ -895,6 +863,7 @@ factories_info = dict({ "configure_function": configure_node, "help": "", "connector_types": ["devs", "apps", "protos", "mobility"], + "box_attributes": ["Up"], "tags": [tags.NODE, tags.ALLOW_ROUTES], }), "ns3::GridPositionAllocator": dict({ diff --git a/src/nepi/testbeds/ns3/util.py b/src/nepi/testbeds/ns3/util.py new file mode 100644 index 00000000..a5ee7318 --- /dev/null +++ b/src/nepi/testbeds/ns3/util.py @@ -0,0 +1,33 @@ +def _get_ipv4_protocol_guid(testbed_instance, node_guid): + # search for the Ipv4L3Protocol asociated with the device + protos_guids = testbed_instance.get_connected(node_guid, "protos", "node") + if len(protos_guids) == 0: + raise RuntimeError("No protocols where found for the node %d" % node_guid) + ipv4_guid = None + for proto_guid in protos_guids: + proto_factory_id = testbed_instance._create[proto_guid] + if proto_factory_id == "ns3::Ipv4L3Protocol": + ipv4_guid = proto_guid + break + if not ipv4_guid: + raise RuntimeError("No Ipv4L3Protocol associated to node %d. Can't add Ipv4 addresses" % node_guid) + return ipv4_guid + +def _get_node_guid(testbed_instance, guid): + # search for the node asociated with the device + node_guids = testbed_instance.get_connected(guid, "node", "devs") + if len(node_guids) == 0: + raise RuntimeError("Can't instantiate interface %d outside node" % guid) + node_guid = node_guids[0] + return node_guid + +def _get_dev_number(testbed_instance, guid): + 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 + interface_number += 1 + return interface_number + diff --git a/test/testbeds/netns/execute.py b/test/testbeds/netns/execute.py index ec27e9ed..1ab3fc23 100755 --- a/test/testbeds/netns/execute.py +++ b/test/testbeds/netns/execute.py @@ -109,6 +109,7 @@ class NetnsExecuteTestCase(unittest.TestCase): user = getpass.getuser() instance = netns.TestbedController() instance.defer_configure("homeDirectory", self.root_dir) + #instance.defer_configure("enableDebug", True) instance.defer_create(2, "Node") instance.defer_create(3, "Node") instance.defer_create(4, "Node")