免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 有关skb_copy_expand函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-28 00:50 |只看该作者 |倒序浏览
我需要在IP协议头和传输层协议头之间加一个新的协议头,我用skb_copy_expand来扩展skb。但似乎用了memcpy以后,tcp的payload发送就有问题了,对端能收到数据包,但payload接收不正确的。但其他协议,例如UDP和ICMP,通讯都正常。只要不执行memcpy操作,对端接收就没问题。请问我改如何解决这个问题?我明白skb_copy_expand本身就执行了相关的copy操作,但我希望把内容调整到所希望的位置,似乎只能再执行memcpy?我调用skb_copy_expand的相关代码如下。谢谢!

        tskb = skb_copy_expand(nskb, skb_headroom(nskb), skb_tailroom(nskb) + new_len, GFP_ATOMIC);
        if(tskb == NULL){
                printk("Expension error\n");
        }

        memcpy(tskb->data, nskb->data, iph_len);
        memcpy(tskb->data + iph_len + new_len, nskb->data + iph_len, nskb->len - iph_len);

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-08-28 08:29 |只看该作者
回复 1# lawrence2013
我需要在IP协议头和传输层协议头之间加一个新的协议头,我用skb_copy_expand来扩展skb。但似乎用了memcpy以后,tcp的payload发送就有问题了,对端能收到数据包,但payload接收不正确的。但其他协议,例如UDP和ICMP,通讯都正常。只要不执行memcpy操作,对端接收就没问题。请问我改如何解决这个问题?我明白skb_copy_expand本身就执行了相关的copy操作,但我希望把内容调整到所希望的位置,似乎只能再执行memcpy?我调用skb_copy_expand的相关代码如下。谢谢!

        tskb = skb_copy_expand(nskb, skb_headroom(nskb), skb_tailroom(nskb) + new_len, GFP_ATOMIC);
        if(tskb == NULL){
                printk("Expension error\n");
        }

        memcpy(tskb->data, nskb->data, iph_len);
        memcpy(tskb->data + iph_len + new_len, nskb->data + iph_len, nskb->len - iph_len);


Maybe need to check skb_put() function.





   

论坛徽章:
0
3 [报告]
发表于 2013-08-28 16:25 |只看该作者
Thanks for the suggestion. I tried to use skb_put, but it does not work. The problem is caused by the following sentence: memcpy(tskb->data + iph_len + new_len, nskb->data + iph_len, nskb->len - iph_len), which does not correctly copy the application payload. It is a bit strange since there is no problem for the UDP and ICMP packets, even the TCP packets without PSH flag. May I know if you have any suggestion to fix it? Thank you very much!

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
4 [报告]
发表于 2013-08-29 07:44 |只看该作者
本帖最后由 firkraag 于 2013-08-29 08:36 编辑

Have you modified the 'Total Length','Protocol' and the 'Header Checksum' fields in the ip header?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-08-29 14:15 |只看该作者
回复 3# lawrence2013
Please have a look http://bbs.chinaunix.net/thread-1960367-1-1.html by Godbach!

   

论坛徽章:
0
6 [报告]
发表于 2013-09-02 21:27 |只看该作者
回复 4# firkraag

我修改了相关信息了,似乎问题是memcpy无法把完整内容拷贝出来。

论坛徽章:
0
7 [报告]
发表于 2013-09-02 21:35 |只看该作者
回复 5# 瀚海书香

Thanks for sharing. Yes, skb_copy_expand() can fix the problem when the packer headers are not extended. But I did not have a way to efficiently copy the payloads when the new packets have the extended headers. Thanks again!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP