X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3node.py;h=ca63c3cd3a8f6ff93ea5c280c93a76570ae45c1c;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=859897905e44f27c6dbb711b55d2d7b49d232444;hpb=e3d822f14bbb4f35525384a4ac44c11b32821f35;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3node.py b/src/nepi/resources/ns3/ns3node.py index 85989790..ca63c3cd 100644 --- a/src/nepi/resources/ns3/ns3node.py +++ b/src/nepi/resources/ns3/ns3node.py @@ -3,9 +3,8 @@ # Copyright (C) 2014 INRIA # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,6 +24,16 @@ from nepi.resources.ns3.ns3base import NS3Base class NS3BaseNode(NS3Base): _rtype = "abstract::ns3::Node" + def __init__(self, ec, guid): + super(NS3BaseNode, self).__init__(ec, guid) + self._simulation = None + self._node_id = None + self._ipv4 = None + self._arp = None + self._mobility = None + self._devices = None + self._dceapplications = None + @classmethod def _register_attributes(cls): enablestack = Attribute("enableStack", @@ -38,61 +47,89 @@ class NS3BaseNode(NS3Base): @property def simulation(self): - from nepi.resources.ns3.ns3simulation import NS3Simulation - for guid in self.connections: - rm = self.ec.get_resource(guid) - if isinstance(rm, NS3Simulation): - return rm - - msg = "Node not connected to simulation" - self.error(msg) - raise RuntimeError, msg - + if not self._simulation: + from nepi.resources.ns3.ns3simulation import NS3Simulation + for guid in self.connections: + rm = self.ec.get_resource(guid) + if isinstance(rm, NS3Simulation): + self._simulation = rm + + if not self._simulation: + msg = "Node not connected to simulation" + self.error(msg) + raise RuntimeError(msg) + + return self._simulation + @property def ipv4(self): - from nepi.resources.ns3.ns3ipv4l3protocol import NS3BaseIpv4L3Protocol - ipv4s = self.get_connected(NS3BaseIpv4L3Protocol.get_rtype()) - if ipv4s: return ipv4s[0] - return None + if not self._ipv4: + from nepi.resources.ns3.ns3ipv4l3protocol import NS3BaseIpv4L3Protocol + ipv4s = self.get_connected(NS3BaseIpv4L3Protocol.get_rtype()) + if ipv4s: + self._ipv4 = ipv4s[0] + + return self._ipv4 + + @property + def arp(self): + if not self._arp: + from nepi.resources.ns3.ns3arpl3protocol import NS3BaseArpL3Protocol + arps = self.get_connected(NS3BaseArpL3Protocol.get_rtype()) + if arps: + self._arp = arps[0] + + return self._arp @property def mobility(self): - from nepi.resources.ns3.ns3mobilitymodel import NS3BaseMobilityModel - mobility = self.get_connected(NS3BaseMobilityModel.get_rtype()) - if mobility: return mobility[0] - return None + if not self._mobility: + from nepi.resources.ns3.ns3mobilitymodel import NS3BaseMobilityModel + mobility = self.get_connected(NS3BaseMobilityModel.get_rtype()) + if mobility: + self._mobility = mobility[0] + + return self._mobility @property def devices(self): - from nepi.resources.ns3.ns3netdevice import NS3BaseNetDevice - devices = self.get_connected(NS3BaseNetDevice.get_rtype()) + if not self._devices: + from nepi.resources.ns3.ns3netdevice import NS3BaseNetDevice + devices = self.get_connected(NS3BaseNetDevice.get_rtype()) + + if not devices: + msg = "Node not connected to devices" + self.error(msg) + raise RuntimeError(msg) + + self._devices = devices - if not devices: - msg = "Node not connected to devices" - self.error(msg) - raise RuntimeError, msg + return self._devices - return devices + @property + def node_id(self): + return self._node_id @property def dceapplications(self): - from nepi.resources.ns3.ns3dceapplication import NS3BaseDceApplication - dceapplications = self.get_connected(NS3BaseDceApplication.get_rtype()) + if not self._dceapplications: + from nepi.resources.ns3.ns3dceapplication import NS3BaseDceApplication + self._dceapplications = self.get_connected(NS3BaseDceApplication.get_rtype()) - return dceapplications + return self._dceapplications @property def _rms_to_wait(self): - rms = set() - rms.add(self.simulation) + rms = set([self.simulation]) - ipv4 = self.ipv4 - if ipv4: - rms.add(ipv4) + if self.ipv4: + rms.add(self.ipv4) - mobility = self.mobility - if mobility: - rms.add(mobility) + if self.arp: + rms.add(self.arp) + + if self.mobility: + rms.add(self.mobility) return rms @@ -100,30 +137,58 @@ class NS3BaseNode(NS3Base): if self.get("enableStack"): uuid_stack_helper = self.simulation.create("InternetStackHelper") self.simulation.invoke(uuid_stack_helper, "Install", self.uuid) + + # Retrieve IPV4 object + ipv4_uuid = self.simulation.invoke(self.uuid, "retrieveObject", + "ns3::Ipv4L3Protocol") + + # Add IPv4 RM to the node + ipv4 = self.ec.register_resource("ns3::Ipv4L3Protocol") + self.ec.register_connection(self.guid, ipv4) + ipv4rm = self.ec.get_resource(ipv4) + ipv4rm._uuid = ipv4_uuid + ipv4rm.set_started() else: ### node.AggregateObject(PacketSocketFactory()) uuid_packet_socket_factory = self.simulation.create("PacketSocketFactory") self.simulation.invoke(self.uuid, "AggregateObject", uuid_packet_socket_factory) + self._node_id = self.simulation.invoke(self.uuid, "GetId") + dceapplications = self.dceapplications if dceapplications: self._add_dce(dceapplications) def _connect_object(self): - ipv4 = self.ipv4 - if ipv4: - self.simulation.invoke(self.uuid, "AggregateObject", ipv4.uuid) + if not self.get("enableStack"): + ipv4 = self.ipv4 + if ipv4: + self.simulation.invoke(self.uuid, "AggregateObject", ipv4.uuid) + self._connected.add(ipv4.uuid) + ipv4._connected.add(self.uuid) + + arp = self.arp + if arp: + self.simulation.invoke(self.uuid, "AggregateObject", arp.uuid) + self._connected.add(arp.uuid) + arp._connected.add(self.uuid) mobility = self.mobility if mobility: self.simulation.invoke(self.uuid, "AggregateObject", mobility.uuid) + self._connected.add(mobility.uuid) + mobility._connected.add(self.uuid) def _add_dce(self, dceapplications): dceapp = dceapplications[0] container_uuid = self.simulation.create("NodeContainer") self.simulation.invoke(container_uuid, "Add", self.uuid) - with dceapp.dce_manager_lock: - self.simulation.invoke(dceapp.dce_manager_helper_uuid, - "Install", container_uuid) + + dce_helper = self.simulation.dce_helper + + with dce_helper.dce_manager_lock: + dce_manager_uuid = dce_helper.dce_manager_uuid + + self.simulation.invoke(dce_manager_uuid, "Install", container_uuid)