|
@@ -358,6 +358,21 @@ static psched_time_t packet_len_2_sched_time(unsigned int len, struct netem_sche
|
|
|
return PSCHED_NS2TICKS(ticks);
|
|
|
}
|
|
|
|
|
|
+static void tfifo_reset(struct Qdisc *sch)
|
|
|
+{
|
|
|
+ struct netem_sched_data *q = qdisc_priv(sch);
|
|
|
+ struct rb_node *p;
|
|
|
+
|
|
|
+ while ((p = rb_first(&q->t_root))) {
|
|
|
+ struct sk_buff *skb = netem_rb_to_skb(p);
|
|
|
+
|
|
|
+ rb_erase(p, &q->t_root);
|
|
|
+ skb->next = NULL;
|
|
|
+ skb->prev = NULL;
|
|
|
+ kfree_skb(skb);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch)
|
|
|
{
|
|
|
struct netem_sched_data *q = qdisc_priv(sch);
|
|
@@ -610,6 +625,7 @@ static void netem_reset(struct Qdisc *sch)
|
|
|
struct netem_sched_data *q = qdisc_priv(sch);
|
|
|
|
|
|
qdisc_reset_queue(sch);
|
|
|
+ tfifo_reset(sch);
|
|
|
if (q->qdisc)
|
|
|
qdisc_reset(q->qdisc);
|
|
|
qdisc_watchdog_cancel(&q->watchdog);
|