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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值