Skip to content

Commit

Permalink
add routing test
Browse files Browse the repository at this point in the history
  • Loading branch information
ophum committed Jan 6, 2021
1 parent 259932a commit 57f19fd
Show file tree
Hide file tree
Showing 4 changed files with 249 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .travis.script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ go test github.com/google/gopacket/tcpassembly
go test github.com/google/gopacket/reassembly
go test github.com/google/gopacket/pcapgo
go test github.com/google/gopacket/pcap
go test github.com/google/gopacket/routing
sudo go test github.com/google/gopacket/routing
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ module github.com/google/gopacket
go 1.12

require (
github.com/vishvananda/netlink v1.1.0
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/net v0.0.0-20190620200207-3b0461eec859
golang.org/x/sys v0.0.0-20190412213103-97732733099d
golang.org/x/sys v0.0.0-20200217220822-9197077df867
)
8 changes: 8 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0=
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA=
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
Expand All @@ -13,6 +18,9 @@ golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67 h1:1Fzlr8kkDLQwqMP8GxrhptBLq
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw=
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
Expand Down
237 changes: 237 additions & 0 deletions routing/routing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ package routing
import (
"fmt"
"net"
"runtime"
"testing"

"github.com/vishvananda/netlink"
"github.com/vishvananda/netns"
)

func TestPrivateRoute(t *testing.T) {
Expand Down Expand Up @@ -275,3 +279,236 @@ func TestPrivateRoute(t *testing.T) {
}

}

func TestRouting(t *testing.T) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()

// parent network namespace
testNs, _ := netns.New()
defer testNs.Close()

// child network namespace
newns, _ := netns.New()
defer newns.Close()

veth0 := &netlink.Veth{
LinkAttrs: netlink.LinkAttrs{
Name: "veth0",
},
PeerName: "veth0-peer",
}

veth1 := &netlink.Veth{
LinkAttrs: netlink.LinkAttrs{
Name: "veth1",
},
PeerName: "veth1-peer",
}

// ip link add veth0 type veth peer name veth0-peer
if err := netlink.LinkAdd(veth0); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link add veth0 type veth peer name veth0-peer: %#v\n\n", err)
return
}

// ip link add veth1 type veth peer name veth1-peer
if err := netlink.LinkAdd(veth1); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link add veth1 type veth peer name veth1-peer: %#v\n\n", err)
return
}

// ip address add 192.168.10.1/24 dev veth0
veth0Addr, err := netlink.ParseAddr("192.168.10.1/24")
if err != nil {
t.Errorf("\nFailed SetUp Test Environment: parse addr 192.168.10.1/24: %#v\n\n", err)
return
}
if err := netlink.AddrAdd(veth0, veth0Addr); err != nil {
t.Errorf("\nFailed SetUp Test Environment: address add 192.168.10.1/24 dev veth0: %#v\n\n", err)
return
}

// ip address add 192.168.20.1/24 dev veth1
veth1Addr, err := netlink.ParseAddr("192.168.20.1/24")
if err != nil {
t.Errorf("\nFailed SetUp Test Environment: parse addr 192.168.20.1/24: %#v\n\n", err)
return
}
if err := netlink.AddrAdd(veth1, veth1Addr); err != nil {
t.Errorf("\nFailed SetUp Test Environment: parse addr 192.168.20.1/24 dev veth1: %#v\n\n", err)
return
}

// ip link set up veth0
if err := netlink.LinkSetUp(veth0); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link set up veth0: %#v\n\n", err)
return
}

// ip link set up veth1
if err := netlink.LinkSetUp(veth1); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link set up veth1: %#v\n\n", err)
return
}

veth0Peer, err := netlink.LinkByName("veth0-peer")
if err != nil {
t.Errorf("\nFailed SetUp Test Environment: link by name veth0-peer: %#v\n\n", err)
return
}
// ip link set up veth0-peer
if err := netlink.LinkSetUp(veth0Peer); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link set up veth0-peer: %#v\n\n", err)
return
}
// ip link set dev veth0-peer netns {testNs}
if err := netlink.LinkSetNsFd(veth0Peer, int(testNs)); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link set dev veth0-peer netns testNs: %#v\n\n", err)
return
}

