Open
Description
Describe the issue
I created an HTB type qdisc, established two different classes with different speed configurations, and set up two different filters to match different traffic types, binding them to the corresponding classes. However, they did not take effect.
Expected behavior
tc qdisc add dev wg0 root handle 1: htb default 2
tc class add dev wg0 parent 1: classid 1:2 htb rate 5Mbit ceil 10Mbit
tc class add dev wg0 parent 1: classid 1:3 htb rate 1000Mbit ceil 10Mbit
tc filter add dev wg0 parent 1: protocol ip prio 1 u32 match ip dst 13.0.0.3/32 flowid 1:2
tc filter add dev wg0 parent 1: protocol ip prio 1 u32 match ip dst 13.0.0.4/32 flowid 1:3
Minimal code example to reproduce the issue
func setupUserLimit(tcnl *tc.Tc, ifindex int, classId uint32, userLimit UserLimit, parentQdisc uint32) error {
class := tc.Object{
Msg: tc.Msg{
Family: unix.AF_UNSPEC,
Ifindex: uint32(ifindex),
Handle: core.BuildHandle(0, uint32(classId)),
Parent: parentQdisc,
},
Attribute: tc.Attribute{
Kind: "htb",
Htb: &tc.Htb{
// Rate64: &userLimit.Rate,
// Ceil64: &userLimit.Burst,
Parms: &tc.HtbOpt{
Rate: tc.RateSpec{CellLog: 0x3, Linklayer: 0x1, Overhead: 0x0, CellAlign: 0xffff, Mpu: 0x0, Rate: 0x98968},
Ceil: tc.RateSpec{CellLog: 0x3, Linklayer: 0x1, Overhead: 0x0, CellAlign: 0xffff, Mpu: 0x0, Rate: 0x1312d0},
},
},
},
}
if err := tcnl.Class().Add(&class); err != nil {
return fmt.Errorf("could not add class for %s: %v", userLimit.IPAddress, err)
}
htbClassid := core.BuildHandle(1, uint32(classId))
filter := tc.Object{
Msg: tc.Msg{
Family: syscall.AF_UNSPEC,
Ifindex: uint32(ifindex),
Handle: core.BuildHandle(0, uint32(classId)), // 过滤器 ID
Parent: parentQdisc, // 过滤器的父级(与类一致)
//Info: core.BuildHandle(0, uint32(class.Msg.Handle)),
Info: 0xa0300, //pref and proto is here
},
Attribute: tc.Attribute{
Kind: "u32",
U32: &tc.U32{
ClassID: &htbClassid,
Sel: &tc.U32Sel{
NKeys: 1,
Keys: []tc.U32Key{
{
Mask: 0xFFFFFFFF,
Val: ipToUint32(userLimit.IPAddress), // 将 IP 地址转换为 uint32
Off: 16, // 匹配目标IP 地址
},
},
},
},
},
}
if err := tcnl.Filter().Add(&filter); err != nil {
return fmt.Errorf("could not add filter for %s: %v", userLimit.IPAddress, err)
}
return nil
}
go.mod
Environment
Provide some information about the system with the issue.
3.10.0-1160.45.1.el7.x86_64