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


    上一篇文章讲了如何禁用载波侦听(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[0].count > 1) &&
             (info->flags & IEEE80211_TX_CTL_NO_ACK)))
        info->control.rates[0].count = 1;

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

  • 相关阅读:
    网益云——冲刺博客0
    网益云——软件工程之现场编程实战
    2020福州大学软件工程实践个人总结
    2020福州大学软件工程实践结对编程作业二
    福州大学软件工程实践个人编程作业
    2020软工第一次作业
    C. Present(二分 + 扫描线)
    P1287 盒子与球
    错排
    Codeforces 1323 D. Present (思维)
  • 原文地址:https://www.cnblogs.com/smarterplanet/p/4082996.html
Copyright © 2020-2023  润新知