veth1Peer, err := netlink.LinkByName("veth1-peer")
if err != nil {
t.Errorf("\nFailed SetUp Test Environment: link by name veth1-peer: %#v\n\n", err)
return
}
// ip link set up veth1-peer
if err := netlink.LinkSetUp(veth1Peer); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link set up veth1-peer: %#v\n\n", err)
return
}
// ip link set dev veth1-peer netns {testNs}
if err := netlink.LinkSetNsFd(veth1Peer, int(testNs)); err != nil {
t.Errorf("\nFailed SetUp Test Environment: link set dev veth1-peer netns testNs: %#v\n\n", err)
return
}

/**
* routing table
* 192.168.10.0/24 dev veth0 proto kernel scope link src 192.168.10.1
* 192.168.20.0/24 dev veth1 proto kernel scope link src 192.168.20.1
*/

t.Run("exists route without default gateway", func(t *testing.T) {
netns.Set(newns)
r, err := New()
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil", err)
return
}

iface, _, _, err := r.Route(net.ParseIP("192.168.10.2"))
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil", err)
}

if veth0.Index != iface.Index {
t.Errorf("\ngot: %d\nwant: %d\n\n", iface.Index, veth0.Index)
}

iface, _, _, err = r.Route(net.ParseIP("192.168.20.2"))
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil", err)
}

if veth1.Index != iface.Index {
t.Errorf("\ngot: %d\nwant: %d\n\n", iface.Index, veth1.Index)
}
})

t.Run("not exists route without default gateway", func(t *testing.T) {
netns.Set(newns)

r, err := New()
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil\n\n", err)
return
}

if _, _, _, err = r.Route(net.ParseIP("172.16.0.1")); err == nil && err == fmt.Errorf("no route found for 172.16.0.1") {
t.Errorf("\ngot: %#v\nwant: %#v\n\n", err, fmt.Errorf("no route found for 172.16.0.1"))
return
}
})

t.Run("exists route with default gateway", func(t *testing.T) {
netns.Set(newns)

netlink.RouteAdd(&netlink.Route{
Gw: net.ParseIP("192.168.20.254"),
LinkIndex: veth1.Index,
})
defer func() {
// teardown
netlink.RouteDel(&netlink.Route{
Gw: net.ParseIP("192.168.20.254"),
LinkIndex: veth1.Index,
})
}()

r, err := New()
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil\n\n", err)
return
}

iface, gateway, prefSrc, err := r.Route(net.ParseIP("192.168.10.2"))
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil\n\n", err)
return
}

if veth0.Index != iface.Index {
t.Errorf("\ngot: %d\nwant: %d\n\n", iface.Index, veth0.Index)
}

if gateway != nil {
t.Errorf("\ngot: %#v\nwant: nil\n\n", gateway)
}

if !prefSrc.Equal(net.ParseIP("192.168.10.1")) {
t.Errorf("\ngot: %#v\nwant: %#v\n\n", prefSrc, net.ParseIP("192.168.10.1"))
}
})

t.Run("not exists route with default gateway", func(t *testing.T) {
netns.Set(newns)

netlink.RouteAdd(&netlink.Route{
Gw: net.ParseIP("192.168.20.254"),
LinkIndex: veth1.Index,
})
defer func() {
// teardown
netlink.RouteDel(&netlink.Route{
Gw: net.ParseIP("192.168.20.254"),
LinkIndex: veth1.Index,
})
}()

r, err := New()
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil\n\n", err)
return
}

iface, gateway, prefSrc, err := r.Route(net.ParseIP("172.16.0.1"))
if err != nil {
t.Errorf("\ngot: %#v\nwant: nil\n\n", err)
return
}

if veth1.Index != iface.Index {
t.Errorf("\ngot: %d\nwant: %d\n\n", iface.Index, veth1.Index)
}

if !gateway.Equal(net.ParseIP("192.168.20.254")) {
t.Errorf("\ngot: %#v\nwant: %#v\n\n", gateway, net.ParseIP("192.168.20.254"))
}

if !prefSrc.Equal(net.ParseIP("192.168.20.1")) {
t.Errorf("\ngot: %#v\nwant: %#v\n\n", prefSrc, net.ParseIP("192.168.20.1"))
}
})
}

0 comments on commit 57f19fd

Please sign in to comment.