您的位置:首页 > 其它

Netmap分析(二)

2016-04-23 10:10 281 查看

netmap_linux.c:

//初始化netmap
static int linux_netmap_init(void)
{
int err;
/* Errors have negative values on linux. */
/*
申请netmap的各个内存池,包括netmap_if,netmap_ring,netmap_buf以及内存池的管理结构
*/
err = -netmap_init();  //netmap.c
if (err) {
return err;
}
/*
* 驱动注册程序
*
* Returns 0 on success, negative on failure
*/
err = nm_os_pt_memdev_init();
if (err) {
return err;
}
//初始化virtual passthrough netmap
err = ptnet_init();
if (err) {
nm_os_pt_memdev_uninit();
return err;
}

return 0;
}


netmap.c

//真正的初始化函数
Int netmap_init(void)
{
int error;

NMG_LOCK_INIT();
//初始化锁和引用计数
error = netmap_mem_init();
if (error != 0)
goto fail;
/*
* MAKEDEV_ETERNAL_KLD avoids an expensive check on syscalls
* when the module is compiled in.
* XXX could use make_dev_credv() to get error number
*/
/*
Make_dev_credf函数将设置错误,并返回第一个参数。
这依赖于'error'局部变量的可用性。
对于老Linux系统不具备的devfs,生成
在系统日志消息,以便系统管理员知道为了创建/ dev/netmap要运行的命令
*/
/*
netmapcdevsw为对应的设备结构体定义,netmapfops为对应的操作函数。
*/
netmap_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD,
&netmap_cdevsw, 0, NULL, UID_ROOT, GID_WHEEL, 0600,
"netmap");
if (!netmap_dev)
goto fail;

//初始化netmap_bridge并分配内存
error = netmap_init_bridges();
if (error)
goto fail;

#ifdef __FreeBSD__
nm_os_vi_init_index();
#endif

error = nm_os_ifnet_init();
if (error)
goto fail;

printf("netmap: loaded module\n");
return (0);
fail:
netmap_fini();
return (EINVAL); /* may be incorrect */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: