05 调度、tc、BPF 与 XDP 机制与实现详解
1. 三个相关子系统
| 目录 | 职责 | 配置 |
|---|---|---|
| net/sched/ | Traffic Control:qdisc、分类、动作 | 常 y |
| net/bpf/ | 网络相关 BPF 自检/测试运行 | CONFIG_BPF |
| net/xdp/ | AF_XDP 用户态零拷贝 | CONFIG_XDP_SOCKETS |
| kernel/bpf/ | BPF 解释器/JIT(不在 net/) | CONFIG_BPF_SYSCALL |
tc 与 XDP 是 RK 上 QoS、高性能收包 的主要内核接口。
2. net/sched — Traffic Control
sch_*.c — 队列规程(pfifo_fast、fq_codel、htb…)cls_*.c — 分类器(u32、flower、bpf…)act_*.c — 动作(mirred、pedit、bpf、vlan…)
配置通路:NETLINK_ROUTE 的 tc 子族(tc qdisc、tc filter)。
数据路径:dev_queue_xmit → qdisc_enqueue → 驱动**;ingress 在 **__dev_xmit_skb` 之前 的 ingress qdisc。
3. core 中的 BPF 挂钩
- cls_bpf / act_bpf 在 sched;
- sock_map、sk_msg 在 core(BPF 与 socket 结合);
- lwt_bpf.c — 轻量隧道 BPF。
4. net/bpf/
主要为 BPF_PROG_TEST_RUN 对网络程序类型的 内核自测(skb、xdp、flow_dissector 等),不是 数据面必经路径。
用户态加载程序走 bpf() 系统调用(kernel/bpf/syscall.c)。
5. XDP 两层
| 层 | 位置 | 说明 |
|---|---|---|
| 原生 XDP | 驱动 ndo_bpf / xdp_buff |
最早点处理 |
| generic XDP | net/core/xdp.c |
无驱动支持时的慢路径 |
| AF_XDP | net/xdp/ |
用户态 mmap 环(XSK) |
bpftool 加载 SEC("xdp") 程序;驱动需声明 NETDEV_XDP_ACT_* 能力。
6. ethtool 协同
net/ethtool/ 配置 ring、channel、pause 参数,影响 XDP/tc 性能上限。
7. RK3588
| 场景 | 建议 |
|---|---|
| 出口限速 | htb/fq_codel on eth0 |
| 高性能收包 | 驱动 XDP + AF_XDP(若驱动支持) |
| 过滤 | tc flower 或 nft + netfilter |
stmmac 等驱动 XDP 支持因版本/补丁而异,需查 ethtool -k 与驱动 Release notes。
8. 小结
sched = 队列与策略;BPF = 可编程挂载点;XDP = 尽早处理包。三者正交,可组合使用。
正在加载留言…