3

LinuxカーネルのSKBバッファーの参照数を増やして、ハードウェアがそれを解放しないようにする簡単な方法はありますか?

skb_cloneを使用すると、参照カウントが自動的に増加することは知っていますが、クローンを作成せずに、SKB参照カウントを増やす方法を知りたいです。

私の目的は同じパケットを複数回送信することであり、同じメモリを再利用したいので、この操作のために毎回skb_cloneを実行したくありません。

同じSKBに使用しているサンプルコードは以下のとおりです

  for (i=0;i<=100;i++)
  {
    tmp_skb = skb_get(skb);
    if (tmp_skb == NULL)
    {
      printk ("Clone Failed");
      continue;
    }

    if ( (err = dev_queue_xmit(tmp_skb)) != NETDEV_TX_OK) {
      if(unlikely(enable_error))
        printk("ERROR - DEV QUEUE FAILED %d\n", err);

      err = -ENETDOWN; /* Probably we need a better error here */
      continue;
    }

    if (i==100)
    {
     printk("Loop is done\n");
     kfree_skb(skb);
     return(len);
    }
  }
4

1 に答える 1

2

skb_getメソッドgetを介してskbを試してください。

758 /**
759  *      skb_get - reference buffer
760  *      @skb: buffer to reference
761  *
762  *      Makes another reference to a socket buffer and returns a pointer
763  *      to the buffer.
764  */
765 static inline struct sk_buff *skb_get(struct sk_buff *skb)
766 {
767         atomic_inc(&skb->users);
768         return skb;
769 }
于 2012-10-22T14:45:02.763 に答える