虚拟网卡驱动(二)

下面让我们来看一下本实验的具体代码:

/*
* 参考 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有相应的信息。并无接收记录。与程序相符。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值