5

Linux カーネル用の新しい tc キューイング規則を作成したいと考えています。目標は、例えば列に並ぶことです。10 個のパケットを送信してから、それらをすべて送信します (これはネットワークにとってあまり良いことではありませんが、それについて調査したいと思います)。

それで、すでに行われたこと: 私は新しい sched-module (エンキュー、デキュー関数など) のスケルトンを持っています。これも正しくコンパイルされ、正しく動作しています (キューに入れられた 1 つのパケット、1 つのパケットが送信されます - 特別なことは何もありません)。実行中のカーネルと同じソースを使用してubuntu maverickでコンパイルし、モジュールをMakefileとKconfigに入れています。

エンキュー関数が呼び出されるたびに、その後、デキュー関数が qdisc_restart (sch_generic.c 内) によって呼び出され、1 つのパケットのみが送信されることがわかりました。

私の問題は、たとえば収集したように、モジュールからネットワークインターフェイスに複数のパケットを送信するにはどうすればよいかです。10 個のパケットをすべて送信したいのですが?

qdisc_restart (およびロックメカニズム) と同じパラメーターを使用して (sch_generic.c から) sch_direct_xmit 関数を呼び出そうとしましたが、モジュールのコンパイルが失敗しました: 不明なシンボル sch_direct_xmit (ただし、/proc/kallsyms を grep すると、結果)。何が問題なのですか?コードが必要な場合はお知らせください (sched_generic.c と同じ .h を含めました)。

BR クリストフ

4

1 に答える 1

0

最も簡単な解決策は、10 個のパケットをキューに入れたときに起動する kthread を使用することだと思います。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-11-06T21:38:39.100 に答える