dev_queue_xmit()函数返回值问题
阅读原文时间:2023年07月13日阅读:1

函数  dev_queue_xmit()用于直接使用sk_buf发包,此函数有返回值,但是并不能通过

此函数返回值为0来说明包已经发送出去且可以立刻释放sk_buff内存。因为网卡发包是一个异步的过程,

比如ixgbe网卡驱动发包过程可以查看此文。因此,解决办法是在skb_buff->uers

没有减少的情况下,将其存放于链表,稍后再释放内存。比如:

        dev\_queue\_xmit(send\_skb);  
        if (atomic\_read(&(send\_skb->users)) == ){  
            kmem\_cache\_free(skbuff\_head\_cache, send\_skb);  
        }  
        else  
        {  
            struct free\_slab \*ptr = kmem\_cache\_alloc(skbuff\_free\_cache, GFP\_ATOMIC & ~\_\_GFP\_DMA);  
            ptr->free\_mem = send\_skb;  
            spin\_lock(&lock);  
            list\_add(&ptr->list, &head\_free\_slab);  
            spin\_unlock(&lock);  
        }