如何在linux中添加新的qdisc

时间:2014-10-22 02:58:20

标签: linux-kernel kernel kernel-module

我正在尝试修改某些实验的红色算法(http://en.wikipedia.org/wiki/Random_early_detection)。 修改代码后,我使用insmod命令加载到内核。

我使用lsmod | grep red_new

验证了加载成功

但是当我尝试使用tc qdisc命令时,它无法给出以下错误:

tc qdisc add dev eth0 root red_new limit 100 min 80 max 90 avpkt 10 burst 10 probability 1 bandwidth 200 ecn

unknown qdisc "red_new" hence option "limit" is unparsable

可能的原因是什么?

运行ymonad建议的ltrace命令后,我得到以下输出:

strlen("red_new")                                = 7
strlen("red_new")                                = 7
strlen("red_new")                                = 7
strncpy(0x7fff6467ad10, "red_new", 15)           = 0x7fff6467ad10
dlopen("./tc/q_red_new.so", 1)                   = 0x1abe030
dlsym(0x1abe030, "red_new_qdisc_util")           = 0x7f62bdd240c0
memcpy(0x7fff6467ad48, "red_new\0", 8)           = 0x7fff6467ad48

我运行了tc qdisc show以检查它是否已添加,但它没有。

 tc qdisc show
qdisc mq 0: dev eth0 root
qdisc mq 0: dev eth1 root
qdisc mq 0: dev eth2 root
qdisc mq 0: dev eth3 root

1 个答案:

答案 0 :(得分:3)

根据strace tc qdisc add dev eth0 root red_new的结果和tc命令的来源,似乎tc正在搜索$TC_LIB_DIR/q_red_new.so

您必须为自己创建模块。我会给你一个小指令。

(1)从以下网址下载iproute2的源代码,将其解压缩,然后cd到该文件夹​​。 https://wiki.linuxfoundation.org/networking/iproute2

(2)将q_red.c复制到q_red_new.c

$ cp tc/q_red.c tc/q_red_new.c

(3)编辑tc / q_red_new.c

red_parse_optred_print_optred_print_xstats重命名为red_new_parse,依此类推。 此外,您必须将red_qdisk_util重命名为req_new_qdisc_util并更改id和其他成员。

struct qdisc_util red_new_qdisc_util = {
  .id   = "red_new",
  .parse_qopt = red_new_parse_opt,
  .print_qopt = red_new_print_opt,
  .print_xstats = red_new_print_xstats,
};

(4)配置并构建q_red_new.so

$ ./configure
$ make TCSO=q_red_new.so

现在您看到./tc/q_red_new.so已创建

(5)使用tc环境运行TC_LIB_DIR命令。

$ TC_LIB_DIR='./tc' tc qdisc add dev eth0 root red_new

更新:这里是如何知道tc命令正确加载了q_red_new.so

如果dlopen返回零,则您无法加载./tc/q_red_new.so

如果dlsym返回零,则无法在q_red_new.so中加载red_new_qdisc_util

# export TC_LIB_DIR='./tc'
# ltrace ./tc/tc qdisc add dev eth0 root red_new limit 100 min 80 max 90 avpkt 10 burst 10 probability 1 bandwidth 200 ecn 2>&1 | grep red_new
.. OMITTED ..
dlopen("./tc/q_red_new.so", 1)                   = 0x12c1030
snprintf("red_new_qdisc_util", 256, "%s_qdisc_util", "red_new") = 18
dlsym(0x12c1030, "red_new_qdisc_util")           = 0x7f1cf0d6cc40
.. OMITTED ..