Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to configure u32 classid #176

Open
youguys opened this issue Oct 16, 2024 · 1 comment
Open

how to configure u32 classid #176

youguys opened this issue Oct 16, 2024 · 1 comment

Comments

@youguys
Copy link

youguys commented Oct 16, 2024

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

@youguys youguys added the bug Something isn't working label Oct 16, 2024
@florianl florianl added needs investigation missing information and removed bug Something isn't working labels Nov 2, 2024
@florianl
Copy link
Owner

florianl commented Nov 2, 2024

Hi 👋
Sorry, to catch up just now.
Could you please provide a full reproducer for the issue you run into? How do you set up the qdisc parent and which values from this do you pass on in which way to setupUserLimit()? To setup Htb as class the fields Ctab and Rtab are essential and commented out in your example.
Can the isue be reproduced on a more recent Linux kernel version, that is at least listed on kernel.org?

For further investigation, it would also help to know which version of this package you use in your code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants