1 #ifndef __NET_PKT_SCHED_H
2 #define __NET_PKT_SCHED_H
4 #define PSCHED_GETTIMEOFDAY 1
5 #define PSCHED_JIFFIES 2
9 #define PSCHED_CLOCK_SOURCE PSCHED_CPU
11 #define PSCHED_CLOCK_SOURCE PSCHED_JIFFIES
14 #include <linux/config.h>
15 #include <linux/types.h>
16 #include <linux/pkt_sched.h>
17 #include <net/pkt_cls.h>
31 int (*fn
)(struct Qdisc
*, unsigned long cl
, struct qdisc_walker
*);
34 struct Qdisc_class_ops
36 /* Child qdisc manipulation */
37 int (*graft
)(struct Qdisc
*, unsigned long cl
, struct Qdisc
*, struct Qdisc
**);
38 struct Qdisc
* (*leaf
)(struct Qdisc
*, unsigned long cl
);
40 /* Class manipulation routines */
41 unsigned long (*get
)(struct Qdisc
*, u32 classid
);
42 void (*put
)(struct Qdisc
*, unsigned long);
43 int (*change
)(struct Qdisc
*, u32
, u32
, struct rtattr
**, unsigned long *);
44 int (*delete)(struct Qdisc
*, unsigned long);
45 void (*walk
)(struct Qdisc
*, struct qdisc_walker
* arg
);
47 /* Filter manipulation */
48 struct tcf_proto
** (*tcf_chain
)(struct Qdisc
*, unsigned long);
49 unsigned long (*bind_tcf
)(struct Qdisc
*, unsigned long, u32 classid
);
50 void (*unbind_tcf
)(struct Qdisc
*, unsigned long);
52 /* rtnetlink specific */
53 int (*dump
)(struct Qdisc
*, unsigned long, struct sk_buff
*skb
, struct tcmsg
*);
58 struct Qdisc_ops
*next
;
59 struct Qdisc_class_ops
*cl_ops
;
63 int (*enqueue
)(struct sk_buff
*, struct Qdisc
*);
64 struct sk_buff
* (*dequeue
)(struct Qdisc
*);
65 int (*requeue
)(struct sk_buff
*, struct Qdisc
*);
66 unsigned int (*drop
)(struct Qdisc
*);
68 int (*init
)(struct Qdisc
*, struct rtattr
*arg
);
69 void (*reset
)(struct Qdisc
*);
70 void (*destroy
)(struct Qdisc
*);
71 int (*change
)(struct Qdisc
*, struct rtattr
*arg
);
73 int (*dump
)(struct Qdisc
*, struct sk_buff
*);
76 extern rwlock_t qdisc_tree_lock
;
80 int (*enqueue
)(struct sk_buff
*skb
, struct Qdisc
*dev
);
81 struct sk_buff
* (*dequeue
)(struct Qdisc
*dev
);
83 #define TCQ_F_BUILTIN 1
84 #define TCQ_F_THROTTLED 2
85 #define TCQ_F_INGRESS 4
86 struct Qdisc_ops
*ops
;
91 #ifndef CONFIG_BCM4710
95 struct sk_buff_head q
;
96 struct net_device
*dev
;
97 #ifndef CONFIG_BCM4710
98 struct list_head list
;
101 struct tc_stats stats
;
102 int (*reshape_fail
)(struct sk_buff
*skb
, struct Qdisc
*q
);
104 /* This field is deprecated, but it is still used by CBQ
105 * and it will live until better solution will be invented.
107 struct Qdisc
*__parent
;
112 struct qdisc_rate_table
114 struct tc_ratespec rate
;
116 struct qdisc_rate_table
*next
;
120 static inline void sch_tree_lock(struct Qdisc
*q
)
122 write_lock(&qdisc_tree_lock
);
123 spin_lock_bh(&q
->dev
->queue_lock
);
126 static inline void sch_tree_unlock(struct Qdisc
*q
)
128 spin_unlock_bh(&q
->dev
->queue_lock
);
129 write_unlock(&qdisc_tree_lock
);
132 static inline void tcf_tree_lock(struct tcf_proto
*tp
)
134 write_lock(&qdisc_tree_lock
);
135 spin_lock_bh(&tp
->q
->dev
->queue_lock
);
138 static inline void tcf_tree_unlock(struct tcf_proto
*tp
)
140 spin_unlock_bh(&tp
->q
->dev
->queue_lock
);
141 write_unlock(&qdisc_tree_lock
);
145 static inline unsigned long
146 cls_set_class(struct tcf_proto
*tp
, unsigned long *clp
, unsigned long cl
)
148 unsigned long old_cl
;
157 static inline unsigned long
158 __cls_set_class(unsigned long *clp
, unsigned long cl
)
160 unsigned long old_cl
;
169 Timer resolution MUST BE < 10% of min_schedulable_packet_size/bandwidth
171 Normal IP packet size ~ 512byte, hence:
173 0.5Kbyte/1Mbyte/sec = 0.5msec, so that we need 50usec timer for
176 10msec resolution -> <50Kbit/sec.
178 The result: [34]86 is not good choice for QoS router :-(
180 The things are not so bad, because we may use artifical
181 clock evaluated by integration of network data flow
182 in the most critical places.
184 Note: we do not use fastgettimeofday.
185 The reason is that, when it is not the same thing as
186 gettimeofday, it returns invalid timestamp, which is
187 not updated, when net_bh is active.
189 So, use PSCHED_CLOCK_SOURCE = PSCHED_CPU on alpha and pentiums
190 with rtdsc. And PSCHED_JIFFIES on all other architectures, including [34]86
191 and pentiums without rtdsc.
192 You can use PSCHED_GETTIMEOFDAY on another architectures,
193 which have fast and precise clock source, but it is too expensive.
196 /* General note about internal clock.
198 Any clock source returns time intervals, measured in units
199 close to 1usec. With source PSCHED_GETTIMEOFDAY it is precisely
200 microseconds, otherwise something close but different chosen to minimize
201 arithmetic cost. Ratio usec/internal untis in form nominator/denominator
202 may be read from /proc/net/psched.
206 #if PSCHED_CLOCK_SOURCE == PSCHED_GETTIMEOFDAY
208 typedef struct timeval psched_time_t
;
209 typedef long psched_tdiff_t
;
211 #define PSCHED_GET_TIME(stamp) do_gettimeofday(&(stamp))
212 #define PSCHED_US2JIFFIE(usecs) (((usecs)+(1000000/HZ-1))/(1000000/HZ))
213 #define PSCHED_JIFFIE2US(delay) ((delay)*(1000000/HZ))
215 #define PSCHED_EXPORTLIST EXPORT_SYMBOL(psched_tod_diff);
217 #else /* PSCHED_CLOCK_SOURCE != PSCHED_GETTIMEOFDAY */
219 #define PSCHED_EXPORTLIST PSCHED_EXPORTLIST_1 PSCHED_EXPORTLIST_2
221 typedef u64 psched_time_t
;
222 typedef long psched_tdiff_t
;
224 extern psched_time_t psched_time_base
;
226 #if PSCHED_CLOCK_SOURCE == PSCHED_JIFFIES
229 #define PSCHED_JSCALE 14
230 #elif HZ >= 96 && HZ < 192
231 #define PSCHED_JSCALE 13
232 #elif HZ >= 192 && HZ < 384
233 #define PSCHED_JSCALE 12
234 #elif HZ >= 384 && HZ < 768
235 #define PSCHED_JSCALE 11
237 #define PSCHED_JSCALE 10
240 #define PSCHED_EXPORTLIST_2
242 #if BITS_PER_LONG <= 32
244 #define PSCHED_WATCHER unsigned long
246 extern PSCHED_WATCHER psched_time_mark
;
248 #define PSCHED_GET_TIME(stamp) ((stamp) = psched_time_base + (((unsigned long)(jiffies-psched_time_mark))<<PSCHED_JSCALE))
250 #define PSCHED_EXPORTLIST_1 EXPORT_SYMBOL(psched_time_base); \
251 EXPORT_SYMBOL(psched_time_mark);
255 #define PSCHED_GET_TIME(stamp) ((stamp) = (jiffies<<PSCHED_JSCALE))
257 #define PSCHED_EXPORTLIST_1
261 #define PSCHED_US2JIFFIE(delay) (((delay)+(1<<PSCHED_JSCALE)-1)>>PSCHED_JSCALE)
262 #define PSCHED_JIFFIE2US(delay) ((delay)<<PSCHED_JSCALE)
264 #elif PSCHED_CLOCK_SOURCE == PSCHED_CPU
266 extern psched_tdiff_t psched_clock_per_hz
;
267 extern int psched_clock_scale
;
269 #define PSCHED_EXPORTLIST_2 EXPORT_SYMBOL(psched_clock_per_hz); \
270 EXPORT_SYMBOL(psched_clock_scale);
272 #define PSCHED_US2JIFFIE(delay) (((delay)+psched_clock_per_hz-1)/psched_clock_per_hz)
273 #define PSCHED_JIFFIE2US(delay) ((delay)*psched_clock_per_hz)
275 #if defined(CONFIG_X86_TSC) || defined(__mips__)
277 #define PSCHED_GET_TIME(stamp) \
280 (stamp) = __cur>>psched_clock_scale; \
283 #define PSCHED_EXPORTLIST_1
285 #elif defined (__alpha__)
287 #define PSCHED_WATCHER u32
289 extern PSCHED_WATCHER psched_time_mark
;
291 #define PSCHED_GET_TIME(stamp) \
293 __asm__ __volatile__ ("rpcc %0" : "r="(__res)); \
294 if (__res <= psched_time_mark) psched_time_base += 0x100000000UL; \
295 psched_time_mark = __res; \
296 (stamp) = (psched_time_base + __res)>>psched_clock_scale; \
299 #define PSCHED_EXPORTLIST_1 EXPORT_SYMBOL(psched_time_base); \
300 EXPORT_SYMBOL(psched_time_mark);
304 #error PSCHED_CLOCK_SOURCE=PSCHED_CPU is not supported on this arch.
308 #endif /* PSCHED_CLOCK_SOURCE == PSCHED_JIFFIES */
310 #endif /* PSCHED_CLOCK_SOURCE == PSCHED_GETTIMEOFDAY */
312 #if PSCHED_CLOCK_SOURCE == PSCHED_GETTIMEOFDAY
313 #define PSCHED_TDIFF(tv1, tv2) \
315 int __delta_sec = (tv1).tv_sec - (tv2).tv_sec; \
316 int __delta = (tv1).tv_usec - (tv2).tv_usec; \
318 switch (__delta_sec) { \
322 __delta += 1000000; \
324 __delta += 1000000; \
330 extern int psched_tod_diff(int delta_sec
, int bound
);
332 #define PSCHED_TDIFF_SAFE(tv1, tv2, bound, guard) \
334 int __delta_sec = (tv1).tv_sec - (tv2).tv_sec; \
335 int __delta = (tv1).tv_usec - (tv2).tv_usec; \
336 switch (__delta_sec) { \
338 __delta = psched_tod_diff(__delta_sec, bound); guard; break; \
340 __delta += 1000000; \
342 __delta += 1000000; \
348 #define PSCHED_TLESS(tv1, tv2) (((tv1).tv_usec < (tv2).tv_usec && \
349 (tv1).tv_sec <= (tv2).tv_sec) || \
350 (tv1).tv_sec < (tv2).tv_sec)
352 #define PSCHED_TADD2(tv, delta, tv_res) \
354 int __delta = (tv).tv_usec + (delta); \
355 (tv_res).tv_sec = (tv).tv_sec; \
356 if (__delta > 1000000) { (tv_res).tv_sec++; __delta -= 1000000; } \
357 (tv_res).tv_usec = __delta; \
360 #define PSCHED_TADD(tv, delta) \
362 (tv).tv_usec += (delta); \
363 if ((tv).tv_usec > 1000000) { (tv).tv_sec++; \
364 (tv).tv_usec -= 1000000; } \
367 /* Set/check that time is in the "past perfect";
368 it depends on concrete representation of system time
371 #define PSCHED_SET_PASTPERFECT(t) ((t).tv_sec = 0)
372 #define PSCHED_IS_PASTPERFECT(t) ((t).tv_sec == 0)
374 #define PSCHED_AUDIT_TDIFF(t) ({ if ((t) > 2000000) (t) = 2000000; })
378 #define PSCHED_TDIFF(tv1, tv2) (long)((tv1) - (tv2))
379 #define PSCHED_TDIFF_SAFE(tv1, tv2, bound, guard) \
381 long long __delta = (tv1) - (tv2); \
382 if ( __delta > (long long)(bound)) { __delta = (bound); guard; } \
387 #define PSCHED_TLESS(tv1, tv2) ((tv1) < (tv2))
388 #define PSCHED_TADD2(tv, delta, tv_res) ((tv_res) = (tv) + (delta))
389 #define PSCHED_TADD(tv, delta) ((tv) += (delta))
390 #define PSCHED_SET_PASTPERFECT(t) ((t) = 0)
391 #define PSCHED_IS_PASTPERFECT(t) ((t) == 0)
392 #define PSCHED_AUDIT_TDIFF(t)
398 struct tcf_police
*next
;
412 struct qdisc_rate_table
*R_tab
;
413 struct qdisc_rate_table
*P_tab
;
415 struct tc_stats stats
;
418 extern int qdisc_copy_stats(struct sk_buff
*skb
, struct tc_stats
*st
);
419 extern void tcf_police_destroy(struct tcf_police
*p
);
420 extern struct tcf_police
* tcf_police_locate(struct rtattr
*rta
, struct rtattr
*est
);
421 extern int tcf_police_dump(struct sk_buff
*skb
, struct tcf_police
*p
);
422 extern int tcf_police(struct sk_buff
*skb
, struct tcf_police
*p
);
424 static inline void tcf_police_release(struct tcf_police
*p
)
426 if (p
&& --p
->refcnt
== 0)
427 tcf_police_destroy(p
);
430 extern struct Qdisc noop_qdisc
;
431 extern struct Qdisc_ops noop_qdisc_ops
;
432 extern struct Qdisc_ops pfifo_qdisc_ops
;
433 extern struct Qdisc_ops bfifo_qdisc_ops
;
435 int register_qdisc(struct Qdisc_ops
*qops
);
436 int unregister_qdisc(struct Qdisc_ops
*qops
);
437 struct Qdisc
*qdisc_lookup(struct net_device
*dev
, u32 handle
);
438 struct Qdisc
*qdisc_lookup_class(struct net_device
*dev
, u32 handle
);
439 void dev_init_scheduler(struct net_device
*dev
);
440 void dev_shutdown(struct net_device
*dev
);
441 void dev_activate(struct net_device
*dev
);
442 void dev_deactivate(struct net_device
*dev
);
443 void qdisc_reset(struct Qdisc
*qdisc
);
444 void qdisc_destroy(struct Qdisc
*qdisc
);
445 struct Qdisc
* qdisc_create_dflt(struct net_device
*dev
, struct Qdisc_ops
*ops
);
446 int qdisc_new_estimator(struct tc_stats
*stats
, struct rtattr
*opt
);
447 void qdisc_kill_estimator(struct tc_stats
*stats
);
448 struct qdisc_rate_table
*qdisc_get_rtab(struct tc_ratespec
*r
, struct rtattr
*tab
);
449 void qdisc_put_rtab(struct qdisc_rate_table
*tab
);
451 int tc_filter_init(void);
452 int pktsched_init(void);
454 extern int qdisc_restart(struct net_device
*dev
);
456 static inline void qdisc_run(struct net_device
*dev
)
458 while (!netif_queue_stopped(dev
) &&
459 qdisc_restart(dev
)<0)
462 /* Lookup a qdisc_rate_table to determine how long it will take to send a
463 packet given its size.
465 static inline u32
qdisc_l2t(struct qdisc_rate_table
* rtab
, int pktlen
)
467 int slot
= pktlen
+ rtab
->rate
.cell_align
;
470 slot
>>= rtab
->rate
.cell_log
;
472 return rtab
->data
[255] + 1;
473 return rtab
->data
[slot
];
476 /* Calculate maximal size of packet seen by hard_start_xmit
477 routine of this device.
479 static inline unsigned psched_mtu(struct net_device
*dev
)
481 unsigned mtu
= dev
->mtu
;
482 return dev
->hard_header
? mtu
+ dev
->hard_header_len
: mtu
;