...

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

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

     1  //go:build linux
     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  // atomic del/add on class
    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