Chinaunix

标题: 请教:如何把skb_copy的新skb放回链中继续传送? [打印本页]

作者: simon_qwl    时间: 2007-10-06 13:41
标题: 请教:如何把skb_copy的新skb放回链中继续传送?
如题,这问题已经折磨我几天了,求各位大牛指点迷津啊
作者: CUDev    时间: 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. }
复制代码

作者: CUDev    时间: 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)
复制代码

作者: simon_qwl    时间: 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);在前面,可以问题依旧,是不是方法用错了?
作者: deadlylight    时间: 2007-10-09 11:45
要给出你的上下文,你是在什么地方copy的?你想让新的skb和老的skb同时从当前点继续往下走么?
作者: simon_qwl    时间: 2007-10-26 12:09
我是在检测到我要的数据包以后(通过IP/PORT),就用skb_copy。
对,之后我就是想发送多个skb继续往下走。
作者: dreamice    时间: 2009-03-13 00:00
这个问题有答案吗?
作者: mtx99    时间: 2012-03-15 14:54
这个问题有答案吗?

我也遇到了这个问题;

我skb_copy 一个数据包 暂存以下,等下一个相关的包 到达后接到这个暂存包里面, 然后需要把这个暂存的包 继续走协议栈,
不知道怎么实现
作者: zhouunix    时间: 2012-07-25 16:35
mtx99 发表于 2012-03-15 14:54
这个问题有答案吗?

我也遇到了这个问题;

不知有没有解决,同问啊。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2