File: class.go

package info (click to toggle)
incus 6.0.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,392 kB
  • sloc: sh: 16,313; ansic: 3,121; python: 457; makefile: 337; ruby: 51; sql: 50; lisp: 6
file content (68 lines) | stat: -rw-r--r-- 1,182 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package ip

import (
	"fmt"

	"github.com/vishvananda/netlink"

	"github.com/lxc/incus/v6/shared/units"
)

// Class represents qdisc class object.
type Class struct {
	Dev     string
	Parent  string
	Classid string
}

// ClassHTB represents htb qdisc class object.
type ClassHTB struct {
	Class
	Rate string
}

// Add adds class to a node.
func (class *ClassHTB) Add() error {
	link, err := linkByName(class.Dev)
	if err != nil {
		return err
	}

	parent, err := parseHandle(class.Parent)
	if err != nil {
		return err
	}

	classAttrs := netlink.ClassAttrs{
		LinkIndex:  link.Attrs().Index,
		Parent:     parent,
		Statistics: nil,
	}

	htbClassAttrs := netlink.HtbClassAttrs{}

	if class.Classid != "" {
		handle, err := parseHandle(class.Classid)
		if err != nil {
			return err
		}

		classAttrs.Handle = handle
	}

	if class.Rate != "" {
		rate, err := units.ParseBitSizeString(class.Rate)
		if err != nil {
			return fmt.Errorf("Invalid rate %q: %w", class.Rate, err)
		}

		htbClassAttrs.Rate = uint64(rate)
	}

	err = netlink.ClassAdd(netlink.NewHtbClass(classAttrs, htbClassAttrs))
	if err != nil {
		return fmt.Errorf("Failed to add htb class: %w", err)
	}

	return nil
}