MTKHQoS的一点玩法总结
功能介绍
MTK的HQoS是基于MTK-PPE包硬件转发引擎的一个延申,理论上所有有PPE的硬件(MT762x,mt798x)都能实现
HQoS。按照官方的规格书,总的有4个调度器和128个硬件队列,但在immortalwrt-mt798x项目中只实现了64个硬件队列(可能和hanwckf在issue中讨论过的的v2驱动有问题有关),下述功能针对改仓库代码总结而来。
我的看法更应该叫硬件限速器,QoS的实现完全看开发者的规则实现。
通过对调度器以及队列的配置实现队列限速,再通过数据帧/包标记的方式,将数据帧绑定到不同队列进而实现对数据帧/包进行分级,进而实现HQoS。
工作流程:
数据包 → HNAT 处理 → 检查 fqos 标志 → 读取 qid → 进入指定硬件队列
命令操作
-
启动准备步骤
- 内核启用与HW_QoS相关的功能模块
- Linux系统安装iptables和ebtabels
iptables工作在L3和L4处理 IP 数据包,而ebtables工作在L2处理以太网帧
- 启用HQoS(在启用HNAT的前提下)
-
启动HQoS和DSCP支持
echo 1 > /sys/kernel/debug/hnat/qos_toggle
echo "10 1" > /sys/kernel/debug/hnat/hnat_setting
-
下调HNAT Bind Rate
echo "11 5" >/sys/kernel/debug/hnat/hnat_setting
uci -q set "turboacc.config.fastpath_mh_eth_hnat_bind_rate"="5"
uci -q commit "turboacc"
-
配置调度器
总的有四个调度器,可根据上下行可分为两组不同的设定
ehco ${sch_ebl} ${sch_policy} ${sch_bw} > /sys/keenel/debug/hant/qdma_schX
- sch_ebl: 是否启动改调度器(0/1)
- sch_policy: 设置调度器策略(WRR/SP)
- WRR:满足最小带宽后按权重分配
- SP:队列号越小优先级越高
- sch_bw: 调度器速率限制(unit:Kbps)
-
配置队列器
在immortalwrt-mt798x的仓库中队列器的数目是64个
echo X ${queue_minebl} ${minirate} ${queue_maxbl} ${maxrate} ${queue_weight} ${queue_resv} > /sys/kernel/debug/hnat/qdma_txqY
- X:指定调度器(0-3)
- queue_minebl:是否启动最小速率限制(0/1)
- minirate:最小速率限制(unit:Kbps)
- queue_maxbl:是否启动最大速率限制(0/1)
- maxrate:最大速率限制(unit:Kbps)
- queue_weight:WRR权重(0-15)
这里的weight值的大小和权重是相反的
- queue_resv:保留缓冲区大小(int)
- Y:队列器(0-63)
-
数据帧/包打标记
在immortalwrt-mt798x仓库中,比手册多了一个基于DSCP标记的功能,和传统DSCP的定义不要太一样,传统DSCP有指定的分级,其实等价于本来的MARK功能。且按照官方手册可以使用ebtabels实现基于mac的双向限速,比iptables只能单向mac匹配会灵活一点。
-
基于设备(IP/MAC)QoS:
-
上行:
iptables -t mangle -A eqos -m mac --mac-source $macaddr -j DSCP --set-dscp Y
ip6tables -t mangle -A eqos -m mac --mac-source $macaddr -j DSCP --set-dscp Y
-
下行:
ebtables -t nat -A eqos -d $macaddr -j mark --mark-set Y
-
基于数据包类型的QoS:
iptables -t mangle -A eqos -i br-lan -p tcp -m multiport --dports 80,443,8080,8081 -j DSCP --set-dscp Y
iptables -t mangle -A eqos -o br-lan -p tcp -m multiport --sports 80,443,8080,8081 -j DSCP --set-dscp Y
EQoS-MTK工作流程分析