免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: meijusan123
打印 上一主题 下一主题

[网络子系统] linux 协议栈 IP头 手动封装 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
41 [报告]
发表于 2009-08-21 10:29 |只看该作者
将你新构造的包用dev_queue_xmit发送出去,然后对于原始的报文return  NF_STOLEN

论坛徽章:
0
42 [报告]
发表于 2009-08-21 10:29 |只看该作者

回复 #35 Godbach 的帖子

“那应该就是在程序的最后加上return  NF_STOLEN,告诉这个包后面的程序都不用关心了。”
现在 我用的是 return NF_ACCEPT,是想,让我封装过的包,继续往下走,如果换成NF_STOLEN没试过,不只能能否发出去。

现在主要是kfree地方出现oops,好难解决哦。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
43 [报告]
发表于 2009-08-21 10:39 |只看该作者
原帖由 meijusan123 于 2009-8-21 10:29 发表
“那应该就是在程序的最后加上return  NF_STOLEN,告诉这个包后面的程序都不用关心了。”
现在 我用的是 return NF_ACCEPT,是想,让我封装过的包,继续往下走,如果换成NF_STOLEN没试过,不只能能否发出去。
...


上面不是提到了吗,你调用dev_queue_xmit把你构造的包发送出去,返回NF_STOLEN只是告诉系统改造前的那个skb不用处理了,因为这个包已经被你修改了

论坛徽章:
0
44 [报告]
发表于 2009-08-21 10:41 |只看该作者
原帖由 Godbach 于 2009-8-21 10:29 发表
将你新构造的包用dev_queue_xmit发送出去,然后对于原始的报文return  NF_STOLEN



Godbach兄弟,这个方法感觉理论上成,就是把自己新的空间nskb进行dev_queue_xmit(nskb)发送出去,直接送到链路层处理,再return  NF_STOLEN ,忽略以前skb所指的久空间。以前的究竟是被释放啦,还是怎么了? 我要试试看。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
45 [报告]
发表于 2009-08-21 10:47 |只看该作者
以前的空间不是被你改了吗。所以在kfree_skb的话,会出问题的。

告诉你的那种方法已经屡试不爽了。。。

论坛徽章:
0
46 [报告]
发表于 2009-08-21 10:53 |只看该作者

回复 #40 meijusan123 的帖子

代码完整贴上来看看

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
47 [报告]
发表于 2009-08-21 10:53 |只看该作者

回复 #46 独孤九贱 的帖子

九贱兄,帮忙看一个小问题啊:
http://linux.chinaunix.net/bbs/thread-1131011-1-1.html

论坛徽章:
0
48 [报告]
发表于 2009-08-21 11:24 |只看该作者
原帖由 独孤九贱 于 2009-8-21 10:53 发表
代码完整贴上来看看


尝试了“Godbach”兄弟所说的方法,ipip包是封装发出可以啦。但,也出现了新问题,之前的skb释放问题没解决,所以发出数据包时,出现了两个包,一个是skb所指的,一个是nskb所指的。
现在,我想尝试不让skb继续下去,直接使用nskb,不只能咋搞。??
“九贱兄弟”

代码:

........

                int addiphlen =0;
                int max_headroom=0;
                       unsigned int    dst =0x80afa8c0;        
                       unsigned int    src =0x82afa8c0;      
                struct sk_buff *nskb=NULL;
                struct net_device *dev = skb->dst->dev;
                       addiphlen = skb->nh.iph->ihl *4;
       
                max_headroom = (LL_RESERVED_SPACE(dev)+sizeof(struct iphdr));
                if (skb_headroom(skb) < max_headroom) {               
                nskb = skb_realloc_headroom(skb, max_headroom);
                if (nskb == NULL){
                        kfree_skb(skb);
                        return -ENOMEM;
                }
                if (skb->sk)
                        skb_set_owner_w(nskb,skb->sk);
                }
               
                nskb->h.raw = nskb->nh.raw;
                nskb->nh.raw = skb_push(nskb, sizeof(struct iphdr));
                iph                 =        nskb->nh.iph;
                iph->version        =        hdr->version;
                iph->ihl        =        hdr->ihl;
                iph->tos        =        hdr->tos;
                iph->tot_len        =        htons(ntohs(hdr->tot_len) + addiphlen);
                iph->id                =        hdr->id;
                iph->frag_off        =        hdr->frag_off;
                iph->ttl        =        hdr->ttl;
                iph->protocol        =        IPPROTO_IPIP;
                iph->daddr        =        dst;
                iph->saddr        =        src;
               
                iph->check = 0;               
                iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
               
                dev_queue_xmit(nskb);
                printk("accept the out packet!number:[%d]\n",out_accept_cnt);
        }
return NF_ACCEPT;

........

论坛徽章:
0
49 [报告]
发表于 2009-08-21 11:28 |只看该作者
原帖由 Godbach 于 2009-8-21 10:39 发表


上面不是提到了吗,你调用dev_queue_xmit把你构造的包发送出去,返回NF_STOLEN只是告诉系统改造前的那个skb不用处理了,因为这个包已经被你修改了


使用NF_STOLEN会出现oops,但,如果使用NF_ACCEPT,还能继续下去,ipip包是可以封装发出了,但,同时还有一个没封装的。
如果NF_STOLEN这个可以使用,不处理skb就可以啦。
但是直接使用dev_queue_xmit这样,会妨碍了hook的扩展,下面的netfilter就不能出来。问题是一个接一个一。

论坛徽章:
0
50 [报告]
发表于 2009-08-21 11:29 |只看该作者
原帖由 Godbach 于 2009-8-21 10:47 发表
以前的空间不是被你改了吗。所以在kfree_skb的话,会出问题的。

告诉你的那种方法已经屡试不爽了。。。


好想释放掉skb,使用自己的nskb,这样,也能继续让下面的netfilter继续使用呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP