[PATCH] netem: fix logic bug in reorder conditional
From: Stephen Hemminger <hidden>
Date: 2005-05-23 17:43:42
Thanks, Julio you spotted the problem with the logic. This should fix it: Index: netem-2.6.12-rc4/net/sched/sch_netem.c ===================================================================
--- netem-2.6.12-rc4.orig/net/sched/sch_netem.c
+++ netem-2.6.12-rc4/net/sched/sch_netem.c@@ -181,13 +181,9 @@ static int netem_enqueue(struct sk_buff q->duplicate = dupsave; } - /* - * Do re-ordering by putting one out of N packets at the front - * of the queue. - * gap == 0 is special case for no-reordering. - */ - if (q->gap == 0 && q->counter < q->gap && - q->reorder < get_crandom(&q->reorder_cor)) { + if (q->gap == 0 /* not doing reordering */ + || q->counter < q->gap /* inside last reordering gap */ + || q->reorder < get_crandom(&q->reorder_cor)) { psched_time_t now; PSCHED_GET_TIME(now); PSCHED_TADD2(now, tabledist(q->latency, q->jitter,
@@ -196,6 +192,10 @@ static int netem_enqueue(struct sk_buff ++q->counter; ret = q->qdisc->enqueue(skb, q->qdisc); } else { + /* + * Do re-ordering by putting one out of N packets at the front + * of the queue. + */ PSCHED_GET_TIME(cb->time_to_send); q->counter = 0; ret = q->qdisc->ops->requeue(skb, q->qdisc);