|
@@ -12,8 +12,10 @@ import (
|
|
|
var bridgeIPv6 *net.IPNet
|
|
|
|
|
|
const (
|
|
|
- bridgeIPv6Str = "fe80::1/64"
|
|
|
- ipv6ForwardConfPerm = 0644
|
|
|
+ bridgeIPv6Str = "fe80::1/64"
|
|
|
+ ipv6ForwardConfPerm = 0644
|
|
|
+ ipv6ForwardConfDefault = "/proc/sys/net/ipv6/conf/default/forwarding"
|
|
|
+ ipv6ForwardConfAll = "/proc/sys/net/ipv6/conf/all/forwarding"
|
|
|
)
|
|
|
|
|
|
func init() {
|
|
@@ -27,10 +29,16 @@ func init() {
|
|
|
}
|
|
|
|
|
|
func setupBridgeIPv6(config *networkConfiguration, i *bridgeInterface) error {
|
|
|
- // Enable IPv6 on the bridge
|
|
|
procFile := "/proc/sys/net/ipv6/conf/" + config.BridgeName + "/disable_ipv6"
|
|
|
- if err := ioutil.WriteFile(procFile, []byte{'0', '\n'}, ipv6ForwardConfPerm); err != nil {
|
|
|
- return fmt.Errorf("Unable to enable IPv6 addresses on bridge: %v", err)
|
|
|
+ ipv6BridgeData, err := ioutil.ReadFile(procFile)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("Cannot read IPv6 setup for bridge %v: %v", config.BridgeName, err)
|
|
|
+ }
|
|
|
+ // Enable IPv6 on the bridge only if it isn't already enabled
|
|
|
+ if ipv6BridgeData[0] != '0' {
|
|
|
+ if err := ioutil.WriteFile(procFile, []byte{'0', '\n'}, ipv6ForwardConfPerm); err != nil {
|
|
|
+ return fmt.Errorf("Unable to enable IPv6 addresses on bridge: %v", err)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
_, addrsv6, err := i.addresses()
|
|
@@ -70,12 +78,29 @@ func setupGatewayIPv6(config *networkConfiguration, i *bridgeInterface) error {
|
|
|
}
|
|
|
|
|
|
func setupIPv6Forwarding(config *networkConfiguration, i *bridgeInterface) error {
|
|
|
- // Enable IPv6 forwarding
|
|
|
- if err := ioutil.WriteFile("/proc/sys/net/ipv6/conf/default/forwarding", []byte{'1', '\n'}, ipv6ForwardConfPerm); err != nil {
|
|
|
- logrus.Warnf("Unable to enable IPv6 default forwarding: %v", err)
|
|
|
+ // Get current IPv6 default forwarding setup
|
|
|
+ ipv6ForwardDataDefault, err := ioutil.ReadFile(ipv6ForwardConfDefault)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("Cannot read IPv6 default forwarding setup: %v", err)
|
|
|
}
|
|
|
- if err := ioutil.WriteFile("/proc/sys/net/ipv6/conf/all/forwarding", []byte{'1', '\n'}, ipv6ForwardConfPerm); err != nil {
|
|
|
- logrus.Warnf("Unable to enable IPv6 all forwarding: %v", err)
|
|
|
+ // Enable IPv6 default forwarding only if it is not already enabled
|
|
|
+ if ipv6ForwardDataDefault[0] != '1' {
|
|
|
+ if err := ioutil.WriteFile(ipv6ForwardConfDefault, []byte{'1', '\n'}, ipv6ForwardConfPerm); err != nil {
|
|
|
+ logrus.Warnf("Unable to enable IPv6 default forwarding: %v", err)
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ // Get current IPv6 all forwarding setup
|
|
|
+ ipv6ForwardDataAll, err := ioutil.ReadFile(ipv6ForwardConfAll)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("Cannot read IPv6 all forwarding setup: %v", err)
|
|
|
+ }
|
|
|
+ // Enable IPv6 all forwarding only if it is not already enabled
|
|
|
+ if ipv6ForwardDataAll[0] != '1' {
|
|
|
+ if err := ioutil.WriteFile(ipv6ForwardConfAll, []byte{'1', '\n'}, ipv6ForwardConfPerm); err != nil {
|
|
|
+ logrus.Warnf("Unable to enable IPv6 all forwarding: %v", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return nil
|
|
|
}
|