//go:build linux package tc import ( "github.com/vishvananda/netlink" ) var ( defaultQuantum uint32 = 1514 ) type Class struct { attrs netlink.ClassAttrs rate uint64 quantum uint32 priority uint32 } func NewClass() *Class { return &Class{} } func (c *Class) WithAttrs(attrs netlink.ClassAttrs) *Class { c.attrs = attrs return c } func (c *Class) WithRateLimit(rate uint64) *Class { c.rate = rate return c } func (c *Class) WithQuantum(quantum uint32) *Class { c.quantum = quantum return c } func (c *Class) WithPriority(priority uint32) *Class { c.priority = priority return c } func (c *Class) Add() error { class := c.Build() if err := netlink.ClassAdd(class); err != nil { return formatTcError("error creating class", class.Attrs().LinkIndex, class.Attrs().Parent, class.Attrs().Handle, err) } return nil } // atomic del/add on class func (c *Class) Replace() error { class := c.Build() if err := netlink.ClassReplace(class); err != nil { return formatTcError("error replacing class", class.Attrs().LinkIndex, class.Attrs().Parent, class.Attrs().Handle, err) } return nil } func (c *Class) Delete() error { class := c.Build() if err := netlink.ClassDel(class); err != nil && !errorIsNotFound(err) { return err } return nil } func (c *Class) Build() netlink.Class { htbClassAttrs := netlink.HtbClassAttrs{} htbClassAttrs.Rate = c.rate htbClassAttrs.Ceil = c.rate htbClassAttrs.Prio = c.priority if c.quantum == 0 { htbClassAttrs.Quantum = defaultQuantum } return netlink.NewHtbClass(c.attrs, htbClassAttrs) }