dev_add_pack加载ETH_P_ALL自定义函数fucntion:
static int fucntion(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
{
//截获包,修改桢类型字段为自己定义的类型ETH_P_ME
struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);//取得针头指针
if(ntohs(skb->protocol)==ETH_P_ME)
goto out;
eth->h_proto = htons(ETH_P_ME);
return dev_queue_xmit(skb);
out:
return -1;
}
当我ping host时,内核就崩溃了,所以怀疑问题出在skb_push,但时从网卡接受数据分配skb到自己定义的函数接受数据并修改发送的过程来看
skb = dev_alloc_skb(pkt_len+2);//pkt_len包括以太网头,这里请问下为什么要加2?有什么用途吗
|
__dev_alloc_skb(length, GFP_ATOMIC);
|
skb = alloc_skb(length+16, gfp_mask);
|
skb_reserve(skb,16);// skb->data+=len; skb->tail+=len;
skb_reserve(skb,2);//skb的data和tail再后移动两个字节长度,到这里skb已预留了18个字节
insb(DATAPORT, skb_put(skb,pkt_len), pkt_len);//读数据到skb
skb->protocol=eth_type_trans(skb,dev);//调用eth_type_trans后,data志向ip头部
netif_rx(skb);
net_rx_action()
function()
struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);
在这里skb_push,skb的data指正前移16个字节,长度加16
照指正的移动来看,应该是对的,怎么会崩溃啊?
请大峡们指点下,谢谢
struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);//取得针头指针
>>>进来就改了,在out的时候,应该给改回去,否则ip层的指针都乱了。
>>skb = dev_alloc_skb(pkt_len+2);//pkt_len包括以太网头,这里请问下为什么要加2?有什么用途吗
这个是为了ip包头对齐的
struct ethhdr *eth = (struct ethhdr *)skb_push(skb,ETH_HLEN);//取得针头指针
>>>进来就改了,在out的时候,应该给改回去,否则ip层的指针都乱了。
在 function截取到数据包的时候,skb的data指针指向了数据包的 ip头部,
所以这里调用skb_push将data前移ETH_HLEN 应该没问题吧? 所以不明白为何会崩溃!
>>在这里skb_push,skb的data指正前移16个字节,长度加16
>>照指正的移动来看,应该是对的,怎么会崩溃啊?
这16个字节里并没有东西。是为空的
//这里16个字节应该不为空了吧,因为前面已经读入了整个以太网帧
》》》这里16个字节应该不为空了吧,因为前面已经读入了整个以太网帧
不好意思我看错了。
btw:eth_type_trans函数中已经有
skb->mac.raw=skb->data;
你这里为什么还要这样做啊?直接引用就可以吧。
如果这里不调用skb_push将data指针回移到帧头,待会驱动发送的时候不是从ip头开始发送了吗?
通过netif_rx不是接受帧吗?
你的packet_type处理过了,其他的packet_type还没有处理,当然会有问题。你可以在你的packet_type里面复制一份新的,然后改,就没有问题
o,我忽率了后面的ptype_base,当我调用dev_queue_xim(skb)后,skb也被释放了,所以会导致崩溃。