diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_rx.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/sta_rx.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/net/wireless/mwifiex/sta_rx.c b/drivers/net/wireless/mwifiex/sta_rx.c index 02ce3b77d3e7..07d32b73783e 100644 --- a/drivers/net/wireless/mwifiex/sta_rx.c +++ b/drivers/net/wireless/mwifiex/sta_rx.c | |||
@@ -54,8 +54,8 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, | |||
54 | 54 | ||
55 | local_rx_pd = (struct rxpd *) (skb->data); | 55 | local_rx_pd = (struct rxpd *) (skb->data); |
56 | 56 | ||
57 | rx_pkt_hdr = (struct rx_packet_hdr *) ((u8 *) local_rx_pd + | 57 | rx_pkt_hdr = (void *)local_rx_pd + |
58 | local_rx_pd->rx_pkt_offset); | 58 | le16_to_cpu(local_rx_pd->rx_pkt_offset); |
59 | 59 | ||
60 | if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, | 60 | if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, |
61 | rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) { | 61 | rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) { |
@@ -125,7 +125,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, | |||
125 | struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb); | 125 | struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb); |
126 | struct rx_packet_hdr *rx_pkt_hdr; | 126 | struct rx_packet_hdr *rx_pkt_hdr; |
127 | u8 ta[ETH_ALEN]; | 127 | u8 ta[ETH_ALEN]; |
128 | u16 rx_pkt_type; | 128 | u16 rx_pkt_type, rx_pkt_offset, rx_pkt_length, seq_num; |
129 | struct mwifiex_private *priv = | 129 | struct mwifiex_private *priv = |
130 | mwifiex_get_priv_by_id(adapter, rx_info->bss_num, | 130 | mwifiex_get_priv_by_id(adapter, rx_info->bss_num, |
131 | rx_info->bss_type); | 131 | rx_info->bss_type); |
@@ -134,16 +134,17 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, | |||
134 | return -1; | 134 | return -1; |
135 | 135 | ||
136 | local_rx_pd = (struct rxpd *) (skb->data); | 136 | local_rx_pd = (struct rxpd *) (skb->data); |
137 | rx_pkt_type = local_rx_pd->rx_pkt_type; | 137 | rx_pkt_type = le16_to_cpu(local_rx_pd->rx_pkt_type); |
138 | rx_pkt_offset = le16_to_cpu(local_rx_pd->rx_pkt_offset); | ||
139 | rx_pkt_length = le16_to_cpu(local_rx_pd->rx_pkt_length); | ||
140 | seq_num = le16_to_cpu(local_rx_pd->seq_num); | ||
138 | 141 | ||
139 | rx_pkt_hdr = (struct rx_packet_hdr *) ((u8 *) local_rx_pd + | 142 | rx_pkt_hdr = (void *)local_rx_pd + rx_pkt_offset; |
140 | local_rx_pd->rx_pkt_offset); | ||
141 | 143 | ||
142 | if ((local_rx_pd->rx_pkt_offset + local_rx_pd->rx_pkt_length) > | 144 | if ((rx_pkt_offset + rx_pkt_length) > (u16) skb->len) { |
143 | (u16) skb->len) { | 145 | dev_err(adapter->dev, |
144 | dev_err(adapter->dev, "wrong rx packet: len=%d," | 146 | "wrong rx packet: len=%d, rx_pkt_offset=%d, rx_pkt_length=%d\n", |
145 | " rx_pkt_offset=%d, rx_pkt_length=%d\n", skb->len, | 147 | skb->len, rx_pkt_offset, rx_pkt_length); |
146 | local_rx_pd->rx_pkt_offset, local_rx_pd->rx_pkt_length); | ||
147 | priv->stats.rx_dropped++; | 148 | priv->stats.rx_dropped++; |
148 | 149 | ||
149 | if (adapter->if_ops.data_complete) | 150 | if (adapter->if_ops.data_complete) |
@@ -154,14 +155,14 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, | |||
154 | return ret; | 155 | return ret; |
155 | } | 156 | } |
156 | 157 | ||
157 | if (local_rx_pd->rx_pkt_type == PKT_TYPE_AMSDU) { | 158 | if (rx_pkt_type == PKT_TYPE_AMSDU) { |
158 | struct sk_buff_head list; | 159 | struct sk_buff_head list; |
159 | struct sk_buff *rx_skb; | 160 | struct sk_buff *rx_skb; |
160 | 161 | ||
161 | __skb_queue_head_init(&list); | 162 | __skb_queue_head_init(&list); |
162 | 163 | ||
163 | skb_pull(skb, local_rx_pd->rx_pkt_offset); | 164 | skb_pull(skb, rx_pkt_offset); |
164 | skb_trim(skb, local_rx_pd->rx_pkt_length); | 165 | skb_trim(skb, rx_pkt_length); |
165 | 166 | ||
166 | ieee80211_amsdu_to_8023s(skb, &list, priv->curr_addr, | 167 | ieee80211_amsdu_to_8023s(skb, &list, priv->curr_addr, |
167 | priv->wdev->iftype, 0, false); | 168 | priv->wdev->iftype, 0, false); |
@@ -173,6 +174,12 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, | |||
173 | dev_err(adapter->dev, "Rx of A-MSDU failed"); | 174 | dev_err(adapter->dev, "Rx of A-MSDU failed"); |
174 | } | 175 | } |
175 | return 0; | 176 | return 0; |
177 | } else if (rx_pkt_type == PKT_TYPE_MGMT) { | ||
178 | ret = mwifiex_process_mgmt_packet(adapter, skb); | ||
179 | if (ret) | ||
180 | dev_err(adapter->dev, "Rx of mgmt packet failed"); | ||
181 | dev_kfree_skb_any(skb); | ||
182 | return ret; | ||
176 | } | 183 | } |
177 | 184 | ||
178 | /* | 185 | /* |
@@ -189,17 +196,14 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, | |||
189 | memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN); | 196 | memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN); |
190 | } else { | 197 | } else { |
191 | if (rx_pkt_type != PKT_TYPE_BAR) | 198 | if (rx_pkt_type != PKT_TYPE_BAR) |
192 | priv->rx_seq[local_rx_pd->priority] = | 199 | priv->rx_seq[local_rx_pd->priority] = seq_num; |
193 | local_rx_pd->seq_num; | ||
194 | memcpy(ta, priv->curr_bss_params.bss_descriptor.mac_address, | 200 | memcpy(ta, priv->curr_bss_params.bss_descriptor.mac_address, |
195 | ETH_ALEN); | 201 | ETH_ALEN); |
196 | } | 202 | } |
197 | 203 | ||
198 | /* Reorder and send to OS */ | 204 | /* Reorder and send to OS */ |
199 | ret = mwifiex_11n_rx_reorder_pkt(priv, local_rx_pd->seq_num, | 205 | ret = mwifiex_11n_rx_reorder_pkt(priv, seq_num, local_rx_pd->priority, |
200 | local_rx_pd->priority, ta, | 206 | ta, (u8) rx_pkt_type, skb); |
201 | (u8) local_rx_pd->rx_pkt_type, | ||
202 | skb); | ||
203 | 207 | ||
204 | if (ret || (rx_pkt_type == PKT_TYPE_BAR)) { | 208 | if (ret || (rx_pkt_type == PKT_TYPE_BAR)) { |
205 | if (adapter->if_ops.data_complete) | 209 | if (adapter->if_ops.data_complete) |