netif_start_queue/netif_wake_queue/netif_stop_queue
在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息。
主要有4个:
1】netif_start_queue 启动接口传输队列
2】netif_wake_queue 通知网络系统可以再次开始传输数据包;并启动接口传输队列。
3】netif_stop_queue 标记设备不能传输其他数据包。
4】netif_queue_stopped
5】netif_tx_disable 和第三个功能接口类似,但它还确保在返回时,在其他cpu上没有运行hard_start_xmit函数。可以用第二个接口再次开始传输队列。
NETIF_STOP_QUEUE:
【作用】在驱动程序中调用这个函数来告诉内核的网络子系统,当前网卡设备内存不够,不能继续传输数据包,内核要停止数据包的发送。
【实现】将设备发送队列_tx[0]的状态state的_QUEUE_STATE_XOFF置1。
NETIF_START_QUEUE:
【作用】驱动程序调用这个函数来告诉内核网络子系统,现在可以开始数据包的发送。
【实现】将设备发送队列的_tx[0]的state的_QUEUE_STATE_XOFF复位0。
NETIF_WAKE_QUEUE:
【作用】除了实现netif_start_queue的作用外,还会将设备的发送队列加入到CPU的发送队列,并且出发中断处理的下半部来出发数据包发送。
【实现】除了检查tx[0]的state的_QUEUE_STATE_XOFF位外,还检查设备发送队列qdisk成员的_QDISK_STATE_SCHED,如果是1说明当前设备的发送队列尚未加入到CPU的发送队列尾部,同时调用raise_softirq_irqoff(NET_TX_SOFTIRQ)来触发softirq。
NETIF_QUEUE_STOPPED:
【作用】检查net_device的发送队列是否stopped
【实现】检查设备发送队列_tx[0]的状态state的_QUEUE_STATE_XOFF是否置1,置1的话返回1,置0返回0。
=======用法=========
netif_start_queue一般在open函数中调用,开启数据包的传输。
netif_stop_queue一般用于驱动程序通知网络子系统暂停数据包传输,从来进行实现流量控制。
netif_wake_queue在timeout后或者网卡硬件出错后调用,来重启数据包的发送,并且将在设备队列关闭期间进入的到队列的数据包发送。
================================================================================
netif_rx :
原型: void netif_rx(struct sk_buff *skb)
调用(包括中断期间)这个函数可以通知内核已经收到一个数据包,并封装入一个套接字缓冲区。
netif_rx_schedule:
原型: void netif_rx_schedule(dev);
调用该函数通知内核数据包已经存在,并且在接口上启动轮询机制,它只在NAPI驱动程序中使用。
netif_receive_skb 和 netif_rx_complete
原型:int netif_receive_skb(struct sk_buff *skb);
void netif_rx_complete(dev);
这两函数只在NAPI驱动程序中使用;NAPI中的netif_receive_skb函数与netif_rx等价;它将数据包发送给内核。当NAPI驱动程序耗尽了为接收数据包准备的内存时,则它将重新启动中断,然后调用netif_rx_complete终止轮询函数。
转载于:https://www.cnblogs.com/zxc2man/p/4105652.html
netif_start_queue/netif_wake_queue/netif_stop_queue相关推荐
- 《linux设备驱动开发详解》笔记——14 linux网络设备驱动
14.1 网络设备驱动结构 网络协议接口层:硬件无关,标准收发函数dev_queue_xmit()和netif_rx(); 注意,netif_rx是将接收到的数据给上层,有时也在驱动收到数据以后调用 ...
- 一文搞懂网卡驱动的原理与移植方法
1.网卡设备驱动原理 1.1 层次结构 Linux系统对网络设备驱动定义了4个层次, 这4个层次有到下分为: 1.网络协议接口层:实现统一的数据包收发的协议.该层主要负责调用dev_queue_xmi ...
- 《精通Linux设备驱动程序开发》——网络接口卡
一.驱动程序数据结构 一).简介 1.在为一个NIC写设备驱动程序时,必须操作3类数据结构 1).形成网络协议栈构造块的数据结构.套接字缓冲区,即定义在include/linux/sk_buff.h文 ...
- Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)
在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...
- 精彩---rtl8139网卡驱动程序分析
学习应该是一个先把问题简单化,再把问题复杂化的过程.一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉.读Linux网卡驱动 也是一样.那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏 ...
- 【Linux高级驱动】如何分析并移植网卡驱动
dm9000的驱动分析 m9000_init platform_driver_register(&dm9000_driver); dm9000_probe /*获取平台数据*/ stru ...
- Linux-2.6.20的cs8900驱动分析
几经波折,在开发板上终于可以使用网络了.Linux内核可以通过网络挂接网络文件系统了.首先感谢Internet,Google等帮助过我的工具,还要感谢各位嵌友的无私奉献.在移植的过程中尤其感激weib ...
- qq2440 cs8900移植
http://www.linuxidc.com/Linux/2011-05/35449.htm 网上关于最新内核移植相关的文章几乎找不到.最新的似乎只有"友善之臂"针对mini24 ...
- 内核网络输出帧的处理
首先来看如何打开和关闭一个输出队列. 帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的.而打开和关闭队列也就是通过这个状态位来处理. static in ...
最新文章
- PHP内核探索之变量(1)Zval
- MySQL导入sql 文件的5大步骤
- python库管理_多版本python控制以及python三方库管理
- docker部署项目,对镜像,容器的操作
- 学习MongoDB 十一: MongoDB聚合(Aggregation Pipeline基础篇上)(三)
- oracle重启数据库一般要多久,优化Oracle停机时间及数据库恢复
- 中科慧眼双目安装pcl
- python中ans的用法_python cx_Oracle基础使用方法
- 【小程序】【Tips】【实践】Json 的对象 和 Json字符串 的区别和转换
- 百度2017春招笔试
- Quick-cocos2d-x3.3 ios实现头像选取
- 递归经典案例汉诺塔 python实现_python实现汉诺塔递归算法经典案例
- 街头篮球一直提示服务器维护怎么解决,街头篮球为什么进不去 街头篮球进不去怎么办...
- 更改MyEclipse匹配颜色
- linux 查找后删除目录,linux中find与rm实现查找并删除目录或文件
- 手机淘宝宝贝详情页《问大家》数据爬虫手把手实战,包含动态参数如何生成...
- 21天设计Arm芯片|移知公开课
- A hard puzzle(HDU1097)(快速幂取模)
- 网站白名单可行性分析
- Linux Glibc幽灵漏洞紧急修补方案【转】
热门文章
- mysql优化 运维_MySQL运维---MySQL优化
- 公里与英里的换算c语言函数_60迈=60码=60公里?这三者天壤之别,可别搞错了
- 【WebRTC---序篇】(二)Windows平台WebRTC源码编译
- python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...
- openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断
- php怎么把时间戳转成日期格式,php怎么把时间格式转换为时间戳?,时间戳转为日期...
- python2048游戏代码_【Python】用Python实现2048小游戏(源代码,1.0版本)
- Ubuntu16.04通过wine环境安装微信与QQ等软件
- 工业以太网交换机和普通商用交换机的区别
- [渝粤教育] 广东-国家-开放大学 21秋期末考试工程项目管理10324k2