| From b561e8274f75831ee87e4ea378cbb1f9f050a51a Mon Sep 17 00:00:00 2001 |
| From: Shanyu Zhao <shanyu.zhao@intel.com> |
| Date: Tue, 1 Jun 2010 17:13:58 -0700 |
| Subject: iwlagn: verify flow id in compressed BA packet |
| |
| From: Shanyu Zhao <shanyu.zhao@intel.com> |
| |
| commit b561e8274f75831ee87e4ea378cbb1f9f050a51a upstream. |
| |
| The flow id (scd_flow) in a compressed BA packet should match the txq_id |
| of the queue from which the aggregated packets were sent. However, in |
| some hardware like the 1000 series, sometimes the flow id is 0 for the |
| txq_id (10 to 19). This can cause the annoying message: |
| [ 2213.306191] iwlagn 0000:01:00.0: Received BA when not expected |
| [ 2213.310178] iwlagn 0000:01:00.0: Read index for DMA queue txq id (0), |
| index 5, is out of range [0-256] 7 7. |
| |
| And even worse, if agg->wait_for_ba is true when the bad BA is arriving, |
| this can cause system hang due to NULL pointer dereference because the |
| code is operating in a wrong tx queue! |
| |
| Signed-off-by: Shanyu Zhao <shanyu.zhao@intel.com> |
| Signed-off-by: Pradeep Kulkarni <pradeepx.kulkarni@intel.com> |
| Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/wireless/iwlwifi/iwl-tx.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/net/wireless/iwlwifi/iwl-tx.c |
| +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c |
| @@ -1553,6 +1553,11 @@ void iwl_rx_reply_compressed_ba(struct i |
| sta_id = ba_resp->sta_id; |
| tid = ba_resp->tid; |
| agg = &priv->stations[sta_id].tid[tid].agg; |
| + if (unlikely(agg->txq_id != scd_flow)) { |
| + IWL_ERR(priv, "BA scd_flow %d does not match txq_id %d\n", |
| + scd_flow, agg->txq_id); |
| + return; |
| + } |
| |
| /* Find index just before block-ack window */ |
| index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd); |