diff options
Diffstat (limited to 'include/net/sch_generic.h')
-rw-r--r-- | include/net/sch_generic.h | 25 |
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 | ||
32 | struct qdisc_size_table { | ||
33 | struct list_head list; | ||
34 | struct tc_sizespec szopts; | ||
35 | int refcnt; | ||
36 | u16 data[]; | ||
37 | }; | ||
38 | |||
32 | struct Qdisc | 39 | struct 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 | ||
176 | struct qdisc_skb_cb { | ||
177 | unsigned int pkt_len; | ||
178 | char data[]; | ||
179 | }; | ||
180 | |||
181 | static inline struct qdisc_skb_cb *qdisc_skb_cb(struct sk_buff *skb) | ||
182 | { | ||
183 | return (struct qdisc_skb_cb *)skb->cb; | ||
184 | } | ||
185 | |||
168 | static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc) | 186 | static 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, | |||
257 | extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, | 275 | extern 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); |
278 | extern void qdisc_calculate_pkt_len(struct sk_buff *skb, | ||
279 | struct qdisc_size_table *stab); | ||
260 | extern void tcf_destroy(struct tcf_proto *tp); | 280 | extern void tcf_destroy(struct tcf_proto *tp); |
261 | extern void tcf_destroy_chain(struct tcf_proto **fl); | 281 | extern 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 | ||
309 | static inline unsigned int qdisc_pkt_len(struct sk_buff *skb) | 329 | static 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 | ||
314 | static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | 334 | static 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 | ||
319 | static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch) | 341 | static 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 | ||