2005-04-17 02:20:36 +04:00
# ifndef __NET_PKT_SCHED_H
# define __NET_PKT_SCHED_H
2006-01-09 09:12:03 +03:00
# include <linux/jiffies.h>
2007-03-16 11:18:42 +03:00
# include <linux/ktime.h>
2005-04-17 02:20:36 +04:00
# include <net/sch_generic.h>
2009-11-03 06:26:03 +03:00
struct qdisc_walker {
2005-04-17 02:20:36 +04:00
int stop ;
int skip ;
int count ;
int ( * fn ) ( struct Qdisc * , unsigned long cl , struct qdisc_walker * ) ;
} ;
2010-03-31 11:06:04 +04:00
# define QDISC_ALIGNTO 64
2005-07-06 01:15:09 +04:00
# define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1))
2005-04-17 02:20:36 +04:00
static inline void * qdisc_priv ( struct Qdisc * q )
{
2005-07-06 01:15:09 +04:00
return ( char * ) q + QDISC_ALIGN ( sizeof ( struct Qdisc ) ) ;
2005-04-17 02:20:36 +04:00
}
/*
Timer resolution MUST BE < 10 % of min_schedulable_packet_size / bandwidth
Normal IP packet size ~ 512 byte , hence :
0.5 Kbyte / 1 Mbyte / sec = 0.5 msec , so that we need 50u sec timer for
10 Mbit ethernet .
10 msec resolution - > < 50 Kbit / sec .
The result : [ 34 ] 86 is not good choice for QoS router : - (
The things are not so bad , because we may use artifical
clock evaluated by integration of network data flow
in the most critical places .
*/
typedef u64 psched_time_t ;
typedef long psched_tdiff_t ;
2009-06-09 02:05:13 +04:00
/* Avoid doing 64 bit divide */
# define PSCHED_SHIFT 6
2009-06-15 13:31:47 +04:00
# define PSCHED_TICKS2NS(x) ((s64)(x) << PSCHED_SHIFT)
# define PSCHED_NS2TICKS(x) ((x) >> PSCHED_SHIFT)
2005-04-17 02:20:36 +04:00
2009-06-15 13:31:47 +04:00
# define PSCHED_TICKS_PER_SEC PSCHED_NS2TICKS(NSEC_PER_SEC)
2007-03-23 21:28:30 +03:00
# define PSCHED_PASTPERFECT 0
2005-04-17 02:20:36 +04:00
2007-03-23 21:29:25 +03:00
static inline psched_time_t psched_get_time ( void )
{
2009-06-15 13:31:47 +04:00
return PSCHED_NS2TICKS ( ktime_to_ns ( ktime_get ( ) ) ) ;
2007-03-23 21:29:25 +03:00
}
2007-03-23 21:29:11 +03:00
static inline psched_tdiff_t
psched_tdiff_bounded ( psched_time_t tv1 , psched_time_t tv2 , psched_time_t bound )
{
return min ( tv1 - tv2 , bound ) ;
}
2007-03-16 11:19:15 +03:00
struct qdisc_watchdog {
struct hrtimer timer ;
struct Qdisc * qdisc ;
} ;
extern void qdisc_watchdog_init ( struct qdisc_watchdog * wd , struct Qdisc * qdisc ) ;
extern void qdisc_watchdog_schedule ( struct qdisc_watchdog * wd ,
psched_time_t expires ) ;
extern void qdisc_watchdog_cancel ( struct qdisc_watchdog * wd ) ;
2005-04-17 02:20:36 +04:00
extern struct Qdisc_ops pfifo_qdisc_ops ;
extern struct Qdisc_ops bfifo_qdisc_ops ;
2010-01-24 15:30:59 +03:00
extern struct Qdisc_ops pfifo_head_drop_qdisc_ops ;
2005-04-17 02:20:36 +04:00
2008-07-06 10:40:21 +04:00
extern int fifo_set_limit ( struct Qdisc * q , unsigned int limit ) ;
extern struct Qdisc * fifo_create_dflt ( struct Qdisc * sch , struct Qdisc_ops * ops ,
unsigned int limit ) ;
2005-04-17 02:20:36 +04:00
extern int register_qdisc ( struct Qdisc_ops * qops ) ;
extern int unregister_qdisc ( struct Qdisc_ops * qops ) ;
2008-08-22 14:24:05 +04:00
extern void qdisc_list_del ( struct Qdisc * q ) ;
2005-04-17 02:20:36 +04:00
extern struct Qdisc * qdisc_lookup ( struct net_device * dev , u32 handle ) ;
extern struct Qdisc * qdisc_lookup_class ( struct net_device * dev , u32 handle ) ;
extern struct qdisc_rate_table * qdisc_get_rtab ( struct tc_ratespec * r ,
2008-01-23 09:11:17 +03:00
struct nlattr * tab ) ;
2005-04-17 02:20:36 +04:00
extern void qdisc_put_rtab ( struct qdisc_rate_table * tab ) ;
2008-07-20 11:08:47 +04:00
extern void qdisc_put_stab ( struct qdisc_size_table * tab ) ;
2009-02-01 12:12:42 +03:00
extern void qdisc_warn_nonwc ( char * txt , struct Qdisc * qdisc ) ;
2009-08-06 05:44:21 +04:00
extern int sch_direct_xmit ( struct sk_buff * skb , struct Qdisc * q ,
struct net_device * dev , struct netdev_queue * txq ,
spinlock_t * root_lock ) ;
2005-04-17 02:20:36 +04:00
2008-07-16 13:15:04 +04:00
extern void __qdisc_run ( struct Qdisc * q ) ;
2005-04-17 02:20:36 +04:00
2008-07-16 13:15:04 +04:00
static inline void qdisc_run ( struct Qdisc * q )
2005-04-17 02:20:36 +04:00
{
2010-06-02 14:23:51 +04:00
if ( qdisc_run_begin ( q ) )
2008-07-16 13:15:04 +04:00
__qdisc_run ( q ) ;
2005-04-17 02:20:36 +04:00
}
2007-07-15 11:02:31 +04:00
extern int tc_classify_compat ( struct sk_buff * skb , struct tcf_proto * tp ,
struct tcf_result * res ) ;
2005-04-17 02:20:36 +04:00
extern int tc_classify ( struct sk_buff * skb , struct tcf_proto * tp ,
2007-07-15 11:02:31 +04:00
struct tcf_result * res ) ;
2005-04-17 02:20:36 +04:00
/* Calculate maximal size of packet seen by hard_start_xmit
routine of this device .
*/
2007-10-09 12:40:57 +04:00
static inline unsigned psched_mtu ( const struct net_device * dev )
2005-04-17 02:20:36 +04:00
{
2007-10-09 12:40:57 +04:00
return dev - > mtu + dev - > hard_header_len ;
2005-04-17 02:20:36 +04:00
}
# endif