gpt4 book ai didi

c - 发送 SKB 以从内核空间传输

转载 作者:IT王子 更新时间:2023-10-29 00:40:07 25 4
gpt4 key购买 nike

我目前正在编写一个修改数据包有效载荷的内核模块,作为一种学习体验。我已经完成数据包修改,但现在我想在原始数据包之后发送这个新的修改数据包(我不想丢弃原始数据包)。我似乎找不到发送 SKB 进行传输的内核函数。我已经尝试过 dev_queue_xmit(nskb) 但这会导致内核 panic ,我也尝试过 skb->next = nskb 但这没有任何作用。我必须实现 SKB 列表处理吗?自从这篇文章 seems to be outdated 以来,我不确定该怎么做.

编辑:

所以我能够在调用 dev_queue_xmit(nskb) 时修复内核 panic ,我不小心执行了 dev_queue_xmit(skb) 这会删除 skb 并导致网络过滤器出现 panic 。现在的问题是一切正常,但我没有看到重复的数据包被发送出去,也没有第二个数据包被发送的痕迹。机器上的 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 Server 虚拟机,所有这些虚拟机都通过 SSH 从主机(macOS,如果重要的话,我现在还不知道)。运行上述内核模块的计算机双向欺骗其他两个虚拟机。其他两个 VM 然后通过 netcat session 相互交谈。我希望当我使用 ip 10.0.2.13 从 VM 发送一条消息时,10.0.2.12 会看到两条相同的消息。我知道确认号码事故会中断连接,但我不明白。这 3 台计算机上的 TCPDump 除了应该发送的数据包外没有显示任何内容。

到目前为止,我已经尝试过 dev_queue_xmit(nskb) 以及 nskb->dev->netdev_ops->ndo_start_xmit(nskb, skb->dev)

最佳答案

据我所知,dev_queue_xmit() 是正确的发送过程。问题是你要发送的skb是怎么准备的?当内核 panic 发生时,还给我们 dmesg 的调用跟踪。你设置skb->dev吗?

关于c - 发送 SKB 以从内核空间传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45873722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com