2014-09-20 84 views
0

假設我實現了一個解析RX數據包的內核驅動程序,並根據EthType決定將其傳遞給用戶空間。 Linux內核中的「官方」方法是什麼?攔截內核中的數據包並傳入用戶空間

我唯一想到的就是用戶應用程序向內核打開一個套接字並偵聽它,而內核將滿足條件的數據包(例如指定的EthType)推入套接字的緩衝區。我當然不準確這一點,但我希望你明白我的意思:)

還有沒有其他的方法可以做到這一點?

謝謝。

回答

0

當分組到達上的NIC,這些數據包首先被複制到內核緩衝區,然後複製到用戶空間,這是通過插座(),接着讀()/寫()訪問調用在用戶空間。您可能需要參考[http://www.linuxfoundation.org/collaborate/workgroups/networking/kernel_flow](Kernel網絡流量)瞭解更多詳情。

此外,NIC可以直接將數據包複製到繞過CPU的DMA中。參見:What happens after a packet is captured?

+0

感謝您的聯繫。我也想知道是否有一個用戶空間接收數據包的套接字方法?它看起來是套接字是唯一合法的方式。如我錯了請糾正我。 – Mark 2014-09-20 22:04:21

+0

用戶空間和內核可以通過多種方式相互通信。參考[內核空間 - 用戶空間接口](http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#ss3.3) – askb 2014-09-21 03:38:48

0

您可以通過使用netfilter框架實現自己的目標。 Netfilter框架可以幫助攔截ingrees/egrees數據包。數據包在內核/網絡堆棧中可被攔截的點在Netfilter中稱爲HOOKS。我們可以編寫一個內核模塊,它可以掛在任何一個HOOKS上。內核模塊必須有一個由我們定義的函數,它可以解析數據包及其頭文件,並決定是否丟棄數據包,將其發送到內核堆棧,將其排隊到用戶空間等。

我們的興趣可以在IP_PREROUTING鉤子處截獲,並通過從我們的函數返回NF_QUEUE排隊。數據包將排隊等待任何應用程序訪問。

請通過Netfilter文檔。

Regards, Roy

相關問題