dev_hold()和dev_put()用于设备的引用计数器加1和设备的引用计数器减1,内核中会经常用到。
linux可以使用dev_get_by_name函数取得设备指针,但是使用是需要注意,使用过dev_get_by_name函数后一定要使用dev_put(pDev)函数取消设备引用,不然可能导致GET的设备无法正常卸载。
一般在将设备指针赋值给SKB->dev后就可以dev_put(pDev)
QUOTE: |
pDev = dev_get_by_name("sap1"); struct sk_buff *pIGMP_Query_skb_clone = NULL; pIGMP_Query_skb_clone=skb_clone(pIGMP_Query_skb, GFP_ATOMIC); pIGMP_Query_skb_clone->dev=pDev; dev_put(pIGMP_Query_skb_clone->dev); dev_queue_xmit(pIGMP_Query_skb_clone); |
但使用__dev_get_by_name就不需要调用dev_put(pDev)
附dev_get_by_name函数原型:
struct net_device *dev_get_by_name(const char *name)
{
}