2012-07-06 117 views
-1

我正在通過網絡發送數據的Linux內核編寫驅動程序。現在假設我要發送的數據(緩衝區)位於內核空間中。如何在不創建套接字的情況下發送數據(首先,這是一個好主意?)。我在代碼中尋找性能而不是簡單的編碼。我如何設計接收端?沒有套接字連接,我可以獲取並查看接收端上的數據(如何)?如果緩衝區在用戶空間中,將會改變所有這些變化(包括性能)(如果有:-),我會從用戶那裏複製)?通過網絡內的網絡發送數據

+0

它是什麼類型的設備?什麼樣的網絡? – 2012-07-07 06:22:42

+0

好吧,我想實現一個適用於所有網絡設備的通用驅動程序。那麼我讀過太多篇禁止我在內核空間編寫網絡代碼的文章。想要看看笏發生如果我這樣做 – Malice 2012-07-09 18:10:20

+0

今天我遇到了一個新的想法。如果我在用戶空間中創建套接字描述符並在模塊插入驅動程序期間傳遞它並在卸載它之前使用套接字描述符,它會有意義嗎>它仍然可以幫助我節省上下文切換的時間。只是一個隨機的想法需要知道這是否比我原來的問題更好 – Malice 2012-07-10 18:30:37

回答

0

如果您希望在沒有套接字的情況下在網絡上發送數據,您需要掛接到網絡驅動程序並通過它們發送原始數據包,並過濾它們的傳入數據包以獲取您要劫持的數據包。我不認爲性能優勢足夠大以保證這一點。

我甚至沒有想過在網絡驅動程序中有這樣的掛鉤,我在過去做了一些相關的實現防火牆。你可以想象使用netfilter掛鉤來做類似的事情,以便從網絡驅動程序附加到接收端。

+0

嗯。那麼現在我開始不喜歡從內核內部通過網絡發送數據的想法。可能是我可以創建一個時間套接字描述符並將其傳遞給內核並永久使用它。看到我上面寫的評論 – Malice 2012-07-10 18:33:57

0

您應該使用netlink,如果您想真正與遠程主機通信(例如通過TCP/IPv6),請使用用戶級代理應用程序。 (所以內核模塊使用netlink到你的應用程序代理,它可以使用TCP,甚至可以通過ssh或HTTP遠程發送數據,或將它存儲在磁盤上...)。

我不認爲有一個內核模塊直接跟一個遙遠的主機是有道理的,否則(如安全問題,過濾,路由,iptables ...)

而真正的瓶頸是幾乎總是(物理)網絡本身。 1Gbit以太網幾乎總是比內核模塊或應用程序可持續產生的速度慢得多(以及延遲問題)。

+0

Netlink?我沒有創建用戶空間應用程序來支持此設備。整個設備位於內核空間。 – Malice 2012-07-07 05:57:18