gpt4 book ai didi

linux-kernel - 如何在 Linux 中添加新的 qdisc

转载 作者:行者123 更新时间:2023-12-04 02:22:41 29 4
gpt4 key购买 nike

我正在尝试为某些实验修改红色算法 ( 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.cq_red_new.c

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

(3) 编辑tc/q_red_new.c

red_pa​​rse_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_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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com