据strace tc qdisc add dev eth0 root red_new结果,并tc源命令,似乎TC正在搜索$TC_LIB_DIR/q_red_new.so。
您必须为您自己创建模块。我会给你小指导。 (1)从以下url中下载iproute2的源文件,将其解压缩,然后将cd下载到该文件夹中。 https://wiki.linuxfoundation.org/networking/iproute2
(2)复制到q_red.cq_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。
if dlopen returns zero,then you failed to load ./tc/q_red_new.so。
if dlsym returns zero,then you failed to load red_new_qdisc_util inside the q_red_new.so。
# 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 ..