网卡驱动程序框架

原创 2017年03月30日 23:31:14

我们这里说的是网卡驱动程序,不是网络驱动程序,网络有七层,我们写的只是最底层的东西,网络这么多层,但是最终你还是要操作硬件啊

所以上面肯定有个硬件相关层,我们要写的就是硬件相关的驱动程序这一小块。

网卡你不需要打开什么设备,你只需要socket编程就行了

怎么写

1、分配某个结构体

2、设置

3、注册

4、硬件相关的操作


然而这个重点在设置这里

首先你得提供发包函数 提供收包的功能


我们随便看一个网卡驱动程序 如cs89x0.c

这是一个真实的网卡驱动程序



分配一个net_device

然后调用了下面这个函数


进去


有个这个

我们看看net_ops


有open和stop函数

还有ndo_start_xmit 硬件启动传输,这个发包函数就在这里


然后注册这个结构体



但是收到数据之后做什么事情,你怎么告诉我收到数据了呢,肯定会有个中断

我们来看看


假设收到数据之后


net_rx 进去看一下


从芯片里面读出来

分配一个skbuf


然后用下面的函数上报



然后我们再看一下发包函数是怎么回事


它发的是什么东西,它的参数是怎样,它的参数是sk_buf


从这里我们可以知道,硬件相关的这层和上层怎么打交道呢?

它们之间就是通过sk_buf,上面这几层构造好包之后,放到sk_buf里面扔给你,调用你的发包函数,你收到数据之后,在你的中断程序收到数据之后,你从芯片里面把数据读出来,构造一个sk_buf,然后用netif_rx来上报这个数据给我


说到这块,写一个网卡驱动很简单,我们先写一个虚拟的网卡

参考/driver/net/cs89x0.c


框架如图



我们来看一下范例里面分配的


但是我们不想用alloc_etherdev这个宏,我们进去看一下这个宏


进入alloc_etherdev_mqs这个函数里面去


这里的名字用的是eth0啊 eth1这种,我不想用这个名字,我想换一个名字,所以我们直接用alloc_netdev_mqs这个函数来做



我们写一个最简单的网络驱动 代码如下

#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/spinlock.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/gfp.h>
#include <asm/system.h>
#include <asm/io.h>a
#include <asm/irq.h>
static struct net_device *vnet_dev;


static int gh_start_xmit(struct sk_buff *skb, struct net_device *dev)
{


static int cnt = 0;
printk("virt_net_send_packet cnt = %d\n", ++cnt);
return 0;
}


static const struct net_device_ops gh_netdev_ops = {
.ndo_start_xmit= gh_start_xmit,
};


static int virtnet_init(void)
{


/*1.分配一个net_device结构体**/
vnet_dev=alloc_netdev(0, "ghnet%d", ether_setup);
/*2.设置*/
vnet_dev->netdev_ops= &gh_netdev_ops;
/*3.注册*/
register_netdev(vnet_dev);
return 0;
}


static void virtnet_exit(void)
{
unregister_netdev(vnet_dev);
free_netdev(vnet_dev);
}


module_init(virtnet_init);
module_exit(virtnet_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EIGHT");


测试如下

1.insmod virt_net.ko

2.ifconfig ghnet0 3.3.3.3

3.ping 3.3.3.3


效果如图


ping 自己是不会进入那个发包的函数的,我们ping下别人 3.3.3.4

效果如图


这上面说我发了20个包 

我们ifconfig来看一下


但是我们这里写的发的包是0,因为我们代码中还没有设置统计信息

在我们net_device结构体中有个net_device_stats这个结构体就是统计信息












Linux驱动修炼之道-DM9000A网卡驱动框架源码分析

首先分析一下Linux网络设备的结构,如下图:   网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过...
  • anqi55
  • anqi55
  • 2011年08月15日 11:16
  • 3241

网络驱动移植之解析Linux网络驱动的基本框架

内核源码:linux-2.6.38.8.tar.bz2       概括而言,编写Linux网络驱动其实只要完成两件事即可,一是分配并初始化网络设备,二是注册网络设备。     1、分配并初始化...
  • npy_lp
  • npy_lp
  • 2011年12月20日 21:18
  • 9731

嵌入式学习-驱动开发-lesson7.1-网卡驱动架构分析驱动及CS8900流程分析

lesson1 网卡驱动架构分析 一、网络子系统 在内核相关一课中,已经介绍过,linux内核一共有7个子系统(模块): 1.SCI 2.Pm 3.MM 4.Arch 5.Vfs 6....
  • u011003120
  • u011003120
  • 2016年08月10日 21:43
  • 1463

网卡驱动流程分析

1.网卡驱动架构分析 1.1linux网络子系统 1.2.重要数据结构 1.3.网卡驱动架构分析1.1linux网络子系统linux网络子系统可以分为System call interface(...
  • cmh477660693
  • cmh477660693
  • 2016年10月03日 14:17
  • 1177

Linux网络驱动架构

http://http://www.ibm.com/developerworks/cn/linux/l-cn-networkdriver/ 网络设备介绍 网络设备是计算机体系结...
  • zhoudengqing
  • zhoudengqing
  • 2015年08月10日 22:54
  • 2566

网卡驱动编写方法

在此仅仅讨论网络设备驱动的一般写法,有关硬件部分的相关代码由于硬件规格不同,予以省略。有什么地方错误,或补充,欢迎大家提出。  1, 驱动模块的加载和卸载 如果网络设备(包括wireless)是...
  • cupidove
  • cupidove
  • 2013年07月17日 10:01
  • 3206

linux内核编程之网卡驱动

每一个网络接口由一个net_device结构描述,定义在中。 1.首先需要分配设备结构,使用函数: struct net_device *alloc_netdev(int sizof_priv, co...
  • gentleliu
  • gentleliu
  • 2014年01月01日 15:41
  • 1994

Linux 网络设备驱动开发(三) —— 网络设备驱动基本原理和框架

一、协议栈层次对比 二.Linux网络子系统     Linux网络子系统的顶部是系统调用接口层。它为用户空间提供的应用程序提供了一种访问内核网络子系统的方法(socket)。位于其下面是一...
  • zqixiao_09
  • zqixiao_09
  • 2016年04月13日 21:17
  • 6644

网卡驱动程序框架

我们这里说的是网卡驱动程序,不是网络驱动程序,网络有七层,我们写的只是最底层的东西,网络这么多层,但是最终你还是要操作硬件啊 所以上面肯定有个硬件相关层,我们要写的就是硬件相关的驱动程序这一小块。 网...
  • fight_onlyfor_you
  • fight_onlyfor_you
  • 2017年03月30日 23:31
  • 621

如何安装网卡和网卡驱动程序

  • 2013年09月24日 15:18
  • 130KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网卡驱动程序框架
举报原因:
原因补充:

(最多只允许输入30个字)