summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorCédric Bosdonnat <cbosdonnat@suse.com>2017-03-03 14:14:51 +0100
committerCédric Bosdonnat <cbosdonnat@suse.com>2017-03-22 09:01:33 +0100
commit00d28a78b5d1f6eaf79f06ac59e31c568af9da37 (patch)
tree700e9adaff66a8cf144c455881528cf160ab20e4 /src/network
parent5dd607059d8a98e04024305ae4afbd038aadbdcd (diff)
downloadlibvirt-00d28a78b5d1f6eaf79f06ac59e31c568af9da37.tar.gz
network: check accept_ra before enabling ipv6 forwarding
When enabling IPv6 on all interfaces, we may get the host Router Advertisement routes discarded. To avoid this, the user needs to set accept_ra to 2 for the interfaces with such routes. See https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt on this topic. To avoid user mistakenly losing routes on their hosts, check accept_ra values before enabling IPv6 forwarding. If a RA route is detected, but neither the corresponding device nor global accept_ra is set to 2, the network will fail to start.
Diffstat (limited to 'src/network')
-rw-r--r--src/network/bridge_driver.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 4d1a44516b..a753cd78b0 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -61,6 +61,7 @@
#include "virlog.h"
#include "virdnsmasq.h"
#include "configmake.h"
+#include "virnetlink.h"
#include "virnetdev.h"
#include "virnetdevip.h"
#include "virnetdevbridge.h"
@@ -2389,11 +2390,16 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
}
/* If forward.type != NONE, turn on global IP forwarding */
- if (network->def->forward.type != VIR_NETWORK_FORWARD_NONE &&
- networkEnableIPForwarding(v4present, v6present) < 0) {
- virReportSystemError(errno, "%s",
- _("failed to enable IP forwarding"));
- goto err3;
+ if (network->def->forward.type != VIR_NETWORK_FORWARD_NONE) {
+ if (!virNetDevIPCheckIPv6Forwarding())
+ goto err3; /* Precise error message already provided */
+
+
+ if (networkEnableIPForwarding(v4present, v6present) < 0) {
+ virReportSystemError(errno, "%s",
+ _("failed to enable IP forwarding"));
+ goto err3;
+ }
}