上一篇文章讲了如何禁用载波侦听(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. android中提示&对话框----AlertDialog

    AlertDialog(对话框) 一.对话框的基本使用流程 step1:创建AlertDialog.Buider; step2:调用setIcon()设置图标,setTitle()或者setCusto ...

  2. 关于main函数的参数

    #include <stdio.h> int main(int argc, char const *argv[]) { int i; for ( i = 0; i < argc; i ...

  3. C# asp.net 导出数据库二进制字段到excel

    前台的话不多说,本次只详细说下后台导出数据库中的二进制字段,上传下次有时间再说,有比较急的可以留言我 之前在网上搜了关于下载导出二进制字段的资料,发现都不是我想要的,都只是把上传的文件放到服务器然后下 ...

  4. TP5 多条件whereOr查询

    问题背景:最近在用ThinkPHP 5开发项目的过程中,发现根据筛选条件做or查询的时候,连贯操作不可以使用where进行条件查询了. 首先列出一个user数据表的信息: uid uname grad ...

  5. 关于超大binlog事件的问题

    我手里维护了一个项目,其功能是用Java模拟一个MariaDB的slave库连接到主库,对从主库传输过来的binlog事件进行监听与分析 碰到一个问题是: 如果主库做了一个很大的修改操作(比方说直接d ...

  6. Netty内存池

    参考资料:http://blog.csdn.net/youaremoon/article/details/47910971 主要思想:buddy allocation,jemalloc

  7. php中int类型在不同平台所占不同字节数理解

    1.在不同平台上占字节数与最大值 在32位平台上int占4个字节,在64位平台上int占8个字节,PHP_INT_SIZE 在32位平台上int的最大值2^31 - 1,在64位平台上int最大值2^ ...

  8. Difference between a Hard Link and Soft (Symbolic) Link

    Within the Unix/Linux file system, linking lets you create file shortcuts to link one or more files. ...

  9. getenv, _wgetenv

    Description The C library function char *getenv(const char *name) searches for the environment strin ...

  10. 基于WPF系统框架设计(1)-为什么要仿Office2010 Ribbon?

    为什么系统框架设计使用Ribbon导航模式? 这得从Office软件的演变说起.微软为什么最后选择使用Ribbon,也许就是很多系统设计要使用Ribbon做功能导航的原因. 你是否还记得曾经使用过的M ...