static unsigned int gred_drop(struct Qdisc *sch) { struct sk_buff *skb; struct gred_sched *t = qdisc_priv(sch); skb = qdisc_dequeue_tail(sch); if (skb) { unsigned int len = qdisc_pkt_len(skb); struct gred_sched_data *q; u16 dp = tc_index_to_dp(skb); if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { if (net_ratelimit()) pr_warning("GRED: Unable to relocate VQ 0x%x " "while dropping, screwing up " "backlog.\n", tc_index_to_dp(skb)); } else { q->backlog -= len; q->stats.other++; if (!q->backlog && !gred_wred_mode(t)) red_start_of_idle_period(&q->vars); } qdisc_drop(skb, sch); return len; } if (gred_wred_mode(t) && !red_is_idling(&t->wred_set)) red_start_of_idle_period(&t->wred_set); return 0; }
static unsigned int red_drop(struct Qdisc* sch) { struct sk_buff *skb; struct red_sched_data *q = qdisc_priv(sch); skb = qdisc_dequeue_tail(sch); if (skb) { unsigned int len = skb->len; q->stats.other++; qdisc_drop(skb, sch); return len; } if (!red_is_idling(&q->parms)) red_start_of_idle_period(&q->parms); return 0; }