aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/sch_generic.h
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>2008-07-20 03:08:47 -0400
committerDavid S. Miller <davem@davemloft.net>2008-07-20 03:08:47 -0400
commit175f9c1bba9b825d22b142d183c9e175488b260c (patch)
tree6b9cdb2e3802e7fc8422dc0d0cc200f6d4d1d0a5 /include/net/sch_generic.h
parent0abf77e55a2459aa9905be4b226e4729d5b4f0cb (diff)
net_sched: Add size table for qdiscs
Add size table functions for qdiscs and calculate packet size in qdisc_enqueue(). Based on patch by Patrick McHardy http://marc.info/?l=linux-netdev&m=115201979221729&w=2 Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/sch_generic.h')
-rw-r--r--include/net/sch_generic.h25
1 files changed, 24 insertions, 1 deletions
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