- 论坛徽章:
- 0
|
最近在做一个数据分流设备的模拟器,有一个功能如下:当收到指定IP地址对的数据包时(如:源IP 192.xx.xx.xx 目的 IP 10.xx.xx.xx),直接在链路层指定MAC地址将数据包发送出去。
我的方法是:在net/ethernet/eth.c的eth_type_trans()里面直接通过比较源IP与目地IP,然后修改源MAC地址与目的MAC地址,再将skb->data指向MAC头,最后通过dev_queue_xmit()将数据包发送到指定MAC地址的主机。
遇到问题:数据包的引用计数有问题skb->users,导致内核崩溃,我起初直接将通过atomic_set()将数据包的引用计数设置为0,在虚拟机上测试没问题,但是当我在真机上测试时,ping没问题,一开tcpdump抓包时,过一会儿就崩溃了。我估计是流量大了的问题,直接atomic_set()设置为0也应改不对。
求解:大家有什么好的方法吗,小弟,刚接触内核不久,还有很多东西不了接,能想到的方法也少。
代码实例:
if((strncmp(saddr,"192.168.1.10",3) == 0) && (strncmp(daddr,"10.10.0.10",2) == 0))
{
memcpy(eth->h_source,rocky_tcp_G_net_fake_mac_addr,ETH_ALEN);
eth->h_source[5] = rocky_tcp_G_net_fake_mac_addr[5] |0x01;
memcpy(eth->h_dest,dmac_buf,ETH_ALEN);
skb_push(skb,ETH_HLEN);
if(skb !=NULL)
{
atomic_set(&skb->users,0);
//kfree_skb(skb);
dev_queue_xmit(skb);
}
else
printk("@@@ skb is NULL!\n");
}
|
|