2012-10-22 43 views
4

有什麼簡單的方法可以增加Linux內核中SKB緩衝區的引用計數,以便硬件不會釋放它。增加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); 
    } 
    } 
+0

什麼內核版本,什麼底層硬件網絡驅動程序做使用用途? –

+0

我使用的是3.4.10內核版本,而nic卡是intel千兆位nic卡 – codingfreak

+0

只是使用克隆:) –

回答

3

通過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 } 
+0

感謝llya的回覆..有一點疑問。我想多次發送相同的SKB,最初嘗試skb_clone,但似乎很慢。那麼我可以在for循環中使用skb_get來發送相同的數據包n次? – codingfreak

+0

你用什麼方法發送'skb'? –

+0

我正在使用dev_queue_xmit發送skb。但是,傳輸skb有不同的功能嗎?實際上,無論sendmsg何時被調用,我都會嘗試發送相同的skb'n'次。當我從用戶空間發送10 pkts時,它工作正常,但是當我嘗試發送100個數據包時,整個系統掛起 – codingfreak