Skip to content

Commit

Permalink
Merge pull request #3 from aboch/master
Browse files Browse the repository at this point in the history
Add implementation and test for SetIPForwarding()
  • Loading branch information
Arnaud Porterie committed Mar 4, 2015
2 parents 764e25e + 2607011 commit 1bb681b
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 4 deletions.
4 changes: 0 additions & 4 deletions drivers/bridge/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,3 @@ func (b *BridgeSetup) QueueStep(step SetupStep) {
func SetupIPTables(i *Interface) error {
return nil
}

func SetupIPForwarding(i *Interface) error {
return nil
}
20 changes: 20 additions & 0 deletions drivers/bridge/setup_ip_forwarding.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package bridge

import (
"fmt"
"io/ioutil"
)

const (
IPV4_FORW_CONF_FILE = "/proc/sys/net/ipv4/ip_forward"
PERM = 0644
)

func SetupIPForwarding(i *Interface) error {
// Sanity Check
if i.Config.EnableIPForwarding == false {
return fmt.Errorf("Unexpected request to enable IP Forwarding for: %v", *i)
}
// Enable IPv4 forwarding
return ioutil.WriteFile(IPV4_FORW_CONF_FILE, []byte{'1', '\n'}, PERM)
}
78 changes: 78 additions & 0 deletions drivers/bridge/setup_ip_forwarding_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package bridge

import (
"bytes"
"io/ioutil"
"testing"
)

func TestSetupIPForwarding(t *testing.T) {
// Read current setting and ensure the original value gets restored
procSetting := readCurrentIPForwardingSetting(t)
defer reconcileIPForwardingSetting(t, procSetting)

// Disable IP Forwarding if enabled
if bytes.Compare(procSetting, []byte("1\n")) == 0 {
writeIPForwardingSetting(t, []byte{'0', '\n'})
}

// Create test interface with ip forwarding setting enabled
br := &Interface{
Config: &Configuration{
BridgeName: DefaultBridgeName,
EnableIPForwarding: true,
},
}

// Set IP Forwarding
if err := SetupIPForwarding(br); err != nil {
t.Fatalf("Failed to setup IP forwarding: %v", err)
}

// Read new setting
procSetting = readCurrentIPForwardingSetting(t)
if bytes.Compare(procSetting, []byte("1\n")) != 0 {
t.Fatalf("Failed to effectively setup IP forwarding")
}
}

func TestUnexpectedSetupIPForwarding(t *testing.T) {
// Read current setting and ensure the original value gets restored
procSetting := readCurrentIPForwardingSetting(t)
defer reconcileIPForwardingSetting(t, procSetting)

// Create test interface without ip forwarding setting enabled
br := &Interface{
Config: &Configuration{
BridgeName: DefaultBridgeName,
EnableIPForwarding: false,
},
}

// Attempt Set IP Forwarding
if err := SetupIPForwarding(br); err == nil {
t.Fatalf(err.Error())
}
}

func readCurrentIPForwardingSetting(t *testing.T) []byte {
procSetting, err := ioutil.ReadFile(IPV4_FORW_CONF_FILE)
if err != nil {
t.Fatalf("Can't execute test: Failed to read current IP forwarding setting: %v", err)
}
return procSetting
}

func writeIPForwardingSetting(t *testing.T, chars []byte) {
err := ioutil.WriteFile(IPV4_FORW_CONF_FILE, chars, PERM)
if err != nil {
t.Fatalf("Can't execute or cleanup after test: Failed to reset IP forwarding: %v", err)
}
}

func reconcileIPForwardingSetting(t *testing.T, original []byte) {
current := readCurrentIPForwardingSetting(t)
if bytes.Compare(original, current) != 0 {
writeIPForwardingSetting(t, original)
}
}

0 comments on commit 1bb681b

Please sign in to comment.