免费注册 查看新帖 |

Chinaunix

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

关于构造Http Response包的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-09-04 17:13 |只看该作者
如果未来的数据内容大于以前的,要看 tailroom 有没有空间,没有的话要扩展 skb 空间
我以前总结过但不知道对不对,也希望有高人帮我指点一下
http://blog.chinaunix.net/u/311/showart_1131002.html

论坛徽章:
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
22 [报告]
发表于 2008-09-04 17:32 |只看该作者
原帖由 platinum 于 2008-9-4 17:13 发表
如果未来的数据内容大于以前的,要看 tailroom 有没有空间,没有的话要扩展 skb 空间
我以前总结过但不知道对不对,也希望有高人帮我指点一下
http://blog.chinaunix.net/u/311/showart_1131002.html


偶这里是小于报文以前的内容,调整起来应该难度不大。

白金兄的Blog,小弟去看了一遍。对于函数skb_put,如果tailroom的空间不够用的话,是会出错并且调用skb_over_panic。

如果白金兄的方法是可以的,那么skb_put函数为什么不做这样的处理呢。

本身向一个报文的当前数据区末尾追加数据的应用极少出现(引自《Linux网络体系结构》),那么想白金兄这样的用法是不是更少出现了呢。
不知小弟理解的是否正确。

论坛徽章:
0
23 [报告]
发表于 2008-09-04 17:44 |只看该作者
skb_put(len):用于在当前有效数据末尾添加数据
如果 tailroom 够用的话是没有问题的,不够就要扩展了
skb_put() 的具体实现是这样的

  1. 901 /**
  2. 902  *      skb_put - add data to a buffer
  3. 903  *      @skb: buffer to use
  4. 904  *      @len: amount of data to add
  5. 905  *
  6. 906  *      This function extends the used data area of the buffer. If this would
  7. 907  *      exceed the total buffer size the kernel will panic. A pointer to the
  8. 908  *      first byte of the extra data is returned.
  9. 909  */
  10. 910 static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
  11. 911 {
  12. 912         unsigned char *tmp = skb_tail_pointer(skb);
  13. 913         SKB_LINEAR_ASSERT(skb);
  14. 914         skb->tail += len;
  15. 915         skb->len  += len;
  16. 916         if (unlikely(skb->tail > skb->end))
  17. 917                 skb_over_panic(skb, len, current_text_addr());
  18. 918         return tmp;
  19. 919 }
复制代码

这个 len 的长度一定不会超过 tailroom,否则会出现问题,916 行就是做了这样的判断,并调用 skb_over_panic 提示错误并 hang
skb_over_panic 的处理如下

  1.   74 /*
  2.   75  *      Keep out-of-line to prevent kernel bloat.
  3.   76  *      __builtin_return_address is not used because it is not always
  4.   77  *      reliable.
  5.   78  */
  6.   79
  7.   80 /**
  8.   81  *      skb_over_panic  -       private function
  9.   82  *      @skb: buffer
  10.   83  *      @sz: size
  11.   84  *      @here: address
  12.   85  *
  13.   86  *      Out of line support code for skb_put(). Not user callable.
  14.   87  */
  15.   88 void skb_over_panic(struct sk_buff *skb, int sz, void *here)
  16.   89 {
  17.   90         printk(KERN_EMERG "skb_over_panic: text:%p len:%d put:%d head:%p "
  18.   91                           "data:%p tail:%#lx end:%#lx dev:%s\n",
  19.   92                here, skb->len, sz, skb->head, skb->data,
  20.   93                (unsigned long)skb->tail, (unsigned long)skb->end,
  21.   94                skb->dev ? skb->dev->name : "<NULL>");
  22.   95         BUG();
  23.   96 }
复制代码

index.7.gif (7.34 KB, 下载次数: 30)

index.7.gif

论坛徽章:
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
24 [报告]
发表于 2008-09-04 18:17 |只看该作者
如果 tailroom 够用的话是没有问题的,不够就要扩展了


这里应该如何扩展啊,内核代码中有扩展tailroom的地方吗?

skb_put中判断如果超过tailroom的话,就报错了,他自己没有去做相应的扩展

论坛徽章:
0
25 [报告]
发表于 2008-09-04 18:56 |只看该作者
原帖由 Godbach 于 2008-9-4 18:17 发表


这里应该如何扩展啊,内核代码中有扩展tailroom的地方吗?

skb_put中判断如果超过tailroom的话,就报错了,他自己没有去做相应的扩展

好像是 skb_make_writable,我在 21 楼有提到,你再仔细看一下我 blog 里的那个东西
虽然我也不是很确定,但我觉得像

论坛徽章:
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
26 [报告]
发表于 2008-09-04 19:16 |只看该作者
原帖由 platinum 于 2008-9-4 18:56 发表

好像是 skb_make_writable,我在 21 楼有提到,你再仔细看一下我 blog 里的那个东西
虽然我也不是很确定,但我觉得像


应该是2.6中添加的,2.4没有。

感觉都是NAT方面的文件调用了该函数

论坛徽章:
0
27 [报告]
发表于 2008-09-04 19:19 |只看该作者
原帖由 Godbach 于 2008-9-4 19:16 发表


应该是2.6中添加的,2.4没有。

感觉都是NAT方面的文件调用了该函数

这样,你看一下 2.4 内核里有没有 ipt_TCPMSS.c,如果有的话,他一定也做了相应的处理,参考他的实现方式
我看了一下,用的是 skb_copy_expand()

  1.         /*
  2.          * MSS Option not found ?! add it..
  3.          */
  4.         if (skb_tailroom((*pskb)) < TCPOLEN_MSS) {
  5.                 struct sk_buff *newskb;

  6.                 newskb = skb_copy_expand(*pskb, skb_headroom(*pskb),
  7.                                          TCPOLEN_MSS, GFP_ATOMIC);
  8.                 if (!newskb) {
  9.                         if (net_ratelimit())
  10.                                 printk(KERN_ERR "ipt_tcpmss_target:"
  11.                                        " unable to allocate larger skb\n");
  12.                         return NF_DROP;
  13.                 }

  14.                 kfree_skb(*pskb);
  15.                 *pskb = newskb;
  16.                 iph = (*pskb)->nh.iph;
  17.                 tcph = (void *)iph + iph->ihl*4;
  18.         }

  19.         skb_put((*pskb), TCPOLEN_MSS);
复制代码

[ 本帖最后由 platinum 于 2008-9-4 19:20 编辑 ]

论坛徽章:
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
28 [报告]
发表于 2008-09-04 19:24 |只看该作者
我的是2.4.22内核,ipt_tcpmss.c没有这个函数啊

论坛徽章:
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
29 [报告]
发表于 2008-09-04 19:26 |只看该作者
2.6中把TCPMSS作为Target,2.4中把这个作为Match,呵呵,变化真大啊

论坛徽章:
0
30 [报告]
发表于 2008-09-04 21:47 |只看该作者
原帖由 Godbach 于 2008-9-4 19:26 发表
2.6中把TCPMSS作为Target,2.4中把这个作为Match,呵呵,变化真大啊

小写的是 match,大写的是 target
我这里有,给你

ipt_TCPMSS.rar

2.57 KB, 下载次数: 27

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP