Skip to content

how to configure u32 classid  #176

Open
@youguys

Description

@youguys

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

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions