staging: wlan-ng: Remove pointless a3/a4 union

There is no need for the a3/a4 union. The two structs are identical
except for the addition of a4. Excepting one place, the structs are
only ever used in the union, and the union is always allocated at full
size. The one instance of the a3-specific struct can be replaced with
the full version, as no sizing information is used. Replace the union
with the a4 version of the struct. "diffoscope" reports there are no
object code differences after this change.

Cc: Allen Pais <apais@linux.microsoft.com>
Cc: Romain Perier <romain.perier@gmail.com>
Cc: Chen Lin <chen.lin5@zte.com.cn>
Cc: Ivan Safonov <insafonov@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-staging@lists.linux.dev
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20210819174537.3499227-2-keescook@chromium.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Kees Cook 2021-08-19 10:45:36 -07:00 committed by Greg Kroah-Hartman
parent 55cdf7d7b2
commit 6277fbfdd2
9 changed files with 48 additions and 62 deletions

View file

@ -1423,7 +1423,7 @@ int hfa384x_drvr_start(struct hfa384x *hw);
int hfa384x_drvr_stop(struct hfa384x *hw); int hfa384x_drvr_stop(struct hfa384x *hw);
int int
hfa384x_drvr_txframe(struct hfa384x *hw, struct sk_buff *skb, hfa384x_drvr_txframe(struct hfa384x *hw, struct sk_buff *skb,
union p80211_hdr *p80211_hdr, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep); struct p80211_metawep *p80211_wep);
void hfa384x_tx_timeout(struct wlandevice *wlandev); void hfa384x_tx_timeout(struct wlandevice *wlandev);

View file

