aboutsummaryrefslogtreecommitdiffstats
path: root/include
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
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')
-rw-r--r--include/linux/pkt_sched.h20
-rw-r--r--include/linux/rtnetlink.h1
-rw-r--r--include/net/pkt_sched.h1
-rw-r--r--include/net/sch_generic.h25
4 files changed, 46 insertions, 1 deletions
diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
index 87f4e0fa8f27..e5de421ac7b4 100644
--- a/include/linux/pkt_sched.h
+++ b/include/linux/pkt_sched.h
@@ -85,6 +85,26 @@ struct tc_ratespec
85 85
86#define TC_RTAB_SIZE 1024 86#define TC_RTAB_SIZE 1024
87 87
88struct tc_sizespec {
89 unsigned char cell_log;
90 unsigned char size_log;
91 short cell_align;
92 int overhead;
93 unsigned int linklayer;
94 unsigned int mpu;
95 unsigned int mtu;
96 unsigned int tsize;
97};
98
99enum {
100 TCA_STAB_UNSPEC,
101 TCA_STAB_BASE,
102 TCA_STAB_DATA,
103 __TCA_STAB_MAX
104};
105
106#define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
107
88/* FIFO section */ 108/* FIFO section */
89 109
90struct tc_fifo_qopt 110struct tc_fifo_qopt
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index b358c704d102..f4d386c191f5 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -482,6 +482,7 @@ enum
482 TCA_RATE, 482 TCA_RATE,
483 TCA_FCNT, 483 TCA_FCNT,
484 TCA_STATS2, 484 TCA_STATS2,
485 TCA_STAB,
485 __TCA_MAX 486 __TCA_MAX
486}; 487};
487 488
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