mwifiex: fix an issue with Appletalk devices
authorAmitkumar Karwar <akarwar@marvell.com>
Tue, 3 Dec 2013 07:17:51 +0000 (23:17 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 9 Dec 2013 20:35:28 +0000 (15:35 -0500)
SNAP/LLC header in the AARP packet is being stripped off while
preparing an EthernetII header.
Annex M, Table M.3 in 802.11 spec says that some header
(ex. AppleTalk AARP(2)) should pass through untouched.
This patch modifies the check to exclude/include EthernetII
header translation for special cases.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/sta_rx.c
drivers/net/wireless/mwifiex/uap_txrx.c

index 241c0e5fc8ffb39fa36d3d85104d34eb80f44ce0..452389959520a607ce62de7b03432c7c3c6f3136 100644 (file)
@@ -94,8 +94,12 @@ int mwifiex_process_rx_packet(struct mwifiex_private *priv,
        rx_pkt_hdr = (void *)local_rx_pd +
                     le16_to_cpu(local_rx_pd->rx_pkt_offset);
 
-       if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header,
-                   sizeof(rfc1042_header))) {
+       if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
+                    sizeof(bridge_tunnel_header))) ||
+           (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header,
+                    sizeof(rfc1042_header)) &&
+            ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_AARP &&
+            ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_IPX)) {
                /*
                 *  Replace the 803 header and rfc1042 header (llc/snap) with an
                 *    EthernetII header, keep the src/dst and snap_type
index 0d4b7d62ebcc886ea5bcb81b87e69c5f63f607d2..a0bd954b3ab29185d24e7ef332255389a3f97ea1 100644 (file)
@@ -111,8 +111,12 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv,
                return;
        }
 
-       if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header,
-                   sizeof(rfc1042_header))) {
+       if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
+                    sizeof(bridge_tunnel_header))) ||
+           (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header,
+                    sizeof(rfc1042_header)) &&
+            ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_AARP &&
+            ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_IPX)) {
                /* Replace the 803 header and rfc1042 header (llc/snap) with
                 * an Ethernet II header, keep the src/dst and snap_type
                 * (ethertype).