linux网络设备驱动结构体,Linux网络设备驱动之设备驱动的注册与注销(二)
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的注冊與注銷由 register_netdev( ) 和 unregister_netdev( ) 函數(shù)完成,這兩個(gè)函數(shù)的原型為:
int register_netdev(struct net_device *dev);
void unregister_netdev(struct net_device *dev);
這兩個(gè)函數(shù)都接收一個(gè) net_device 結(jié)構(gòu)體指針為參數(shù),可見 net_device 數(shù)據(jù)結(jié)構(gòu)在網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)中的核心地位。
net_device 的生成和成員的賦值并不一定要由我們親自動(dòng)手逐個(gè)完成,可以利用如下宏幫助填充:
#define alloc_netdev(sizeof_priv, name, name_assign_type, setup) \
alloc_netdev_mqs(sizeof_priv, name, name_assign_type, setup, 1, 1)
#define alloc_netdev_mq(sizeof_priv, name, name_assign_type, setup, count) \
alloc_netdev_mqs(sizeof_priv, name, name_assign_type, setup, count, count)
#define alloc_etherdev(sizeof_priv) \
alloc_etherdev_mq(sizeof_priv, 1)
#define alloc_etherdev_mq(sizeof_priv, count) \
alloc_etherdev_mqs(sizeof_priv, count, count)
alloc_etherdev_mq 宏引用的 alloc_etherdev_mqs( ) 函數(shù)的原型為:
struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs,
unsigned int rxqs);
alloc_netdev 以及 alloc_netdev_mq 宏引用的 alloc_netdev_mqs( ) 函數(shù)的原型為:
struct net_device *alloc_netdev_mqs(int sizeof_priv,
const char *name,
unsigned char name_assign_type,
void (*setup)(struct net_device *),
unsigned int txqs, unsigned int rxqs);
alloc_netdev_mqs( ) 函數(shù)生成一個(gè) net_device 結(jié)構(gòu)體,對其成員賦值并返回該結(jié)構(gòu)體的指針。第一個(gè)參數(shù)為設(shè)備私有成員大小,第二個(gè)參數(shù)為設(shè)備名, 第三個(gè)參數(shù)為 net_device 的 setup( ) 函數(shù)指針,第四、五個(gè)參數(shù)為要分配的發(fā)送和接收子隊(duì)列的數(shù)量。
setup( ) 接收的參數(shù)也為 ?struct net_device? 指針,用于預(yù)置 net_device 成員的值。
free_netdev( ) 完成與 alloc_netdev( ) 和 alloc_etherdev( ) 函數(shù)相反的功能,即釋放 net_device 結(jié)構(gòu)體的函數(shù):
void free_netdev(struct net_device *dev);
net_device 結(jié)構(gòu)體的分配 和 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的注冊 需在網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序初始化時(shí)進(jìn)行,而 net_device 結(jié)構(gòu)體的釋放 和 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的注銷 在設(shè)備或驅(qū)動(dòng)被移除的時(shí)候執(zhí)行,如下所示:
/*
* 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的注冊和注銷
*
*/
static int xxx_register(void)
{
```
/* 分配 net_device 結(jié)構(gòu)體并對其成員賦值 */
xxx_dev = alloc_netdev(sizeof(struct xxx_priv), "sn%d", xxx_init);
if (xxx_dev == NULL)
``` /* 分配 net_device 失敗 */
/* 注冊 net_device 結(jié)構(gòu)體 */
if ((result = register_netdev(xxx_dev)))
```
}
static void xxx_unregister(void)
{
```
/* 注銷 net_device 結(jié)構(gòu)體 */
unregister_netdev(xxx_dev);
/* 釋放 net_device 結(jié)構(gòu)體 */
free_netdev(xxx_dev);
}
標(biāo)簽:alloc,sizeof,netdev,Linux,device,驅(qū)動(dòng),網(wǎng)絡(luò)設(shè)備,net,priv
來源: https://www.cnblogs.com/wanglouxiaozi/p/13375328.html
總結(jié)
以上是生活随笔為你收集整理的linux网络设备驱动结构体,Linux网络设备驱动之设备驱动的注册与注销(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux切换桌面环境bug,GNOME
- 下一篇: linux裸设备文件系统,Linux当中