]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
mt76: fix endianness errors in reverse_frag0_hdr_trans
authorLorenzo Bianconi <lorenzo@kernel.org>
Sun, 6 Feb 2022 18:53:23 +0000 (19:53 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 23 Feb 2022 10:32:18 +0000 (11:32 +0100)
Fix ht ctl field size in mt{7615,7915,7921}_reverse_frag0_hdr_trans.
Fix the following endianness warnings in mt{7615,7915,7921}_reverse_frag0_hdr_trans:

drivers/net/wireless/mediatek/mt76/mt7915/mac.c:417:29: warning: cast to restricted __le32
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:417:29: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:417:29: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:417:27: warning: incorrect type in assignment (different base types)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:417:27:    expected restricted __le16 [usertype] frame_control
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:417:27:    got unsigned long
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:418:24: warning: cast to restricted __le32
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:418:24: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:418:24: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:418:22: warning: incorrect type in assignment (different base types)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:418:22:    expected restricted __le16 [usertype] seq_ctrl
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:418:22:    got unsigned long
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:419:20: warning: cast to restricted __le32
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:419:20: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:419:20: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:419:18: warning: incorrect type in assignment (different base types)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:419:18:    expected restricted __le32 [usertype] qos_ctrl
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:419:18:    got unsigned long
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:420:19: warning: cast to restricted __le32
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:420:19: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:420:19: warning: restricted __le32 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:420:17: warning: incorrect type in assignment (different base types)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:420:17:    expected restricted __le32 [usertype] ht_ctrl
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:420:17:    got unsigned long
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:448:25: warning: restricted __be16 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:448:38: warning: restricted __be16 degrades to integer
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:1450:23: warning: incorrect type in assignment (different base types)
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:1450:23:    expected unsigned int [usertype] *cur_info
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:1450:23:    got restricted __le32 *
drivers/net/wireless/mediatek/mt76/mt7915/mac.c:1451:34: warning: cast to restricted __le32

Fixes: dc5399a50b45f ("mt76: reverse the first fragmented frame to 802.11")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7921/mac.c

index f035cd880696a30abf9da0778adb4dc54cb4105a..80592d446bc31fb3e2ebfa1746b4e06bae8eb4de 100644 (file)
@@ -259,7 +259,7 @@ static int mt7615_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        struct ieee80211_sta *sta;
        struct ieee80211_vif *vif;
        struct ieee80211_hdr hdr;
-       __le32 qos_ctrl, ht_ctrl;
+       u16 frame_control;
 
        if (FIELD_GET(MT_RXD1_NORMAL_ADDR_TYPE, le32_to_cpu(rxd[1])) !=
            MT_RXD1_NORMAL_U2M)
@@ -275,16 +275,15 @@ static int mt7615_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
 
        /* store the info from RXD and ethhdr to avoid being overridden */
-       hdr.frame_control = FIELD_GET(MT_RXD4_FRAME_CONTROL, rxd[4]);
-       hdr.seq_ctrl = FIELD_GET(MT_RXD6_SEQ_CTRL, rxd[6]);
-       qos_ctrl = FIELD_GET(MT_RXD6_QOS_CTL, rxd[6]);
-       ht_ctrl = FIELD_GET(MT_RXD7_HT_CONTROL, rxd[7]);
-
+       frame_control = le32_get_bits(rxd[4], MT_RXD4_FRAME_CONTROL);
+       hdr.frame_control = cpu_to_le16(frame_control);
+       hdr.seq_ctrl = cpu_to_le16(le32_get_bits(rxd[6], MT_RXD6_SEQ_CTRL));
        hdr.duration_id = 0;
+
        ether_addr_copy(hdr.addr1, vif->addr);
        ether_addr_copy(hdr.addr2, sta->addr);
-       switch (le16_to_cpu(hdr.frame_control) &
-               (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
+       switch (frame_control & (IEEE80211_FCTL_TODS |
+                                IEEE80211_FCTL_FROMDS)) {
        case 0:
                ether_addr_copy(hdr.addr3, vif->bss_conf.bssid);
                break;
@@ -306,15 +305,23 @@ static int mt7615_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        if (eth_hdr->h_proto == cpu_to_be16(ETH_P_AARP) ||
            eth_hdr->h_proto == cpu_to_be16(ETH_P_IPX))
                ether_addr_copy(skb_push(skb, ETH_ALEN), bridge_tunnel_header);
-       else if (eth_hdr->h_proto >= cpu_to_be16(ETH_P_802_3_MIN))
+       else if (be16_to_cpu(eth_hdr->h_proto) >= ETH_P_802_3_MIN)
                ether_addr_copy(skb_push(skb, ETH_ALEN), rfc1042_header);
        else
                skb_pull(skb, 2);
 
        if (ieee80211_has_order(hdr.frame_control))
-               memcpy(skb_push(skb, 2), &ht_ctrl, 2);
-       if (ieee80211_is_data_qos(hdr.frame_control))
-               memcpy(skb_push(skb, 2), &qos_ctrl, 2);
+               memcpy(skb_push(skb, IEEE80211_HT_CTL_LEN), &rxd[7],
+                      IEEE80211_HT_CTL_LEN);
+
+       if (ieee80211_is_data_qos(hdr.frame_control)) {
+               __le16 qos_ctrl;
+
+               qos_ctrl = cpu_to_le16(le32_get_bits(rxd[6], MT_RXD6_QOS_CTL));
+               memcpy(skb_push(skb, IEEE80211_QOS_CTL_LEN), &qos_ctrl,
+                      IEEE80211_QOS_CTL_LEN);
+       }
+
        if (ieee80211_has_a4(hdr.frame_control))
                memcpy(skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
        else
index 1848fa1633d7da6ea81df31c1c3c2d7ec35c01a3..94b27ad6a456faa02435a1f1b176e3356b2f3aa0 100644 (file)
@@ -398,7 +398,7 @@ static int mt7915_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        struct ieee80211_sta *sta;
        struct ieee80211_vif *vif;
        struct ieee80211_hdr hdr;
-       __le32 qos_ctrl, ht_ctrl;
+       u16 frame_control;
 
        if (FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, le32_to_cpu(rxd[3])) !=
            MT_RXD3_NORMAL_U2M)
@@ -414,16 +414,15 @@ static int mt7915_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
 
        /* store the info from RXD and ethhdr to avoid being overridden */
-       hdr.frame_control = FIELD_GET(MT_RXD6_FRAME_CONTROL, rxd[6]);
-       hdr.seq_ctrl = FIELD_GET(MT_RXD8_SEQ_CTRL, rxd[8]);
-       qos_ctrl = FIELD_GET(MT_RXD8_QOS_CTL, rxd[8]);
-       ht_ctrl = FIELD_GET(MT_RXD9_HT_CONTROL, rxd[9]);
-
+       frame_control = le32_get_bits(rxd[6], MT_RXD6_FRAME_CONTROL);
+       hdr.frame_control = cpu_to_le16(frame_control);
+       hdr.seq_ctrl = cpu_to_le16(le32_get_bits(rxd[8], MT_RXD8_SEQ_CTRL));
        hdr.duration_id = 0;
+
        ether_addr_copy(hdr.addr1, vif->addr);
        ether_addr_copy(hdr.addr2, sta->addr);
-       switch (le16_to_cpu(hdr.frame_control) &
-               (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
+       switch (frame_control & (IEEE80211_FCTL_TODS |
+                                IEEE80211_FCTL_FROMDS)) {
        case 0:
                ether_addr_copy(hdr.addr3, vif->bss_conf.bssid);
                break;
@@ -445,15 +444,22 @@ static int mt7915_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        if (eth_hdr->h_proto == cpu_to_be16(ETH_P_AARP) ||
            eth_hdr->h_proto == cpu_to_be16(ETH_P_IPX))
                ether_addr_copy(skb_push(skb, ETH_ALEN), bridge_tunnel_header);
-       else if (eth_hdr->h_proto >= cpu_to_be16(ETH_P_802_3_MIN))
+       else if (be16_to_cpu(eth_hdr->h_proto) >= ETH_P_802_3_MIN)
                ether_addr_copy(skb_push(skb, ETH_ALEN), rfc1042_header);
        else
                skb_pull(skb, 2);
 
        if (ieee80211_has_order(hdr.frame_control))
-               memcpy(skb_push(skb, 2), &ht_ctrl, 2);
-       if (ieee80211_is_data_qos(hdr.frame_control))
-               memcpy(skb_push(skb, 2), &qos_ctrl, 2);
+               memcpy(skb_push(skb, IEEE80211_HT_CTL_LEN), &rxd[9],
+                      IEEE80211_HT_CTL_LEN);
+       if (ieee80211_is_data_qos(hdr.frame_control)) {
+               __le16 qos_ctrl;
+
+               qos_ctrl = cpu_to_le16(le32_get_bits(rxd[8], MT_RXD8_QOS_CTL));
+               memcpy(skb_push(skb, IEEE80211_QOS_CTL_LEN), &qos_ctrl,
+                      IEEE80211_QOS_CTL_LEN);
+       }
+
        if (ieee80211_has_a4(hdr.frame_control))
                memcpy(skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
        else
index d17558349a17a57994af927eed2286fc9aabbf82..9487ad4812c58c6a1c487290cd33142ee86dd2da 100644 (file)
@@ -407,7 +407,7 @@ static int mt7921_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        struct ieee80211_sta *sta;
        struct ieee80211_vif *vif;
        struct ieee80211_hdr hdr;
-       __le32 qos_ctrl, ht_ctrl;
+       u16 frame_control;
 
        if (FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, le32_to_cpu(rxd[3])) !=
            MT_RXD3_NORMAL_U2M)
@@ -423,16 +423,15 @@ static int mt7921_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
 
        /* store the info from RXD and ethhdr to avoid being overridden */
-       hdr.frame_control = FIELD_GET(MT_RXD6_FRAME_CONTROL, rxd[6]);
-       hdr.seq_ctrl = FIELD_GET(MT_RXD8_SEQ_CTRL, rxd[8]);
-       qos_ctrl = FIELD_GET(MT_RXD8_QOS_CTL, rxd[8]);
-       ht_ctrl = FIELD_GET(MT_RXD9_HT_CONTROL, rxd[9]);
-
+       frame_control = le32_get_bits(rxd[6], MT_RXD6_FRAME_CONTROL);
+       hdr.frame_control = cpu_to_le16(frame_control);
+       hdr.seq_ctrl = cpu_to_le16(le32_get_bits(rxd[8], MT_RXD8_SEQ_CTRL));
        hdr.duration_id = 0;
+
        ether_addr_copy(hdr.addr1, vif->addr);
        ether_addr_copy(hdr.addr2, sta->addr);
-       switch (le16_to_cpu(hdr.frame_control) &
-               (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
+       switch (frame_control & (IEEE80211_FCTL_TODS |
+                                IEEE80211_FCTL_FROMDS)) {
        case 0:
                ether_addr_copy(hdr.addr3, vif->bss_conf.bssid);
                break;
@@ -454,15 +453,22 @@ static int mt7921_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
        if (eth_hdr->h_proto == cpu_to_be16(ETH_P_AARP) ||
            eth_hdr->h_proto == cpu_to_be16(ETH_P_IPX))
                ether_addr_copy(skb_push(skb, ETH_ALEN), bridge_tunnel_header);
-       else if (eth_hdr->h_proto >= cpu_to_be16(ETH_P_802_3_MIN))
+       else if (be16_to_cpu(eth_hdr->h_proto) >= ETH_P_802_3_MIN)
                ether_addr_copy(skb_push(skb, ETH_ALEN), rfc1042_header);
        else
                skb_pull(skb, 2);
 
        if (ieee80211_has_order(hdr.frame_control))
-               memcpy(skb_push(skb, 2), &ht_ctrl, 2);
-       if (ieee80211_is_data_qos(hdr.frame_control))
-               memcpy(skb_push(skb, 2), &qos_ctrl, 2);
+               memcpy(skb_push(skb, IEEE80211_HT_CTL_LEN), &rxd[9],
+                      IEEE80211_HT_CTL_LEN);
+       if (ieee80211_is_data_qos(hdr.frame_control)) {
+               __le16 qos_ctrl;
+
+               qos_ctrl = cpu_to_le16(le32_get_bits(rxd[8], MT_RXD8_QOS_CTL));
+               memcpy(skb_push(skb, IEEE80211_QOS_CTL_LEN), &qos_ctrl,
+                      IEEE80211_QOS_CTL_LEN);
+       }
+
        if (ieee80211_has_a4(hdr.frame_control))
                memcpy(skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
        else