From f759616d72818a47e61dde111b4d1b0b92e1cb4c Mon Sep 17 00:00:00 2001 From: Alina Quereilhac Date: Fri, 2 Sep 2011 12:19:31 +0200 Subject: [PATCH] added Tun device for netns --- src/nepi/testbeds/netns/metadata.py | 41 +++++++++++++++++++++++-- src/nepi/testbeds/planetlab/tunproto.py | 2 +- src/nepi/util/server.py | 2 +- src/nepi/util/tunchannel.py | 6 +++- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/nepi/testbeds/netns/metadata.py b/src/nepi/testbeds/netns/metadata.py index dc875a31..8c04d99b 100644 --- a/src/nepi/testbeds/netns/metadata.py +++ b/src/nepi/testbeds/netns/metadata.py @@ -20,6 +20,7 @@ import functools NODE = "Node" P2PIFACE = "P2PNodeInterface" TAPIFACE = "TapNodeInterface" +TUNIFACE = "TunNodeInterface" NODEIFACE = "NodeInterface" SWITCH = "Switch" APPLICATION = "Application" @@ -149,6 +150,15 @@ def create_tapiface(testbed_instance, guid): element = node.add_tap() testbed_instance.elements[guid] = element +def create_tuniface(testbed_instance, guid): + node_guid = testbed_instance.get_connected(guid, "node", "devs") + if len(node_guid) == 0: + raise RuntimeError("Can't instantiate interface %d outside netns \ + node" % guid) + node = testbed_instance.elements[node_guid[0]] + element = node.add_tun() + testbed_instance.elements[guid] = element + def create_nodeiface(testbed_instance, guid): node_guid = testbed_instance.get_connected(guid, "node", "devs") if len(node_guid) == 0: @@ -307,6 +317,11 @@ connections = [ "to": (TESTBED_ID, TAPIFACE, "node"), "can_cross": False }), + dict({ + "from": (TESTBED_ID, NODE, "devs"), + "to": (TESTBED_ID, TUNIFACE, "node"), + "can_cross": False + }), dict({ "from": (TESTBED_ID, NODE, "devs"), "to": (TESTBED_ID, NODEIFACE, "node"), @@ -322,6 +337,12 @@ connections = [ "to": (None, None, "->fd"), "compl_code": connect_fd, "can_cross": True + }), + dict({ + "from": (TESTBED_ID, TUNIFACE, "fd->"), + "to": (None, None, "->fd"), + "compl_code": connect_fd, + "can_cross": True }), dict({ "from": (TESTBED_ID, SWITCH, "devs"), @@ -340,6 +361,12 @@ connections = [ "init_code": connect_tunchannel_tap, "can_cross": False }), + dict({ + "from": (TESTBED_ID, TUNCHANNEL, "->fd" ), + "to": (TESTBED_ID, TUNIFACE, "fd->" ), + "init_code": connect_tunchannel_tap, + "can_cross": False + }), dict({ "from": (TESTBED_ID, TUNCHANNEL, "tcp"), "to": (None, None, "tcp"), @@ -451,11 +478,11 @@ traces = dict({ }) create_order = [ NODE, P2PIFACE, NODEIFACE, TAPIFACE, - TUNCHANNEL, SWITCH, + TUNIFACE, TUNCHANNEL, SWITCH, APPLICATION ] configure_order = [ P2PIFACE, NODEIFACE, TAPIFACE, - TUNCHANNEL, SWITCH, + TUNIFACE, TUNCHANNEL, SWITCH, NODE, APPLICATION ] factories_info = dict({ @@ -489,6 +516,16 @@ factories_info = dict({ "connector_types": ["node", "fd->"], "tags": [tags.INTERFACE, tags.ALLOW_ADDRESSES], }), + TUNIFACE: dict({ + "help": "Tun device network interface", + "category": FC.CATEGORY_DEVICES, + "create_function": create_tuniface, + "configure_function": configure_device, + "box_attributes": ["lladdr", "up", "device_name", "mtu", + "multicast", "broadcast", "arp"], + "connector_types": ["node", "fd->"], + "tags": [tags.INTERFACE, tags.ALLOW_ADDRESSES], + }), NODEIFACE: dict({ "help": "Node network interface", "category": FC.CATEGORY_DEVICES, diff --git a/src/nepi/testbeds/planetlab/tunproto.py b/src/nepi/testbeds/planetlab/tunproto.py index 0f4537a6..3f10b85b 100644 --- a/src/nepi/testbeds/planetlab/tunproto.py +++ b/src/nepi/testbeds/planetlab/tunproto.py @@ -411,7 +411,7 @@ class TunProtoBase(object): self._logger.debug("if_name: %r does not match expected pattern from cmd %s", out, cmd) else: self._logger.debug("if_name: empty output from cmd %s", cmd) - time.sleep(1) + time.sleep(3) else: self._logger.warn("if_name: Could not get interface name") return self._if_name diff --git a/src/nepi/util/server.py b/src/nepi/util/server.py index 51397562..675ca38d 100644 --- a/src/nepi/util/server.py +++ b/src/nepi/util/server.py @@ -230,7 +230,7 @@ class Server(object): try: msg = self.recv_msg(conn) except socket.timeout, e: - self.log_error("SERVER recv_msg: connection timedout ") + #self.log_error("SERVER recv_msg: connection timedout ") continue if not msg: diff --git a/src/nepi/util/tunchannel.py b/src/nepi/util/tunchannel.py index cb076c60..ce780502 100644 --- a/src/nepi/util/tunchannel.py +++ b/src/nepi/util/tunchannel.py @@ -4,6 +4,7 @@ import os import struct import socket import threading +import traceback import errno import fcntl import random @@ -354,6 +355,7 @@ def tun_fwd(tun, remote, with_pi, ether_mode, cipher_key, udp, TERMINATE, stderr # just retry continue else: + traceback.print_exc(file=sys.stderr) raise # check for errors @@ -679,7 +681,9 @@ def tcp_establish(TERMINATE, local_addr, local_port, peer_addr, peer_port): end = False sock = None - while not end: + for i in xrange(0, 50): + if end: + break if TERMINATE: raise OSError, "Killed" hand = str(random.randint(1, 6)) -- 2.47.0