目的:给虚拟网卡驱动添加发包函数,使其能ping通3.3.3.4
代码如下
-
/*
-
* 参考drivers\net\dm9000.c
-
*/
-
#include <linux/module.h>
-
#include <linux/ioport.h>
-
#include <linux/netdevice.h>
-
#include <linux/etherdevice.h>
-
#include <linux/init.h>
-
#include <linux/interrupt.h>
-
#include <linux/skbuff.h>
-
#include <linux/spinlock.h>
-
#include <linux/crc32.h>
-
#include <linux/mii.h>
-
#include <linux/ethtool.h>
-
#include <linux/dm9000.h>
-
#include <linux/delay.h>
-
#include <linux/platform_device.h>
-
#include <linux/irq.h>
-
#include <linux/slab.h>
-
-
#include <asm/delay.h>
-
#include <asm/irq.h>
-
#include <asm/io.h>
-
-
static struct net_device *vnet_dev;
-
-
static int vnet_send_packet(struct sk_buff *skb, struct net_device *dev)//发包函数
-
{
-
/* 对于真实的网卡,应该把skb里的数据通过网卡发送出去,这里我们简单起见,只打印信息 */
-
static int cnt = 0;
-
printk("vnet_send_packet %d\n", ++cnt);
-
-
/*更新统计信息*/
-
dev->stats.tx_bytes += skb->len;//发送的字节数
-
dev->stats.tx_packets++;//发送的包个数
-
return 0;
-
}
-
-
static struct net_device_ops vnet_dev_ops =
-
{
-
/* 2.1 在结构体net_device_ops中定义发包函数:nodo_start_xmit */
-
.ndo_start_xmit = vnet_send_packet,
-
};
-
-
static int vnet_init(void)
-
{
-
/* 1. 分配一个net_device */
-
vnet_dev = alloc_netdev(0, "vnet%d", ether_setup); // alloc_etherdev;
-
-
/* 2. 设置: */
-
/* 2.2 其他信息 */
-
/*设置mac地址*/
-
vnet_dev->dev_addr[0] = 0x00;
-
vnet_dev->dev_addr[1] = 0xE0;
-
vnet_dev->dev_addr[2] = 0x4A;
-
vnet_dev->dev_addr[3] = 0xbc;
-
vnet_dev->dev_addr[4] = 0x15;
-
vnet_dev->dev_addr[5] = 0xe8;
-
-
/* 3. 硬件相关的: request_irq, 在中断函数里得到数据后用netif_rx上报 */
-
-
/* 4. 注册net_device */
-
vnet_dev->netdev_ops = &vnet_dev_ops;//必须添加,否则会注册失败
-
register_netdev(vnet_dev);
-
-
-
return 0;
-
}
-
-
static void vnet_exit(void)
-
{
-
unregister_netdev(vnet_dev);
-
free_netdev(vnet_dev);
-
}
-
-
module_init(vnet_init);
-
module_exit(vnet_exit);
-
-
MODULE_LICENSE("GPL");
测试:
加载驱动设置ip后,ping 3.3.3.4,发现调用了vnet_send_packet函数发包,打印出了信息
通过ifconfig查看网卡,可以看到发包信息和我们设置的mac地址
阅读(1361) | 评论(0) | 转发(0) |