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这个内联函数的原因可能是以后这个字段会被取消,当然我只是猜测!