0

有一个tc(8)用于流量整形的用户空间工具,即

tc qdisc add dev eth0 root tbf rate 10mbit latency 100ms burst 5000.

tc命令的内部实现使用 netlink 将特定消息发送到内核,这反过来会相应地改变事情。但是,对于这个特定过程,内核代码没有公共接口——就像没有公共 API 一样tc_qdisc_add(x,y,z)——因为一切都取决于来自 netlink 消息本身的数据。

那么,是否有一个技巧可以简化流程并模拟来自内核的消息?有没有办法绕过用户空间调用tc并仅从内核上下文中获得相同的结果?

4

1 回答 1

0

是否有简化流程并模拟来自内核的消息的技巧?

我看不出有什么办法让它变得简单。

如果我们不深入了解特定命令的实现细节tc,仅考虑内核内部现有的 API,我们可以看到所有与 netlink talk 和 qdiscs 添加代码相关的代码都位于/net/sched子目录中。注册 qdisc 的主要函数位于/net/sched/sch_api.c中,名为register_qdisc(). 我们还可以看到在pktsched_init().

Qdisc 操作通过struct Qdisc_ops并包括诸如 init、enqueue、change 等进行描述。

知道了这一点,我们可以看看它是如何在tbf模块(net/sched/sch_tbf.c)中实现的。它有几个用 描述的操作tbf_qdisc_ops。这里有一个改变被调用的操作,通常像tc_modify_qdisc()-> qdisc_change()->这样调用tbf_change()

因此,根据您想要调整的具体内容,您可以通过某种方式获取特定的 qdisc,构建适当的 netlink 消息(结构 nlmsghdr,因为它在用户模式中完成)并调用 qdisc 的->change(...)方法。

答案并不声称是正确的。我只是想稍微澄清一下情况。

于 2020-12-02T15:53:03.707 回答