2005-04-16 15:20:36 -07:00
# ifndef __NET_PKT_SCHED_H
# define __NET_PKT_SCHED_H
2006-01-08 22:12:03 -08:00
# include <linux/jiffies.h>
2007-03-16 01:18:42 -07:00
# include <linux/ktime.h>
2005-04-16 15:20:36 -07:00
# include <net/sch_generic.h>
struct qdisc_walker
{
int stop ;
int skip ;
int count ;
int ( * fn ) ( struct Qdisc * , unsigned long cl , struct qdisc_walker * ) ;
} ;
2005-07-05 14:15:09 -07:00
# define QDISC_ALIGNTO 32
# define QDISC_ALIGN(len) (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1))
2005-04-16 15:20:36 -07:00
static inline void * qdisc_priv ( struct Qdisc * q )
{
2005-07-05 14:15:09 -07:00
return ( char * ) q + QDISC_ALIGN ( sizeof ( struct Qdisc ) ) ;
2005-04-16 15:20:36 -07: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-08 22:05:13 +00:00
/* Avoid doing 64 bit divide */
# define PSCHED_SHIFT 6
2009-06-15 02:31:47 -07:00
# define PSCHED_TICKS2NS(x) ((s64)(x) << PSCHED_SHIFT)
# define PSCHED_NS2TICKS(x) ((x) >> PSCHED_SHIFT)
2005-04-16 15:20:36 -07:00
2009-06-15 02:31:47 -07:00
# define PSCHED_TICKS_PER_SEC PSCHED_NS2TICKS(NSEC_PER_SEC)
2007-03-23 11:28:30 -07:00
# define PSCHED_PASTPERFECT 0
2005-04-16 15:20:36 -07:00
2007-03-23 11:29:25 -07:00
static inline psched_time_t psched_get_time ( void )
{
2009-06-15 02:31:47 -07:00
return PSCHED_NS2TICKS ( ktime_to_ns ( ktime_get ( ) ) ) ;
2007-03-23 11:29:25 -07:00
}
2007-03-23 11:29:11 -07: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 01:19:15 -07: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-16 15:20:36 -07:00
extern struct Qdisc_ops pfifo_qdisc_ops ;
extern struct Qdisc_ops bfifo_qdisc_ops ;
2008-07-05 23:40:21 -07: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-16 15:20:36 -07:00
extern int register_qdisc ( struct Qdisc_ops * qops ) ;
extern int unregister_qdisc ( struct Qdisc_ops * qops ) ;
2008-08-22 03:24:05 -07:00
extern void qdisc_list_del ( struct Qdisc * q ) ;
2005-04-16 15:20:36 -07: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-22 22:11:17 -08:00
struct nlattr * tab ) ;
2005-04-16 15:20:36 -07:00
extern void qdisc_put_rtab ( struct qdisc_rate_table * tab ) ;
2008-07-20 00:08:47 -07:00
extern void qdisc_put_stab ( struct qdisc_size_table * tab ) ;
2009-02-01 01:12:42 -08:00
extern void qdisc_warn_nonwc ( char * txt , struct Qdisc * qdisc ) ;
2009-08-06 01:44:21 +00: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-16 15:20:36 -07:00
2008-07-16 02:15:04 -07:00
extern void __qdisc_run ( struct Qdisc * q ) ;
2005-04-16 15:20:36 -07:00
2008-07-16 02:15:04 -07:00
static inline void qdisc_run ( struct Qdisc * q )
2005-04-16 15:20:36 -07:00
{
2008-09-23 01:05:56 -07:00
if ( ! test_and_set_bit ( __QDISC_STATE_RUNNING , & q - > state ) )
2008-07-16 02:15:04 -07:00
__qdisc_run ( q ) ;
2005-04-16 15:20:36 -07:00
}
2007-07-15 00:02:31 -07:00
extern int tc_classify_compat ( struct sk_buff * skb , struct tcf_proto * tp ,
struct tcf_result * res ) ;
2005-04-16 15:20:36 -07:00
extern int tc_classify ( struct sk_buff * skb , struct tcf_proto * tp ,
2007-07-15 00:02:31 -07:00
struct tcf_result * res ) ;
2005-04-16 15:20:36 -07:00
/* Calculate maximal size of packet seen by hard_start_xmit
routine of this device .
*/
2007-10-09 01:40:57 -07:00
static inline unsigned psched_mtu ( const struct net_device * dev )
2005-04-16 15:20:36 -07:00
{
2007-10-09 01:40:57 -07:00
return dev - > mtu + dev - > hard_header_len ;
2005-04-16 15:20:36 -07:00
}
# endif