A-A+

Netmap分析(二)

2018年12月12日 netmap 暂无评论

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 */
}

 

标签:

给我留言

Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录