diff options
author | Yogesh Ashok Powar <yogeshp@marvell.com> | 2011-06-06 13:23:02 +0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-06-07 22:44:03 +0400 |
commit | fb3c19bc9687d972b83faf366b38ac807eca8f25 (patch) | |
tree | 0426abe754c359684ca5d0e567395015934a717a /drivers/net/wireless/mwifiex/11n_aggr.c | |
parent | a8fe32937e4e55c9ed73c79800198d137a1b968a (diff) | |
download | linux-fb3c19bc9687d972b83faf366b38ac807eca8f25.tar.xz |
mwifiex: adding check for enough space before padding
All MSDUs, except the last one in an AMSDU, should end up at 4
bytes boundary. There is need to check if enough skb_tailroom
space exists before padding the skb.
Also re-arranging code for better readablity.
Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwifiex/11n_aggr.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/11n_aggr.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/net/wireless/mwifiex/11n_aggr.c b/drivers/net/wireless/mwifiex/11n_aggr.c index aee3491f61d5..25312e4437f5 100644 --- a/drivers/net/wireless/mwifiex/11n_aggr.c +++ b/drivers/net/wireless/mwifiex/11n_aggr.c @@ -185,16 +185,15 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, tx_info_aggr->bss_index = tx_info_src->bss_index; skb_aggr->priority = skb_src->priority; - while (skb_src && ((skb_headroom(skb_aggr) + skb_src->len - + LLC_SNAP_LEN) - <= adapter->tx_buf_size)) { + do { + /* Check if AMSDU can accommodate this MSDU */ + if (skb_tailroom(skb_aggr) < (skb_src->len + LLC_SNAP_LEN)) + break; skb_src = skb_dequeue(&pra_list->skb_head); - if (skb_src) { - pra_list->total_pkts_size -= skb_src->len; - pra_list->total_pkts--; - } + pra_list->total_pkts_size -= skb_src->len; + pra_list->total_pkts--; atomic_dec(&priv->wmm.tx_pkts_queued); @@ -212,8 +211,15 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, return -1; } + if (skb_tailroom(skb_aggr) < pad) { + pad = 0; + break; + } + skb_put(skb_aggr, pad); + skb_src = skb_peek(&pra_list->skb_head); - } + + } while (skb_src); spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, ra_list_flags); |