mac80211: remove unnecessary byteshifts in frame control testing
authorHarvey Harrison <harvey.harrison@gmail.com>
Mon, 21 Apr 2008 17:41:10 +0000 (10:41 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 14 May 2008 20:29:32 +0000 (16:29 -0400)
Byteswap the constants rather than the frame_control member.

Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/ieee80211.h

index 0b5e03e..a9102bc 100644 (file)
@@ -552,16 +552,17 @@ enum ieee80211_back_parties {
  */
 static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
 {
-       u8 *raw = (u8 *) hdr;
-       u8 tofrom = (*(raw+1)) & 3; /* get the TODS and FROMDS bits */
-
-       switch (tofrom) {
-               case 2:
-                       return hdr->addr3;
-               case 3:
-                       return hdr->addr4;
+       __le16 fc = hdr->frame_control;
+       fc &= cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
+
+       switch (fc) {
+       case __constant_cpu_to_le16(IEEE80211_FCTL_FROMDS):
+               return hdr->addr3;
+       case __constant_cpu_to_le16(IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS):
+               return hdr->addr4;
+       default:
+               return hdr->addr2;
        }
-       return hdr->addr2;
 }
 
 /**
@@ -577,12 +578,13 @@ static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
  */
 static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
 {
-       u8 *raw = (u8 *) hdr;
-       u8 to_ds = (*(raw+1)) & 1; /* get the TODS bit */
+       __le16 fc = hdr->frame_control;
+       fc &= cpu_to_le16(IEEE80211_FCTL_TODS);
 
-       if (to_ds)
+       if (fc)
                return hdr->addr3;
-       return hdr->addr1;
+       else
+               return hdr->addr1;
 }
 
 /**
@@ -595,8 +597,8 @@ static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
  */
 static inline int ieee80211_get_morefrag(struct ieee80211_hdr *hdr)
 {
-       return (le16_to_cpu(hdr->frame_control) &
-               IEEE80211_FCTL_MOREFRAGS) != 0;
+       __le16 fc = hdr->frame_control;
+       return !!(fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS));
 }
 
 #endif /* IEEE80211_H */