...

Source file src/edge-infra.dev/pkg/lib/kernel/netlink/tc/tc_test.go

Documentation: edge-infra.dev/pkg/lib/kernel/netlink/tc

     1  //go:build linux
     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  // 4mbit/s
    29  	replaceRate uint64 = 10e+6 // 10mbit/s
    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  			// until we figure out how to test with kernel modules installed these tests will be skipped
    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() /* #nosec G115 */
    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