diff options
Diffstat (limited to 'include/net/codel.h')
| -rw-r--r-- | include/net/codel.h | 23 | 
1 files changed, 16 insertions, 7 deletions
diff --git a/include/net/codel.h b/include/net/codel.h index 389cf621161..fe0eab32ce7 100644 --- a/include/net/codel.h +++ b/include/net/codel.h @@ -46,7 +46,6 @@  #include <linux/skbuff.h>  #include <net/pkt_sched.h>  #include <net/inet_ecn.h> -#include <linux/reciprocal_div.h>  /* Controlling Queue Delay (CoDel) algorithm   * ========================================= @@ -72,10 +71,21 @@ static inline codel_time_t codel_get_time(void)  	return ns >> CODEL_SHIFT;  } -#define codel_time_after(a, b)		((s32)(a) - (s32)(b) > 0) -#define codel_time_after_eq(a, b)	((s32)(a) - (s32)(b) >= 0) -#define codel_time_before(a, b)		((s32)(a) - (s32)(b) < 0) -#define codel_time_before_eq(a, b)	((s32)(a) - (s32)(b) <= 0) +/* Dealing with timer wrapping, according to RFC 1982, as desc in wikipedia: + *  https://en.wikipedia.org/wiki/Serial_number_arithmetic#General_Solution + * codel_time_after(a,b) returns true if the time a is after time b. + */ +#define codel_time_after(a, b)						\ +	(typecheck(codel_time_t, a) &&					\ +	 typecheck(codel_time_t, b) &&					\ +	 ((s32)((a) - (b)) > 0)) +#define codel_time_before(a, b) 	codel_time_after(b, a) + +#define codel_time_after_eq(a, b)					\ +	(typecheck(codel_time_t, a) &&					\ +	 typecheck(codel_time_t, b) &&					\ +	 ((s32)((a) - (b)) >= 0)) +#define codel_time_before_eq(a, b)	codel_time_after_eq(b, a)  /* Qdiscs using codel plugin must use codel_skb_cb in their own cb[] */  struct codel_skb_cb { @@ -200,10 +210,9 @@ static codel_time_t codel_control_law(codel_time_t t,  				      codel_time_t interval,  				      u32 rec_inv_sqrt)  { -	return t + reciprocal_divide(interval, rec_inv_sqrt << REC_INV_SQRT_SHIFT); +	return t + reciprocal_scale(interval, rec_inv_sqrt << REC_INV_SQRT_SHIFT);  } -  static bool codel_should_drop(const struct sk_buff *skb,  			      struct Qdisc *sch,  			      struct codel_vars *vars,  | 
