netlink/qdisc.go

116 lines
2.3 KiB
Go
Raw Normal View History

2015-08-18 10:16:54 +00:00
package netlink
import (
"fmt"
)
const (
HANDLE_NONE = 0
HANDLE_INGRESS = 0xFFFFFFF1
HANDLE_ROOT = 0xFFFFFFFF
PRIORITY_MAP_LEN = 16
)
type Qdisc interface {
Attrs() *QdiscAttrs
Type() string
}
// Qdisc represents a netlink qdisc. A qdisc is associated with a link,
2015-08-19 23:02:04 +00:00
// has a handle, a parent and a refcnt. The root qdisc of a device should
// have parent == HANDLE_ROOT.
2015-08-18 10:16:54 +00:00
type QdiscAttrs struct {
LinkIndex int
Handle uint32
Parent uint32
2015-08-19 23:02:04 +00:00
Refcnt uint32 // read only
2015-08-18 10:16:54 +00:00
}
func (q QdiscAttrs) String() string {
2015-08-19 23:02:04 +00:00
return fmt.Sprintf("{LinkIndex: %d, Handle: %s, Parent: %s, Refcnt: %s}", q.LinkIndex, HandleStr(q.Handle), HandleStr(q.Parent), q.Refcnt)
2015-08-18 10:16:54 +00:00
}
func MakeHandle(major, minor uint16) uint32 {
2015-08-18 21:07:01 +00:00
return (uint32(major) << 16) | uint32(minor)
2015-08-18 10:16:54 +00:00
}
func MajorMinor(handle uint32) (uint16, uint16) {
return uint16((handle & 0xFFFF0000) >> 16), uint16(handle & 0x0000FFFFF)
}
func HandleStr(handle uint32) string {
switch handle {
case HANDLE_NONE:
return "none"
case HANDLE_INGRESS:
return "ingress"
case HANDLE_ROOT:
return "root"
default:
major, minor := MajorMinor(handle)
return fmt.Sprintf("%x:%x", major, minor)
}
}
// PfifoFast is the default qdisc created by the kernel if one has not
// been defined for the interface
type PfifoFast struct {
QdiscAttrs
Bands uint8
PriorityMap [PRIORITY_MAP_LEN]uint8
}
func (qdisc *PfifoFast) Attrs() *QdiscAttrs {
return &qdisc.QdiscAttrs
}
func (qdisc *PfifoFast) Type() string {
return "pfifo_fast"
}
2015-08-19 23:02:04 +00:00
// Tbf is a classful qdisc that rate limits based on tokens
type Tbf struct {
2015-08-18 10:16:54 +00:00
QdiscAttrs
2015-08-18 21:07:01 +00:00
// TODO: handle 64bit rate properly
Rate uint64
Limit uint32
Buffer uint32
// TODO: handle other settings
2015-08-18 10:16:54 +00:00
}
2015-08-19 23:02:04 +00:00
func (qdisc *Tbf) Attrs() *QdiscAttrs {
2015-08-18 10:16:54 +00:00
return &qdisc.QdiscAttrs
}
2015-08-19 23:02:04 +00:00
func (qdisc *Tbf) Type() string {
2015-08-18 10:16:54 +00:00
return "tbf"
}
2015-08-19 23:02:04 +00:00
// Ingress is a qdisc for adding ingress filters
type Ingress struct {
QdiscAttrs
}
func (qdisc *Ingress) Attrs() *QdiscAttrs {
return &qdisc.QdiscAttrs
}
func (qdisc *Ingress) Type() string {
return "ingress"
}
2015-08-18 10:16:54 +00:00
// GenericQdisc qdiscs represent types that are not currently understood
// by this netlink library.
type GenericQdisc struct {
QdiscAttrs
QdiscType string
}
func (qdisc *GenericQdisc) Attrs() *QdiscAttrs {
return &qdisc.QdiscAttrs
}
func (qdisc *GenericQdisc) Type() string {
return qdisc.QdiscType
}