From: Claudio-Daniel Freire Date: Sun, 4 Sep 2011 17:27:37 +0000 (+0200) Subject: Merge TCP handshake stuff X-Git-Tag: nepi-3.0.0~253 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=71dff96ea5f1da9cb09fc79f9ad1b3ecfc8f2a71;p=nepi.git Merge TCP handshake stuff --- 71dff96ea5f1da9cb09fc79f9ad1b3ecfc8f2a71 diff --cc src/nepi/testbeds/planetlab/interfaces.py index 96991673,1f313c14..56720a37 --- a/src/nepi/testbeds/planetlab/interfaces.py +++ b/src/nepi/testbeds/planetlab/interfaces.py @@@ -239,11 -238,10 +239,11 @@@ class TunIface(object) if self.tun_cipher != 'PLAIN' and self.peer_proto not in ('udp','tcp',None): raise RuntimeError, "Miscofnigured TUN: %s - ciphered tunnels only work with udp or tcp links" % (self,) - def _impl_instance(self, home_path, listening): + def _impl_instance(self, home_path): impl = self._PROTO_MAP[self.peer_proto]( - self, self.peer_iface, home_path, self.tun_key, listening) + self, self.peer_iface, home_path, self.tun_key) impl.port = self.tun_port + impl.cross_slice = not self.peer_iface or isinstance(self.peer_iface, _CrossIface) return impl def recover(self): diff --cc src/nepi/testbeds/planetlab/scripts/tun_connect.py index c57884c8,cf55e0da..f015bade --- a/src/nepi/testbeds/planetlab/scripts/tun_connect.py +++ b/src/nepi/testbeds/planetlab/scripts/tun_connect.py @@@ -452,8 -517,8 +461,8 @@@ def pl_vif_start(tun_path, tun_name) if options.vif_txqueuelen is not None: stdin.write("txqueuelen=%d\n" % (options.vif_txqueuelen,)) if options.mode.startswith('pl-gre'): - stdin.write("gre=%d\n" % (options.gre_key,)) + stdin.write("gre=%s\n" % (options.gre_key,)) - stdin.write("remote=%s\n" % (remaining_args[0],)) + stdin.write("remote=%s\n" % (options.peer_addr,)) stdin.close() t.join() @@@ -660,63 -719,8 +669,63 @@@ try tcpdump = None reconnect = None mcastthread = None + + # install multicast forwarding hook + if options.multicast_fwd: + print >>sys.stderr, "Installing mcast filter" + + if HAS_IOVEC: + writev = iovec.writev + else: + os_write = os.write + map_ = map + str_ = str + def writev(fileno, *stuff): + os_write(''.join(map_(str_,stuff))) + + def accept_packet(packet, direction, + _up_accept=accept_packet, + sock=mcfwd_sock, + sockno=mcfwd_sock.fileno(), + etherProto=tunchannel.etherProto, + etherStrip=tunchannel.etherStrip, + etherMode=tun_name.startswith('tap'), + multicast_fwd = options.multicast_fwd, + vif_addr = socket.inet_aton(options.vif_addr), + connected = [], writev=writev, + len=len, ord=ord): + if _up_accept: + rv = _up_accept(packet, direction) + if not rv: + return rv + + if direction == 1: + # Incoming... what? + if etherMode: + if etherProto(packet)=='\x08\x00': + fwd = etherStrip(packet) + else: + fwd = None + else: + fwd = packet + if fwd is not None and len(fwd) >= 20: + if (ord(fwd[16]) & 0xf0) == 0xe0: + # Forward it + if not connected: + try: + sock.connect(multicast_fwd) + connected.append(None) + except: + traceback.print_exc(file=sys.stderr) + if connected: + try: + writev(sockno, vif_addr,fwd) + except: + traceback.print_exc(file=sys.stderr) + return 1 + - if options.pass_fd: + if options.protocol == 'fd': if accept_packet or filter_init: raise NotImplementedError, "--pass-fd and --filter are not compatible" diff --cc src/nepi/testbeds/planetlab/tunproto.py index 60ce91bb,0f4537a6..13e0c03e --- a/src/nepi/testbeds/planetlab/tunproto.py +++ b/src/nepi/testbeds/planetlab/tunproto.py @@@ -26,14 -26,11 +26,12 @@@ class TunProtoBase(object) self.port = 15000 self.mode = 'pl-tun' self.key = key + self.cross_slice = False self.home_path = home_path - - self._launcher = None + self._started = False - self._started_listening = False - self._starting = False + self._pid = None self._ppid = None self._if_name = None @@@ -244,10 -228,10 +230,11 @@@ args = ["python", "tun_connect.py", "-m", str(self.mode), + "-t", str(check_proto), "-A", str(local_addr), "-M", str(local_mask), - "-C", str(local_cipher)] + "-C", str(local_cipher), + ] if check_proto == 'fd': passfd_arg = str(peer_addr) @@@ -260,13 -244,16 +247,20 @@@ "--pass-fd", passfd_arg ]) elif check_proto == 'gre': + if self.cross_slice: + args.extend([ + "-K", str(self.key.strip('=')) + ]) ++ + args.extend([ - "-K", str(min(local_port, peer_port)), + "-a", str(peer_addr), + ]) + # both udp and tcp else: args.extend([ - "-p", str(local_port if listen else peer_port), + "-P", str(local_port), + "-p", str(peer_port), + "-a", str(peer_addr), "-k", str(self.key) ]) @@@ -280,12 -267,10 +274,8 @@@ args.append("-N") elif local_cap == 'pcap': args.extend(('-c','pcap')) - if local_mcast: - args.append("--multicast") if local_bwlim: args.extend(("-b",str(local_bwlim*1024))) - if extra_args: - args.extend(map(str,extra_args)) - if not listen and check_proto != 'fd': - args.append(str(peer_addr)) if filter_module: args.extend(("--filter", filter_module)) if filter_args: