新的linux tc队列规则创建突发事件…知识不足

新的linux tc队列规则创建突发事件…知识不足,linux,linux-kernel,queuing,Linux,Linux Kernel,Queuing,我想为linux内核编写一个新的tc队列规程。我们的目标是排队,例如10个数据包,然后全部发送出去(我知道,这对建立网络不是一件好事,但我想做一些研究) 那么,已经做了什么:我有了一个新sched模块的框架(排队、出列函数等等),它也可以正确编译和正常工作(一个数据包排队,一个数据包发送-没有什么特别的)。我使用与运行内核相同的源代码在ubuntu maverick上编译它,并将我的模块放入Makefile和Kconfig中 我发现,每次调用enqueue函数时,qdisc_restart(在s

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

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

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

我的问题是:我如何从我的模块向网络接口发送多个数据包,比如我收集了10个数据包,现在我想将它们全部发送出去

我试图使用与qdisc_重启(和锁定机制)中相同的参数调用schu direct_xmit函数(来自sch_generic.c)——但随后,我的模块编译失败:未知符号schu direct_xmit(但greping/proc/kallsyms会给我一个结果)。你知道这有什么不对吗?如果需要一些代码,请告诉我(我在sched_generic.c中包含了相同的.h)


Christoph

我认为最简单的解决方案是使用一个kthread,当你排队等待10个数据包时,你就会醒来。kthread将负责使用您先前排队的数据包

如果没有一些代码示例,很难知道使您的出列函数被调用的事件序列,但您可能可以这样做:

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;
}
静态结构sk_buff_head foo_skb_队列;
静态声明队列头(食物);
内部食物发送器(无效*未使用)
{
结构sk_buff*skb=NULL;
无符号整数i=0;
而(!kthread_should_stop()){
while(skb=skb_出列(&foo_-skb_队列)&&i=要发送的编号)
唤醒(食物);
返回0;
}
我怀疑像这样的东西会有用的。代码未编译,但它为您提供了如何执行此操作的想法