import socket
import fcntl
import os
+import os.path
import select
import struct
import re
import functools
import time
+import base64
tun_name = 'tun0'
tun_path = '/dev/net/tun'
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")
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 ""
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
import rspawn
import subprocess
import threading
+import base64
from nepi.util import server
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")
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()
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'
TUN_PROTO_MAP = {
'tcp' : TunProtoTCP,
'udp' : TunProtoUDP,
+ 'fd' : TunProtoFD,
}
TAP_PROTO_MAP = {
'tcp' : TapProtoTCP,
'udp' : TapProtoUDP,
+ 'fd' : TapProtoFD,
}