【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 ...
随机推荐
- git使用代理clone加速
不设置代理10kb/s不到....,设置后,500kb/s左右跑- 开shadowsocks,代理127.0.0.1:1080 编写一个脚本 /YOUR PATH/gitproxy.sh #!/bin ...
- MySQL命令行导入脚本文件
通过命令行执行sql脚本文件的方法: cmd命令行下: C:\users\test_dir>"C:\Program Files\MySQL\MySQL Server 5.7\bin\m ...
- android 集成友盟分享之后,想自定义分享面板的看过来
第一种情况 首先上传一张默认的友盟分享的效果图 看起来还不错,但是总是有这样那样的原因,需要我们对默认效果做出一些改变. 第二种情况 如果你想做出下面的效果: 或者这样的效果 : 总之上面的效果总是在 ...
- MySQL复制表结构和内容到另一张表(转)
MySQL不要看它小,一个开源的产物,要学习它的东西真的很多.而它的一切是SQL Server无法比拟的. 复制表结构及数据到新表 create table 新表 select * from 旧表 只 ...
- Copy Records From One Data Block To Another Data Block In Oracle Forms
In this tutorial you will learn to copy the records from one data block to another data block on sam ...
- Using Single Alert For Messages And Confirmation Messages In Oracle Forms With Set_Alert_Button_Property
Learn how to use single Oracle Form's Alert object for warning/information messages and confirmation ...
- python遍历当前目录并删除某文件
#coding: utf-8 """ this programe is to clear driverlog below this dir __author__:the_ ...
- Importance sampling
用蒙特卡洛求解积分时 (Monte Carlo 随机采样对目标积分函数做近似) importance sampling func p(x) p(x)值大的地方,Monte Carlo多采几次 值小的地 ...
- unity游戏开发
第1章 基础知识 11.1 Unity简介 11.2 跨平台与多工种协作 11.3 Unity版本 21.4 Unity内置资源或拓展资源 31.5 示例项目打包与发布 51.6 Unity服务 71 ...
- Activity入门(一)
生命周期 onCreate():activity进行创建,在该方法中应调用setContentView(),findViewById()以及获取要展示的数据的方法(如调用manager ...