//go:build linux package tc import ( "fmt" "github.com/vishvananda/netlink" ) type Htb struct { attrs netlink.QdiscAttrs defaultClass uint32 rate2quantum uint32 } func NewHtb() *Htb { return &Htb{} } func (q *Htb) WithDefaultClass(class uint32) *Htb { q.defaultClass = class return q } func (q *Htb) WithRate2Quantum(r2q uint32) *Htb { q.rate2quantum = r2q return q } func (q *Htb) WithAttrs(attrs netlink.QdiscAttrs) *Htb { q.attrs = attrs return q } func (q *Htb) Build() netlink.Qdisc { htb := netlink.NewHtb(q.attrs) htb.Defcls = q.defaultClass htb.Rate2Quantum = q.rate2quantum return htb } func (q *Htb) Add() error { qdisc := q.Build() return AddQdisc(qdisc) } func (q *Htb) Replace() error { qdisc := q.Build() return ReplaceQdisc(qdisc) } func (q *Htb) Delete() error { qdisc := q.Build() return DeleteQdisc(qdisc) } type Ingress struct { attrs netlink.QdiscAttrs } func NewIngressQdisc() *Ingress { return &Ingress{} } func (q *Ingress) WithAttrs(attrs netlink.QdiscAttrs) *Ingress { q.attrs = attrs return q } func (q *Ingress) Build() netlink.Qdisc { ingress := netlink.Ingress{} ingress.QdiscAttrs = q.attrs return &ingress } func (q *Ingress) Add() error { qdisc := q.Build() return AddQdisc(qdisc) } func (q *Ingress) Replace() error { qdisc := q.Build() return ReplaceQdisc(qdisc) } func (q *Ingress) Delete() error { qdisc := q.Build() return DeleteQdisc(qdisc) } func ReplaceQdisc(qdisc netlink.Qdisc) error { if err := netlink.QdiscReplace(qdisc); err != nil { return formatTcError("error replacing qdisc with parent", qdisc.Attrs().LinkIndex, qdisc.Attrs().Parent, qdisc.Attrs().Handle, err) } return nil } func AddQdisc(qdisc netlink.Qdisc) error { if err := netlink.QdiscAdd(qdisc); err != nil && !errorIsFileExists(err) { return formatTcError("error creating qdisc", qdisc.Attrs().LinkIndex, qdisc.Attrs().Parent, qdisc.Attrs().Handle, err) } return nil } func DeleteQdisc(qdisc netlink.Qdisc) error { if err := netlink.QdiscDel(qdisc); err != nil && !errorIsNotFound(err) { return fmt.Errorf("error deleting qdisc %+v: %w", qdisc, err) } return nil }