关于修改以太网帧头类型字段引发的问题

 

 

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也被释放了,所以会导致崩溃。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值