[問題] kernel mode發送自定封包問題
※ [本文轉錄自 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)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
11
38