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