之前的snull只能自娱自乐,我们来实现一个可以和外部通讯的虚拟网卡。
这个虚拟网卡参考了vlan协议实现。
重点我们说四个东西,引用真实的网卡、自定义协议号注册、发送和接受。
Linux-3.0.8
引用真实的网卡:
单从程序上看就这一句:
real_netdev = dev_get_by_name(&init_net, "eth0");
dev_get_by_name()和init_net
init_net是struct net结构,这个结构中有两个成员
struct hlist_head *dev_name_head;
struct hlist_head *dev_index_head;
你可以想象到应该还有个函数时dev_get_by_index()。每个struct net_device有一个ifindex成员,在此会用到。
dev_get_by_name就是获取通过name去查找hash表。找到对应的网卡结构体地址。
从这点我们也可以看出内核用一个hash表去管理网卡设备。
我们再看在那把网卡放入此hash表。首先说一下init_net,它是一个全局变量,如果要使用它,需要包含头文件net/net_name