From f53238d253f27a04174507933ef6fb038aab7591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20F=C3=A9lizard?= Date: Mon, 19 Feb 2018 13:47:48 +0000 Subject: [PATCH 1/2] Skip link-local addresses when fixing IPv6 route This occurs with a Linux host when a link-local address is configured for vboxnet0 (which is the default for VirtualBox 5.2.6). `connect': Invalid argument - connect(2) for "fe80::ffff:ffff:ffff:ffff" port 80 (Errno::EINVAL) --- plugins/providers/virtualbox/action/network_fix_ipv6.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/providers/virtualbox/action/network_fix_ipv6.rb b/plugins/providers/virtualbox/action/network_fix_ipv6.rb index be5468d88..33bcf3e98 100644 --- a/plugins/providers/virtualbox/action/network_fix_ipv6.rb +++ b/plugins/providers/virtualbox/action/network_fix_ipv6.rb @@ -43,6 +43,7 @@ module VagrantPlugins # If we have no IPv6, forget it return if !has_v6 + link_local_range = IPAddr.new("fe80::/10") host_only_interfaces(env).each do |interface| next if !present?(interface[:ipv6]) next if interface[:status] != "Up" @@ -50,6 +51,8 @@ module VagrantPlugins ip = IPAddr.new(interface[:ipv6]) ip |= ("1" * (128 - interface[:ipv6_prefix].to_i)).to_i(2) + next if link_local_range.include?(ip) + @logger.info("testing IPv6: #{ip}") begin From 87ee57d94aee47b8ee86ec938696c163a9dfea21 Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Mon, 30 Jul 2018 15:16:50 -0700 Subject: [PATCH 2/2] Add test coverage on link-local skip for ipv6 in vbox --- .../virtualbox/action/network_fix_ipv6_test.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/unit/plugins/providers/virtualbox/action/network_fix_ipv6_test.rb b/test/unit/plugins/providers/virtualbox/action/network_fix_ipv6_test.rb index f12261de5..618c024a8 100644 --- a/test/unit/plugins/providers/virtualbox/action/network_fix_ipv6_test.rb +++ b/test/unit/plugins/providers/virtualbox/action/network_fix_ipv6_test.rb @@ -123,6 +123,23 @@ describe VagrantPlugins::ProviderVirtualBox::Action::NetworkFixIPv6 do expect(socket).to_not have_received(:connect) end + it "should ignore interfaces with link-local IPv6 address" do + all_networks = [{name: "vboxnet0", + ipv6: "fe80::ffff:ffff:ffff:ffff", + ipv6_prefix: 64, + status: 'Up' + } + ] + ifaces = { 1 => {type: :hostonly, hostonly: "vboxnet0"} + } + allow(machine.provider.driver).to receive(:read_network_interfaces) + .and_return(ifaces) + allow(machine.provider.driver).to receive(:read_host_only_interfaces) + .and_return(all_networks) + subject.call(env) + expect(socket).to_not have_received(:connect) + end + it "should ignore nat interfaces" do all_networks = [{name: "vboxnet0", ipv6: "",