...

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

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

     1  //go:build linux
     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