void ath_debug_rate_stats(struct ath_softc *sc, struct ath_rx_status *rs, struct sk_buff *skb) { struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; struct ath_hw *ah = sc->sc_ah; struct ieee80211_rx_status *rxs; struct ath_rx_rate_stats *rstats; struct ieee80211_sta *sta; struct ath_node *an; if (!ieee80211_is_data(hdr->frame_control)) return; rcu_read_lock(); sta = ieee80211_find_sta_by_ifaddr(sc->hw, hdr->addr2, NULL); if (!sta) goto exit; an = (struct ath_node *) sta->drv_priv; rstats = &an->rx_rate_stats; rxs = IEEE80211_SKB_RXCB(skb); if (IS_HT_RATE(rs->rs_rate)) { if (rxs->rate_idx >= ARRAY_SIZE(rstats->ht_stats)) goto exit; if (rxs->bw == RATE_INFO_BW_40) rstats->ht_stats[rxs->rate_idx].ht40_cnt++; else rstats->ht_stats[rxs->rate_idx].ht20_cnt++; if (rxs->enc_flags & RX_ENC_FLAG_SHORT_GI) rstats->ht_stats[rxs->rate_idx].sgi_cnt++; else rstats->ht_stats[rxs->rate_idx].lgi_cnt++; goto exit; } if (IS_CCK_RATE(rs->rs_rate)) { if (rxs->enc_flags & RX_ENC_FLAG_SHORTPRE) rstats->cck_stats[rxs->rate_idx].cck_sp_cnt++; else rstats->cck_stats[rxs->rate_idx].cck_lp_cnt++; goto exit; } if (IS_OFDM_RATE(rs->rs_rate)) { if (ah->curchan->chan->band == NL80211_BAND_2GHZ) rstats->ofdm_stats[rxs->rate_idx - 4].ofdm_cnt++; else rstats->ofdm_stats[rxs->rate_idx].ofdm_cnt++; } exit: rcu_read_unlock(); }
u1Byte ComputeAckRate( IN OCTET_STRING BSSBasicRateSet, IN u1Byte DataRate) { u2Byte i; u1Byte AckRate = 0; u1Byte BasicRate; DataRate &= 0x7F; // Find the highest rate in the BSSBasicRateSet // that is less than or equal to DataRate. for( i = 0; i < BSSBasicRateSet.Length; i++) { BasicRate = BSSBasicRateSet.Octet[i] & 0x7F; if( BasicRate <= DataRate && BasicRate > AckRate) AckRate = BasicRate; } // Make sure the AckRate is in the same modulation of DataRate, // otherwise we it shall use highest mandatory rate of PHY // that is less than or equal to DataRate. switch(DataRate) { // CCK. case MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M: if(AckRate == 0 || !IS_CCK_RATE(AckRate) ) AckRate = MGN_1M; break; // OFDM. case 12: case 18: case 24: case 36: case 48: case 72: case 96: case 108: if( AckRate == 0 || IS_CCK_RATE(AckRate) ) { if(DataRate >= 48) { // 24M AckRate = 48; } else if(DataRate >= 24) { // 12M AckRate = 24; } else { // 6M AckRate = 12; } } break; default: RT_TRACE(COMP_DBG, DBG_SERIOUS, ("ComputeAckRate(): unsupported rate %#02X !!!\n", DataRate)); if(AckRate == 0) AckRate = MGN_1M; break; } RT_ASSERT(AckRate != 0, ("ComputeAckRate(): AckRate should not be 0 !!!\n")); return AckRate; }