下面让我们来看一下本实验的具体代码:
/*
* 参考 drivers\net\cs89x0.c
*/
#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_send_packet(struct sk_buff *skb, struct net_device *dev)//这个发包函数我们什么也没有做,只是在发包的时候将被调用
{
static int cnt = 0;
printk("virt_net_send_packet cnt = %d\n", ++cnt);
/* 更新统计信息 */
dev->stats.tx_packets
++;//统计发包数量
dev->stats.tx_bytes += skb->len
;//统计发送字节数,二者都可以通过ifconfig nvet0来查看
return 0;
}
static int virt_net_init(void)
{
/* 1. 分配一个net_device结构体 */
vnet_dev = alloc_netdev(0, "vnet%d", ether_setup);; /* alloc_etherdev */
/* 2. 设置 */
vnet_dev->hard_start_xmit = virt_net_send_packet
;//你看,在设置这一步里我们设置了发包函数,当发送数据包时,会调用这个函数
/* 设置MAC地址 */
vnet_dev->dev_addr[0] = 0x08;
vnet_dev->dev_addr[1] = 0x89;
vnet_dev->dev_addr[2] = 0x89;
vnet_dev->dev_addr[3] = 0x89;
vnet_dev->dev_addr[4] = 0x89;
vnet_dev->dev_addr[5] = 0x11;
/* 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");
分析:
在这个驱动程序里面,我们主要是提供了发包函数,因为当ping其他网卡的时候,会调用到发包函数。如果不提供这个函数,将会使系统崩溃。
测试:
那好我们现在来ping一下其他的网卡:ping 3.3.3.4
你看,我们在ping其它网卡的时候是不是调用了发包函数。
我们再来用ifconfig vnet0来查看网卡相关信息。信息如下:
因为我们只是发送数据包,所以只有TX packets:6与TXbytes:252有相应的信息。并无接收记录。与程序相符。