【Atheros】如何禁用载波侦听CSMA和BACKOFF
无线网络上发包之前都要进行载波侦听,如果未收到ACK,就指数级退避之后重传。
有时候我们为了观察网卡在全力发送数据包时的性能,要禁用CSMA和ACK,这一篇文章先来讨论怎么禁用CSMA,这里提供两种思路,一是通过设置几个寄存器来完成禁CSMA和退避,,在drivers/net/wireless/ath/ath9k/hw.c的ath9k_hw_reset函数最后设置几个寄存器:
REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_IGNORE_VIRT_CS);
REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF);
我以前搜到过一个说法,设置AR_DIAG_SW寄存器的AR_DIAG_IGNORE_VIRT_CS来禁用虚拟载波侦听,设置AR_DIAG_SW寄存器的AR_DIAG_FORCE_RX_CLEAR来禁止物理载波侦听,,不过我设置FORCE_RX_CLEAR这个的时候有一定几率崩溃,所以最终没有采用。关于虚拟和物理载波侦听,参考《下一代无线局域网-802.11n的吞吐率、强健性和可靠性》一书的解释是:
CSMA/CA的基础在于载波侦听。DCF同时通过物理和虚拟的载波侦听功能来判断媒体状态。物理载波侦听功能位于PHY中,其通过能量检测与带帧长后延的前导码检测来判断媒体是否繁忙。虚拟载波侦听功能位于MAC中,其使用在MAC头的“时长”字段中所承载的预订信息,该信息声明了对媒体的独占接入。虚拟载波侦听功能被称为网络分配向量(NAV)。只有在物理和虚拟载波侦听机制都给出同样结果的情况下,媒体才被判断为空闲。
这个VIRT_CS位应该就是虚拟载波侦听,而物理载波侦听应该怎么来禁止,对于网上说的AR_DIAG_FORCE_RX_CLEAR这个标志,不了解具体作用。AR_DIAG_FORCE_CH_IDLE_HIGH而这个位则表明信道空闲,我觉得应该是和这个物理载波侦听相对应的。
但是,本文下面分割线以后,提出了一个问题,那就是只用上面的前两行来禁CSMA没有问题,但是用第三行禁退避,就会出问题,用下文的设置skb->priority的方法能够保证可以正常发送,系统不再panic,但是速率会很低,所以我用另外的方法来禁用退避,驱动有很多的发送队列,针对每一个发送队列,要设置自己的最大退避窗口,最小退避窗口,把这两个值都设置成0就是禁用退避了,而且针对每个队列,也有单独禁用退避(backoff)的方式,在drivers/net/wireless/ath/ath9k/mac.c的ath9k_hw_resettxqueue函数里,随便找个快结束的地方,加上:
REG_WRITE(ah, AR_DLCL_IFS(q),
SM(, AR_D_LCL_IFS_CWMIN) |
SM(, AR_D_LCL_IFS_CWMAX) |
SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS));
REG_SET_BIT(ah, AR_DMISC(q), AR_D_MISC_POST_FR_BKOFF_DIS);
==================================分割线===========================================
如果采用最前面的设置三个寄存器的方法来禁用CSMA,使用pktgen的时候还是会panic的。
决解思路:skb中有这么一个域,叫做nfctinfo,源代码里对它的解释是“Relationship of this skb to the connection”,在源代码里它的类型是__u8,但是我在网上查找的资料,都是说这是一个枚举型变量ip_conntrack_info的值。
nfctinfo是一个NetFilter相关的概念,我在驱动的库里面找到了ip_conntrack_info枚举类型的定义,如下:
/* Connection state tracking for netfilter. This is separated from,
but required by, the NAT layer; it can also be used by an iptables
extension. */
enum ip_conntrack_info
{
IP_CT_ESTABLISHED, /*作为已建立的连接的一部分*/
IP_CT_RELATED, /*正在建立或已建立的连接,或ICMP错误*/
IP_CT_NEW, /*新连接或重传*/
IP_CT_IS_REPLY, /*大于等着这个数的都是应答*/
IP_CT_NUMBER = IP_CT_IS_REPLY * - /*不同的IP_CT 类型*/
};
pktgen没有对这个值做修改,是0,但是使用iperf进行发包时,经过一层层协议栈,这个值已经被赋为2,也就是新建连接来发送。
当禁用掉CSMA之后,更确切地说是忽略退避(设置标志位AR_D_GBL_IFS_MISC_IGNORE_BACKOFF)之后,如果这个nfctinfo的取值是IP_CT_ESTABLISHED则发不出包去。设置为2(IP_CT_NEW)之后就可以了。但是这两者之间的具体关系不了解。在前一篇文章的最后,我讲了在驱动里面为pktgen数据包强制设置发送队列的方法,只需要在那里面再加一行(并且设置队列也不是写死一个2了,而是用驱动自己去选择队列):
if (skb->len > ){
__le32 *magic = &skb->data[];
if(*magic == 0xbe9be955){ /* magic number of pktgen */
skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb)); /* BE */
skb->priority = ; /* skb->nfctinfo = 2; */
}
}
但是这么做了之后pktgen的速率还是提不上去,最好还是用本文正文的方法去禁用BACKOFF。
【Atheros】如何禁用载波侦听CSMA和BACKOFF的更多相关文章
- 【Atheros】禁用CSMA之后pktgen发包一分钟后无法发送的问题
无线网络中各个节点不断地广播信标帧,收到某节点的信标帧之后才知道这个节点存在,知道它的网络配置是怎么样的,才能知道应该怎么和它通信. 那么问题来了,禁用了CSMA之后,发送节点全力发送,那么它会永远占 ...
- 【Atheros】如何在驱动中禁用ACK
上一篇文章讲了如何禁用载波侦听(CSMA)和退避(BACKOFF)的方法,这一篇介绍如何禁用ACK. 禁用ACK主要分为三部分: 1. 在发送端设置不等待ACK回来就继续发送: 2. 在接收端设置收到 ...
- 【Atheros】无线网卡驱动性能测试工具pktgen的使用
前言:从12年开始做无线驱动相关的工作,到13年大概做了一年半,现在歇了快一年了,以免白学那么久,最近重新整理了一下当时的资料,写一点文章,这方面的帖子比较少,当时碰到过很多问题难以解决,我是用的li ...
- cURL.1 手册页
摘自http://blog.csdn.net/huangxy10/article/details/45717793 cURL.1 手册页 名称 cURL - transfer a URL 摘要 cUR ...
- 从状态转移看:载波侦听多路访问/冲突避免(CSMA/CA)
CSMA/CA是写入IEEE802.11的无线网络MAC层标准协议,相信看到这篇文章的读者都知道它是用来做什么的.但许多短文对这个协议的解释都有所缺乏,因此本文用状态转换图的形式详细说明协议的工作流程 ...
- H3C CSMA/CD载波侦听
- CSMA/CD协议(载波侦听多路访问/碰撞检测) 最小帧长理解
以下的帧长有的是指帧的时间长度,帧的时间长度= 帧长/传输时延
- s4-3 CSMA
载波侦听多路访问协议 CSMA:Carrier Sense Multiple Access 特点:"先听后发" 改进ALOHA协议的侦听/发送策略 分类 非持续式 持 ...
- [计算机网络-数据链路层] CSMA、CSMA/CA、CSMA/CD详解
1.CSMA(载波侦听多路访问协议) CSMA 当其他节点检测到信道被占用时不发送数据.但是当数据发送完后其他节点同时检测到信道为空闲,之后又在同一时刻发送数据,可能再次产生冲突. 2.CSMA/CD ...
随机推荐
- 通过命令编译的项目 导入 到eclipse
通过命令编译的项目 导入 到eclipse后,需要 1.设置 sdk和ndk 的路径 2.设置 AndroidManifest.xml 中的版本为当前版本:<uses-sdk android:m ...
- android基本控件学习-----SeekBar&RatingBar
SeekBar(拖动条)和RatingBar(星级评分条)讲解 一.SeekBar(拖动条) (1)拖动条简单理解就是可以拖动的线,这个对我们来讲很常见,比如视频播放或者音乐播放我们拖动播放的进度,下 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---6
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...
- Scrapy学习-22-扩展开发
开发scrapy扩展 定义 扩展框架提供一个机制,使得你能将自定义功能绑定到Scrapy. 扩展只是正常的类,它们在Scrapy启动时被实例化.初始化 注意 实际上自定义扩展和spider中间件. ...
- JavaScript-性能优化,函数节流(throttle)与函数去抖(debounce)
我在写一个类似百度搜索框的自动提示功能时候,使用了AJAX+keydown事件.调试时候我发现,当在搜索框中输入文字的时候,控制台在不停发送AJAX.这在本地服务器测试还好,如果我把它拿到运行环境,很 ...
- hdu 4520
小Q系列故事——最佳裁判 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- UVA 272 TEX Quotes【字符串】
https://vjudge.net/problem/UVA-272 [分析]:标记一下. [代码]: #include <bits/stdc++.h> using namespace s ...
- vue.js移动端app实战1
本系列将会用vue.js2制作一个移动端的webapp单页面,页面不多,大概在7,8个左右,不过麻雀虽小,五脏俱全,常用的效果如轮播图,下拉刷新,上拉加载,图片懒加载都会用到.css方面也会有一些描述 ...
- MySQL复制表结构和内容到另一张表(转)
MySQL不要看它小,一个开源的产物,要学习它的东西真的很多.而它的一切是SQL Server无法比拟的. 复制表结构及数据到新表 create table 新表 select * from 旧表 只 ...
- Centos下添加用户组
近日,重新整理了下开发环境,重装了,nginx,但是这个时候却是报错了,报错信息如下: [root@hserver1 php-7.0.5]# nginx -t nginx: [emerg] getpw ...