Skip to content

Commit 1bb681b

Browse files
author
Arnaud Porterie
committed
Merge pull request #3 from aboch/master
Add implementation and test for SetIPForwarding()
2 parents 764e25e + 2607011 commit 1bb681b

File tree

3 files changed

+98
-4
lines changed

3 files changed

+98
-4
lines changed

drivers/bridge/setup.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,3 @@ func (b *BridgeSetup) QueueStep(step SetupStep) {
2929
func SetupIPTables(i *Interface) error {
3030
return nil
3131
}
32-
33-
func SetupIPForwarding(i *Interface) error {
34-
return nil
35-
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package bridge
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
)
7+
8+
const (
9+
IPV4_FORW_CONF_FILE = "/proc/sys/net/ipv4/ip_forward"
10+
PERM = 0644
11+
)
12+
13+
func SetupIPForwarding(i *Interface) error {
14+
// Sanity Check
15+
if i.Config.EnableIPForwarding == false {
16+
return fmt.Errorf("Unexpected request to enable IP Forwarding for: %v", *i)
17+
}
18+
// Enable IPv4 forwarding
19+
return ioutil.WriteFile(IPV4_FORW_CONF_FILE, []byte{'1', '\n'}, PERM)
20+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package bridge
2+
3+
import (
4+
"bytes"
5+
"io/ioutil"
6+
"testing"
7+
)
8+
9+
func TestSetupIPForwarding(t *testing.T) {
10+
// Read current setting and ensure the original value gets restored
11+
procSetting := readCurrentIPForwardingSetting(t)
12+
defer reconcileIPForwardingSetting(t, procSetting)
13+
14+
// Disable IP Forwarding if enabled
15+
if bytes.Compare(procSetting, []byte("1\n")) == 0 {
16+
writeIPForwardingSetting(t, []byte{'0', '\n'})
17+
}
18+
19+
// Create test interface with ip forwarding setting enabled
20+
br := &Interface{
21+
Config: &Configuration{
22+
BridgeName: DefaultBridgeName,
23+
EnableIPForwarding: true,
24+
},
25+
}
26+
27+
// Set IP Forwarding
28+
if err := SetupIPForwarding(br); err != nil {
29+
t.Fatalf("Failed to setup IP forwarding: %v", err)
30+
}
31+
32+
// Read new setting
33+
procSetting = readCurrentIPForwardingSetting(t)
34+
if bytes.Compare(procSetting, []byte("1\n")) != 0 {
35+
t.Fatalf("Failed to effectively setup IP forwarding")
36+
}
37+
}
38+
39+
func TestUnexpectedSetupIPForwarding(t *testing.T) {
40+
// Read current setting and ensure the original value gets restored
41+
procSetting := readCurrentIPForwardingSetting(t)
42+
defer reconcileIPForwardingSetting(t, procSetting)
43+
44+
// Create test interface without ip forwarding setting enabled
45+
br := &Interface{
46+
Config: &Configuration{
47+
BridgeName: DefaultBridgeName,
48+
EnableIPForwarding: false,
49+
},
50+
}
51+
52+
// Attempt Set IP Forwarding
53+
if err := SetupIPForwarding(br); err == nil {
54+
t.Fatalf(err.Error())
55+
}
56+
}
57+
58+
func readCurrentIPForwardingSetting(t *testing.T) []byte {
59+
procSetting, err := ioutil.ReadFile(IPV4_FORW_CONF_FILE)
60+
if err != nil {
61+
t.Fatalf("Can't execute test: Failed to read current IP forwarding setting: %v", err)
62+
}
63+
return procSetting
64+
}
65+
66+
func writeIPForwardingSetting(t *testing.T, chars []byte) {
67+
err := ioutil.WriteFile(IPV4_FORW_CONF_FILE, chars, PERM)
68+
if err != nil {
69+
t.Fatalf("Can't execute or cleanup after test: Failed to reset IP forwarding: %v", err)
70+
}
71+
}
72+
73+
func reconcileIPForwardingSetting(t *testing.T, original []byte) {
74+
current := readCurrentIPForwardingSetting(t)
75+
if bytes.Compare(original, current) != 0 {
76+
writeIPForwardingSetting(t, original)
77+
}
78+
}

0 commit comments

Comments
 (0)