Linux网卡驱动设计

Linux网络体系结构

Linux的优点之一在于它丰富而稳定的网络协议栈。其范围从协议无关层到各种具体的网络协议实现。

协议层次对比图

网络接口层提供访问物理设备的驱动程序,对应的网络协议主要是以太网协议。

网络层协议管理离散计算机间的数据传输,如IP协议为用户和远程计算机提供了信息包的传输方法。确保了信息包能正确的到达目的机器。

传输层的功能包括:格式化信息流、提供可靠传输。

应用层位于协议栈的顶端,它的主要任务是服务于应用。

Linux网络子系统

其顶端时系统调用接口层。位于其下面的是一个协议无关层,它提供了一个通用方法来使用传输层协议。然后是具体协议的实现,然后是设备无关层,它提供了协议与设备驱动通信的通用接口,最下面是设备驱动程序。

系统调用接口:Socket系统调用。

协议无关接口:实现一组通用函数来访问各种不同的协议:通过socket实现。这个结构包含了特定socket所需要的所有状态信息,还概括了socket所使用的特定协议和socket上可以执行的一些操作。

设备无关接口将协议与各种网络设备驱动连接在一起。这一层提供一组通用函数供底层网络设备驱动程序使用,让它们可以对高层协议栈进行操作。首先,设备驱动程序可能会通过调用用register_netdevice或unregister_netdevice在内核中进行注册或注销。调用者首先填写首先填写net_device结构结构,然后传递这个结构进行注册。内核调用它的的init函数(如果定义了这种函数),然后执行一组健全性检查,并将新设备添加到设备列表中(内核中的活动设备链表)。

要从协议层向设备发送数据,需要使用dev_queue_xmit函函数,这个函数对数据进行排队,并交由底层设备驱动程序进行最终传输报文的接收通常是使用使用netif_rx执行执行的。当底层设备驱动程序接收到一个报文(包含在所分配的的sk_buff中)时,就会通过调用用netif_rx将将数据上传至设备无关层,然后,这个函数通过过netif_rx_schedule将sk_buff在上在上层协议队列中进行排队,供以后进行处理。

驱动设计

设备描述

每个网络接口都由一个net_device结构来描述,该结构可使用如下内核函数动态分配:

1、structnet_device *alloc_netdev(int sizeof_priv, const char*mask, void (*setup)(structnet_device *))

sizeof_priv 私有数据区大小;mask:设备名;setup 初始化函数

2、structnet_device *alloc_etherdev(int sizeof_priv)

alloc_etherdev是alloc_netdev针对以太网的快捷函数

structnet_device{

charname[IFNAMSIZ];

unsigned longstate;

unsigned longbase_addr;

unsigned int irq;

int(*init)(struct net_device *dev);//该函数在register_netdev时被调用来完成对net_device结构的初始化

}

基本方法

int(*open)(struct net_device *dev);打开接口。ifconfig激活时,接口将被打开。

int(*stop)(struct net_device *dev);停止接口。网卡关闭时。

int (*hard_start_xmit)(struct sk_buff *skb, struct net_device *dev) ;数据发送函数

设备注册

intregister_netdev(struct net_device *dev)

sk_buff

Linux内核中的每个网络数据包都由一个套接字缓冲区结构结构structsk_buff描述,即一个sk_buff结构结构就是一个包,指向sk_buff的的指针通常被称做skb。

该结构包含如下重要成员:

structdevice*dev;//处处理该包的设备

__u32saddr;//IP源源地址

__u32daddr;//IP目目的地址

__u32raddr;//IP路路由器地址

unsignedchar*head;//分分配空间的开始

unsignedchar*data;//有有效数据的开始

unsignedchar*tail;//有有效数据的结束

unsignedchar*end;//分分配空间的结束

unsignedlonglen;;//有有效数据的

skb操作函数

struct sk_buff *alloc_skb(unsigned int len, int priority)

分配一个sk_buff结构,供协议栈代码使用

struct sk_buff *dev_alloc_skb(unsigned int len)

分配一个sk_buff结构,供驱动代码使用

unsigned char *skb_push(struct sk_buff *skb, int len)

向后移动skb的tail指针,并返回tail移动之前的值。

unsigned char *skb_put(structsk_buff *skb, int len)

向前移动skb的head指针,并返回head移动之后的值。

kfree_skb(struct sk_buff *skb)

释放一个sk_buff结构,供协议栈代码使用。

dev_kfree_skb(struct sk_buff *skb)

释放一个sk_buff结构,供驱动代码使用

设备打开

1、  注册中断.MDA等

2、  设置寄存器,启动设备

3、  启动发送队列

代码示例

intnet_open(struct net_device *dev)

{

/*申请中断*/

request_irq(dev->irq,&net_interrupt, SA_SHIRQ,“dm9000”, dev);;

/*设置寄存器,启动设备 */

...... ............ ......

/*启动发送队列*/

netif_start_queue(dev); ;

}

数据接收

