在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息。

主要有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相关推荐

  1. 《linux设备驱动开发详解》笔记——14 linux网络设备驱动

    14.1 网络设备驱动结构 网络协议接口层:硬件无关,标准收发函数dev_queue_xmit()和netif_rx();  注意,netif_rx是将接收到的数据给上层,有时也在驱动收到数据以后调用 ...

  2. 一文搞懂网卡驱动的原理与移植方法

    1.网卡设备驱动原理 1.1 层次结构 Linux系统对网络设备驱动定义了4个层次, 这4个层次有到下分为: 1.网络协议接口层:实现统一的数据包收发的协议.该层主要负责调用dev_queue_xmi ...

  3. 《精通Linux设备驱动程序开发》——网络接口卡

    一.驱动程序数据结构 一).简介 1.在为一个NIC写设备驱动程序时,必须操作3类数据结构 1).形成网络协议栈构造块的数据结构.套接字缓冲区,即定义在include/linux/sk_buff.h文 ...

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

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

  5. 精彩---rtl8139网卡驱动程序分析

    学习应该是一个先把问题简单化,再把问题复杂化的过程.一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉.读Linux网卡驱动 也是一样.那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏 ...

  6. 【Linux高级驱动】如何分析并移植网卡驱动

    dm9000的驱动分析 m9000_init  platform_driver_register(&dm9000_driver); dm9000_probe  /*获取平台数据*/  stru ...

  7. Linux-2.6.20的cs8900驱动分析

    几经波折,在开发板上终于可以使用网络了.Linux内核可以通过网络挂接网络文件系统了.首先感谢Internet,Google等帮助过我的工具,还要感谢各位嵌友的无私奉献.在移植的过程中尤其感激weib ...

  8. qq2440 cs8900移植

    http://www.linuxidc.com/Linux/2011-05/35449.htm 网上关于最新内核移植相关的文章几乎找不到.最新的似乎只有"友善之臂"针对mini24 ...

  9. 内核网络输出帧的处理

    首先来看如何打开和关闭一个输出队列. 帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的.而打开和关闭队列也就是通过这个状态位来处理. static in ...

最新文章

  1. PHP内核探索之变量(1)Zval
  2. MySQL导入sql 文件的5大步骤
  3. python库管理_多版本python控制以及python三方库管理
  4. docker部署项目,对镜像,容器的操作
  5. 学习MongoDB 十一: MongoDB聚合(Aggregation Pipeline基础篇上)(三)
  6. oracle重启数据库一般要多久,优化Oracle停机时间及数据库恢复
  7. 中科慧眼双目安装pcl
  8. python中ans的用法_python cx_Oracle基础使用方法
  9. 【小程序】【Tips】【实践】Json 的对象 和 Json字符串 的区别和转换
  10. 百度2017春招笔试
  11. Quick-cocos2d-x3.3 ios实现头像选取
  12. 递归经典案例汉诺塔 python实现_python实现汉诺塔递归算法经典案例
  13. 街头篮球一直提示服务器维护怎么解决,街头篮球为什么进不去 街头篮球进不去怎么办...
  14. 更改MyEclipse匹配颜色
  15. linux 查找后删除目录,linux中find与rm实现查找并删除目录或文件
  16. 手机淘宝宝贝详情页《问大家》数据爬虫手把手实战,包含动态参数如何生成...
  17. 21天设计Arm芯片|移知公开课
  18. A hard puzzle(HDU1097)(快速幂取模)
  19. 网站白名单可行性分析
  20. Linux Glibc幽灵漏洞紧急修补方案【转】

热门文章

  1. mysql优化 运维_MySQL运维---MySQL优化
  2. 公里与英里的换算c语言函数_60迈=60码=60公里?这三者天壤之别,可别搞错了
  3. 【WebRTC---序篇】(二)Windows平台WebRTC源码编译
  4. python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...
  5. openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断
  6. php怎么把时间戳转成日期格式,php怎么把时间格式转换为时间戳?,时间戳转为日期...
  7. python2048游戏代码_【Python】用Python实现2048小游戏(源代码,1.0版本)
  8. Ubuntu16.04通过wine环境安装微信与QQ等软件
  9. 工业以太网交换机和普通商用交换机的区别
  10. [渝粤教育] 广东-国家-开放大学 21秋期末考试工程项目管理10324k2