- 论坛徽章:
- 0
|
本帖最后由 mtx99 于 2012-11-26 13:25 编辑
最近遇到一个问题就是,linux 服务器服务器socket通行 通过桥发送数据包到其它机器时, tcp报文ack消息 headroom只有16字节,包总长度为 68字节. 我需要给数据包打vlan标签, headroom 16个字节不够,需要扩展,可是我调用扩展函数以后,导致机器crash;
修改代码如下:
if (skb_headroom(skb) < VLAN_HLEN+14 ||skb_shared(skb) || skb_cloned(skb) ) {
struct sk_buff *skb_tmp=NULL;
skb_tmp=skb_copy_expand(skb,VLAN_HLEN+14,skb_tailroom(skb),GFP_ATOMIC);
if (!skb_tmp) {
printk(KERN_ERR "vlan: failed to realloc headroom\n");
return NULL;
}
if(skb->sk)
skb_set_owner_w(skb_tmp, skb->sk);
kfree_skb(skb);
skb=skb_tmp;
}
crash文件每次报错各不相同,基本上是 页面错误.我查了几天也没查到结果, 请各位帮忙看看 是哪里改的不合适? 修改的hook点和优先级都调整试过,没效果
修改hook点 在 网桥的 POST_ROUTING
.pf = PF_BRIDGE,
.hooknum = NF_BR_POST_ROUTING,
.priority =NF_BR_PRI_NAT_SRC+1, |
|