免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1755 | 回复: 1
打印 上一主题 下一主题

[网络子系统] 请教 怎么修改本机发出的数据包 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-26 13:22 |只看该作者 |倒序浏览
本帖最后由 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,

论坛徽章:
0
2 [报告]
发表于 2012-11-28 10:29 |只看该作者
return NULL 和  kfree skb这种要结合你代码框架来看,

一般修改之后也是让skb 重新入队重发。

skb=skb_tmp;   你这种赋值我不知道什么意思。  总之skb的生命周期要结合你整体代码管理和符合人家的框架来做。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP