上一篇文章讲了如何禁用载波侦听(CSMA)和退避(BACKOFF)的方法,这一篇介绍如何禁用ACK。

禁用ACK主要分为三部分:

1. 在发送端设置不等待ACK回来就继续发送;

2. 在接收端设置收到数据帧之后不返回ACK;

3. (可选)有些地方针对不等待ACK的情况会有WARN等处理措施,把它们去掉。

下面分别来看,首先在发送端设置不等待ACK就继续发送,打开net/mac80211/tx.c,在ieee80211_tx_prepare函数中有这样的判断:

if (is_multicast_ether_addr(hdr->addr1)) {
tx->flags &= ~IEEE80211_TX_UNICAST;
info->flags |= IEEE80211_TX_CTL_NO_ACK;
} else
tx->flags |= IEEE80211_TX_UNICAST;

这儿是说,如果当前的目标地址是多播地址,则去掉单播的标志位,并设置不等到ACK,因为多播广播是不需要ACK的嘛,如果不是多播,则加上单播的标志位,所以要在单播的时候也不等待ACK,只需要在else里面也加上IEEE80211_TX_CTL_NO_ACK就可以了:

if (is_multicast_ether_addr(hdr->addr1)) {
tx->flags &= ~IEEE80211_TX_UNICAST;
info->flags |= IEEE80211_TX_CTL_NO_ACK;
} else {
tx->flags |= IEEE80211_TX_UNICAST;
info->flags |= IEEE80211_TX_CTL_NO_ACK;
}

还有一个地方也有类似的控制,在net/mac80211/wme.c的ieee80211_set_qos_hdr中,设置QoS头的时候有判断:

if (is_multicast_ether_addr(hdr->addr1) ||
sdata->noack_map & BIT(tid)) {
ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK;
info->flags |= IEEE80211_TX_CTL_NO_ACK;
}

同样是多播情况下设置禁用ACK,这里把if这个条件去掉,无论是不是多播都设置这两行就可以了。

2. 第二步,在接收方设置不返回ACK帧,打开drivers/net/wireless/ath/ath9k/hw.c,在ath9k_hw_reset函数中找一个位置设置:

REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_ACK_DIS);

3. 这一步可选,有很多地方对没有ACK的情况做了特殊处理,影响有大有小,先来看一个影响比较小的,net/mac80211/tx.c的ieee80211_tx_h_rate_ctrl函数中有:

if (WARN_ON_ONCE((info->control.rates[].count > ) &&
(info->flags & IEEE80211_TX_CTL_NO_ACK)))
info->control.rates[].count = ;

如果禁用了ACK并且发送速率的最大尝试次数大于1,则置为1,这里比较烦人的是这个WARN_ON_ONCE,本身它只打印一次堆栈信息,对性能影响不大,但是占用dmsg的输出,而且有时候看着有警告什么的特别烦,所以还是把这里删掉,最起码把WARN_ON_ONCE去掉。

再来看一个,在速率调整算法获取发送速率的时候,也就是get_rate函数开头的位置,都会调用net/mac80211/rate.c的rc_no_data_or_no_ack_use_min函数,当然了,一旦禁用了ACK,速率调整算法就不能用了,不过有时候我们固定MCS发送的时候可能被这里困扰,因为在这个函数里:

return (info->flags & (IEEE80211_TX_CTL_NO_ACK | IEEE80211_TX_CTL_USE_MINRATE)) ||
!ieee80211_is_data(fc);

如果禁用了ACK,就会直接用传统的低速率发送,根据当前修改驱动的目的,可能会被这个问题耽误,注意一下就行,需要的时候把标红的部分删掉。

【Atheros】如何在驱动中禁用ACK的更多相关文章

  1. Linux 驱动框架---驱动中的中断

    在单片机开发中中断就是执行过程中发生了一些事件需要及时处理,所以需要停止当前正在运行的处理的事情转而去执行中断服务函数,已完成必要的事件的处理.在Linux中断一样是如此使用但是基于常见的中断控制器的 ...

  2. linux驱动中printk的使用注意事项

    今天在按键驱动中增加printk(KERN_INFO "gpio_keys_gpio_isr()\n");在驱动加载阶段可以输出调试信息,但驱动加载起来后的信息,在串口端看不到输出 ...

  3. (转载)MongoDB C#驱动中Query几个方法

    MongoDB C#驱动中Query几个方法 Query.All("name", "a", "b");//通过多个元素来匹配数组 Query ...

  4. linux设备驱动第五篇:驱动中的并发与竟态

    综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争. 首先什么是并发与竟态呢?并发(concurrency)指的是多个执行单元同时.并行被 ...

  5. 【转】驱动中的类class和节点

    原文出处:http://blog.chinaunix.net/uid-23036581-id-2230558.html 一个类是一个设备的高级视图, 它抽象出低级的实现细节. 驱动可以见到一个SCSI ...

  6. 内核驱动中常见的miscdevice、platform_device、platform_driver

    最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统(这两个是两 ...

  7. Linux设备驱动中的异步通知与异步I/O

    异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...

  8. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  9. linux底半部机制在视频采集驱动中的应用

    最近在做一个arm+linux平台的视频驱动.本来这个驱动应该是做板子的第三方提供的,结果对方软件实力很差,自己做不了这个东西,外包给了一个暑期兼职的在读博士.学生嘛,只做过实验,没做过产品,给出的东 ...

随机推荐

  1. vim的使用技巧--模式入门

    vim作为编辑器之神,一直都是程序爱好者的最爱,与一般的编辑器的最大不同就是对模式的把握更加的细腻和得当.普通编辑主要分为使用菜单和使用键盘,菜单就是输入命令作用,键盘主要用来输入文本,中间穿插着使用 ...

  2. 如何配置tomcat环境变量

    首先下载tomcat,并且解压到目录: 注意:2,3步的变量值要到下图这一步 即,bin的上一级目录不包含bin 1.第一步鼠标右键计算机->属性->高级系统设置,进去之后,点击环境变量, ...

  3. java 读写操作

    java代码: 写入: public void getNotice(HttpServletRequest request, String notice){ String message = JSON. ...

  4. ACM信息汇总

    一.ACM算法总结及刷题参考 (摘自:http://www.cnblogs.com/flipped/p/5005693.html) 初期: 一.基本算法: (1)枚举. (poj1753,poj296 ...

  5. 模型搭建练习2_实现nn模块、optim、two_layer、dynamic_net

    用variable实现nn.module import torch from torch.autograd import Variable N, D_in, H, D_out = 64, 1000, ...

  6. Oracle 安装前准备

    [root@localhost Desktop]# groupadd -g 110 oinstall 用来安装oracle软件 [root@localhost Desktop]# groupadd - ...

  7. golang:mgo剖析之Session

    golang操作mongo使用的包是"gopkg.in/mgo.v2",coding过程中需要并发读写mongo数据库,简单观摩了下源码,记录下自己的一些理解,如有错误,敬请斧正. ...

  8. Mac OS X上使用Wireshark抓包

    Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...

  9. linux下crontab使用笔记

    1. 安装     service crond status     yum install vixie-cron     yum install crontabs 2. 实例         每分钟 ...

  10. Web自动化测试框架改进

    Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...