...
1
2
3 package tc
4
5 import (
6 "fmt"
7
8 "github.com/vishvananda/netlink"
9 )
10
11 type Htb struct {
12 attrs netlink.QdiscAttrs
13 defaultClass uint32
14 rate2quantum uint32
15 }
16
17 func NewHtb() *Htb {
18 return &Htb{}
19 }
20
21 func (q *Htb) WithDefaultClass(class uint32) *Htb {
22 q.defaultClass = class
23 return q
24 }
25
26 func (q *Htb) WithRate2Quantum(r2q uint32) *Htb {
27 q.rate2quantum = r2q
28 return q
29 }
30
31 func (q *Htb) WithAttrs(attrs netlink.QdiscAttrs) *Htb {
32 q.attrs = attrs
33 return q
34 }
35
36 func (q *Htb) Build() netlink.Qdisc {
37 htb := netlink.NewHtb(q.attrs)
38 htb.Defcls = q.defaultClass
39 htb.Rate2Quantum = q.rate2quantum
40 return htb
41 }
42
43 func (q *Htb) Add() error {
44 qdisc := q.Build()
45 return AddQdisc(qdisc)
46 }
47
48 func (q *Htb) Replace() error {
49 qdisc := q.Build()
50 return ReplaceQdisc(qdisc)
51 }
52
53 func (q *Htb) Delete() error {
54 qdisc := q.Build()
55 return DeleteQdisc(qdisc)
56 }
57
58 type Ingress struct {
59 attrs netlink.QdiscAttrs
60 }
61
62 func NewIngressQdisc() *Ingress {
63 return &Ingress{}
64 }
65
66 func (q *Ingress) WithAttrs(attrs netlink.QdiscAttrs) *Ingress {
67 q.attrs = attrs
68 return q
69 }
70
71 func (q *Ingress) Build() netlink.Qdisc {
72 ingress := netlink.Ingress{}
73 ingress.QdiscAttrs = q.attrs
74 return &ingress
75 }
76
77 func (q *Ingress) Add() error {
78 qdisc := q.Build()
79 return AddQdisc(qdisc)
80 }
81
82 func (q *Ingress) Replace() error {
83 qdisc := q.Build()
84 return ReplaceQdisc(qdisc)
85 }
86
87 func (q *Ingress) Delete() error {
88 qdisc := q.Build()
89 return DeleteQdisc(qdisc)
90 }
91
92 func ReplaceQdisc(qdisc netlink.Qdisc) error {
93 if err := netlink.QdiscReplace(qdisc); err != nil {
94 return formatTcError("error replacing qdisc with parent", qdisc.Attrs().LinkIndex, qdisc.Attrs().Parent, qdisc.Attrs().Handle, err)
95 }
96 return nil
97 }
98
99 func AddQdisc(qdisc netlink.Qdisc) error {
100 if err := netlink.QdiscAdd(qdisc); err != nil && !errorIsFileExists(err) {
101 return formatTcError("error creating qdisc", qdisc.Attrs().LinkIndex, qdisc.Attrs().Parent, qdisc.Attrs().Handle, err)
102 }
103 return nil
104 }
105
106 func DeleteQdisc(qdisc netlink.Qdisc) error {
107 if err := netlink.QdiscDel(qdisc); err != nil && !errorIsNotFound(err) {
108 return fmt.Errorf("error deleting qdisc %+v: %w", qdisc, err)
109 }
110 return nil
111 }
112
View as plain text