aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/sta_rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_rx.c')
-rw-r--r--drivers/net/wireless/mwifiex/sta_rx.c44
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)