Merge with HEAD, close aly's branch.
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Sun, 4 Sep 2011 17:31:46 +0000 (19:31 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Sun, 4 Sep 2011 17:31:46 +0000 (19:31 +0200)
src/nepi/testbeds/netns/metadata.py
src/nepi/testbeds/planetlab/tunproto.py
src/nepi/util/server.py
src/nepi/util/tunchannel.py
src/nepi/util/tunchannel_impl.py

index dc875a3..8c04d99 100644 (file)
@@ -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,
index 13e0c03..aeb4e67 100644 (file)
@@ -418,7 +418,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
index 5139756..675ca38 100644 (file)
@@ -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:
index 61cb2e3..970f83c 100644 (file)
@@ -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))
index c358429..d543c94 100644 (file)
@@ -206,6 +206,7 @@ class TunChannel(object):
         # drop strong reference
         del self
         
+        print >>sys.stderr, "Connected"
         tun_fwd(tun, remote,
             with_pi = with_pi, 
             ether_mode = ether_mode,