我们先来看代码:
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/in.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bitops.h>
#include <linux/delay.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/irq.h>
static struct net_device *vnet_dev;
static int virt_net_init(void)
{
/* 1. 分配一个net_device结构体 */
vnet_dev = alloc_netdev(0, "vnet%d", ether_setup);; /* alloc_etherdev */
/* 2. 设置 */
/* 3. 注册 */
register_netdev(vnet_dev);
return 0;
}
static void virt_net_exit(void)
{
unregister_netdev(vnet_dev);
free_netdev(vnet_dev);
}
module_init(virt_net_init);
module_exit(virt_net_exit);
MODULE_LICENSE("GPL");
分析:
首先分配得到一个net_device结构体,然后对这个结构体进行设置,设置好后注册。这就是编写网卡驱动的最主要的三大步骤。不过这本例子中我们并没有读这个结构体进行设置。
测试:
(1)
ifconfig vnet0 up
ifconfig
可以看到vnet0网卡被打开了
(2)
ifconfig vnet0 3.3.3.3 up
ifconfig
可以看到vnet0的ip地址被设置成了:3.3.3.3
(3)
ping 3.3.3.3 :可以看到ping通了
ifconfig :根据输出信息,
我们可以看出,只是ping通了,但是没有涉及包的发送与接收,因为接受与发送字节都显示为0,那么应该如何实现包的发送与接收呢?我们在下一节中会有讲解。
(4)
当我们使用ping 3.3.3.4来ping其他网卡时,这时候系统会崩溃的,这是因为ping其他网卡是涉及到数据包的发送,因为我们并没有设置发包函数,所以会造成系统的崩溃。