新的linux tc排队规则来创建突发事件…已经没有知识了



我想为linux内核编写一个新的tc队列规则。目标是排队。10个数据包,然后将它们全部发送出去(我知道,这对网络来说不是一件好事,但我想对此做一些研究)。

那么,已经完成了什么:我有一个新的调度模块的框架(enqueue, dequeue函数等等),它也正确编译和正确工作(一个数据包排队,一个数据包发送-没有什么特别的)。我在ubuntu maverick上编译它,使用与运行内核相同的源代码,并将我的模块放在Makefile和Kconfig中。

我发现,每次调用enqueue函数时,随后由qdisc_restart调用dequeue函数(在sch_generic.c中)—并且只发送一个数据包。

我的问题是:我如何从我的模块发送多个数据包到网络接口,就像我收集的一样。10包,现在我要把它们都发出去?

我试图调用sch_direct_xmit函数(从sch_generic.c)与qdisc_restart(和锁定机制)相同的参数-但是,我的模块编译失败:未知符号sch_direct_xmit(但greping/proc/kallsyms给我一个结果)。知道这有什么不对吗?如果需要一些代码,请告诉我(我在sched_generic.c中包含了相同的.h)

BRChristoph

我认为最简单的解决方案是使用当您排队10个数据包时唤醒的kthread。kthread将负责使用您先前排队的数据包。

如果没有一些代码示例,很难知道调用dequeue函数的事件顺序是什么,但你可能会这样做:

static struct sk_buff_head foo_skb_queue;
static DECLARE_WAIT_QUEUE_HEAD(food_wqh);
int food_sender(void* unused)
{
        struct sk_buff* skb = NULL;
        unsigned int i = 0;
        while (!kthread_should_stop()) {
                while (skb = skb_dequeue(&foo_skb_queue) && i < NUMBER_TO_SEND) {
                         send_packet(skb);
                         ++i;
                }
                DECLARE_WAITQUEUE(wq, current);
                set_current_state(TASK_INTERRUPTIBLE);
                add_wait_queue(&food_wqh, &wq);
                /* Avoid wake-up lost race */
                if (skb_queue_len(&foo_skb_queue) < NUMBER_TO_SEND)
                        schedule();
                remove_wait_queue(&food_wqh, &wq);
        }
        return 0;
}
int foo_enqueue(struct sk_buff* skb)
{
        skb_queue_tail(&foo_skb, skb);       
        if (skb_queue_len(&foo_skb) >= NUMBER_TO_SEND)
                wake_up(&food_wqh);
        return 0;
}
我猜像这样的东西可以做到。代码没有编译,但它给你一个想法,如何做到这一点。

相关内容

最新更新