- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为某些实验修改红色算法 ( 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
最佳答案
根据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_LIB_DIR
环境下运行tc
命令。
$ 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 ..
关于linux-kernel - 如何在 Linux 中添加新的 qdisc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26499631/
我是一名优秀的程序员,十分优秀!