puzzle 发表于 2003-10-15 14:52:09

关于linux内核TC模块RED的疑问。

找不到合适的地方发,只好发在这里了。
请大家指点。
linux内核TC模块设计是一个包驱动过程。
在其RED算法的实现中需要定位队列进入IDLE状态的时间。
在red_dequeue函数中(/net/sched/sch_red.c)
static struct sk_buff *
red_dequeue(struct Qdisc* sch)
{
        struct sk_buff *skb;
        struct red_sched_data *q = (struct red_sched_data *)sch->data;
        skb = __skb_dequeue(&sch->q);
        if (skb) {
                sch->stats.backlog -= skb->len;
                return skb;
        }
        PSCHED_GET_TIME(q->qidlestart);
        return NULL;
}
调用red_dequeue时若队列已为空则取当前时间为队列进入IDLE状态的时间。
问题是包驱动过程应该是一次enqueue对应一次dequeue,如果没有red_dequeue没有其他的调用点是__skb_dequeue的返回值是不可能为NULL的。我觉得可能有另外一个机制,但是找了很久都没发现。请熟悉TC模块的达人解答,谢谢:)
页: [1]
查看完整版本: 关于linux内核TC模块RED的疑问。