dev_queue_xmit返回值为0,但是对端没有收到包,内核版本2.6.32
各位大神,小弟刚接触netfilter不久,在调用dev_queue_xmit的时候遇到了问题,返回值为0,但是对端并没有收到我发的包。
我要实现的功能是,有A,B,C三台服务器,我写的驱动模块在B中,是一台负责转发的服务器的角色,现在想做的是,A给B发一个包的时候,B能够收到两个相同的包,C到A不需要复制,我的代码如下,在测试的时候A向C发了3个icmp包,但是C只收到了3个包,而且,我抓了B和C的所有网卡,也都只有3三个包,所以我多发的那一份,并没有成功,不知道问题出现在哪里,我觉得应该是在dev_queue_xmit这个函数就没有发出去,内核版本2.6.32,希望各位大神指教。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#define ETH_USER "eth2"
static struct nf_hook_ops nfho;
unsigned int copy_skb_hook(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct sk_buff * sk = NULL;
printk(KERN_INFO "============================\n");
printk(KERN_INFO "EthName == %s\n", out->name);
if(0 == strcmp(out->name, ETH_USER))
{
//sk = skb_clone(skb, GFP_KERNEL);
sk = skb_copy(skb, GFP_ATOMIC & ~__GFP_DMA);
int ret = dev_queue_xmit(sk);
printk(KERN_INFO "ret == %d\n", ret);
//return NF_DROP;
}
printk(KERN_INFO "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
return NF_ACCEPT;
}
static int __init init_nethook(void)
{
nfho.hook = copy_skb_hook;
nfho.hooknum = NF_INET_POST_ROUTING;
nfho.owner = THIS_MODULE;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;
nf_register_hook(&nfho);
return 0;
}
static void __exit exit_nethook(void)
{
nf_unregister_hook(&nfho);
}
module_init(init_nethook);
module_exit(exit_nethook);
MODULE_AUTHOR("renzhanyi");
MODULE_LICENSE("GPL");