【问题标题】:New linux tc queuing discipline to create bursts...ran out of knowledge新的 linux tc 队列规则创建突发......知识用完了
【发布时间】:2011-11-01 07:39:27
【问题描述】:

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

所以,已经完成了什么:我有一个新的 sched 模块(入队、出队函数等)的骨架,它也可以正确编译和正常工作(一个数据包排队,一个数据包发送出去——没什么特别的) .我在 ubuntu maverick 上使用与正在运行的内核相同的源对其进行编译,并将我的模块放在 Makefile 和 Kconfig 中。

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

我的问题是:我怎样才能将多个数据包从我的模块发送到网络接口,就像我收集的那样。 10个包,现在我想把它们都寄出去?

我尝试使用与 qdisc_restart 中相同的参数(和锁定机制)调用 sch_direct_xmit 函数(来自 sch_generic.c),但随后,我的模块编译失败:未知符号 sch_direct_xmit(但 greping /proc/kallsyms这给了我一个结果)。任何想法,这有什么问题?如果需要一些代码,请告诉我(我包含与 sched_generic.c 中相同的 .h)

BR 克里斯托夫

【问题讨论】:

    标签: linux linux-kernel queuing


    【解决方案1】:

    我认为最简单的解决方案是使用一个 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;
    }
    

    我怀疑这样的事情会做到这一点。代码未编译,但它让您了解如何执行此操作。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多