【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(0, AR_D_LCL_IFS_CWMIN) |
        SM(0, 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 * 2 - 1    /*不同的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 > 58){
    __le32 *magic = &skb->data[42];
    if(*magic == 0xbe9be955){                /* magic number of pktgen */
        skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));        /* BE */
        skb->priority = 0;                    /* skb->nfctinfo = 2; */
    }
}

但是这么做了之后pktgen的速率还是提不上去,最好还是用本文正文的方法去禁用BACKOFF。

时间: 2024-10-10 07:49:31

【Atheros】如何禁用载波侦听CSMA和BACKOFF的相关文章

【Atheros】禁用CSMA之后pktgen发包一分钟后无法发送的问题

无线网络中各个节点不断地广播信标帧,收到某节点的信标帧之后才知道这个节点存在,知道它的网络配置是怎么样的,才能知道应该怎么和它通信. 那么问题来了,禁用了CSMA之后,发送节点全力发送,那么它会永远占用信道,邻居节点的信标帧再也收不到了,那么,等本地对邻居节点保存的信息超时之后,就认为对方节点已经不存在,就无法再正常发送了. 那么知道了原因,解决方案也就很简单了,把这个超时时间设长,长到完全可以满足实验需求就可以了. 打开net/mac80211/ibss.c,就在前几行宏定义里面找到: #de

【Atheros】如何在驱动中禁用ACK

上一篇文章讲了如何禁用载波侦听(CSMA)和退避(BACKOFF)的方法,这一篇介绍如何禁用ACK. 禁用ACK主要分为三部分: 1. 在发送端设置不等待ACK回来就继续发送: 2. 在接收端设置收到数据帧之后不返回ACK: 3. (可选)有些地方针对不等待ACK的情况会有WARN等处理措施,把它们去掉. 下面分别来看,首先在发送端设置不等待ACK就继续发送,打开net/mac80211/tx.c,在ieee80211_tx_prepare函数中有这样的判断: if (is_multicast_

cURL.1 手册页

摘自http://blog.csdn.net/huangxy10/article/details/45717793 名称 cURL - transfer a URL 摘要 cURL[选项] [URL... ] 描述 cURL 是一个向服务器或从服务器传输数据的工具,它支持HTTP .HTTPS. FTP .FTPS .SCP.SFTP.TFTP.DICT.TELNET.LDAP 或FILE 等协议. 该命令设计为无需用户干预即可执行. cURL 提供了一大堆诸如代理支持.用户认证.FTP 上传.

802.11协议精读2:DCF与CSMA/CA

序言 在802.11的MAC层中.分成了两种基本工作模式: DCF(Distributed Coordination Function) PCF(Point Coordination Function) 当中,因为DCF具有良好的分布式特性.从而应用更加广泛,而PCF模式则较为少用.在802.11e协议中,DCF被扩展为EDCA模式,PCF模式被扩展为HCCA模式. 本文所讨论的主要内容即有关DCF模式以及其核心CSMA/CA机制. CSMA/CA机制 因为无线信道唯独一个冲突域的特性,所以须要

CSMA/CD

CSMA/CD(Carrier Sense Multiple Access with Collision Detection)即带冲突检测的载波监听多路访问技术.在传统的共享以太网中,所有的节点共享传输介质.如何保证传输介质有序.高效地为许多节点提供传输服务,就是以太网的介质访问控制协议要解决的问题. 1基础篇 CSMA/CD是一种争用型的介质访问控制协议.它起源于美国夏威夷大学开发的ALOHA网所采用的争用型协议,并进行了改进,使之具有比ALOHA协议更高的介质利用率.主要应用于现场总线Eth

CSMA/CA机制

CSMA/CA机制 backoff 简介 CSMA/CA机制带冲突检测的载波监听多路访问,冲突避免机制. 网络拓扑 若node1和node2同时给GW发送数据,那么在GW处会产生冲突,从而两者都无法正确接收,最终传输失败. DIFS与SIFS: 帧间间隙. 分布式帧间间隙, 短帧间间隙. 发一帧之前都需要等待一个相应的帧间间隙.比如发送数据至少等待DIFS,发送ACK需要等待SIFS Slot time:时隙,一个时间片段.节点竞争接入信道前需要经过相应的随机回退backoff过程,backof

CentOS禁用本地root和远程ssh登录

某天为解决su切换慢的问题,黄哥修改了一个加载脚本,导致普通用户无法切换root用户,su输入密码后登录还是普通用户.当初设置禁止root登录时,未给某个特定用户增加sudo权限,导致现在所有程序无法使用(telnet服务同样被禁止了).最后通过将该系统盘挂载到另外一台服务器上,将脚本改回为原来状态解决问题. 正常后登录服务器检查CentOS使用版本为6.4,因数据安全要禁用root本地和远程ssh登录,只给普通用户权限. 禁止root本地登录 修改配置/etc/pam.d/login,增加如下

如何在Linux下禁用IPv6

如何在Linux下禁用IPv6 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6                            禁用IPv6(包括回环接口) echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6                     禁用IPv6(默认) vim /etc/sysctl.conf                                    

linux下可以禁用的一些服务

linux下多软件/多脚本之间的配合: 包括做好 “实体”和“配置”两个方面的事情 “实体”是指实实在在的脚本文件,服务脚本: “配置”是指其他与之交互的.协同工作的软件.脚本,要进行适当的配置,告知“实体”存在的位置等信息,才能正常工作 ----------------------------------------------------- apmd,acpid 电源管理和配置服务,只有配置了ups和电池的笔记本/服务器才开这个服务 bluetooth,hidd,pcscd, pcmcid: