2014-02-21 34 views
0

背景:我是UCSB的第四年計算機工程專業。我已經參加了網絡和操作系統課程。我在用戶空間中創建了一個程序,它將UDP數據包廣播到子網上,並在自組織網絡中接收UDP數據包。我想要完成的是將這個程序轉換成一個內核模塊,該模塊可以在一個帶有Angstrom Linux的ARM嵌入式系統上工作,內核版本爲2.6.39(x86到ARM架構交叉編譯是另一個問題)。這個轉移到內核的原因是爲了減少用戶空間函數的一些開銷,並儘可能快地使發送和接收部分。在內核模塊中發送UDP數據包

我以前從未在任何課程中做過這樣的事情,所以請告訴我,我說的任何內容都是不正確,無用或效率低下的!

經過與谷歌的研究,我已經總結出典型的方法是徹底取消套接字並使用sockbuf結構並自己填寫必要的標題。這會影響在子網上廣播數據包的能力嗎? 我目前正在按照這裏的代碼: UDP packet send with linux-kernel module without using sockets

我已經想通了後面的大部分代碼的推理,但最後的部分是什麼讓我困惑:

eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); 
skb_reset_mac_header(skb); 
skb->protocol = eth->h_proto = htons(ETH_P_IP); 
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN); 
memcpy(eth->h_dest, remote_mac, ETH_ALEN); 

skb->dev = dev; 


dev_queue_xmit(skb); 
  • 所有以太網報頭似乎是純粹由內核中除源MAC地址之外定義的報頭構成的,這是正確的嗎?我將要廣播我的數據包,那麼究竟應該把什麼東西放到目的MAC地址字段?
  • 更重要的是,skb->dev = dev;行中的設備是什麼?從我的調查來看,它是一個指向它所關聯的設備驅動程序的指針。根據我的理解,我希望這個指向無線芯片設備驅動程序,因爲我使用8​​02.11進行通信。我是否必須爲無線驅動程序創建我自己的dev結構?如果是這樣,那麼有關於如何完成這一任務的指導?如果沒有,我如何訪問現有的設備驅動程序並在內核模塊中使用它?

我已經嘗試過註釋開發線和運行代碼,但毫不奇怪,一旦它執行dev_queue_xmit(skb);就會發生內核恐慌。

再一次,我從來沒有做過這樣的事情,所以任何建議都會有幫助,即使這意味着完全改變我的方法!我也明白,這可能是一個問題的利基,但任何形式的指導表示讚賞!

預先感謝您!

+0

的源MAC地址字段應該有相同的信息,像往常一樣:地址正如您的示例中所示,該設備的設置是正確的。在目標MAC地址字段中放置以太網廣播地址(FF:FF:FF:FF:FF:FF)。我認爲你使用現有的設備驅動程序結構並將其放入skb中,以便dev_queue_xmit方法知道發送數據包的驅動程序;但是不確定。 –

+0

感謝您的反饋。你說的是有道理的。雖然看起來我們都不太瞭解設備驅動程序!我讚賞雖然:) –

+0

我會說,而是,設備驅動程序高度依賴於設備和平臺。 –

回答

1

如果您不想修改協議,最好的方法是不要干擾協議。在更高的(套接字)層上工作。這個API可以在網上找到/ socket.c中

這將幫助:(在新的瀏覽器標籤頁中打開/窗口進行縮放) Linux Kernel Network Flow

+0

謝謝!這張照片對於理解事物的程序流程非常有幫助。你真的認爲我應該回到套接字層?我試圖儘可能減少發送/接收數據包的延遲(我目前處於亞毫秒級別)。如果你認爲沒有足夠的好處去深入,那麼我會嘗試套接字實現。謝謝! –

+0

是的,在套接字層更好,否則你可能會搞亂協議。您可以使用內核套接字來獲得適當的有效負載(以太網,IP等)。另外,減少一些函數調用也沒有什麼大的優勢。開銷可以忽略不計,因爲你已經在內核之內了(不像減少系統調用)。 如果答案有幫助,請將其標記爲正確並+1,以便其他人通過搜索有所幫助。 – user31986