正確的刪除tc的filter過濾器

直接用過濾器的生成規則去刪除TC的filter會導致所有過濾器都被清空


不像class,添加後 想要刪除很簡單 直接把TC命令中的add換成del就可以了,如果class重複,就會像添加路由出錯時候一樣有提示。
但是filter不一樣,相同規則的filter可以不斷持續的添加,規則添加後,內核會用不同的句柄號(handle)來區分,
刪除一個filter,不能簡單的把規則的add換成del,那會刪除所有的filter規則,因爲你沒有提供最重要的句柄號(handle) 沒有提供就是0 是0就會刪除所有規則。

You must at least provide the following:
dev
parent (qdisc or class)
prio
kind (filter type)
handle

如果一個filter已經和一個class關聯了,那麼你如果刪除這個class 就會得到這樣的提示:RTNETLINK answers: Device or resource busy

所以,刪除一條class規則前,要先把和這個class關聯的filter刪除掉。下面是我的一個實現($id 代表class規則ID號碼)

1 handles=`tc filter list dev ${dev} |grep "flowid 1:${id}"|awk '{print $10}'`
2   
3 for handle in $handles
4 do
5 tc filter delete dev ${dev} parent 1: protocol ip prio 1 handle ${handle} u32
6 done

之所以要用循環,因爲filter可能有多條關聯一個class


來源:http://ihipop.info/2011/06/2471.html

發佈了6 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章