To clarify with an example i used to test your patches: #0 add ingress filter $TC qdisc add dev $P ingress #1 add filter $TC filter add dev $P parent ffff: protocol ip prio 10 \ u32 match ip protocol 1 0xff #2 display $TC filter ls dev $P parent ffff: #3 try to delete root $TC filter delete dev $P parent ffff: protocol ip prio 10 \ handle 800: u32 #4 nothing changes.. $TC filter ls dev $P parent ffff: #5 delete filter $TC filter delete dev $P parent ffff: protocol ip prio 10 \ handle 800:0:800 u32 #6 filter gone but hash table still there.. $TC filter ls dev $P parent ffff: #7 delete tp $TC filter delete dev $P parent ffff: protocol ip prio 10 \ u32 #8 now it is gone.. $TC filter ls dev $P parent ffff: your patches show #6 filter as still active. We want it to look like #8 Hope this helps. cheers, jamal