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

主要有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终止轮询函数。

netif_start_queue/netif_wake_queue/netif_stop_queue的更多相关文章

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

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

  2. Linux网络设备驱动架構學習(二)

    Linux网络设备驱动架構學習(二) 接下來會從以下幾個方面介紹網絡設備驅動的編寫流程: 1.網絡設備的註冊與註銷 2.網絡設備的初始化 3.網絡設備的打開與釋放 4.網絡數據發送流程 5.網絡數據接 ...

  3. Linux网络驱动--snull

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

  4. DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)篇一

    关于dm9000的驱动移植分为两篇,第一篇在mini2440上实现,基于linux2.6.29,也成功在在6410上移植了一遍,和2440非常类似,第二篇在fs4412(Cortex A9)上实现,基 ...

  5. 嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序

    基于DM9000C的原厂代码修改dm9000c的驱动程序. 首先确认内存的基地址 iobase. 确定中断号码. 打开模块的初始化函数定义. 配置内存控制器的相应时序(结合DM9000C.C的手册). ...

  6. dm9000c 移值新内核 linux-4.1.24

    错误 1 /home/dm9000/dm9dev9000c.c:309: error: conflicting types for 'phy_read'include/linux/phy.h:637: ...

  7. Linux网络设备驱动(一) _驱动模型

    Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆 ...

  8. [国嵌攻略][136][DM9000网卡驱动深度分析]

    网卡初始化 1.分配描述结构,alloc_etherdev 2.获取平台资源,platform_get_resource 2.1.在s3c_dm9k_resource中有相关的资源 2.2.add地址 ...

  9. Linux网络设备驱动 _驱动模型

    Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆 ...

随机推荐

  1. 第187天:js基础---常见的Bom对象

    BOM(Browser Object Mode)浏览器对象模型,是Javascript的重要组成部分.它提供了一系列对象用于与浏览器窗口进行交互,这些对象通常统称为BOM. 一张图了解一下先 1.wi ...

  2. 动态Lambda表达式打印HelloWorld

    最近在用C#与数据库打交道.开发过程中采用了ORM模型(以前是纯sql玩法,复杂的逻辑用存储过程做). 为了能通过配置文件动态地查询字段,也就是说需要能这样写: db.AsQuery<T> ...

  3. Codeforces Round #525 Div. 2 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  4. 计算机网络:A、B、C、D和E类IP地址

    IP地址分为A,B,C,D,E五类. 网络号:用于识别主机所在的网络:主机号:用于识别该网络中的主机. 其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用.这三种是主要的. IP ...

  5. InnoDB事务日志(redo log 和 undo log)详解

    数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,undolog实现事务原子性,redolog实现事务的持久性. 为了最大程度避免数 ...

  6. [HAOI2017]八纵八横 线性基

    题面 题面 题解 观察到题目中的 "内陆经济环" 不好处理,因此我们把它拆成 "内陆经济链". 对于1号节点,我们创建一个它的复制节点n + 1号节点,这个节点 ...

  7. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  8. vs下给生成的程序(exe)加入默认的申请管理员权限

    在vs下编程时,经常会用到一些特殊的权限,尤其是管理员权限,下面是在win7下笔者亲测通过的. 下面要分两种情况: 第一种情况就是在vs2003或者以下的编译器中运行 1.准备一个manifest文件 ...

  9. php curl使用ss代理

    1.安装 ss,过程略 2.ss 配置文件 { "server":"x.x.x.x", #你的 ss 服务器 ip "server_port" ...

  10. 安装好dashboard 登录出现错误

    验证发生错误.请稍后再试一次. While turning SELinux off certainly does the trick, it is somewhat like using a sled ...