【摘要】前文我们分析了一个虚拟硬件的网络驱动例子,从中我们看到了网络设备的一些接口,其实网络设备驱动和块设备驱动的功能比较类似,都是发送和接收数据包(数据请求)。当然它们实际是有很多不同的。

1、引言

首先块设备在/dev目录下有设备节点,而网络设备没有这样的设备入口。read,write等常规的文件接口在网络设备下也没有意义。 
最大的区别在于:块设备只响应内核的数据请求;而网络设备驱动要异步地接收来自外部的数据包。简单地说,块设备驱动是被要求传输数据而网络设备是主动请求传输数据。网络设备驱动还需要支持设置地址,修改传输参数等等这样的操作,所以网络设备驱动的api需要提供这些接口。

本文是对上文虚拟硬件的网络驱动例子进行一个简单的梳理。

(1)网络设备注册

头文件:<linux/netdevice.h>
struct net_device 网络设备结构体
struct net_device *alloc_netdev (int size_priv, const char *name, void (*setup)(struct net_device *));
int register_netdev(struct net_device *device); 注册网络设备
void unregitster_netdev(struct net_device *device); 注销网络设备

(2)打开和关闭 
驱动在加载入内核后,内核会调用probe函数来探测它。在网络接口可以传送数据包时,内核必须首先打开它并给它设置地址。内核打开和关闭网络接口是由ifconfig命令触发的。

int (*open)(struct net_device*); 打开网络设备
int (*stop)(struct net_device*); 关闭网络设备
void netif_start_queue(struct net_device*); 启动网络传输队列
void netif_stop_queue(struct net_device*); 关闭网络传输队列

(3)网络数据的发送 
网络接口最重要的作用是发送和接收网络数据。

头文件:<linux/skbuff.h> 定义了网络驱动中传输的基本单元,struct sk_buff
struct netdeviceops 网络设备驱动需要实现的接口函数
netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev); 传输网络数据包的函数
void (*ndo_tx_timeout) (struct net_device *dev); 传输超时函数

(4)网络数据的接收 
接收网络数据相对于发送数据要复杂一些,因为你需要在原子上下文中把分配一个 sk_buff 并把它移交给上层处理。

数据包接收有两种实现方式:中断驱动和轮询。大多数驱动都是中断驱动的,有一些高吞吐量的驱动会使用轮询的方式。

struct sk_buff *dev_alloc_skb(unsigned int length); 原子上下文中分配skb
printk_ratelimit() 限制printk的输出频率,在中断相应函数中减少输出
  • 1
  • 2
  • 1
  • 2

实现高吞吐量的网络驱动,要减少网络阻塞最好的方法是使用napi,后面会介绍

(5)中断处理 
硬件可以中断cpu发送两种事件:新的数据包到来和发送的数据包已经发送完成。

判断并处理数据包事件 
如果在其他地方暂时停止了发送队列,应该在中断函数中重新启动它

(6)NAPI  
高吞吐量的网络接口如果每个数据包都用中断来处理的话会给系统带来很大的负担,这个时候应该使用基于轮询的 NAPI。这样可以减轻系统的负担,减少阻塞的时间。

只有极少数的设备实现了NAPI,因为实现起来比中断要复杂,而且有其他的一些条件。

在中断处理函数中,首先禁止进一步的中断处理,然后调度轮询函数,进入轮询函数后连续处理多个数据发送请求。

int (*poll)(struct net_device *dev, int *budget); 网络驱动轮询函数
int netif_rx_schedule(struct net_device *dev); 准备调用轮询函数
int (*poll)(struct net_device *dev, int *budget); 轮询函数

http://blog.csdn.net/xy010902100449/article/details/47132917

Linux 网卡驱动学习(二)(网络驱动接口小结)的更多相关文章

  1. Linux Platform驱动模型(二) _驱动方法

    在Linux设备树语法详解和Linux Platform驱动模型(一) _设备信息中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分-驱动方法,将试图回答下面几个问题: 如何填充platfo ...

  2. Linux Platform驱动模型(二) _驱动方法【转】

    转自:http://www.cnblogs.com/xiaojiang1025/archive/2017/02/06/6367910.html 在Linux设备树语法详解和Linux Platform ...

  3. [Binder深入学习二]Binder驱动——基础数据结构二

    Userspace和KernelSpace进行交互时,大部分命令是通过 ioctl 实现的,在这个过程中,最重要的一个便是 BINDER_WRITE_READ 命令了. #define BINDER_ ...

  4. Linux——shell简单学习(二)

    流控制语句: for…done语句 格式:for  变量   in   名字表 do  命令列表 done 例子: #!/bin/sh for DAY in Sunday Monday Tuesday ...

  5. Linux运维学习笔记-网络技术知识体系总结

    传统网络知识体系 未来网络SND模型架构

  6. Linux运维学习笔记-网络安全等级保护

    网络安全等级保护简介与作用: 验证信息系统是否满足相应安全保护等级的一个过程. 对不同信息系统分等级进行保护.

  7. Linux网络驱动--snull

    snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...

  8. 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序

    一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...

  9. Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)

    在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...

随机推荐

  1. LA 3790 Overlapping Squares DFS

    题意: 给出一个字符矩阵,问能否是不超过6个2×2的正方形组成的. 分析: 每次找一个最表面的正方形然后DFS就好了. 一个正方形被移开后,用一个特殊符号标记上,下次再匹配的时候就直接忽略这些位置. ...

  2. 如何高效的学习 TensorFlow ?

    1.https://www.zhihu.com/question/41667903?from=profile_question_card 2.http://cn.udacity.com/course/ ...

  3. 学习boundingRectWithSize:options:attributes:context:计算文本尺寸

    oundingRectWithSize:options:context: 返回文本绘制所占据的矩形空间. - (CGRect)boundingRectWithSize:(CGSize)size opt ...

  4. Selenium WebDriver-通过ActionChains实现页面元素拖拽

    #encoding=utf-8 import unittest import time import chardet from selenium import webdriver class Visi ...

  5. css各属性浏览器的兼容情况

  6. Leetcode 475.供暖气

    供暖气 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径. 所以,你的输入将会是房屋和供暖器 ...

  7. Leetcode 427.建立四叉树

    建立四叉树 我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络.网络中每一格的值只会是真或假.树的根结点代表整个网络.对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相同的. 每 ...

  8. kmp-模板-hd-1711

    p数组记录的是当该位置上失配的时候,跳到第几个进行继续匹配: /* 题意:给两个数串,求模板串第一此出现在源串中的位置,开头的位置:没有输出-1: 算法:kmp 先对字符串进行自匹配: 然后串间匹配: ...

  9. [CODEVS1917] 深海机器人问题(最小费用最大流)

    传送门 [问题分析] 最大费用最大流问题. [建模方法] 把网格中每个位置抽象成网络中一个节点,建立附加源S汇T. 1.对于每个顶点i,j为i东边或南边相邻的一个节点,连接节点i与节点j一条容量为1, ...

  10. BZOJ3505 & 洛谷P3166 [Cqoi2014]数三角形 【数学、数论】

    题目 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入格式 输入一行,包含两个空格分隔的正整数m和n. 输出格式 输出 ...