From bb382e64c95103f24b198b37d57c40373c69f199 Mon Sep 17 00:00:00 2001 From: Claudio-Daniel Freire Date: Fri, 6 May 2011 18:44:00 +0200 Subject: [PATCH] Some fixes to TUN/TAP devices Fixed support for FileDescriptor-based taps. (still ongoing though) --- .../testbeds/planetlab/scripts/tun_connect.py | 26 +++++++++++++------ src/nepi/testbeds/planetlab/tunproto.py | 25 +++++++++++++----- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/nepi/testbeds/planetlab/scripts/tun_connect.py b/src/nepi/testbeds/planetlab/scripts/tun_connect.py index 19b08978..59f9eb23 100644 --- a/src/nepi/testbeds/planetlab/scripts/tun_connect.py +++ b/src/nepi/testbeds/planetlab/scripts/tun_connect.py @@ -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 diff --git a/src/nepi/testbeds/planetlab/tunproto.py b/src/nepi/testbeds/planetlab/tunproto.py index 5ba9e1cc..7a340a8b 100644 --- a/src/nepi/testbeds/planetlab/tunproto.py +++ b/src/nepi/testbeds/planetlab/tunproto.py @@ -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, } -- 2.43.0