天天看点

linux dev alloc name,关于netdev_priv以及alloc_netdev函数

struct net_device *alloc_netdev(int sizeof_priv, const char

*name,

void (*setup)(struct net_device

*))

{

void *p;

struct net_device *dev;

int alloc_size;

alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST)

& ~NETDEV_ALIGN_CONST;

alloc_size += sizeof_priv +

NETDEV_ALIGN_CONST;

p = kmalloc(alloc_size, GFP_KERNEL);

if (!p) {

printk(KERN_ERR "alloc_dev:

Unable to allocate device.\n");

return NULL;

}

memset(p, 0, alloc_size);

dev = (struct net_device *)

(((long)p + NETDEV_ALIGN_CONST)

& ~NETDEV_ALIGN_CONST);

dev->padded = (char *)dev - (char

*)p;

if (sizeof_priv)

dev->priv =

netdev_priv(dev);

setup(dev);

strcpy(dev->name, name);

return dev;

}

EXPORT_SYMBOL(alloc_netdev);

static inline void *netdev_priv(struct net_device *dev)

{

return (char *)dev + ((sizeof(struct

net_device)

+

NETDEV_ALIGN_CONST)

&

~NETDEV_ALIGN_CONST);

}

代码如上,对于alloc_netdev函数,入参是驱动自定义的一个似有结构结构的大小,例如下面所示:

dev =

alloc_netdev(sizeof(osif_dev), name, ether_setup);

也就是说,当需要分配一块似有的dev数据结构时,linux内核帮我们一次性就把net_device结构跟自己似有的内容一并分配了,省事省力,也灵活了!

同时,我们注意到,dev->priv指针被赋为netdev_priv返回的值,也就是说,加入我们要通过net_device获得我们自定义的device结构的指针时,可以使用netdev_priv(dev),当然也可以直接使用dev->priv。而一般推荐我们使用netdev_priv,而不使用后者,不知为何。按照现在代码来看,priv指针完全可以不需要,而只需要使用netdev_priv,我想推荐我们使用netdev_priv这个内联函数的原因可能是以后这个字段会被取消,当然我只是猜测!