免费注册 查看新帖 |

Chinaunix

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

请教:如何把skb_copy的新skb放回链中继续传送? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-06 13:41 |只看该作者 |倒序浏览
如题,这问题已经折磨我几天了,求各位大牛指点迷津啊

论坛徽章:
0
2 [报告]
发表于 2007-10-06 14:58 |只看该作者
替换掉原来的sk_buff。

  1. static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
  2.                                           gfp_t pri)
  3. {
  4.         might_sleep_if(pri & __GFP_WAIT);
  5.         if (skb_cloned(skb)) {
  6.                 struct sk_buff *nskb = skb_copy(skb, pri);
  7.                 kfree_skb(skb);        /* Free our shared copy */
  8.                 skb = nskb;
  9.         }
  10.         return skb;
  11. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-10-06 15:15 |只看该作者
可以看一下skb_queue_head
可以参考:http://www.lslnet.com/linux/dosc1/54/linux-361227.htm


  1. SKB_QUEUE_HEAD(9)                                   Linux Networking                                  SKB_QUEUE_HEAD(9)

  2. NAME
  3.        skb_queue_head - queue a buffer at the list head

  4. SYNOPSIS
  5.        void skb_queue_head(struct sk_buff_head * list, struct sk_buff * newsk);

  6. ARGUMENTS
  7.        list
  8.            list to use

  9.        newsk
  10.            buffer to queue

  11. DESCRIPTION
  12.        Queue a buffer at the start of the list. This function takes the list lock and can be used safely with other
  13.        locking &sk_buff functions safely.

  14.        A buffer cannot be placed on two lists at the same time.

  15. COPYRIGHT
  16. Kernel Hackers Manual                                  July 2007                                      SKB_QUEUE_HEAD(9)
复制代码

论坛徽章:
0
4 [报告]
发表于 2007-10-06 17:42 |只看该作者
我试着用skb_queue_head()如下:

  1. new_skb = skb_copy(old_skb, GFP_ATOMIC);
  2. if(new_skb){
  3.      skb_unlink(new_skb);
  4.      skb_queue_head(old_skb->list,new_skb);
  5.      return NF_DROP;
  6. }
  7.      return NF_ACCEPT;
复制代码


可是一执行insmod就死机,以为象"A buffer cannot be placed on two lists at the same time." 的原因,所以加了一个   skb_unlink(new_skb);在前面,可以问题依旧,是不是方法用错了?

论坛徽章:
0
5 [报告]
发表于 2007-10-09 11:45 |只看该作者
要给出你的上下文,你是在什么地方copy的?你想让新的skb和老的skb同时从当前点继续往下走么?

论坛徽章:
0
6 [报告]
发表于 2007-10-26 12:09 |只看该作者
我是在检测到我要的数据包以后(通过IP/PORT),就用skb_copy。
对,之后我就是想发送多个skb继续往下走。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-03-13 00:00 |只看该作者
这个问题有答案吗?

论坛徽章:
0
8 [报告]
发表于 2012-03-15 14:54 |只看该作者
这个问题有答案吗?

我也遇到了这个问题;

我skb_copy 一个数据包 暂存以下,等下一个相关的包 到达后接到这个暂存包里面, 然后需要把这个暂存的包 继续走协议栈,
不知道怎么实现

论坛徽章:
0
9 [报告]
发表于 2012-07-25 16:35 |只看该作者
mtx99 发表于 2012-03-15 14:54
这个问题有答案吗?

我也遇到了这个问题;

不知有没有解决,同问啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP