197 lines · c
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 are7 * 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 2421#define WLAN_HDR_A3_QOS_LEN 2622 23enum 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 47static 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 159static 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_ 2186#define _CAPABILITY_ 2187#define _TIMESTAMP_ 8188 189/*-----------------------------------------------------------------------------190 * Below is the definition for WMM191 *------------------------------------------------------------------------------192 */193#define _WMM_IE_Length_ 7 /* for WMM STA */194 195#endif /* _WIFI_H_ */196 197