X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fns3%2Fns3node.py;h=2d14b85635bb4e2020678b9253a0a2c209fccd57;hb=94e7d9b143ab9ea609ef367cad7d49d45dabef8b;hp=0d6f69172656fbc58a85b7ccb13315611ec050b5;hpb=4343255121c4a2e8f3fe0b6377ec9219de75eab1;p=nepi.git diff --git a/src/nepi/resources/ns3/ns3node.py b/src/nepi/resources/ns3/ns3node.py index 0d6f6917..2d14b856 100644 --- a/src/nepi/resources/ns3/ns3node.py +++ b/src/nepi/resources/ns3/ns3node.py @@ -17,6 +17,7 @@ # # Author: Alina Quereilhac +from nepi.execution.attribute import Attribute, Flags, Types from nepi.execution.resource import clsinit_copy from nepi.resources.ns3.ns3base import NS3Base @@ -24,43 +25,99 @@ 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", + "Install network stack in Node, including: ARP, " + "IP4, ICMP, UDP and TCP ", + type = Types.Bool, + default = False, + flags = Flags.Design) + + cls._register_attribute(enablestack) + @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 - if not devices: - msg = "Node not connected to devices" - self.error(msg) - raise RuntimeError, msg + self._devices = devices - return devices + return self._devices + + @property + def node_id(self): + return self._node_id + + @property + def dceapplications(self): + if not self._dceapplications: + from nepi.resources.ns3.ns3dceapplication import NS3BaseDceApplication + self._dceapplications = self.get_connected(NS3BaseDceApplication.get_rtype()) + + return self._dceapplications @property def _rms_to_wait(self): @@ -71,6 +128,10 @@ class NS3BaseNode(NS3Base): if ipv4: rms.add(ipv4) + arp = self.arp + if arp: + rms.add(arp) + mobility = self.mobility if mobility: rms.add(mobility) @@ -78,17 +139,57 @@ class NS3BaseNode(NS3Base): return rms def _configure_object(self): - ### node.AggregateObject(PacketSocketFactory()) - uuid_packet_socket_factory = self.simulation.create("PacketSocketFactory") - self.simulation.invoke(self.uuid, "AggregateObject", uuid_packet_socket_factory) + 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)