当核心需要发送一个数据包时,他调用hard_start_transmit,该函数最终将用到net_device结构中的hard_start_xmit函数指针。

网络接口驱动可以实现两种方式的报文接收:

中断和查询,Linux中驱动多采用中断方式。

接收流程

1、  分配skb

skb =dev_alloc_skb(pkt->datalen + 2)

2、  从硬件中读取数据到skb

3、  调用netif_rx将数据交到协议栈netif_rx(skb)

Linux网卡驱动设计相关推荐

  1. linux网卡驱动开发视频,Linux下网卡驱动程序的开发.doc

    Linux下网卡驱动程序的开发 论文题目:Linux下网卡驱动程序的开发 专 业: 年 级: 学生学号: 学生姓名: 指导教师: 完成时间: Linux下网卡驱动程序的开发 八年经验 专业指导毕业设计 ...

  2. linux双网卡驱动配置,linux网卡驱动安装、双网卡绑定

    本次课程包含RAID0/1/5/6/10/50/60配置实验(使用Dell R720服务器实验).Redhat/CentOS/ubuntu/windows操作系统安装.windows/linux网卡绑 ...

  3. linux网卡驱动对XDP支持情况

    各个网卡厂商对应的Linux内核驱动如下 Mellanox: mlx4 (4.8) and mlx5 (4.9) QLogic/Cavium: qede (4.10) Virtio_net: (4.1 ...

  4. 6.S081 lab: networking e1000 网卡驱动 附 Linux 网卡驱动编写分析

    本文是 6.S081 操作系统课程学习最后一个 lab,编写一个 intel 的 e1000 网卡的驱动在 xv6 下.需要复习知识有:操作系统知识,计算机组成原理 DMA 相关,循环缓冲区的概念,e ...

  5. linux网卡驱动离线安装_Linux网卡驱动的安装方式

    如何安装Linux网卡驱动呢,看看下面的说明. 适用机型: 所有xSeries 205; 所有xSeries 206; 所有xSeries 225; 所有xSeries 226; 所有xSeries ...

  6. 有限状态机的嵌入式Linux按键驱动设计(转载)

    本文转载自边缘之火<有限状态机的嵌入式Linux按键驱动设计(转载)> 原文链接:  http://www.eccn.com/design_2010052509381340.htm 秦国栋 ...

  7. Linux网卡驱动分析之RTL8139(五)

    Linux网卡驱动分析之RTL8139(五) deliver_skb(dev.c) // 该函数就是调用个协议的接收函数处理该skb 包,进入第三层网络层处理 static __inline__ in ...

  8. linux网卡驱动源码分析(一)

    linux网卡驱动源码分析(一) linux struct linux内核 网络 descriptor resources 转自http://blog.csdn.net/ustc_dylan/arti ...

  9. linux回环网卡,Linux回环网卡驱动设计

    回环网卡驱动 1.回环网卡和普通网卡的区别是他是虚拟的不是实际的物理网卡,它相当于把普通网卡的发送端和接收端短接在一起. 2.在内核源代码里的回环网卡程序(drivers/net/loopback.c ...

最新文章

  1. DOS文件转换成UNIX文件格式详解
  2. 投资比特币现金的四个理由
  3. django forms 错误处理
  4. C#2.0泛型-Dictionary,List的用法
  5. ×××技术在ATM机无线组网中的应用
  6. 视频容器格式与编码格式简介
  7. python导入urllib request_Python 3.3 - urllib.request - 导入错误
  8. 云上远程运维的最后那点担心,“云梯”帮你解决
  9. finereport mysql 插件,web报表插件领导品牌FineReport
  10. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法
  11. WIN7 X64 下 VS2008升级补丁 (显示隐藏按钮)
  12. ssh 认证指定端口
  13. jQuery特效:实现瀑布流
  14. Office 2016中修改正文默认字体
  15. Linux批量转图,CMYK转RGB
  16. 边境的悍匪—机器学习实战:第五章 支持向量机
  17. 一名合格的IT项目经理 这八项核心技能不能缺
  18. 子库存-OU-库存组织-关系
  19. LGA1155、LGA1156、LGA1366、LGA2011的CPU插槽对应的都是什么型号的CPU
  20. Django的Forms.py

热门文章

  1. 如何用JavaScript获得div高度
  2. 手机数据丢失!没想到是这样找回来的
  3. 华为荣耀鸿蒙os系统,华为没有放弃荣耀!鸿蒙OS系统再次放出大招:老花粉们有福气了...
  4. element表格图片放大_vue中element-ui表格缩略图悬浮放大功能的实例代码
  5. animation 在 电视版的 UC 浏览器没动画
  6. xshell6 常用命令
  7. android 美拍人脸识别,人脸识别+双摄美拍一个都不少:荣耀畅玩7C使用体验
  8. Java技术常见术语及其解释(常见缩写)
  9. 劲爆!魔都人民打开流量“不限量”的正确方式
  10. .net开发 C盘空间不足问题