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

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

我正在尝试修改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 "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
命令对其进行调试。