diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/pkt_sched.h | 20 | ||||
| -rw-r--r-- | include/linux/rtnetlink.h | 1 | ||||
| -rw-r--r-- | include/net/pkt_sched.h | 1 | ||||
| -rw-r--r-- | include/net/sch_generic.h | 25 |
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 | ||
| 88 | struct 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 | |||
| 99 | enum { | ||
| 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 | ||
| 90 | struct tc_fifo_qopt | 110 | struct 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); | |||
| 83 | extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, | 83 | extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, |
| 84 | struct nlattr *tab); | 84 | struct nlattr *tab); |
| 85 | extern void qdisc_put_rtab(struct qdisc_rate_table *tab); | 85 | extern void qdisc_put_rtab(struct qdisc_rate_table *tab); |
| 86 | extern void qdisc_put_stab(struct qdisc_size_table *tab); | ||
| 86 | 87 | ||
| 87 | extern void __qdisc_run(struct Qdisc *q); | 88 | extern 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 | ||
| 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 | ||
