kni模块的具体实现
一、kni内核模块初始化
kni驱动入口:module_init(kni_init) --》初始化 kni_init 模块;
kni_init :
1、获取驱动启动参数:检查 kthread 、 carrier 配置(是否将kni虚拟网卡注册到网络命名空间内核软中断进行收发包的设备链表上); //加载kni驱动时,需要加上carrier=on参数,不然kni驱动默认为carrier off,即切断了与协议栈的上行路径(收包轮询网卡设备时检查到网卡状态为NOCARRIER不会进行网卡报文上送协议栈)
2、注册kni设备到网络命名空间
register_pernet_subsys(&kni_net_ops):将kni_net_ops的id记录到init_net->gen链表,并执行ops->init函数
static struct pernet_operations kni_net_ops = {undefined
.init = kni_init_net,
.exit = kni_exit_net,
#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS
.id = &kni_net_id,
.size == sizeof(struct kni_net),
#endif
};
kni_init_net:
调net_generic申请kni在网络命名空间的私有数据空间 struct kni_n