anchor.diff:            services.httpd.documentRoot = "/tmp";
           };
   
  -      client = 
  +      router = 
  +        { config, pkgs, ... }:
  +        { environment.systemPackages = [ pkgs.iptables pkgs.miniupnpd ];
  +          virtualisation.vlans = [ 1 2 ];
  +        };
  +
  +      client1 = 
  +        { config, pkgs, ... }:
  +        { environment.systemPackages = [ pkgs.transmission ];
  +          virtualisation.vlans = [ 2 ];
  +          networking.defaultGateway = "192.168.2.3"; # !!! ugly
  +        };
  +
  +      client2 = 
           { config, pkgs, ... }:
           { environment.systemPackages = [ pkgs.transmission ];
           };
  
positive.code:   testScript =
      ''
        startAll;
  
        # Create the torrent.
        $tracker->mustSucceed("mkdir /tmp/data");
  
negative.code: # This test runs a Bittorrent tracker on one machine, and verifies
  # that two client machines can download the torrent using
  # `transmission'.  The first client (behind a NAT router) downloads
  # from the initial seeder running on the tracker.  Then we kill the
  # initial seeder.  The second client downloads from the first client,
  # which only works if the first client successfully uses the UPnP-IGD
  # protocol to poke a hole in the NAT.
  
  { pkgs, ... }:
  
  let
  
    # Some random file to serve.
    file = pkgs.nixUnstable.src;
  
    miniupnpdConf = pkgs.writeText "miniupnpd.conf"
      ''
        ext_ifname=eth1
        listening_ip=192.168.2.3/24
        allow 1024-65535 192.168.2.0/24 1024-65535
      '';
    
  in
  
  