aboutsummaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
Diffstat (limited to 'include/net')
-rw-r--r--include/net/pkt_sched.h1
-rw-r--r--include/net/sch_generic.h25
2 files changed, 25 insertions, 1 deletions
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
index e4e30052e4e2..6affcfaa123e 100644
--- a/include/net/pkt_sched.h
+++ b/include/net/pkt_sched.h
@@ -83,6 +83,7 @@ extern struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);
83extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, 83extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
84 struct nlattr *tab); 84 struct nlattr *tab);
85extern void qdisc_put_rtab(struct qdisc_rate_table *tab); 85extern void qdisc_put_rtab(struct qdisc_rate_table *tab);
86extern void qdisc_put_stab(struct qdisc_size_table *tab);
86 87
87extern void __qdisc_run(struct Qdisc *q); 88extern void __qdisc_run(struct Qdisc *q);
88 89
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 8229520e088a..db9ad655eb8a 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -29,6 +29,13 @@ enum qdisc_state_t
29 __QDISC_STATE_SCHED, 29 __QDISC_STATE_SCHED,
30}; 30};
31 31
32struct qdisc_size_table {
33 struct list_head list;
34 struct tc_sizespec szopts;
35 int refcnt;
36 u16 data[];
37};
38
32struct Qdisc 39struct Qdisc
33{ 40{
34 int (*enqueue)(struct sk_buff *skb, struct Qdisc *dev); 41 int (*enqueue)(struct sk_buff *skb, struct Qdisc *dev);
@@ -39,6 +46,7 @@ struct Qdisc
39#define TCQ_F_INGRESS 4 46#define TCQ_F_INGRESS 4
40 int padded; 47 int padded;
41 struct Qdisc_ops *ops; 48 struct Qdisc_ops *ops;
49 struct qdisc_size_table *stab;
42 u32 handle; 50 u32 handle;
43 u32 parent; 51 u32 parent;
44 atomic_t refcnt; 52 atomic_t refcnt;
@@ -165,6 +173,16 @@ struct tcf_proto
165 struct tcf_proto_ops *ops; 173 struct tcf_proto_ops *ops;
166}; 174};
167 175
176struct qdisc_skb_cb {
177 unsigned int pkt_len;
178 char data[];
179};
180
181static inline struct qdisc_skb_cb *qdisc_skb_cb(struct sk_buff *skb)
182{
183 return (struct qdisc_skb_cb *)skb->cb;
184}
185
168static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc) 186static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc)
169{ 187{
170 return &qdisc->q.lock; 188 return &qdisc->q.lock;
@@ -257,6 +275,8 @@ extern struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
257extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, 275extern struct Qdisc *qdisc_create_dflt(struct net_device *dev,
258 struct netdev_queue *dev_queue, 276 struct netdev_queue *dev_queue,
259 struct Qdisc_ops *ops, u32 parentid); 277 struct Qdisc_ops *ops, u32 parentid);
278extern void qdisc_calculate_pkt_len(struct sk_buff *skb,
279 struct qdisc_size_table *stab);
260extern void tcf_destroy(struct tcf_proto *tp); 280extern void tcf_destroy(struct tcf_proto *tp);
261extern void tcf_destroy_chain(struct tcf_proto **fl); 281extern void tcf_destroy_chain(struct tcf_proto **fl);
262 282
@@ -308,16 +328,19 @@ static inline bool qdisc_tx_is_noop(const struct net_device *dev)
308 328
309static inline unsigned int qdisc_pkt_len(struct sk_buff *skb) 329static inline unsigned int qdisc_pkt_len(struct sk_buff *skb)
310{ 330{
311 return skb->len; 331 return qdisc_skb_cb(skb)->pkt_len;
312} 332}
313 333
314static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) 334static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
315{ 335{
336 if (sch->stab)
337 qdisc_calculate_pkt_len(skb, sch->stab);
316 return sch->enqueue(skb, sch); 338 return sch->enqueue(skb, sch);
317} 339}
318 340
319static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch) 341static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch)
320{ 342{
343 qdisc_skb_cb(skb)->pkt_len = skb->len;
321 return qdisc_enqueue(skb, sch); 344 return qdisc_enqueue(skb, sch);
322} 345}
323 346