Exemplo n.º 1
0
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;
}