diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 5a8b0a1755797b869de0d9f8feb72e002ab0e26e..1f114219d68b6a9821336f7156e4814f16757f93 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -450,7 +450,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, skb->prev = NULL; /* Random duplication */ - if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) + if (q->duplicate && skb->tc_depth == 0 && + q->duplicate >= get_crandom(&q->dup_cor)) ++count; /* Drop packet? */ @@ -528,11 +529,9 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, */ if (skb2) { struct Qdisc *rootq = qdisc_root_bh(sch); - u32 dupsave = q->duplicate; /* prevent duplicating a dup... */ - q->duplicate = 0; + skb2->tc_depth++; /* prevent duplicating a dup... */ rootq->enqueue(skb2, rootq, to_free); - q->duplicate = dupsave; skb2 = NULL; }