1. 参考资料

  • Linux 上的虚拟网络接口,主要要了解一下 IFB,对输入的流量进行整形

  • IFB wiki介绍

  • 《Linux 高级路由与流量控制手册》关于各种队列Queue和排队规则Queueing Disciplines的介绍

  • Linux 流量控制 Traffic Control

  • 关于 IngressEgress 的介绍

  • 关于 HTB - Hierarchical Token Bucket 队列的介绍

  • HTB 官方介绍

2. 内核配置

  • 开启 IFB - Intermediate Functional Block support, 这个会影响下行限速功能,如果只需要限制上行即出站的流量,也可不启用此模块
    RK356X网口限速-LMLPHP

  • Networking support > Networking options > QoS and/or fair queueing 这一页的内容全部选中,可以选择编译进内核或作为外部模块,开机时加载;

    • 其中 TBF - Token Bucket Filter,这个会影响上行限速功能
      RK356X网口限速-LMLPHP

3. tc工具移植

  • RK3566 SDK 中 busybox 集成的 tc 工具过于简陋,不支持流量整形,需要重新移植 tc 工具

  • tc工具是 iproute2中的一个组件,获取iproute2源码,我选择使用 5.18.0版本

  • 编译环境:Ubuntu20.04

  • 进入源码目录,执行 configure

    iproute2-5.2.0$ ./configure
    
  • 修改 config.mk 中的 AR CC,指定交叉编译工具链

  • 修改 config.mk, 取消 HAVE_SELINUX HAVE_ELF HAVE_MNL HAVE_CAP这几个宏定义
    RK356X网口限速-LMLPHP

  • 编译

    iproute2-5.2.0$ make clean && make
    
  • 查看编译得到的 tc工具是不是目标平台格式的文件
    RK356X网口限速-LMLPHP

  • 使用这个 tc工具替换 RK3566 中的 /sbin/tc

3. 限速测试

  • 上行限速,限个 500kbps 试试

    tc qdisc add dev eth0 root tbf rate 500Kbit latency 50ms burst 15kb
    
  • 使用 iperf3上行测速,限速成功
    RK356X网口限速-LMLPHP

  • 下行限速,需要借助一个虚拟网口 ifb0 来实现

    # 创建一个虚拟网口ifb0,用于流量重定向和整形
    ip link add ifb0 type ifb
    ip link set dev ifb0 up
    
    # 将网口eth0入站流量重定向到ifb0
    # 在eth0上添加一个入站队列qdisc
    tc qdisc add dev eth0 handle ffff: ingress
    # 在eth0上添加一个过滤器,将所有IP包都重定向到网口ifb0上
    tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
    
    # 在网口ifb0上添加一个HTB队列
    tc qdisc add dev ifb0 root handle 1: htb default 10
    # 创建一个类class,匹配这个类的流量将被限制为500kbps
    tc class add dev ifb0 parent 1: classid 1:1 htb rate 500Kbit
    # 创建一个过滤器,将ifb0上的所有流量都匹配到上一步创建的类上
    tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:1
    
  • 使用 iperf3 下行测速,限速成功
    RK356X网口限速-LMLPHP

04-23 16:58