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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写下载服务器。 第四部分:有效地实现HEAD操作

HEAD是一个经常被遗忘的HTTP方法(动词),其行为类似于GET,但不会返回正文。 您使用HEAD来检查资源的存在(如果不存在,它应该返回404),并确保您的缓存中没有陈旧的版本。 在这种情况下…

【grunt整合版】30分钟学会使用grunt打包前端代码

http://www.itnose.net/detail/6009394.html转载于:https://www.cnblogs.com/zifeiyu/p/4106585.html

十三水算法php_基于PHP+Redis令牌桶限流

一 、场景描述在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制。比如对于某个 用户,他在一个时间段(interval)内&…

ECSHOP如何增加红包序列号字符

ECSHOP系统线下发放红包时系统生成的红包序列号是在10000的基础上增加四位随机数字。如果当我们要发放大额度红包的时候,这样的序列号规 则难免给人不安全的感觉,万一有无聊的人,蒙几个红包序列号出来,那就亏大了,因为…

Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型

无论是X-Form-Urlencoded还是JSON HTTP发布到REST资源端点,对于与日期或时间相关的数据都没有特定的“数据类型”。 大多数开发人员会将这些数据发布为“字符串”,或者只是将它们转换为Unix时间戳值(例如1435061152)。 但是&#…

html中给div设置的属性怎么样才能拿得到_HTML与CSS结合的三种方式:优先级比较...

所谓实践出真知,只有自己动手去做了,才能得到正确的结论。首先我们看看三种结合方式:通过link标签引入外部css文件通过style标签通过style属性很长一段时间我受这个一段话影响:在html文件中,代码的执行顺序是从外到内&…

Quartz作业调度框架及时间表达式的含义和语法

Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。本系统结合通过 Spring 来集成 Quartz 。 Quartz 下载地址 &#x…

spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

一、准备工作1. 首先创建一个表:CREATE TABLE t_user (USER_ID int(11) NOT NULL AUTO_INCREMENT,USER_NAME char(30) NOT NULL,USER_PASSWORD char(10) NOT NULL,USER_EMAIL char(30) NOT NULL,PRIMARY KEY (USER_ID),KEY IDX_NAME (USER_NAME)) ENGINEInnoDB AUTO…

LinkedHashMap 根据PUT顺序排序Map

最近工程里面报表需要合计 &#xff0c; 因为所有的项都是动态的&#xff0c;所以只能动态添加。 思路是使用Map&#xff0c;初始化所有Map&#xff0c;然后在Map中合计并且覆盖。 使用HashMap , 初始化后所有动态项的顺序都乱了。 Map<String , Double> totalMap new …

mysql 表设计 date_mysql 表 Date类型

举个例子给你吧&#xff0c;mysql的 datetime字段有表&#xff1a;CREATE TABLE u_user (id bigint(20) NOT NULL AUTO_INCREMENT,nickname varchar(32) DEFAULT NULL,addtime datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4;插入的话INSERT IN…

Oracle学习笔记(三)----------执行计划

查看Oracle执行计划的几种方法 一、通过PL/SQL Dev工具 1、直接File->New->Explain Plan Window&#xff0c;在窗口中执行sql可以查看计划结果。其中&#xff0c;Cost表示cpu的消耗&#xff0c;单位为n%&#xff0c;Cardinality表示执行的行数&#xff0c;等价Rows。 2、…

daocloud创建mysql_GitHub - DaoCloud/php-apache-mysql-sample

如何开发一个 PHP MySQL 的 Docker 化应用目标&#xff1a;基于典型的 LAMP 技术栈&#xff0c;用 Docker 镜像的方式搭建一个 Linux Apache MySQL PHP 的应用 。创建 PHP 应用容器因所有官方镜像均位于境外服务器&#xff0c;为了确保所有示例能正常运行&#xff0c;DaoCl…

HDU2795 Billboard

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2795 1 #include<cstdio>2 #include<algorithm>3 using namespace std;4 #define lson l,m,rt<<15 #define rson m1,r,rt<<1|16 const int maxn 222222;7 int MAX[maxn << 2];8 int…

自动计算尺寸列表功能案例ios源码

源码HTKDynamicResizingCell&#xff0c;HTKDynamicResizingCell提供自动计算尺寸的TableViewCell/CollectionViewCel&#xff0c;只要设置了合适AutoLayout的约束。<ignore_js_op> 使用方法&#xff1a;使用CocoaPods添加&#xff1a; pod HTKDynamicResizingCell, ~>…

mysql存储过程返回多个值_数据库mysql存储过程之返回多个值的方法示例

本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;mysql存储函数只返回一个值。要开发返回多个值的存储过程&#xff0c;需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构&#xff1a;mysql> de…

休眠NONSTRICT_READ_WRITE CacheConcurrencyStrategy如何工作

介绍 在我以前的文章中 &#xff0c;我介绍了READ_ONLY CacheConcurrencyStrategy &#xff0c;这是不可变实体图的显而易见的选择。 当缓存的数据可变时&#xff0c;我们需要使用读写缓存策略&#xff0c;本文将介绍NONSTRICT_READ_WRITE二级缓存的工作方式。 内部运作 提交H…

mysql用大白话解释_Java基础--2021Java面试题系列教程--大白话解读

前言序言再高大上的框架&#xff0c;也需要扎实的基础才能玩转&#xff0c;高频面试问题更是基础中的高频实战要点。适合阅读人群Java 学习者和爱好者&#xff0c;有一定工作经验的技术人&#xff0c;准面试官等。阅读建议本教程是系列教程&#xff0c;包含 Java 基础&#xff…

Android开源之行之走进zxing,轻松实现二维码扫描(二)

对于Zxing开源项目的简化上文已给出&#xff0c;源码经过测试且不断修改。众所周知&#xff0c;Zxing项目的扫描是横向的&#xff0c;这么引用的用户体验确实不好&#xff1b;然而盲目的修改会出现拉伸以及样本采集的偏离。所以这里说一下如何将横屏修改为竖屏扫描 解决办法引用…

mdb批量导入mysql_快速将 access 用的 mdb 文件导入到 mysql 里

下载链接&#xff1a;http://www.bullzip.com/download/a2m/msa2mys_5_4_0_274.zipAccess To MySQLAccess to MySQL is a small program that will convert Microsoft Access Databases to MySQL.Wizard interface.Transfer data directly from one server to another.Create a…

动画

1.UIVIew 1.1 动画块(改变背景颜色和移动) static BOOL flagYES; //开始动画 [UIView beginAnimations:nil context:nil]; //运动的时间 [UIView setAnimationDuration:2.f]; //延时启动 [UIView setAnimationDelay:2.f]; //速度曲线 [UIView setAnimationCurve:UIViewAnima…