alloc_netdev()与alloc_etherdev()
来源:互联网 发布:h5场景模板源码 编辑:程序博客网 时间:2024/06/11 15:42
alloc_netdev()函数生成一个net_device结构体,对其成员赋值并返回该结构体的指针。第一个参数是设备私有成员的大小,第二个参数为设备名,第三个参数为net_device的setup()函数指针。setup()函数接收的参数为struct net_device指针,用于预置net_device成员的值。
linux-2.6.22/net/core/dev.c
----------------------------------------
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;
BUG_ON(strlen(name) >= sizeof(dev->name));
/* ensure 32-byte alignment of both the device and private area */
alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;
alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
p = kzalloc(alloc_size, GFP_KERNEL);
if (!p) {
printk(KERN_ERR "alloc_netdev: Unable to allocate device.\n");
return NULL;
}
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);
dev->get_stats = internal_stats;
setup(dev);
strcpy(dev->name, name);
return dev;
}
linux-2.6.22/net/core/dev.c
----------------------------------------
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;
BUG_ON(strlen(name) >= sizeof(dev->name));
/* ensure 32-byte alignment of both the device and private area */
alloc_size = (sizeof(*dev) + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST;
alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
p = kzalloc(alloc_size, GFP_KERNEL);
if (!p) {
printk(KERN_ERR "alloc_netdev: Unable to allocate device.\n");
return NULL;
}
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);
dev->get_stats = internal_stats;
setup(dev);
strcpy(dev->name, name);
return dev;
}
alloc_etherdev()是alloc_netdev()针对以太网的"快捷"函数
linux-2.6.22/net/ethernet/eth.c
----------------------------------------
struct net_device *alloc_etherdev(int sizeof_priv)
{
----returnalloc_netdev(sizeof_priv, "eth%d", ether_setup);
}
net_device
+--------------+
| |
|--------------|
| base_addr |
|--------------|
| |
| |
|--------------|
| priv |---+
|--------------| |
| | |
| | |
+--------------+<--+
| |
| | sizeof_priv
| |
+--------------+
net_device->base_addr 网络寄存器的基地址(物理地址)
linux-2.6.22/net/ethernet/eth.c
----------------------------------------
struct net_device *alloc_etherdev(int sizeof_priv)
{
----returnalloc_netdev(sizeof_priv, "eth%d", ether_setup);
}
net_device
+--------------+
| |
|--------------|
| base_addr |
|--------------|
| |
| |
|--------------|
| priv |---+
|--------------| |
| | |
| | |
+--------------+<--+
| |
| | sizeof_priv
| |
+--------------+
net_device->base_addr 网络寄存器的基地址(物理地址)
0 0
- alloc_netdev()与alloc_etherdev()
- alloc_netdev() 与alloc_etherdev()区别
- alloc_netdev()与alloc_etherdev()
- alloc_netdev()与alloc_etherdev() (转)
- Linux网络设备驱动程序——alloc_netdev()与alloc_etherdev()
- Linux网络设备驱动程序——alloc_netdev()与alloc_etherdev()
- 与
- 与
- “” 与 “”
- ##与#
- >> 与 > >
- :与::
- &与&&
- && 与 &
- [[与((
- >>与>>>
- *与++
- *与++
- 数据挖掘之企业危机管理
- SD卡挂载判断
- 网页图片延时加载
- Android动画学习笔记-Android Animation
- sqlserver数据库备份和还原
- alloc_netdev()与alloc_etherdev()
- ISCC-逃离临淄-注册机
- sh脚本语法_基础
- 的发顺丰但是鬼地方官方店鬼地方鬼地方
- 吉诺比利:伦纳德变得更可靠了
- 链接MAC XAMPP WordPress
- delphi 中几种多线程操作方式
- mysql 执行顺序 SQL语句执行顺序分析
- 加入收藏