Skip to content

Commit

Permalink
mac80211: don't check rates on PLCP error frames
Browse files Browse the repository at this point in the history
Frames that failed PLCP error checks are most likely
microwave transmissions (well, maybe not ...) and
don't have a proper rate detected, so ignore it.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Aug 16, 2010
1 parent 86df5f7 commit fc88518
Showing 1 changed file with 29 additions and 20 deletions.
49 changes: 29 additions & 20 deletions net/mac80211/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2615,28 +2615,37 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
if (WARN_ON(!local->started))
goto drop;

if (status->flag & RX_FLAG_HT) {
if (likely(!(status->flag & RX_FLAG_FAILED_PLCP_CRC))) {
/*
* rate_idx is MCS index, which can be [0-76] as documented on:
*
* http://wireless.kernel.org/en/developers/Documentation/ieee80211/802.11n
*
* Anything else would be some sort of driver or hardware error.
* The driver should catch hardware errors.
* Validate the rate, unless a PLCP error means that
* we probably can't have a valid rate here anyway.
*/
if (WARN((status->rate_idx < 0 ||
status->rate_idx > 76),
"Rate marked as an HT rate but passed "
"status->rate_idx is not "
"an MCS index [0-76]: %d (0x%02x)\n",
status->rate_idx,
status->rate_idx))
goto drop;
} else {
if (WARN_ON(status->rate_idx < 0 ||
status->rate_idx >= sband->n_bitrates))
goto drop;
rate = &sband->bitrates[status->rate_idx];

if (status->flag & RX_FLAG_HT) {
/*
* rate_idx is MCS index, which can be [0-76]
* as documented on:
*
* http://wireless.kernel.org/en/developers/Documentation/ieee80211/802.11n
*
* Anything else would be some sort of driver or
* hardware error. The driver should catch hardware
* errors.
*/
if (WARN((status->rate_idx < 0 ||
status->rate_idx > 76),
"Rate marked as an HT rate but passed "
"status->rate_idx is not "
"an MCS index [0-76]: %d (0x%02x)\n",
status->rate_idx,
status->rate_idx))
goto drop;
} else {
if (WARN_ON(status->rate_idx < 0 ||
status->rate_idx >= sband->n_bitrates))
goto drop;
rate = &sband->bitrates[status->rate_idx];
}
}

/*
Expand Down

0 comments on commit fc88518

Please sign in to comment.