假設我實現了一個解析RX數據包的內核驅動程序,並根據EthType決定將其傳遞給用戶空間。 Linux內核中的「官方」方法是什麼?攔截內核中的數據包並傳入用戶空間
我唯一想到的就是用戶應用程序向內核打開一個套接字並偵聽它,而內核將滿足條件的數據包(例如指定的EthType)推入套接字的緩衝區。我當然不準確這一點,但我希望你明白我的意思:)
還有沒有其他的方法可以做到這一點?
謝謝。
假設我實現了一個解析RX數據包的內核驅動程序,並根據EthType決定將其傳遞給用戶空間。 Linux內核中的「官方」方法是什麼?攔截內核中的數據包並傳入用戶空間
我唯一想到的就是用戶應用程序向內核打開一個套接字並偵聽它,而內核將滿足條件的數據包(例如指定的EthType)推入套接字的緩衝區。我當然不準確這一點,但我希望你明白我的意思:)
還有沒有其他的方法可以做到這一點?
謝謝。
當分組到達上的NIC,這些數據包首先被複制到內核緩衝區,然後複製到用戶空間,這是通過插座(),接着讀()/寫()訪問調用在用戶空間。您可能需要參考[http://www.linuxfoundation.org/collaborate/workgroups/networking/kernel_flow](Kernel網絡流量)瞭解更多詳情。
此外,NIC可以直接將數據包複製到繞過CPU的DMA中。參見:What happens after a packet is captured?
您可以通過使用netfilter框架實現自己的目標。 Netfilter框架可以幫助攔截ingrees/egrees數據包。數據包在內核/網絡堆棧中可被攔截的點在Netfilter中稱爲HOOKS。我們可以編寫一個內核模塊,它可以掛在任何一個HOOKS上。內核模塊必須有一個由我們定義的函數,它可以解析數據包及其頭文件,並決定是否丟棄數據包,將其發送到內核堆棧,將其排隊到用戶空間等。
我們的興趣可以在IP_PREROUTING鉤子處截獲,並通過從我們的函數返回NF_QUEUE排隊。數據包將排隊等待任何應用程序訪問。
請通過Netfilter文檔。
Regards, Roy
感謝您的聯繫。我也想知道是否有一個用戶空間接收數據包的套接字方法?它看起來是套接字是唯一合法的方式。如我錯了請糾正我。 – Mark 2014-09-20 22:04:21
用戶空間和內核可以通過多種方式相互通信。參考[內核空間 - 用戶空間接口](http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#ss3.3) – askb 2014-09-21 03:38:48