2011-08-22 12 views
5

bitti. Amaç, sıraya girmek. On paketleri ve daha sonra (yani gerçekten ağ için iyi bir şey değil, ama bununla biraz araştırma yapmak istiyorum, biliyorum) hepsini göndermek.Yeni linux tc ... Ben Linux çekirdeği için disiplin kuyruk yeni tc yazmak istiyorum bilginin

Peki, zaten ne yapıldı: Yeni bir zamanlama modülüne sahip bir iskeletim var (enque, dequeue işlevler vb.), Aynı zamanda doğru bir şekilde derleme ve doğru çalışma (bir paket sıraya alındı, bir paket özel bir şey göndermiyor)). Koşuyorum çekirdek ile aynı kaynaklarla ubuntu maverick üzerinde derleme ve Makefile ve KConfig benim modül koymak ediyorum.

Enqueue işlevi her çağrıldığında, daha sonra dequeue işlevinin qdisc_restart (sch_generic.c) tarafından çağrıldığını ve yalnızca bir paketin gönderileceğini anladım.

Sorunum: Ben eg için toplanan gibi, ağ arayüzüne benim modülünden birden fazla paket göndermek nasıl. 10 paket ve şimdi hepsini dışarı göndermek istiyorum?

ben qdisc_restart (ve kilitleme mekanizmalarının) aynı parametrelerle (sch_generic.c itibaren) sch_direct_xmit işlevini aramaya çalıştım - ama sonra benim modülün derleme başarısız: bilinmeyen sembol sch_direct_xmit (ama greping/proc/kallsyms Bunun için bana bir sonuç verir). Herhangi bir fikrin, bunun nesi var? Bazı kod gerekiyorsa, sadece

cevap

0

Ben kolay çözüm uyandığında verecek bir kthread kullanmak olacağını düşünüyorum

BR Christoph (ı sched_generic.c aynı .h dahil) bana bildirin 10 paket sıraya girdikten sonra. kthread önce sıraya olurdu paketleri tüketen sorumlu olacaktır. kodunuzun bazı örneklerin olmadan

sizin dequeue fonksiyonu çağrıldığını yapar olaylar dizisi ne olduğunu bilmek zor ama muhtemelen böyle bir şey yapabilirsiniz:

böyle
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; 
} 

şey yapacağını Şüpheliyim. Kod derlenmiş değil ama bu nasıl yapılacağına ilişkin bir fikir verir.