[問題] kernel mode發送自定封包問題
各位好, 我想請教一個kernel module發送封包的問題
情境如下:
1. 一台linux主機有2張分屬2個ip domain的網卡
2. 若從網卡1收到的封包, 在ip header後插上自訂protocol header, 然後從網卡2送出
3. 若從網卡2收到的封包, 在ip header後移除自訂protocol header, 然後從網卡1送出
我一開始把此機制實作在user space, 也就是開2個raw socket, 收到網卡1來的封包
就加上自訂protocol header, 然後從網卡2 raw socket送出; 收到網卡2來的封包,
就移除自訂protocol header, 然後從網卡1 raw socket送出
後來我認為把機制實作在kernel space, 應該可以加快處理速度, 所以寫了1個
net filter module, 並hook在pre_routing的位置;當module收到ip封包(sk_buff), 檢查
ip的protocol欄位, 如果是UDP/TCP, 就用alloc_skb創出一個新的sk_buff, memcpy原有
封包資料並在適當位置插上自訂protocol header, 最後呼叫
NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, mskb, NULL, mskb->dst->dev, dst_output)
自網卡2送出
反之, 若module收到ip封包(sk_buff), 檢查ip的protocol欄位發現其為自訂protocol
的代表號, 就用alloc_skb創出一個新的sk_buff, 並將原有的sk_buff除了自訂header
以外的所有資料作memcpy, 最後呼叫
NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, mskb, NULL, mskb->dst->dev, dst_output)
自網卡1送出, 而hook到的所有sk_buff, 因為被新的sk_buff替代, 所以我都用
NF_DROP處理
令我大失所望的是, kernel space傳輸機制不但沒有加快處理速度, 反而還可能較
user space的機制稍慢, 請問各位高手可能問提出在哪呢?是因為我每hook到一個
封包就呼叫一次alloc_skb太花時間嗎? 還是
NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, mskb, NULL, mskb->dst->dev, dst_output)
的效率不好呢?
我的環境CentOS 5.5, kernel version 2.6.18
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.101.33
→
09/24 14:25, , 1F
09/24 14:25, 1F
→
09/24 14:26, , 2F
09/24 14:26, 2F
→
09/24 14:26, , 3F
09/24 14:26, 3F
→
09/24 14:29, , 4F
09/24 14:29, 4F
※ 編輯: Andyleee 來自: 220.135.253.175 (09/25 23:24)
→
09/25 23:25, , 5F
09/25 23:25, 5F
→
09/25 23:26, , 6F
09/25 23:26, 6F
→
09/25 23:27, , 7F
09/25 23:27, 7F
→
09/27 11:56, , 8F
09/27 11:56, 8F
→
09/27 11:59, , 9F
09/27 11:59, 9F
→
09/27 12:03, , 10F
09/27 12:03, 10F
推
09/27 14:25, , 11F
09/27 14:25, 11F
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章