1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved. 5 * 6 * Modifications for inclusion into the Linux staging tree are 7 * Copyright(c) 2010 Larry Finger. All rights reserved. 8 * 9 * Contact information: 10 * WLAN FAE <wlanfae@realtek.com> 11 * Larry Finger <Larry.Finger@lwfinger.net> 12 * 13 ******************************************************************************/ 14 #ifndef _WIFI_H_ 15 #define _WIFI_H_ 16 17 #include <linux/compiler.h> 18 #include <linux/ieee80211.h> 19 20 #define WLAN_HDR_A3_LEN 24 21 #define WLAN_HDR_A3_QOS_LEN 26 22 23 enum WIFI_FRAME_TYPE { 24 WIFI_QOS_DATA_TYPE = (BIT(7) | BIT(3)), /*!< QoS Data */ 25 }; 26 27 #define SetToDs(pbuf) ({ \ 28 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_TODS); \ 29 }) 30 31 #define GetToDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0) 32 33 #define ClearToDs(pbuf) ({ \ 34 *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_TODS)); \ 35 }) 36 37 #define SetFrDs(pbuf) ({ \ 38 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_FROMDS); \ 39 }) 40 41 #define GetFrDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0) 42 43 #define ClearFrDs(pbuf) ({ \ 44 *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_FROMDS)); \ 45 }) 46 47 static inline unsigned char get_tofr_ds(unsigned char *pframe) 48 { 49 return ((GetToDs(pframe) << 1) | GetFrDs(pframe)); 50 } 51 52 #define SetMFrag(pbuf) ({ \ 53 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_MOREFRAGS); \ 54 }) 55 56 #define GetMFrag(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0) 57 58 #define ClearMFrag(pbuf) ({ \ 59 *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)); \ 60 }) 61 62 #define SetRetry(pbuf) ({ \ 63 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_RETRY); \ 64 }) 65 66 #define GetRetry(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0) 67 68 #define ClearRetry(pbuf) ({ \ 69 *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_RETRY)); \ 70 }) 71 72 #define SetPwrMgt(pbuf) ({ \ 73 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_PM); \ 74 }) 75 76 #define GetPwrMgt(pbuf) (((*(__le16 *)(pbuf)) & \ 77 cpu_to_le16(IEEE80211_FCTL_PM)) != 0) 78 79 #define ClearPwrMgt(pbuf) ({ \ 80 *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_PM)); \ 81 }) 82 83 #define SetMData(pbuf) ({ \ 84 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); \ 85 }) 86 87 #define GetMData(pbuf) (((*(__le16 *)(pbuf)) & \ 88 cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0) 89 90 #define ClearMData(pbuf) ({ \ 91 *(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_MOREDATA)); \ 92 }) 93 94 #define SetPrivacy(pbuf) ({ \ 95 *(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); \ 96 }) 97 98 #define GetPrivacy(pbuf) (((*(__le16 *)(pbuf)) & \ 99 cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0) 100 101 #define GetOrder(pbuf) (((*(__le16 *)(pbuf)) & \ 102 cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0) 103 104 #define GetFrameType(pbuf) (le16_to_cpu(*(__le16 *)(pbuf)) & \ 105 (BIT(3) | BIT(2))) 106 107 #define SetFrameType(pbuf, type) \ 108 do { \ 109 *(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(3) | \ 110 BIT(2))); \ 111 *(__le16 *)(pbuf) |= cpu_to_le16(type); \ 112 } while (0) 113 114 #define GetFrameSubType(pbuf) (le16_to_cpu(*(__le16 *)(pbuf)) & \ 115 (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | \ 116 BIT(2))) 117 118 #define SetFrameSubType(pbuf, type) \ 119 do { \ 120 *(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | \ 121 BIT(5) | BIT(4) | BIT(3) | BIT(2))); \ 122 *(__le16 *)(pbuf) |= cpu_to_le16(type); \ 123 } while (0) 124 125 #define GetSequence(pbuf) (le16_to_cpu(*(__le16 *)\ 126 ((addr_t)(pbuf) + 22)) >> 4) 127 128 #define GetFragNum(pbuf) (le16_to_cpu(*(__le16 *)((addr_t)\ 129 (pbuf) + 22)) & 0x0f) 130 131 #define SetSeqNum(pbuf, num) ({ \ 132 *(__le16 *)((addr_t)(pbuf) + 22) = \ 133 cpu_to_le16((le16_to_cpu(*(__le16 *)((addr_t)(pbuf) + 22)) & \ 134 0x000f) | (0xfff0 & (num << 4))); \ 135 }) 136 137 #define SetPriority(pbuf, tid) ({ \ 138 *(__le16 *)(pbuf) |= cpu_to_le16(tid & 0xf); \ 139 }) 140 141 #define GetPriority(pbuf) ((le16_to_cpu(*(__le16 *)(pbuf))) & 0xf) 142 143 #define SetAckpolicy(pbuf, ack) ({ \ 144 *(__le16 *)(pbuf) |= cpu_to_le16((ack & 3) << 5); \ 145 }) 146 147 #define GetAckpolicy(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 5) & 0x3) 148 149 #define GetAMsdu(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 7) & 0x1) 150 151 #define GetAddr1Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 4)) 152 153 #define GetAddr2Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 10)) 154 155 #define GetAddr3Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 16)) 156 157 #define GetAddr4Ptr(pbuf) ((unsigned char *)((addr_t)(pbuf) + 24)) 158 159 static inline unsigned char *get_hdr_bssid(unsigned char *pframe) 160 { 161 unsigned char *sa; 162 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); 163 164 switch (to_fr_ds) { 165 case 0x00: /* ToDs=0, FromDs=0 */ 166 sa = GetAddr3Ptr(pframe); 167 break; 168 case 0x01: /* ToDs=0, FromDs=1 */ 169 sa = GetAddr2Ptr(pframe); 170 break; 171 case 0x02: /* ToDs=1, FromDs=0 */ 172 sa = GetAddr1Ptr(pframe); 173 break; 174 default: /* ToDs=1, FromDs=1 */ 175 sa = NULL; 176 break; 177 } 178 return sa; 179 } 180 181 /* --------------------------------------------------------------------------- 182 * Below is the fixed elements... 183 * --------------------------------------------------------------------------- 184 */ 185 #define _BEACON_ITERVAL_ 2 186 #define _CAPABILITY_ 2 187 #define _TIMESTAMP_ 8 188 189 /*----------------------------------------------------------------------------- 190 * Below is the definition for WMM 191 *------------------------------------------------------------------------------ 192 */ 193 #define _WMM_IE_Length_ 7 /* for WMM STA */ 194 195 #endif /* _WIFI_H_ */ 196 197