Merge TCP handshake stuff
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Sun, 4 Sep 2011 17:27:37 +0000 (19:27 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Sun, 4 Sep 2011 17:27:37 +0000 (19:27 +0200)
1  2 
src/nepi/testbeds/planetlab/interfaces.py
src/nepi/testbeds/planetlab/metadata.py
src/nepi/testbeds/planetlab/scripts/tun_connect.py
src/nepi/testbeds/planetlab/tunproto.py
src/nepi/util/tunchannel.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):
@@@ -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"
          
@@@ -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
          
          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)
                  "--pass-fd", passfd_arg
              ])
          elif check_proto == 'gre':
 -                "-K", str(min(local_port, peer_port)),
 +            if self.cross_slice:
 +                args.extend([
 +                    "-K", str(self.key.strip('='))
 +                ])
++
+             args.extend([
+                 "-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)
              ])
          
              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:
Simple merge