我目前正在編寫一個內核模塊,將數據包有效載荷修改爲學習體驗。我已經完成了數據包修改,但是現在我想在原始數據(我不想刪除原始數據)之後發出這個新的修改數據包。我似乎無法找到發送SKB的內核函數。我試過dev_queue_xmit(nskb)
但是導致內核恐慌,我也試過skb->next = nskb
,但是什麼也沒做。我是否必須實施SKB清單處理?自從這篇文章seems to be outdated以來,我不確定如何做到這一點。發送SKB從內核空間傳輸
編輯:
所以我能夠調用dev_queue_xmit(nskb)時修復內核恐慌,我不小心做dev_queue_xmit(SKB),這將刪除SKB,並導致淨過濾恐慌。現在的問題是,一切正常,但我沒有看到重複的數據包被髮送出去,沒有發送第二個數據包的蹤跡。在機器上的TCPDump沒有看到任何東西,目標上的TPCDump也沒有看到任何東西,下面是我的代碼。
unsigned int in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
struct sk_buff *nskb = skb_copy(skb, GFP_KERNEL);
/* Various other variables not relevant to the problem */
__u32 saddr, daddr;
saddr = ntohl(iph->saddr);
if (saddr == ipToInt(10,0,2,12) || saddr == ipToInt(10,0,2,13)) {
/*For loop that saves the payload contents into a variable */
/* Here is where the problem is,
I have this if statement to prevent a feedback loop
then if the ip matches, I call dev_queue_xmit(nskb)
which is supposed to send out sk_buff's, but TCPDump doesn't
show anything on any computer */
if (saddr == ipToInt(10,0,2,13)) {
dev_queue_xmit(nskb);
}
/* Rest of the code that isn't relevant to sending packets */
}
return NF_ACCEPT;
}
我的網絡設置如下,它是3 Ubuntu的服務器虛擬機,所有的人都被通過SSH連接到主計算機(MacOS的,如果它很重要,我不知道在這一點)。運行上述內核模塊的計算機會雙向欺騙另外兩臺虛擬機。另外兩個虛擬機然後通過netcat會話相互通話。我希望當我使用ip 10.0.2.13從虛擬機發送一條消息時,10.0.2.12會看到兩條相同的消息。我知道確認號碼的事故會中斷連接,但我不明白。任何3臺計算機上的TCPDump都不會顯示任何應該發送的數據包。
我到目前爲止試過dev_queue_xmit(nskb)
以及nskb->dev->netdev_ops->ndo_start_xmit(nskb, skb->dev)
。
當我檢查時,Dmesg爲空,並且設置了skb-> dev,我認爲,當我執行if(skb-> dev)時,它返回true。此外,現在我只是試圖發送第二個數據包,所以通過網絡過濾器函數向我提供的skb,我在其上執行'dev_queue_xmit(skb)',希望看到兩個重複數據包。 – MacStation
最重要的事情是:當發生內核恐慌時,我們需要確切地知道dmesg中的內容(屏幕上)。我知道當內核發生時它可能不會被記錄到系統文件中 - 所以你可以使用連接了串行控制檯的第二個系統並執行這個控制檯的轉儲。 – user2699113
第二件事 - 你如何複製skb? – user2699113