Commit ed1ea6f4 authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by John W. Linville

mwifiex: do le_to_cpu conversion for Rx packet header elements

We do similar conversion for Tx packet header but it was missing
for Rx packet header. Without this fix, Rx packet header won't
be correctly parsed on big endian platform.
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarAvinash Patil <patila@marvell.com>
Signed-off-by: default avatarKiran Divekar <dkiran@marvell.com>
Signed-off-by: default avatarBing Zhao <bzhao@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent bda1b1b7
...@@ -424,10 +424,10 @@ struct txpd { ...@@ -424,10 +424,10 @@ struct txpd {
struct rxpd { struct rxpd {
u8 bss_type; u8 bss_type;
u8 bss_num; u8 bss_num;
u16 rx_pkt_length; __le16 rx_pkt_length;
u16 rx_pkt_offset; __le16 rx_pkt_offset;
u16 rx_pkt_type; __le16 rx_pkt_type;
u16 seq_num; __le16 seq_num;
u8 priority; u8 priority;
u8 rx_rate; u8 rx_rate;
s8 snr; s8 snr;
......
...@@ -54,8 +54,8 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter, ...@@ -54,8 +54,8 @@ int mwifiex_process_rx_packet(struct mwifiex_adapter *adapter,
local_rx_pd = (struct rxpd *) (skb->data); local_rx_pd = (struct rxpd *) (skb->data);
rx_pkt_hdr = (struct rx_packet_hdr *) ((u8 *) local_rx_pd + rx_pkt_hdr = (void *)local_rx_pd +
local_rx_pd->rx_pkt_offset); le16_to_cpu(local_rx_pd->rx_pkt_offset);
if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, if (!memcmp(&rx_pkt_hdr->rfc1042_hdr,
rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) { rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) {
...@@ -125,7 +125,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, ...@@ -125,7 +125,7 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb); struct mwifiex_rxinfo *rx_info = MWIFIEX_SKB_RXCB(skb);
struct rx_packet_hdr *rx_pkt_hdr; struct rx_packet_hdr *rx_pkt_hdr;
u8 ta[ETH_ALEN]; u8 ta[ETH_ALEN];
u16 rx_pkt_type; u16 rx_pkt_type, rx_pkt_offset, rx_pkt_length, seq_num;
struct mwifiex_private *priv = struct mwifiex_private *priv =
mwifiex_get_priv_by_id(adapter, rx_info->bss_num, mwifiex_get_priv_by_id(adapter, rx_info->bss_num,
rx_info->bss_type); rx_info->bss_type);
...@@ -134,16 +134,17 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, ...@@ -134,16 +134,17 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
return -1; return -1;
local_rx_pd = (struct rxpd *) (skb->data); local_rx_pd = (struct rxpd *) (skb->data);
rx_pkt_type = local_rx_pd->rx_pkt_type; rx_pkt_type = le16_to_cpu(local_rx_pd->rx_pkt_type);
rx_pkt_offset = le16_to_cpu(local_rx_pd->rx_pkt_offset);
rx_pkt_length = le16_to_cpu(local_rx_pd->rx_pkt_length);
seq_num = le16_to_cpu(local_rx_pd->seq_num);
rx_pkt_hdr = (struct rx_packet_hdr *) ((u8 *) local_rx_pd + rx_pkt_hdr = (void *)local_rx_pd + rx_pkt_offset;
local_rx_pd->rx_pkt_offset);
if ((local_rx_pd->rx_pkt_offset + local_rx_pd->rx_pkt_length) > if ((rx_pkt_offset + rx_pkt_length) > (u16) skb->len) {
(u16) skb->len) { dev_err(adapter->dev,
dev_err(adapter->dev, "wrong rx packet: len=%d," "wrong rx packet: len=%d, rx_pkt_offset=%d, rx_pkt_length=%d\n",
" rx_pkt_offset=%d, rx_pkt_length=%d\n", skb->len, skb->len, rx_pkt_offset, rx_pkt_length);
local_rx_pd->rx_pkt_offset, local_rx_pd->rx_pkt_length);
priv->stats.rx_dropped++; priv->stats.rx_dropped++;
if (adapter->if_ops.data_complete) if (adapter->if_ops.data_complete)
...@@ -154,14 +155,14 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, ...@@ -154,14 +155,14 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
return ret; return ret;
} }
if (local_rx_pd->rx_pkt_type == PKT_TYPE_AMSDU) { if (rx_pkt_type == PKT_TYPE_AMSDU) {
struct sk_buff_head list; struct sk_buff_head list;
struct sk_buff *rx_skb; struct sk_buff *rx_skb;
__skb_queue_head_init(&list); __skb_queue_head_init(&list);
skb_pull(skb, local_rx_pd->rx_pkt_offset); skb_pull(skb, rx_pkt_offset);
skb_trim(skb, local_rx_pd->rx_pkt_length); skb_trim(skb, rx_pkt_length);
ieee80211_amsdu_to_8023s(skb, &list, priv->curr_addr, ieee80211_amsdu_to_8023s(skb, &list, priv->curr_addr,
priv->wdev->iftype, 0, false); priv->wdev->iftype, 0, false);
...@@ -189,17 +190,14 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter, ...@@ -189,17 +190,14 @@ int mwifiex_process_sta_rx_packet(struct mwifiex_adapter *adapter,
memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN); memcpy(ta, rx_pkt_hdr->eth803_hdr.h_source, ETH_ALEN);
} else { } else {
if (rx_pkt_type != PKT_TYPE_BAR) if (rx_pkt_type != PKT_TYPE_BAR)
priv->rx_seq[local_rx_pd->priority] = priv->rx_seq[local_rx_pd->priority] = seq_num;
local_rx_pd->seq_num;
memcpy(ta, priv->curr_bss_params.bss_descriptor.mac_address, memcpy(ta, priv->curr_bss_params.bss_descriptor.mac_address,
ETH_ALEN); ETH_ALEN);
} }
/* Reorder and send to OS */ /* Reorder and send to OS */
ret = mwifiex_11n_rx_reorder_pkt(priv, local_rx_pd->seq_num, ret = mwifiex_11n_rx_reorder_pkt(priv, seq_num, local_rx_pd->priority,
local_rx_pd->priority, ta, ta, (u8) rx_pkt_type, skb);
(u8) local_rx_pd->rx_pkt_type,
skb);
if (ret || (rx_pkt_type == PKT_TYPE_BAR)) { if (ret || (rx_pkt_type == PKT_TYPE_BAR)) {
if (adapter->if_ops.data_complete) if (adapter->if_ops.data_complete)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment