Linux kernel 如何在linux中添加新的qdisc
我正在尝试修改Red算法()以用于某些实验。 修改代码后,我使用Linux kernel 如何在linux中添加新的qdisc,linux-kernel,kernel,kernel-module,Linux Kernel,Kernel,Kernel Module,我正在尝试修改Red算法()以用于某些实验。 修改代码后,我使用insmod命令加载到内核 我使用lsmod|grep red|u 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
insmod
命令加载到内核
我使用lsmod|grep red|u 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秀来检查它是否被添加,但它没有
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\u new
的结果和tc
命令的来源,似乎tc正在搜索$tc\u LIB\u DIR/q\u red\u new.so
您必须为自己创建模块。我会给你一些指示
(1) 从以下url下载iproute2的源代码,将其解压缩,然后cd
到文件夹中。
(2) 将q_red.c
复制到q_red\u new.c
$ cp tc/q_red.c tc/q_red_new.c
(3) 编辑tc/q_red_new.c
将red\u parse\u opt
,red\u print\u opt
,red\u print\u xstats
,重命名为red\u new\u parse
,依此类推。
此外,您必须将red\u qdisk\u util
重命名为req\u new\u qdisc\u 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\u red\u new.so
$ ./configure
$ make TCSO=q_red_new.so
现在您看到/tc/q\u red\u new。因此创建了
(5) 使用tc_LIB_DIR
环境运行tc
命令
$ TC_LIB_DIR='./tc' tc qdisc add dev eth0 root red_new
更新:下面是如何知道tc
命令正确地加载了q_red_new
如果dlopen
返回零,则无法加载/tc/q\u red\u new.so
如果dlsym
返回零,则无法在q\u red\u new.so内加载red\u new\u qdisc\u 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 ..
您看到了吗:?我按照您提到的步骤创建了q_red_new.so文件。然而,我仍然面临着同样的错误!:(如果$strace bash-c'TC_LIB_DIR=“/TC”TC qdisc add dev eth0 root red_new'2>&1 | grep q_red_new
,结果如何?TC
是否成功打开q_red_new。因此,
我收到以下消息:打开(“/TC/q_red_new.so”,O| RDONLY | O|CLOEXEC)=4 tc命令是否也应该查找red_new.ko文件?否。red_new.ko
由linux内核通过insmod
命令加载。tc
使用其他一些系统调用与linux内核通信。因为打开(“./tc/q_red_new.so”)
返回非负值,因此您成功打开了文件。但错误显示q\u red\u new。因此不是tc
的有效模块(可能tc的版本与模块不同?)。我更新了答案,因此使用ltrace
命令对其进行调试。