我正在尝试修改某些实验的红色算法(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
答案 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_opt
,red_print_opt
,red_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 ..