歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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");

Copyright © Linux教程網 All Rights Reserved