]> err.no Git - linux-2.6/blobdiff - include/linux/ieee80211.h
mac80211: remove unnecessary byteshifts in frame control testing
[linux-2.6] / include / linux / ieee80211.h
index 529f301d9372d85ed588441894140edbd5d79321..a9102bc78b6163703d056cd1386f3e422f022b22 100644 (file)
@@ -113,7 +113,7 @@ struct ieee80211_hdr {
 struct ieee80211s_hdr {
        u8 flags;
        u8 ttl;
-       u8 seqnum[3];
+       __le32 seqnum;
        u8 eaddr1[6];
        u8 eaddr2[6];
        u8 eaddr3[6];
@@ -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 */