| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  | # Test of IPv6 functionality in NixOS, including whether router | 
					
						
							|  |  |  | # solicication/advertisement using radvd works. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | import ./make-test.nix ({ pkgs, ...} : { | 
					
						
							| 
									
										
										
										
											2014-06-28 16:04:49 +02:00
										 |  |  |   name = "ipv6"; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							|  |  |  |     maintainers = [ eelco chaoflow ]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   nodes = | 
					
						
							|  |  |  |     { client = { config, pkgs, ... }: { }; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |       server = | 
					
						
							|  |  |  |         { config, pkgs, ... }: | 
					
						
							|  |  |  |         { services.httpd.enable = true; | 
					
						
							|  |  |  |           services.httpd.adminAddr = "foo@example.org"; | 
					
						
							| 
									
										
										
										
											2014-04-11 17:15:56 +02:00
										 |  |  |           networking.firewall.allowedTCPPorts = [ 80 ]; | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |       router = | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |         { config, pkgs, ... }: | 
					
						
							|  |  |  |         { services.radvd.enable = true; | 
					
						
							|  |  |  |           services.radvd.config = | 
					
						
							|  |  |  |             ''
 | 
					
						
							|  |  |  |               interface eth1 { | 
					
						
							|  |  |  |                 AdvSendAdvert on; | 
					
						
							|  |  |  |                 # ULA prefix (RFC 4193). | 
					
						
							|  |  |  |                 prefix fd60:cc69:b537:1::/64 { }; | 
					
						
							|  |  |  |               }; | 
					
						
							|  |  |  |             '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   testScript = | 
					
						
							|  |  |  |     ''
 | 
					
						
							|  |  |  |       # Start the router first so that it respond to router solicitations. | 
					
						
							| 
									
										
										
										
											2012-10-24 18:22:53 +02:00
										 |  |  |       $router->waitForUnit("radvd"); | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |       startAll; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 18:22:53 +02:00
										 |  |  |       $client->waitForUnit("network.target"); | 
					
						
							|  |  |  |       $server->waitForUnit("network.target"); | 
					
						
							| 
									
										
										
										
											2014-08-10 14:51:01 +02:00
										 |  |  |       $server->waitForUnit("httpd.service"); | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # Wait until the given interface has a non-tentative address of | 
					
						
							|  |  |  |       # the desired scope (i.e. has completed Duplicate Address | 
					
						
							|  |  |  |       # Detection). | 
					
						
							|  |  |  |       sub waitForAddress { | 
					
						
							|  |  |  |           my ($machine, $iface, $scope) = @_; | 
					
						
							|  |  |  |           $machine->waitUntilSucceeds("[ `ip -o -6 addr show dev $iface scope $scope | grep -v tentative | wc -l` -eq 1 ]"); | 
					
						
							|  |  |  |           my $ip = (split /[ \/]+/, $machine->succeed("ip -o -6 addr show dev $iface scope $scope"))[3]; | 
					
						
							|  |  |  |           $machine->log("$scope address on $iface is $ip"); | 
					
						
							|  |  |  |           return $ip; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |       subtest "loopback address", sub { | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |           $client->succeed("ping6 -c 1 ::1 >&2"); | 
					
						
							|  |  |  |           $client->fail("ping6 -c 1 ::2 >&2"); | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-19 19:21:19 +00:00
										 |  |  |       subtest "local link addressing", sub { | 
					
						
							|  |  |  |           my $clientIp = waitForAddress $client, "eth1", "link"; | 
					
						
							|  |  |  |           my $serverIp = waitForAddress $server, "eth1", "link"; | 
					
						
							|  |  |  |           $client->succeed("ping6 -c 1 -I eth1 $clientIp >&2"); | 
					
						
							|  |  |  |           $client->succeed("ping6 -c 1 -I eth1 $serverIp >&2"); | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       subtest "global addressing", sub { | 
					
						
							|  |  |  |           my $clientIp = waitForAddress $client, "eth1", "global"; | 
					
						
							|  |  |  |           my $serverIp = waitForAddress $server, "eth1", "global"; | 
					
						
							|  |  |  |           $client->succeed("ping6 -c 1 $clientIp >&2"); | 
					
						
							|  |  |  |           $client->succeed("ping6 -c 1 $serverIp >&2"); | 
					
						
							|  |  |  |           $client->succeed("curl --fail -g http://[$serverIp]"); | 
					
						
							|  |  |  |           $client->fail("curl --fail -g http://[$clientIp]"); | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # TODO: test reachability of a machine on another network. | 
					
						
							|  |  |  |     '';
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | }) |