Some fixes to TUN/TAP devices
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Fri, 6 May 2011 16:44:00 +0000 (18:44 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Fri, 6 May 2011 16:44:00 +0000 (18:44 +0200)
Fixed support for FileDescriptor-based taps.
(still ongoing though)

src/nepi/testbeds/planetlab/scripts/tun_connect.py
src/nepi/testbeds/planetlab/tunproto.py

index 19b0897..59f9eb2 100644 (file)
@@ -3,6 +3,7 @@ import sys
 import socket
 import fcntl
 import os
+import os.path
 import select
 
 import struct
@@ -13,6 +14,7 @@ import subprocess
 import re
 import functools
 import time
+import base64
 
 tun_name = 'tun0'
 tun_path = '/dev/net/tun'
@@ -255,11 +257,12 @@ def ipfmt(ip):
     return '.'.join(map(str,ipbytes))
 
 tagtype = {
-    '0806' : 'arp ',
-    '0800' : 'ipv4 ',
-    '8870' : 'jumbo ',
-    '8863' : 'PPPoE discover ',
-    '8864' : 'PPPoE ',
+    '0806' : 'arp',
+    '0800' : 'ipv4',
+    '8870' : 'jumbo',
+    '8863' : 'PPPoE discover',
+    '8864' : 'PPPoE',
+    '86dd' : 'ipv6',
 }
 def etherProto(packet):
     packet = packet.encode("hex")
@@ -342,12 +345,12 @@ def pullPacket(buf, ether_mode):
 def etherStrip(buf):
     if len(buf) < 14:
         return ""
-    if buf[12:14] == '\x08\x10' and buf[16:18] == '\x08\x00':
+    if buf[12:14] == '\x08\x10' and buf[16:18] in '\x08\x00':
         # tagged ethernet frame
-        return buf[18:-4]
+        return buf[18:]
     elif buf[12:14] == '\x08\x00':
         # untagged ethernet frame
-        return buf[14:-4]
+        return buf[14:]
     else:
         return ""
 
@@ -535,6 +538,13 @@ except:
 
 try:
     if options.pass_fd:
+        if options.pass_fd.startswith("base64:"):
+            options.pass_fd = base64.b64decode(
+                options.pass_fd[len("base64:"):])
+            options.pass_fd = os.path.expandvars(options.pass_fd)
+        
+        print >>sys.stderr, "Sending FD to: %r" % (options.pass_fd,)
+        
         # send FD to whoever wants it
         import passfd
         
index 5ba9e1c..7a340a8 100644 (file)
@@ -7,6 +7,7 @@ import os.path
 import rspawn
 import subprocess
 import threading
+import base64
 
 from nepi.util import server
 
@@ -137,17 +138,25 @@ class TunProtoBase(object):
             raise RuntimeError, "Misconfigured TUN: %s" % (local,)
         
         args = ["python", "tun_connect.py", 
-            "-m", str(self.mode)]
+            "-m", str(self.mode),
+            "-A", str(local_addr),
+            "-M", str(local_mask)]
         
         if check_proto == 'fd':
+            passfd_arg = str(peer_addr)
+            if '\x00' in passfd_arg:
+                # cannot shell_encode null characters :(
+                passfd_arg = "base64:"+base64.b64encode('$HOME/'+passfd_arg)
+            else:
+                passfd_arg = '$HOME/'+server.shell_escape(passfd_arg)
             args.extend([
-                "--pass-fd", str(peer_addr)])
+                "--pass-fd", passfd_arg
+            ])
         else:
             args.extend([
                 "-p", str(local_port if listen else peer_port),
-                "-A", str(local_addr),
-                "-M", str(local_mask),
-                "-k", str(self.key)])
+                "-k", str(self.key)
+            ])
         
         if local_snat:
             args.append("-S")
@@ -155,7 +164,7 @@ class TunProtoBase(object):
             args.extend(("-Q",str(local_txq)))
         if extra_args:
             args.extend(map(str,extra_args))
-        if not listen:
+        if not listen and check_proto != 'fd':
             args.append(str(peer_addr))
         
         self._make_home()
@@ -392,7 +401,7 @@ class TapProtoTCP(TunProtoTCP):
 
 class TapProtoFD(TunProtoFD):
     def __init__(self, local, peer, home_path, key, listening):
-        super(TapProtoUDP, self).__init__(local, peer, home_path, key, listening)
+        super(TapProtoFD, self).__init__(local, peer, home_path, key, listening)
         self.mode = 'pl-tap'
 
 
@@ -400,11 +409,13 @@ class TapProtoFD(TunProtoFD):
 TUN_PROTO_MAP = {
     'tcp' : TunProtoTCP,
     'udp' : TunProtoUDP,
+    'fd'  : TunProtoFD,
 }
 
 TAP_PROTO_MAP = {
     'tcp' : TapProtoTCP,
     'udp' : TapProtoUDP,
+    'fd'  : TapProtoFD,
 }