123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- package netlink
- import (
- "net"
- "syscall"
- "testing"
- "time"
- "github.com/vishvananda/netns"
- )
- func TestRouteAddDel(t *testing.T) {
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
-
- link, err := LinkByName("lo")
- if err != nil {
- t.Fatal(err)
- }
-
- if err := LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
-
- dst := &net.IPNet{
- IP: net.IPv4(192, 168, 0, 0),
- Mask: net.CIDRMask(24, 32),
- }
- ip := net.IPv4(127, 1, 1, 1)
- route := Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
- if err := RouteAdd(&route); err != nil {
- t.Fatal(err)
- }
- routes, err := RouteList(link, FAMILY_V4)
- if err != nil {
- t.Fatal(err)
- }
- if len(routes) != 1 {
- t.Fatal("Route not added properly")
- }
- dstIP := net.IPv4(192, 168, 0, 42)
- routeToDstIP, err := RouteGet(dstIP)
- if err != nil {
- t.Fatal(err)
- }
- if len(routeToDstIP) == 0 {
- t.Fatal("Default route not present")
- }
- if err := RouteDel(&route); err != nil {
- t.Fatal(err)
- }
- routes, err = RouteList(link, FAMILY_V4)
- if err != nil {
- t.Fatal(err)
- }
- if len(routes) != 0 {
- t.Fatal("Route not removed properly")
- }
- }
- func TestRouteAddIncomplete(t *testing.T) {
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
-
- link, err := LinkByName("lo")
- if err != nil {
- t.Fatal(err)
- }
-
- if err = LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
- route := Route{LinkIndex: link.Attrs().Index}
- if err := RouteAdd(&route); err == nil {
- t.Fatal("Adding incomplete route should fail")
- }
- }
- func expectRouteUpdate(ch <-chan RouteUpdate, t uint16, dst net.IP) bool {
- for {
- timeout := time.After(time.Minute)
- select {
- case update := <-ch:
- if update.Type == t && update.Route.Dst.IP.Equal(dst) {
- return true
- }
- case <-timeout:
- return false
- }
- }
- }
- func TestRouteSubscribe(t *testing.T) {
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
- ch := make(chan RouteUpdate)
- done := make(chan struct{})
- defer close(done)
- if err := RouteSubscribe(ch, done); err != nil {
- t.Fatal(err)
- }
-
- link, err := LinkByName("lo")
- if err != nil {
- t.Fatal(err)
- }
-
- if err = LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
-
- dst := &net.IPNet{
- IP: net.IPv4(192, 168, 0, 0),
- Mask: net.CIDRMask(24, 32),
- }
- ip := net.IPv4(127, 1, 1, 1)
- route := Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
- if err := RouteAdd(&route); err != nil {
- t.Fatal(err)
- }
- if !expectRouteUpdate(ch, syscall.RTM_NEWROUTE, dst.IP) {
- t.Fatal("Add update not received as expected")
- }
- if err := RouteDel(&route); err != nil {
- t.Fatal(err)
- }
- if !expectRouteUpdate(ch, syscall.RTM_DELROUTE, dst.IP) {
- t.Fatal("Del update not received as expected")
- }
- }
- func TestRouteSubscribeAt(t *testing.T) {
-
- newNs, err := netns.New()
- if err != nil {
- t.Fatal(err)
- }
- defer newNs.Close()
- nh, err := NewHandleAt(newNs)
- if err != nil {
- t.Fatal(err)
- }
- defer nh.Delete()
-
- ch := make(chan RouteUpdate)
- done := make(chan struct{})
- defer close(done)
- if err := RouteSubscribeAt(newNs, ch, done); err != nil {
- t.Fatal(err)
- }
-
- link, err := nh.LinkByName("lo")
- if err != nil {
- t.Fatal(err)
- }
-
- if err = nh.LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
-
- dst := &net.IPNet{
- IP: net.IPv4(192, 169, 0, 0),
- Mask: net.CIDRMask(24, 32),
- }
- ip := net.IPv4(127, 100, 1, 1)
- route := Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
- if err := nh.RouteAdd(&route); err != nil {
- t.Fatal(err)
- }
- if !expectRouteUpdate(ch, syscall.RTM_NEWROUTE, dst.IP) {
- t.Fatal("Add update not received as expected")
- }
- if err := nh.RouteDel(&route); err != nil {
- t.Fatal(err)
- }
- if !expectRouteUpdate(ch, syscall.RTM_DELROUTE, dst.IP) {
- t.Fatal("Del update not received as expected")
- }
- }
- func TestRouteExtraFields(t *testing.T) {
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
-
- link, err := LinkByName("lo")
- if err != nil {
- t.Fatal(err)
- }
-
- if err = LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
-
- dst := &net.IPNet{
- IP: net.IPv4(1, 1, 1, 1),
- Mask: net.CIDRMask(32, 32),
- }
- src := net.IPv4(127, 3, 3, 3)
- route := Route{
- LinkIndex: link.Attrs().Index,
- Dst: dst,
- Src: src,
- Scope: syscall.RT_SCOPE_LINK,
- Priority: 13,
- Table: syscall.RT_TABLE_MAIN,
- Type: syscall.RTN_UNICAST,
- Tos: 14,
- }
- if err := RouteAdd(&route); err != nil {
- t.Fatal(err)
- }
- routes, err := RouteListFiltered(FAMILY_V4, &Route{
- Dst: dst,
- Src: src,
- Scope: syscall.RT_SCOPE_LINK,
- Table: syscall.RT_TABLE_MAIN,
- Type: syscall.RTN_UNICAST,
- Tos: 14,
- }, RT_FILTER_DST|RT_FILTER_SRC|RT_FILTER_SCOPE|RT_FILTER_TABLE|RT_FILTER_TYPE|RT_FILTER_TOS)
- if err != nil {
- t.Fatal(err)
- }
- if len(routes) != 1 {
- t.Fatal("Route not added properly")
- }
- if routes[0].Scope != syscall.RT_SCOPE_LINK {
- t.Fatal("Invalid Scope. Route not added properly")
- }
- if routes[0].Priority != 13 {
- t.Fatal("Invalid Priority. Route not added properly")
- }
- if routes[0].Table != syscall.RT_TABLE_MAIN {
- t.Fatal("Invalid Scope. Route not added properly")
- }
- if routes[0].Type != syscall.RTN_UNICAST {
- t.Fatal("Invalid Type. Route not added properly")
- }
- if routes[0].Tos != 14 {
- t.Fatal("Invalid Tos. Route not added properly")
- }
- }
- func TestRouteMultiPath(t *testing.T) {
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
-
- link, err := LinkByName("lo")
- if err != nil {
- t.Fatal(err)
- }
-
- if err = LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
-
- dst := &net.IPNet{
- IP: net.IPv4(192, 168, 0, 0),
- Mask: net.CIDRMask(24, 32),
- }
- idx := link.Attrs().Index
- route := Route{Dst: dst, MultiPath: []*NexthopInfo{&NexthopInfo{LinkIndex: idx}, &NexthopInfo{LinkIndex: idx}}}
- if err := RouteAdd(&route); err != nil {
- t.Fatal(err)
- }
- routes, err := RouteList(nil, FAMILY_V4)
- if err != nil {
- t.Fatal(err)
- }
- if len(routes) != 1 {
- t.Fatal("MultiPath Route not added properly")
- }
- if len(routes[0].MultiPath) != 2 {
- t.Fatal("MultiPath Route not added properly")
- }
- }
|