[問題] kernel mode發送自定封包問題

看板C_and_CPP (C/C++)作者 (帕格尼尼 阿瑪迪斯)時間14年前 (2011/09/20 18:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 LinuxDev 看板 #1EU6_eSw ] 作者: Andyleee (帕格尼尼 阿瑪迪斯) 看板: LinuxDev 標題: [問題] kernel mode發送自定封包問題 時間: Tue Sep 20 18:50:14 2011 想藉貴版的高人氣請教一下kernel module相關問題, 因為linux kernel module亦 屬於C語言, 因此應該未觸犯版規 各位好, 我想請教一個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 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.96.101.33 ※ 編輯: Andyleee 來自: 140.96.101.33 (09/20 18:55)
文章代碼(AID): #1EU72qLJ (C_and_CPP)
文章代碼(AID): #1EU72qLJ (C_and_CPP)