网卡驱动程序之框架(一)

一、网卡驱动程序框架:

app:  socket
--------------------------------------------------
           ---------------
           --------------- 若干层网络协议--纯软件
           ---------------
           ---------------
hard_start_xmit||  /\
               \/  ||  netif_rx   sk_buff
           ---------------
          硬件相关的驱动程序(要提供hard_start_xmit, 有数据时要用netif_rx上报)           
--------------------------------------------------
               硬件           
           
怎么写网卡驱动程序?
1. 分配一个net_device结构体
2. 设置:
2.1 发包函数: hard_start_xmit
2.2 收到数据时(在中断处理函数里)用netif_rx上报数据
2.3 其他设置
3. 注册: register_netdevice


测试1th/2th:
1. insmod virt_net.ko
2. ifconfig vnet0 3.3.3.3
   ifconfig // 查看
3. ping 3.3.3.3  // 成功   
   ping 3.3.3.4  // 死机


测试DM9000C驱动程序:
1. 把dm9dev9000c.c放到内核的drivers/net目录下
2. 修改drivers/net/Makefile

obj-$(CONFIG_DM9000) += dm9000.o
改为
obj-$(CONFIG_DM9000) += dm9dev9000c.o
3. make uImage
   使用新内核启动
4.
使用NFS启动

ifconfig eth0 192.168.1.17
ping 192.168.1.1   
二、虚拟网卡测试程序

1.

/*

 * 参考 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_init(void)

{

    /* 1. 分配一个net_device结构体 */

    vnet_dev = alloc_netdev(0, "vnet%d", ether_setup);;  /* alloc_etherdev */



    /* 2. 设置 */



    /* 3. 注册 */

    //register_netdevice(vnet_dev);

 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_AUTHOR("[email protected],[email protected]");

MODULE_LICENSE("GPL");

2.Makefile

KERN_DIR = /work/system/linux-2.6.22.6



all:

    make -C $(KERN_DIR) M=`pwd` modules 



clean:

    make -C $(KERN_DIR) M=`pwd` modules clean

    rm -rf modules.order



obj-m    += virt_net.o

你可能感兴趣的:(框架)