Linux驱动开发:网络设备之虚拟网卡

以下是一个简单的虚拟网卡驱动,目的是使初学者对网卡驱动的整体架构有一个初步的了解
代码编译加载(insmod virtnet.ko)后,会形成一个自己的虚拟网卡(ifconfig -a 可查看全部网卡信息),

MAC address = 00:12:34:56:78:9a,可以通过ifconfig "ether" 192.168.1.1 up 对虚拟网卡设置IP地址(ifconfig "ether" 192.168.1.1 down 卸载)

测试:

ping 192.168.1.1

ping 192.168.1.2 即会不停地向外发送数据,此时数据包其实是没有经过网卡设备层的

但是,我自己测试一直没有加载上,待后续弄清楚后再来更新!!!

#include <linux/init.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/version.h>
#include <asm/dma.h>
#include <linux/spinlock.h>
#include <linux/crc32.h>
#include <linux/mii.h>
#include <linux/ethtool.h>
#include <asm/uaccess.h>

//声明一个网络设备结构体

struct net_device *dev = NULL;

//启动数据包的传输,传递参数skb,使得驱动程序能获取从上层传递下来的数据包

static int virtnet_start_xmit(struct sk_buf *skb, struct net_device *dev)

{

printf("send %d bytes\n", skb->len);

// 更改统计数据

dev->stats.tx_packets++;

dev->stats.tx_bytes += skb->len;

return 0;

}

//入口函数

static int __init virtnet_init(void)

{

1、分配一个维护网卡的结构

dev = alloc_netdev(0, "virtnet%d", ether_setup);

2、配置网卡特性

dev->hard_start_xmit = &virtnet_start_xmit;

/*MAC address*/

dev->dev_addr[0] = 0x00;

dev->dev_addr[0] = 0x12;

dev->dev_addr[0] = 0x34;

dev->dev_addr[0] = 0x56;

dev->dev_addr[0] = 0x78;

dev->dev_addr[0] = 0x9a;

3、注册网卡设备

register_netdev(dev);

return 0;

}

//出口函数

static void __exit virtnet_exit(void)

{

unregister_netdev(dev);

free_netdev(dev);

return;

}

//注册

module_init(virtnet_init);

module_exit(virtnet_exit);

MODULE_LICENSE("GPL");

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywgxz.html