...
1
2
3 package tc
4
5 import (
6 "context"
7 "net"
8 "os"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12 "github.com/vishvananda/netlink"
13 "github.com/vishvananda/netns"
14 "golang.org/x/sys/unix"
15
16 "edge-infra.dev/pkg/lib/kernel/netlink/ip"
17 testnetns "edge-infra.dev/pkg/lib/kernel/netlink/netns"
18
19 "edge-infra.dev/test/f2"
20 )
21
22 var (
23 ipFilter = net.ParseIP("192.168.1.1")
24 maskFilter = net.ParseIP("255.255.255.255")
25 major uint16 = 0x1
26 minor uint16 = 0x2
27 priority uint32 = 1
28 rate uint64 = 4e+6
29 replaceRate uint64 = 10e+6
30 )
31
32 var f f2.Framework
33
34 func TestMain(m *testing.M) {
35 f = f2.New(context.Background(), f2.WithExtensions()).
36 Setup().
37 Teardown()
38 os.Exit(f.Run(m))
39 }
40
41 func TestLinuxTrafficControl(t *testing.T) {
42 var tearDownFunction func()
43 var ns netns.NsHandle
44 var link netlink.Link
45
46 feature := f2.NewFeature("traffic control").
47 Setup("setup testing namespace", func(ctx f2.Context, t *testing.T) f2.Context {
48
49 ns, tearDownFunction = testnetns.NewTestingNetworkNamespace(t)
50 assert.NoError(t, testnetns.CreateDummyLink())
51
52 dummyLink, err := testnetns.GetDummyLink()
53 assert.NoError(t, err)
54 link = dummyLink
55
56 return ctx
57 }).
58 Test("create qdisc", func(ctx f2.Context, t *testing.T) f2.Context {
59 assert.NoError(t, netns.Set(ns))
60
61 htbAttrs := NewQdiscAttrs().WithMakeHandle(major, 0x0).WithLinkIndex(link.Attrs().Index).WithParent(netlink.HANDLE_ROOT).Build()
62 qdisc := NewHtb().WithAttrs(htbAttrs).WithDefaultClass(uint32(minor)).WithRate2Quantum(1500)
63 assert.NoError(t, qdisc.Add())
64
65 return ctx
66 }).
67 Test("create class", func(ctx f2.Context, t *testing.T) f2.Context {
68 assert.NoError(t, netns.Set(ns))
69
70 classAttrs := NewClassAttrs().WithLinkIndex(link.Attrs().Index).WithMakeHandle(minor, major).WithParent(netlink.HANDLE_ROOT).Build()
71 class := NewClass().WithAttrs(classAttrs).WithRateLimit(rate).WithPriority(priority)
72 assert.NoError(t, class.Add())
73
74 class = NewClass().WithAttrs(classAttrs).WithRateLimit(replaceRate).WithPriority(priority)
75 assert.NoError(t, class.Replace())
76
77 return ctx
78 }).
79 Test("create filter", func(ctx f2.Context, t *testing.T) f2.Context {
80 filterAttrs := NewFilterAttrs().WithLinkIndex(link.Attrs().Index).WithMakeParent(major, 0x0).WithProtocol(unix.ETH_P_IP).WithPriority(uint16(priority)).WithMakeHandle(major, minor).Build()
81 matchIP := NewMatchIP().WithIPv4HeaderOffset(ip.DstAddressBitOffset).WithIP(&ipFilter).WithMask(&maskFilter)
82 filter := NewU32Filter().WithAttrs(filterAttrs).WithMakeClassID(major, minor).WithMatchIP(matchIP).WithHashTable(uint32(major))
83
84 assert.NoError(t, filter.Replace())
85
86 return ctx
87 }).
88 Teardown("teardown testing namespace", func(ctx f2.Context, _ *testing.T) f2.Context {
89 tearDownFunction()
90 return ctx
91 }).Feature()
92
93 f.Test(t, feature)
94 }
95
View as plain text