aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/sch_generic.h
diff options
context:
space:
mode:
authorCong Wang <cwang@twopensource.com>2015-03-06 14:47:59 -0500
committerDavid S. Miller <davem@davemloft.net>2015-03-09 15:35:55 -0400
commit1e052be69d045c8d0f82ff1116fd3e5a79661745 (patch)
treec237348cf8f28ca178c3ebfcec0e0013ef18b4c5 /include/net/sch_generic.h
parentfc6c6c2b8a2e1fbaa9e864af62c873dae15420ea (diff)
net_sched: destroy proto tp when all filters are gone
Kernel automatically creates a tp for each (kind, protocol, priority) tuple, which has handle 0, when we add a new filter, but it still is left there after we remove our own, unless we don't specify the handle (literally means all the filters under the tuple). For example this one is left: # tc filter show dev eth0 filter parent 8001: protocol arp pref 49152 basic The user-space is hard to clean up these for kernel because filters like u32 are organized in a complex way. So kernel is responsible to remove it after all filters are gone. Each type of filter has its own way to store the filters, so each type has to provide its way to check if all filters are gone. Cc: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: Cong Wang <cwang@twopensource.com> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Acked-by: Jamal Hadi Salim<jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/sch_generic.h')
-rw-r--r--include/net/sch_generic.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index c605d305c577..6d778efcfdfd 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -213,7 +213,7 @@ struct tcf_proto_ops {
213 const struct tcf_proto *, 213 const struct tcf_proto *,
214 struct tcf_result *); 214 struct tcf_result *);
215 int (*init)(struct tcf_proto*); 215 int (*init)(struct tcf_proto*);
216 void (*destroy)(struct tcf_proto*); 216 bool (*destroy)(struct tcf_proto*, bool);
217 217
218 unsigned long (*get)(struct tcf_proto*, u32 handle); 218 unsigned long (*get)(struct tcf_proto*, u32 handle);
219 int (*change)(struct net *net, struct sk_buff *, 219 int (*change)(struct net *net, struct sk_buff *,
@@ -399,7 +399,7 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
399 const struct Qdisc_ops *ops, u32 parentid); 399 const struct Qdisc_ops *ops, u32 parentid);
400void __qdisc_calculate_pkt_len(struct sk_buff *skb, 400void __qdisc_calculate_pkt_len(struct sk_buff *skb,
401 const struct qdisc_size_table *stab); 401 const struct qdisc_size_table *stab);
402void tcf_destroy(struct tcf_proto *tp); 402bool tcf_destroy(struct tcf_proto *tp, bool force);
403void tcf_destroy_chain(struct tcf_proto __rcu **fl); 403void tcf_destroy_chain(struct tcf_proto __rcu **fl);
404 404
405/* Reset all TX qdiscs greater then index of a device. */ 405/* Reset all TX qdiscs greater then index of a device. */