@ -2472,7 +2472,7 @@ int hfa384x_drvr_stop(struct hfa384x *hw)
*---------------------------------------------------------------- *----------------------------------------------------------------
*/ */
int hfa384x_drvr_txframe(struct hfa384x *hw, struct sk_buff *skb, int hfa384x_drvr_txframe(struct hfa384x *hw, struct sk_buff *skb,
union p80211_hdr *p80211_hdr, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep) struct p80211_metawep *p80211_wep)
{ {
int usbpktlen = sizeof(struct hfa384x_tx_frame); int usbpktlen = sizeof(struct hfa384x_tx_frame);
@ -2517,7 +2517,7 @@ int hfa384x_drvr_txframe(struct hfa384x *hw, struct sk_buff *skb,
/* copy the header over to the txdesc */ /* copy the header over to the txdesc */
memcpy(&hw->txbuff.txfrm.desc.frame_control, p80211_hdr, memcpy(&hw->txbuff.txfrm.desc.frame_control, p80211_hdr,
sizeof(union p80211_hdr)); sizeof(struct p80211_hdr));
/* if we're using host WEP, increase size by IV+ICV */ /* if we're using host WEP, increase size by IV+ICV */
if (p80211_wep->data) { if (p80211_wep->data) {

View file

@ -106,7 +106,7 @@ static const u8 oui_8021h[] = { 0x00, 0x00, 0xf8 };
*---------------------------------------------------------------- *----------------------------------------------------------------
*/ */
int skb_ether_to_p80211(struct wlandevice *wlandev, u32 ethconv, int skb_ether_to_p80211(struct wlandevice *wlandev, u32 ethconv,
struct sk_buff *skb, union p80211_hdr *p80211_hdr, struct sk_buff *skb, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep) struct p80211_metawep *p80211_wep)
{ {
__le16 fc; __le16 fc;
@ -175,21 +175,21 @@ int skb_ether_to_p80211(struct wlandevice *wlandev, u32 ethconv,
switch (wlandev->macmode) { switch (wlandev->macmode) {
case WLAN_MACMODE_IBSS_STA: case WLAN_MACMODE_IBSS_STA:
memcpy(p80211_hdr->a3.a1, &e_hdr.daddr, ETH_ALEN); memcpy(p80211_hdr->a1, &e_hdr.daddr, ETH_ALEN);
memcpy(p80211_hdr->a3.a2, wlandev->netdev->dev_addr, ETH_ALEN); memcpy(p80211_hdr->a2, wlandev->netdev->dev_addr, ETH_ALEN);
memcpy(p80211_hdr->a3.a3, wlandev->bssid, ETH_ALEN); memcpy(p80211_hdr->a3, wlandev->bssid, ETH_ALEN);
break; break;
case WLAN_MACMODE_ESS_STA: case WLAN_MACMODE_ESS_STA:
fc |= cpu_to_le16(WLAN_SET_FC_TODS(1)); fc |= cpu_to_le16(WLAN_SET_FC_TODS(1));
memcpy(p80211_hdr->a3.a1, wlandev->bssid, ETH_ALEN); memcpy(p80211_hdr->a1, wlandev->bssid, ETH_ALEN);
memcpy(p80211_hdr->a3.a2, wlandev->netdev->dev_addr, ETH_ALEN); memcpy(p80211_hdr->a2, wlandev->netdev->dev_addr, ETH_ALEN);
memcpy(p80211_hdr->a3.a3, &e_hdr.daddr, ETH_ALEN); memcpy(p80211_hdr->a3, &e_hdr.daddr, ETH_ALEN);
break; break;
case WLAN_MACMODE_ESS_AP: case WLAN_MACMODE_ESS_AP:
fc |= cpu_to_le16(WLAN_SET_FC_FROMDS(1)); fc |= cpu_to_le16(WLAN_SET_FC_FROMDS(1));
memcpy(p80211_hdr->a3.a1, &e_hdr.daddr, ETH_ALEN); memcpy(p80211_hdr->a1, &e_hdr.daddr, ETH_ALEN);
memcpy(p80211_hdr->a3.a2, wlandev->bssid, ETH_ALEN); memcpy(p80211_hdr->a2, wlandev->bssid, ETH_ALEN);
memcpy(p80211_hdr->a3.a3, &e_hdr.saddr, ETH_ALEN); memcpy(p80211_hdr->a3, &e_hdr.saddr, ETH_ALEN);
break; break;
default: default:
netdev_err(wlandev->netdev, netdev_err(wlandev->netdev,
@ -222,9 +222,9 @@ int skb_ether_to_p80211(struct wlandevice *wlandev, u32 ethconv,
/* skb->nh.raw = skb->data; */ /* skb->nh.raw = skb->data; */
p80211_hdr->a3.fc = fc; p80211_hdr->fc = fc;
p80211_hdr->a3.dur = 0; p80211_hdr->dur = 0;
p80211_hdr->a3.seq = 0; p80211_hdr->seq = 0;
return 0; return 0;
} }
@ -281,7 +281,7 @@ int skb_p80211_to_ether(struct wlandevice *wlandev, u32 ethconv,
unsigned int payload_offset; unsigned int payload_offset;
u8 daddr[ETH_ALEN]; u8 daddr[ETH_ALEN];
u8 saddr[ETH_ALEN]; u8 saddr[ETH_ALEN];
union p80211_hdr *w_hdr; struct p80211_hdr *w_hdr;
struct wlan_ethhdr *e_hdr; struct wlan_ethhdr *e_hdr;
struct wlan_llc *e_llc; struct wlan_llc *e_llc;
struct wlan_snap *e_snap; struct wlan_snap *e_snap;
@ -291,21 +291,21 @@ int skb_p80211_to_ether(struct wlandevice *wlandev, u32 ethconv,
payload_length = skb->len - WLAN_HDR_A3_LEN - WLAN_CRC_LEN; payload_length = skb->len - WLAN_HDR_A3_LEN - WLAN_CRC_LEN;
payload_offset = WLAN_HDR_A3_LEN; payload_offset = WLAN_HDR_A3_LEN;
w_hdr = (union p80211_hdr *)skb->data; w_hdr = (struct p80211_hdr *)skb->data;
/* setup some vars for convenience */ /* setup some vars for convenience */
fc = le16_to_cpu(w_hdr->a3.fc); fc = le16_to_cpu(w_hdr->fc);
if ((WLAN_GET_FC_TODS(fc) == 0) && (WLAN_GET_FC_FROMDS(fc) == 0)) { if ((WLAN_GET_FC_TODS(fc) == 0) && (WLAN_GET_FC_FROMDS(fc) == 0)) {
ether_addr_copy(daddr, w_hdr->a3.a1); ether_addr_copy(daddr, w_hdr->a1);
ether_addr_copy(saddr, w_hdr->a3.a2); ether_addr_copy(saddr, w_hdr->a2);
} else if ((WLAN_GET_FC_TODS(fc) == 0) && } else if ((WLAN_GET_FC_TODS(fc) == 0) &&
(WLAN_GET_FC_FROMDS(fc) == 1)) { (WLAN_GET_FC_FROMDS(fc) == 1)) {
ether_addr_copy(daddr, w_hdr->a3.a1); ether_addr_copy(daddr, w_hdr->a1);
ether_addr_copy(saddr, w_hdr->a3.a3); ether_addr_copy(saddr, w_hdr->a3);
} else if ((WLAN_GET_FC_TODS(fc) == 1) && } else if ((WLAN_GET_FC_TODS(fc) == 1) &&
(WLAN_GET_FC_FROMDS(fc) == 0)) { (WLAN_GET_FC_FROMDS(fc) == 0)) {
ether_addr_copy(daddr, w_hdr->a3.a3); ether_addr_copy(daddr, w_hdr->a3);
ether_addr_copy(saddr, w_hdr->a3.a2); ether_addr_copy(saddr, w_hdr->a2);
} else { } else {
payload_offset = WLAN_HDR_A4_LEN; payload_offset = WLAN_HDR_A4_LEN;
if (payload_length < WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN) { if (payload_length < WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN) {
@ -313,8 +313,8 @@ int skb_p80211_to_ether(struct wlandevice *wlandev, u32 ethconv,
return 1; return 1;
} }
payload_length -= (WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN); payload_length -= (WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN);
ether_addr_copy(daddr, w_hdr->a4.a3); ether_addr_copy(daddr, w_hdr->a3);
ether_addr_copy(saddr, w_hdr->a4.a4); ether_addr_copy(saddr, w_hdr->a4);
} }
/* perform de-wep if necessary.. */ /* perform de-wep if necessary.. */

View file

@ -154,7 +154,7 @@ struct wlandevice;
int skb_p80211_to_ether(struct wlandevice *wlandev, u32 ethconv, int skb_p80211_to_ether(struct wlandevice *wlandev, u32 ethconv,
struct sk_buff *skb); struct sk_buff *skb);
int skb_ether_to_p80211(struct wlandevice *wlandev, u32 ethconv, int skb_ether_to_p80211(struct wlandevice *wlandev, u32 ethconv,
struct sk_buff *skb, union p80211_hdr *p80211_hdr, struct sk_buff *skb, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep); struct p80211_metawep *p80211_wep);
int p80211_stt_findproto(u16 proto); int p80211_stt_findproto(u16 proto);

View file

@ -148,16 +148,7 @@
/* Generic 802.11 Header types */ /* Generic 802.11 Header types */
struct p80211_hdr_a3 { struct p80211_hdr {
__le16 fc;
u16 dur;
u8 a1[ETH_ALEN];
u8 a2[ETH_ALEN];
u8 a3[ETH_ALEN];
u16 seq;
} __packed;
struct p80211_hdr_a4 {
u16 fc; u16 fc;
u16 dur; u16 dur;
u8 a1[ETH_ALEN]; u8 a1[ETH_ALEN];
@ -167,11 +158,6 @@ struct p80211_hdr_a4 {
u8 a4[ETH_ALEN]; u8 a4[ETH_ALEN];
} __packed; } __packed;
union p80211_hdr {
struct p80211_hdr_a3 a3;
struct p80211_hdr_a4 a4;
} __packed;
/* Frame and header length macros */ /* Frame and header length macros */
static inline u16 wlan_ctl_framelen(u16 fstype) static inline u16 wlan_ctl_framelen(u16 fstype)

View file

@ -299,7 +299,7 @@ struct wlan_fr_mgmt {
u16 type; u16 type;
u16 len; /* DOES NOT include CRC !!!! */ u16 len; /* DOES NOT include CRC !!!! */
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -311,7 +311,7 @@ struct wlan_fr_beacon {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -334,7 +334,7 @@ struct wlan_fr_ibssatim {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
@ -350,7 +350,7 @@ struct wlan_fr_disassoc {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -365,7 +365,7 @@ struct wlan_fr_assocreq {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -382,7 +382,7 @@ struct wlan_fr_assocresp {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -399,7 +399,7 @@ struct wlan_fr_reassocreq {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -417,7 +417,7 @@ struct wlan_fr_reassocresp {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -434,7 +434,7 @@ struct wlan_fr_probereq {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -449,7 +449,7 @@ struct wlan_fr_proberesp {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -470,7 +470,7 @@ struct wlan_fr_authen {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/
@ -487,7 +487,7 @@ struct wlan_fr_deauthen {
u16 type; u16 type;
u16 len; u16 len;
u8 *buf; u8 *buf;
union p80211_hdr *hdr; struct p80211_hdr *hdr;
/* used for target specific data, skb in Linux */ /* used for target specific data, skb in Linux */
void *priv; void *priv;
/*-- fixed fields -----------*/ /*-- fixed fields -----------*/

View file

@ -235,9 +235,9 @@ void p80211netdev_rx(struct wlandevice *wlandev, struct sk_buff *skb)
static int p80211_convert_to_ether(struct wlandevice *wlandev, static int p80211_convert_to_ether(struct wlandevice *wlandev,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct p80211_hdr_a3 *hdr; struct p80211_hdr *hdr;
hdr = (struct p80211_hdr_a3 *)skb->data; hdr = (struct p80211_hdr *)skb->data;
if (p80211_rx_typedrop(wlandev, le16_to_cpu(hdr->fc))) if (p80211_rx_typedrop(wlandev, le16_to_cpu(hdr->fc)))
return CONV_TO_ETHER_SKIPPED; return CONV_TO_ETHER_SKIPPED;
@ -327,7 +327,7 @@ static netdev_tx_t p80211knetdev_hard_start_xmit(struct sk_buff *skb,
int result = 0; int result = 0;
int txresult; int txresult;
struct wlandevice *wlandev = netdev->ml_priv; struct wlandevice *wlandev = netdev->ml_priv;
union p80211_hdr p80211_hdr; struct p80211_hdr p80211_hdr;
struct p80211_metawep p80211_wep; struct p80211_metawep p80211_wep;
p80211_wep.data = NULL; p80211_wep.data = NULL;

View file

@ -180,7 +180,7 @@ struct wlandevice {
int (*close)(struct wlandevice *wlandev); int (*close)(struct wlandevice *wlandev);
void (*reset)(struct wlandevice *wlandev); void (*reset)(struct wlandevice *wlandev);
int (*txframe)(struct wlandevice *wlandev, struct sk_buff *skb, int (*txframe)(struct wlandevice *wlandev, struct sk_buff *skb,
union p80211_hdr *p80211_hdr, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep); struct p80211_metawep *p80211_wep);
int (*mlmerequest)(struct wlandevice *wlandev, struct p80211msg *msg); int (*mlmerequest)(struct wlandevice *wlandev, struct p80211msg *msg);
int (*set_multicast_list)(struct wlandevice *wlandev, int (*set_multicast_list)(struct wlandevice *wlandev,

View file

@ -103,7 +103,7 @@ static int prism2sta_open(struct wlandevice *wlandev);
static int prism2sta_close(struct wlandevice *wlandev); static int prism2sta_close(struct wlandevice *wlandev);
static void prism2sta_reset(struct wlandevice *wlandev); static void prism2sta_reset(struct wlandevice *wlandev);
static int prism2sta_txframe(struct wlandevice *wlandev, struct sk_buff *skb, static int prism2sta_txframe(struct wlandevice *wlandev, struct sk_buff *skb,
union p80211_hdr *p80211_hdr, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep); struct p80211_metawep *p80211_wep);
static int prism2sta_mlmerequest(struct wlandevice *wlandev, static int prism2sta_mlmerequest(struct wlandevice *wlandev,
struct p80211msg *msg); struct p80211msg *msg);
@ -242,7 +242,7 @@ static void prism2sta_reset(struct wlandevice *wlandev)
* process thread * process thread
*/ */
static int prism2sta_txframe(struct wlandevice *wlandev, struct sk_buff *skb, static int prism2sta_txframe(struct wlandevice *wlandev, struct sk_buff *skb,
union p80211_hdr *p80211_hdr, struct p80211_hdr *p80211_hdr,
struct p80211_metawep *p80211_wep) struct p80211_metawep *p80211_wep)
{ {
struct hfa384x *hw = wlandev->priv; struct hfa384x *hw = wlandev->priv;
@ -250,7 +250,7 @@ static int prism2sta_txframe(struct wlandevice *wlandev, struct sk_buff *skb,
/* If necessary, set the 802.11 WEP bit */ /* If necessary, set the 802.11 WEP bit */
if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) ==
HOSTWEP_PRIVACYINVOKED) { HOSTWEP_PRIVACYINVOKED) {
p80211_hdr->a3.fc |= cpu_to_le16(WLAN_SET_FC_ISWEP(1)); p80211_hdr->fc |= cpu_to_le16(WLAN_SET_FC_ISWEP(1));
} }
return hfa384x_drvr_txframe(hw, skb, p80211_hdr, p80211_wep); return hfa384x_drvr_txframe(hw, skb, p80211_hdr, p80211_wep);