...
1
2
3 package tc
4
5 import (
6 "github.com/vishvananda/netlink"
7 )
8
9 var (
10 defaultQuantum uint32 = 1514
11 )
12
13 type Class struct {
14 attrs netlink.ClassAttrs
15 rate uint64
16 quantum uint32
17 priority uint32
18 }
19
20 func NewClass() *Class {
21 return &Class{}
22 }
23
24 func (c *Class) WithAttrs(attrs netlink.ClassAttrs) *Class {
25 c.attrs = attrs
26 return c
27 }
28
29 func (c *Class) WithRateLimit(rate uint64) *Class {
30 c.rate = rate
31 return c
32 }
33
34 func (c *Class) WithQuantum(quantum uint32) *Class {
35 c.quantum = quantum
36 return c
37 }
38
39 func (c *Class) WithPriority(priority uint32) *Class {
40 c.priority = priority
41 return c
42 }
43
44 func (c *Class) Add() error {
45 class := c.Build()
46 if err := netlink.ClassAdd(class); err != nil {
47 return formatTcError("error creating class", class.Attrs().LinkIndex, class.Attrs().Parent, class.Attrs().Handle, err)
48 }
49 return nil
50 }
51
52
53 func (c *Class) Replace() error {
54 class := c.Build()
55 if err := netlink.ClassReplace(class); err != nil {
56 return formatTcError("error replacing class", class.Attrs().LinkIndex, class.Attrs().Parent, class.Attrs().Handle, err)
57 }
58 return nil
59 }
60
61 func (c *Class) Delete() error {
62 class := c.Build()
63 if err := netlink.ClassDel(class); err != nil && !errorIsNotFound(err) {
64 return err
65 }
66 return nil
67 }
68
69 func (c *Class) Build() netlink.Class {
70 htbClassAttrs := netlink.HtbClassAttrs{}
71 htbClassAttrs.Rate = c.rate
72 htbClassAttrs.Ceil = c.rate
73 htbClassAttrs.Prio = c.priority
74 if c.quantum == 0 {
75 htbClassAttrs.Quantum = defaultQuantum
76 }
77 return netlink.NewHtbClass(c.attrs, htbClassAttrs)
78 }
79
View as plain text