2014-10-22 90 views
2

我想修改某些實驗的紅色算法(http://en.wikipedia.org/wiki/Random_early_detection)。 修改代碼後,我使用insmod命令加載到內核。如何在linux中添加新的qdisk

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 

可能是什麼可能的原因:

我用lsmod | grep red_new

然而,當我嘗試使用它失敗TC隊列規定的命令給下面的錯誤驗證成功加載?

運行由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隊列規定顯示,以檢查是否加入它,但它沒有。

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 
+0

你見過這個:http://tldp.org/HOWTO/Traffic-Control-HOWTO/classless-qdiscs.html? – Niloct 2014-10-22 03:17:23

回答

2

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_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

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 .. 
+0

我按照您提到的步驟創建了q_red_new.so文件。不過,我仍然面臨同樣的錯誤! :( – user1692342 2014-10-23 03:29:18

+0

'$ 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.so'的結果是什麼? – ymonad 2014-10-23 03:33:49

+0

我收到以下消息:open(「./ tc/q_red_new.so」,O_RDONLY | O_CLOEXEC)= 4 – user1692342 2014-10-23 20:08:16