2017-08-25 58 views
5

Şu anda paket yükünü bir öğrenme deneyimi olarak değiştiren bir çekirdek modülü yazıyorum. Paket değiştirmelerim var, ancak şimdi bu yeni değiştirilmiş paketi orijinalden sonra göndermek istiyorum (orijinali bırakmak istemiyorum). SKB'leri iletim için gönderen bir çekirdek işlevi bulamıyorum. Ben dev_queue_xmit(nskb) denedim ama bu bir çekirdek panik neden olur, ben de skb->next = nskb denedim ama hiçbir şey yapmaz. SKB liste işlemlerini uygulamak zorunda mıyım? Bu makale seems to be outdated'dan beri nasıl yapılacağından emin değilim.Çekirdek alanından iletim için SKB'leri gönderme

DÜZENLEME:

Yani dev_queue_xmit (nskb) çağrılırken çekirdek panik düzeltmek başardı, yanlışlıkla net filtresinden panik SKB silip yol açacak dev_queue_xmit (SKB) yapıyordu. Sorun şu ki her şey çalışıyor, ama kopya paketlerin gönderilmediğini görmüyorum, gönderilen ikinci paketin izi yok. Makinede TCPDump hiçbir şey görmüyor ve hedefte TPCDump ya bir şey görmüyor, aşağıdaki kod benim. aşağıdaki gibi

unsigned int in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { 
    struct sk_buff *nskb = skb_copy(skb, GFP_KERNEL); 
    /* Various other variables not relevant to the problem */ 
    __u32 saddr, daddr; 
    saddr = ntohl(iph->saddr); 
    if (saddr == ipToInt(10,0,2,12) || saddr == ipToInt(10,0,2,13)) { 
     /*For loop that saves the payload contents into a variable */ 

     /* Here is where the problem is, 
     I have this if statement to prevent a feedback loop 
     then if the ip matches, I call dev_queue_xmit(nskb) 
     which is supposed to send out sk_buff's, but TCPDump doesn't 
     show anything on any computer */ 
     if (saddr == ipToInt(10,0,2,13)) { 
      dev_queue_xmit(nskb); 
     } 

     /* Rest of the code that isn't relevant to sending packets */ 
    } 
    return NF_ACCEPT; 
} 

Benim ağ kurulumu, bu 3 Ubuntu Sunucu VM en hepsi ana bilgisayardan (Bu konularda, ben bu noktada bilmiyorum MacOS) içine SSH'd ediliyor bu. Yukarıdaki çekirdek modülünü çalıştıran bilgisayar, diğer iki VM'sinin iki yönlü olarak taklit edildiğini. Diğer iki VM daha sonra bir netcat oturumuyla birbirleriyle konuşur. VM'den ip 10.0.2.13 ile bir mesaj yolladığımda, bu 10.0.2.12 mesajının ikisinin de aynı mesajı görmesini umuyorum. Anlaşılan numaranın yanlış anlaşılmasının bağlantıyı keseceğini biliyorum, ama bunu anlamıyorum. 3 bilgisayarın herhangi birindeki TCPDump, gönderilmesi gereken paketlerin yanında hiçbir şey göstermez.

Şu ana kadar dev_queue_xmit(nskb) ve nskb->dev->netdev_ops->ndo_start_xmit(nskb, skb->dev) çalıştı.

cevap

0

Bunu çözdüm, skb_copy bir skb'nin ethernet başlığını kopyalamıyor, böylece gönderilen paket hiçbir zaman hedefine ulaşmıyor.

1

Dev_queue_xmit() öğesinin hatırladığım kadarıyla gönderim için doğru yöntemdir. Soru, göndermek istediğin skb'yi nasıl hazırlıyor? Ayrıca, çekirdek paniği meydana geldiğinde bize dmesg'den calltrace verin. Skb-> dev'i ayarladın mı?

+0

Dmesg kontrol ettiğimde boş ve skb-> dev ayarlanmışsa, sanırım eğer 'if (skb-> dev)' ise, true değerini döndürür. Ayrıca, şimdi sadece ikinci bir paket göndermeye çalışıyorum, bu yüzden net filtre işlevi tarafından bana verilen skb, ben iki yinelenen paketi görmeyi umuyordum üzerinde dev_queue_xmit (skb) 'yapmak. – MacStation

+0

En önemli şey: çekirdek panik meydana geldiğinde, dmesg'de (ekranda) tam olarak ne olması gerektiğine ihtiyacımız var. Çekirdek oluştuğunda, sistem dosyalarında oturum açılmayabileceğini biliyorum - böylece ikinci sistemi bağlı seri konsol ile kullanabilirsiniz ve bu konsolun dökümünü yapabilirsiniz. – user2699113

+0

İkinci bir şey - skb'yi nasıl kopyaladınız? – user2699113

İlgili konular