From 0fc019da03d72867cb8a0149c29976791444cf84 Mon Sep 17 00:00:00 2001 From: Joe Bowen Date: Tue, 6 May 2014 10:25:05 -0600 Subject: [PATCH] Setup NIO for UDP communication --- gns3server/modules/vpcs/adapters/__init__.py | 0 gns3server/modules/vpcs/adapters/adapter.py | 104 ++++++++++++++++++ .../modules/vpcs/adapters/ethernet_adapter.py | 31 ++++++ gns3server/modules/vpcs/vpcs_device.py | 17 ++- 4 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 gns3server/modules/vpcs/adapters/__init__.py create mode 100644 gns3server/modules/vpcs/adapters/adapter.py create mode 100644 gns3server/modules/vpcs/adapters/ethernet_adapter.py diff --git a/gns3server/modules/vpcs/adapters/__init__.py b/gns3server/modules/vpcs/adapters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gns3server/modules/vpcs/adapters/adapter.py b/gns3server/modules/vpcs/adapters/adapter.py new file mode 100644 index 00000000..4d2f4053 --- /dev/null +++ b/gns3server/modules/vpcs/adapters/adapter.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2014 GNS3 Technologies Inc. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +class Adapter(object): + """ + Base class for adapters. + + :param interfaces: number of interfaces supported by this adapter. + """ + + def __init__(self, interfaces=4): + + self._interfaces = interfaces + + self._ports = {} + for port_id in range(0, interfaces): + self._ports[port_id] = None + + def removable(self): + """ + Returns True if the adapter can be removed from a slot + and False if not. + + :returns: boolean + """ + + return True + + def port_exists(self, port_id): + """ + Checks if a port exists on this adapter. + + :returns: True is the port exists, + False otherwise. + """ + + if port_id in self._ports: + return True + return False + + def add_nio(self, port_id, nio): + """ + Adds a NIO to a port on this adapter. + + :param port_id: port ID (integer) + :param nio: NIO instance + """ + + self._ports[port_id] = nio + + def remove_nio(self, port_id): + """ + Removes a NIO from a port on this adapter. + + :param port_id: port ID (integer) + """ + + self._ports[port_id] = None + + def get_nio(self, port_id): + """ + Returns the NIO assigned to a port. + + :params port_id: port ID (integer) + + :returns: NIO instance + """ + + return self._ports[port_id] + + @property + def ports(self): + """ + Returns port to NIO mapping + + :returns: dictionary port -> NIO + """ + + return self._ports + + @property + def interfaces(self): + """ + Returns the number of interfaces supported by this adapter. + + :returns: number of interfaces + """ + + return self._interfaces diff --git a/gns3server/modules/vpcs/adapters/ethernet_adapter.py b/gns3server/modules/vpcs/adapters/ethernet_adapter.py new file mode 100644 index 00000000..bbca7f40 --- /dev/null +++ b/gns3server/modules/vpcs/adapters/ethernet_adapter.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2014 GNS3 Technologies Inc. +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class EthernetAdapter(Adapter): + """ + VPCS Ethernet adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "VPCS Ethernet adapter" diff --git a/gns3server/modules/vpcs/vpcs_device.py b/gns3server/modules/vpcs/vpcs_device.py index 3bd3f95a..88f07f85 100644 --- a/gns3server/modules/vpcs/vpcs_device.py +++ b/gns3server/modules/vpcs/vpcs_device.py @@ -29,6 +29,7 @@ import threading import configparser from .vpcscon import start_vpcscon from .vpcs_error import VPCSError +from .adapters.ethernet_adapter import EthernetAdapter from .nios.nio_udp import NIO_UDP from .nios.nio_tap import NIO_TAP @@ -80,6 +81,8 @@ class VPCSDevice(object): # VPCS settings self._script_file = "" + self._ethernet_adapters = [EthernetAdapter()] # one adapter = 1 interfaces + self._slots = self._ethernet_adapters # update the working directory self.working_dir = working_dir @@ -437,9 +440,17 @@ class VPCSDevice(object): command = [self._path] command.extend(["-p", str(self._console)]) - command.extend(["-s", str(self._lport)]) - command.extend(["-c", str(self._rport)]) - command.extend(["-t", str(self._rhost)]) + + for adapter in self._slots: + for unit in adapter.ports.keys(): + nio = adapter.get_nio(unit) + if nio: + if isinstance(nio, NIO_UDP): + # UDP tunnel + command.extend(["-s", str(nio.lport)]) + command.extend(["-c", str(nio.rport)]) + command.extend(["-t", str(nio.rhost)]) + command.extend(["-m", str(self._id)]) #The unique ID is used to set the mac address offset if self._script_file: command.extend([self._script_file])