//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// MAC_Structures.h
//
// This file contains the definitions and data structures used by SW-MAC.
//
// Revision Histoy
//=================
// 0.1      2002        UN00
// 0.2      20021004    PD43 CCLiu6
//          20021018    PD43 CCLiu6
//                      Add enum_TxRate type
//                      Modify enum_STAState type
// 0.3      20021023    PE23 CYLiu update MAC session struct
//          20021108
//          20021122    PD43 Austin
//                      Deleted some unused.
//          20021129    PD43 Austin
//			20030617	increase the 802.11g definition
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#ifndef _MAC_Structures_H_
#define _MAC_Structures_H_


//=========================================================
// Some miscellaneous definitions
//-----
#define MAX_CHANNELS                        30
#define MAC_ADDR_LENGTH                     6
#define MAX_WEP_KEY_SIZE                    16  // 128 bits
#define	MAX_802_11_FRAGMENT_NUMBER		10 // By spec

//========================================================
// 802.11 Frame define
//-----
#define MASK_PROTOCOL_VERSION_TYPE	0x0F
#define MASK_FRAGMENT_NUMBER		0x000F
#define SEQUENCE_NUMBER_SHIFT		4
#define DIFFER_11_TO_3				18
#define DOT_11_MAC_HEADER_SIZE		24
#define DOT_11_SNAP_SIZE			6
#define DOT_11_DURATION_OFFSET		2
#define DOT_11_SEQUENCE_OFFSET		22 //Sequence control offset
#define DOT_11_TYPE_OFFSET			30 //The start offset of 802.11 Frame//
#define DOT_11_DATA_OFFSET          24
#define DOT_11_DA_OFFSET			4
#define DOT_3_TYPE_ARP				0x80F3
#define DOT_3_TYPE_IPX				0x8137
#define DOT_3_TYPE_OFFSET			12


#define ETHERNET_HEADER_SIZE			14
#define MAX_ETHERNET_PACKET_SIZE		1514


//-----  management : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7)
#define MAC_SUBTYPE_MNGMNT_ASSOC_REQUEST    0x00
#define MAC_SUBTYPE_MNGMNT_ASSOC_RESPONSE   0x10
#define MAC_SUBTYPE_MNGMNT_REASSOC_REQUEST  0x20
#define MAC_SUBTYPE_MNGMNT_REASSOC_RESPONSE 0x30
#define MAC_SUBTYPE_MNGMNT_PROBE_REQUEST    0x40
#define MAC_SUBTYPE_MNGMNT_PROBE_RESPONSE   0x50
#define MAC_SUBTYPE_MNGMNT_BEACON           0x80
#define MAC_SUBTYPE_MNGMNT_ATIM             0x90
#define MAC_SUBTYPE_MNGMNT_DISASSOCIATION   0xA0
#define MAC_SUBTYPE_MNGMNT_AUTHENTICATION   0xB0
#define MAC_SUBTYPE_MNGMNT_DEAUTHENTICATION 0xC0

//-----  control : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7)
#define MAC_SUBTYPE_CONTROL_PSPOLL          0xA4
#define MAC_SUBTYPE_CONTROL_RTS             0xB4
#define MAC_SUBTYPE_CONTROL_CTS             0xC4
#define MAC_SUBTYPE_CONTROL_ACK             0xD4
#define MAC_SUBTYPE_CONTROL_CFEND           0xE4
#define MAC_SUBTYPE_CONTROL_CFEND_CFACK     0xF4

//-----  data : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7)
#define MAC_SUBTYPE_DATA                    0x08
#define MAC_SUBTYPE_DATA_CFACK              0x18
#define MAC_SUBTYPE_DATA_CFPOLL             0x28
#define MAC_SUBTYPE_DATA_CFACK_CFPOLL       0x38
#define MAC_SUBTYPE_DATA_NULL               0x48
#define MAC_SUBTYPE_DATA_CFACK_NULL         0x58
#define MAC_SUBTYPE_DATA_CFPOLL_NULL        0x68
#define MAC_SUBTYPE_DATA_CFACK_CFPOLL_NULL  0x78

//-----  Frame Type of Bits (2, 3)
#define MAC_TYPE_MANAGEMENT                 0x00
#define MAC_TYPE_CONTROL                    0x04
#define MAC_TYPE_DATA                       0x08

//----- definitions for Management Frame Element ID (1 BYTE)
#define ELEMENT_ID_SSID                     0
#define ELEMENT_ID_SUPPORTED_RATES          1
#define ELEMENT_ID_FH_PARAMETER_SET         2
#define ELEMENT_ID_DS_PARAMETER_SET         3
#define ELEMENT_ID_CF_PARAMETER_SET         4
#define ELEMENT_ID_TIM                      5
#define ELEMENT_ID_IBSS_PARAMETER_SET       6
// 7~15 reserverd
#define ELEMENT_ID_CHALLENGE_TEXT           16
// 17~31 reserved for challenge text extension
// 32~255 reserved
//--  11G  --
#define ELEMENT_ID_ERP_INFORMATION			42
#define ELEMENT_ID_EXTENDED_SUPPORTED_RATES 50

//--  WPA  --

#define ELEMENT_ID_RSN_WPA					221
#ifdef _WPA2_
#define ELEMENT_ID_RSN_WPA2				    48
#endif //endif WPA2

#define WLAN_MAX_PAIRWISE_CIPHER_SUITE_COUNT    ((u16) 6)
#define WLAN_MAX_AUTH_KEY_MGT_SUITE_LIST_COUNT  ((u16) 2)

#ifdef WB_LINUX
#define UNALIGNED
#endif

//========================================================
typedef enum enum_PowerManagementMode
{
    ACTIVE = 0,
    POWER_SAVE
} WB_PM_Mode, *PWB_PM_MODE;

//===================================================================
//  Reason Code (Table 18): indicate the reason of DisAssoc, DeAuthen
//  length of ReasonCode is 2 Octs.
//===================================================================
#define REASON_REASERED             0
#define REASON_UNSPECIDIED          1
#define REASON_PREAUTH_INVALID      2
#define DEAUTH_REASON_LEFT_BSS      3
#define DISASS_REASON_AP_INACTIVE   4
#define DISASS_REASON_AP_BUSY       5
#define REASON_CLASS2_FRAME_FROM_NONAUTH_STA    6
#define REASON_CLASS3_FRAME_FROM_NONASSO_STA    7
#define DISASS_REASON_LEFT_BSS      8
#define REASON_NOT_AUTH_YET         9
//802.11i define
#define REASON_INVALID_IE						13
#define REASON_MIC_ERROR						14
#define REASON_4WAY_HANDSHAKE_TIMEOUT			15
#define REASON_GROUPKEY_UPDATE_TIMEOUT			16
#define REASON_IE_DIFF_4WAY_ASSOC				17
#define REASON_INVALID_MULTICAST_CIPHER			18
#define REASON_INVALID_UNICAST_CIPHER			19
#define REASON_INVALID_AKMP						20
#define REASON_UNSUPPORTED_RSNIE_VERSION		21
#define REASON_INVALID_RSNIE_CAPABILITY			22
#define REASON_802_1X_AUTH_FAIL					23
#define	REASON_CIPHER_REJECT_PER_SEC_POLICY		14

/*
//===========================================================
// enum_MMPDUResultCode --
//   Status code (2 Octs) in the MMPDU's frame body. Table.19
//
//===========================================================
enum enum_MMPDUResultCode
{
//    SUCCESS   = 0,      // Redefined
    UNSPECIFIED_FAILURE                         = 1,

    // 2 - 9 Reserved

    NOT_SUPPROT_CAPABILITIES                    = 10,

    //REASSOCIATION_DENIED
    //
    REASSOC_DENIED_UNABLE_CFM_ASSOC_EXIST       = 11,

    //ASSOCIATION_DENIED_NOT_IN_STANDARD
    //
    ASSOC_DENIED_REASON_NOT_IN_STANDARD         = 12,
    PEER_NOT_SUPPORT_AUTH_ALGORITHM             = 13,
    AUTH_SEQNUM_OUT_OF_EXPECT                   = 14,
    AUTH_REJECT_REASON_CHALLENGE_FAIL           = 15,
    AUTH_REJECT_REASON_WAIT_TIMEOUT             = 16,
    ASSOC_DENIED_REASON_AP_BUSY                 = 17,
    ASSOC_DENIED_REASON_NOT_SUPPORT_BASIC_RATE  = 18
} WB_MMPDURESULTCODE, *PWB_MMPDURESULTCODE;
*/

//===========================================================
// enum_TxRate --
//   Define the transmission constants based on W89C32 MAC
//   target specification.
//===========================================================
typedef enum enum_TxRate
{
    TXRATE_1M               = 0,
    TXRATE_2MLONG           = 2,
    TXRATE_2MSHORT          = 3,
    TXRATE_55MLONG          = 4,
    TXRATE_55MSHORT         = 5,
    TXRATE_11MLONG          = 6,
    TXRATE_11MSHORT         = 7,
    TXRATE_AUTO             = 255           // PD43 20021108
} WB_TXRATE, *PWB_TXRATE;


#define	RATE_BITMAP_1M				1
#define	RATE_BITMAP_2M				2
#define	RATE_BITMAP_5dot5M			5
#define RATE_BITMAP_6M				6
#define RATE_BITMAP_9M				9
#define RATE_BITMAP_11M				11
#define RATE_BITMAP_12M				12
#define RATE_BITMAP_18M				18
#define RATE_BITMAP_22M				22
#define RATE_BITMAP_24M				24
#define RATE_BITMAP_33M				17
#define RATE_BITMAP_36M				19
#define RATE_BITMAP_48M				25
#define RATE_BITMAP_54M				28

#define RATE_AUTO					0
#define RATE_1M						2
#define RATE_2M						4
#define RATE_5dot5M					11
#define RATE_6M						12
#define RATE_9M						18
#define RATE_11M					22
#define RATE_12M					24
#define RATE_18M					36
#define RATE_22M					44
#define RATE_24M					48
#define RATE_33M					66
#define RATE_36M					72
#define RATE_48M					96
#define RATE_54M					108
#define RATE_MAX					255

//CAPABILITY
#define CAPABILITY_ESS_BIT				0x0001
#define CAPABILITY_IBSS_BIT				0x0002
#define CAPABILITY_CF_POLL_BIT			0x0004
#define CAPABILITY_CF_POLL_REQ_BIT		0x0008
#define CAPABILITY_PRIVACY_BIT			0x0010
#define CAPABILITY_SHORT_PREAMBLE_BIT	0x0020
#define CAPABILITY_PBCC_BIT				0x0040
#define CAPABILITY_CHAN_AGILITY_BIT		0x0080
#define CAPABILITY_SHORT_SLOT_TIME_BIT	0x0400
#define CAPABILITY_DSSS_OFDM_BIT		0x2000


struct Capability_Information_Element
{
  union
  {
  	u16 __attribute__ ((packed)) wValue;
    #ifdef _BIG_ENDIAN_  //20060926 add by anson's endian
    struct _Capability
    {
        //--  11G  --
	u8	Reserved3 : 2;
	u8	DSSS_OFDM : 1;
	u8	Reserved2 : 2;
	u8	Short_Slot_Time : 1;
	u8    Reserved1 : 2;
	u8    Channel_Agility : 1;
	u8    PBCC : 1;
	u8    ShortPreamble : 1;
	u8    CF_Privacy : 1;
	u8    CF_Poll_Request : 1;
	u8    CF_Pollable : 1;
	u8    IBSS : 1;
	u8    ESS : 1;
    } __attribute__ ((packed)) Capability;
    #else
    struct _Capability
    {
        u8    ESS : 1;
        u8    IBSS : 1;
        u8    CF_Pollable : 1;
        u8    CF_Poll_Request : 1;
        u8    CF_Privacy : 1;
        u8    ShortPreamble : 1;
        u8    PBCC : 1;
        u8    Channel_Agility : 1;
        u8    Reserved1 : 2;
		//--  11G  --
		u8	Short_Slot_Time : 1;
		u8	Reserved2 : 2;
		u8	DSSS_OFDM : 1;
		u8	Reserved3 : 2;
    } __attribute__ ((packed)) Capability;
    #endif
  }__attribute__ ((packed)) ;
}__attribute__ ((packed));

struct FH_Parameter_Set_Element
{
    u8    Element_ID;
    u8    Length;
    u8    Dwell_Time[2];
    u8    Hop_Set;
    u8    Hop_Pattern;
    u8    Hop_Index;
};

struct DS_Parameter_Set_Element
{
    u8    Element_ID;
    u8    Length;
    u8    Current_Channel;
};

struct Supported_Rates_Element
{
    u8    Element_ID;
    u8    Length;
    u8    SupportedRates[8];
}__attribute__ ((packed));

struct SSID_Element
{
    u8    Element_ID;
    u8    Length;
    u8    SSID[32];
}__attribute__ ((packed)) ;

struct CF_Parameter_Set_Element
{
    u8    Element_ID;
    u8    Length;
    u8    CFP_Count;
    u8    CFP_Period;
    u8    CFP_MaxDuration[2];     // in Time Units
    u8    CFP_DurRemaining[2];    // in time units
};

struct TIM_Element
{
    u8    Element_ID;
    u8    Length;
    u8    DTIM_Count;
    u8    DTIM_Period;
    u8    Bitmap_Control;
    u8    Partial_Virtual_Bitmap[251];
};

struct IBSS_Parameter_Set_Element
{
    u8    Element_ID;
    u8    Length;
    u8    ATIM_Window[2];
};

struct Challenge_Text_Element
{
    u8    Element_ID;
    u8    Length;
    u8    Challenge_Text[253];
};

struct PHY_Parameter_Set_Element
{
//  int     aSlotTime;
//  int     aSifsTime;
    s32     aCCATime;
    s32     aRxTxTurnaroundTime;
    s32     aTxPLCPDelay;
    s32     RxPLCPDelay;
    s32     aRxTxSwitchTime;
    s32     aTxRampOntime;
    s32     aTxRampOffTime;
    s32     aTxRFDelay;
    s32     aRxRFDelay;
    s32     aAirPropagationTime;
    s32     aMACProcessingDelay;
    s32     aPreambleLength;
    s32     aPLCPHeaderLength;
    s32     aMPDUDurationFactor;
    s32     aMPDUMaxLength;
//  int     aCWmin;
//  int     aCWmax;
};

//--  11G  --
struct ERP_Information_Element
{
    u8	Element_ID;
    u8	Length;
    #ifdef _BIG_ENDIAN_ //20060926 add by anson's endian
    	u8	Reserved:5;   //20060926 add by anson
       u8	Barker_Preamble_Mode:1;
	u8	Use_Protection:1;
       u8	NonERP_Present:1;
    #else
	u8	NonERP_Present:1;
	u8	Use_Protection:1;
	u8	Barker_Preamble_Mode:1;
	u8	Reserved:5;
    #endif
};

struct Extended_Supported_Rates_Element
{
    u8	Element_ID;
    u8	Length;
    u8	ExtendedSupportedRates[255];
}__attribute__ ((packed));

//WPA(802.11i draft 3.0)
#define VERSION_WPA				1
#ifdef _WPA2_
#define VERSION_WPA2            1
#endif //end def  _WPA2_
#define OUI_WPA					0x00F25000	//WPA2.0 OUI=00:50:F2, the MSB is reserved for suite type
#ifdef _WPA2_
#define OUI_WPA2				0x00AC0F00	// for wpa2 change to 0x00ACOF04 by Ws 26/04/04
#endif //end def _WPA2_

#define OUI_WPA_ADDITIONAL		0x01
#define WLAN_MIN_RSN_WPA_LENGTH                 6 //added by ws 09/10/04
#ifdef _WPA2_
#define WLAN_MIN_RSN_WPA2_LENGTH                2 // Fix to 2 09/14/05
#endif //end def _WPA2_

#define oui_wpa                  (u32)(OUI_WPA|OUI_WPA_ADDITIONAL)

#define WPA_OUI_BIG    ((u32) 0x01F25000)//added by ws 09/23/04
#define WPA_OUI_LITTLE  ((u32) 0x01F25001)//added by ws 09/23/04

#define WPA_WPS_OUI				cpu_to_le32(0x04F25000) // 20061108 For WPS. It's little endian. Big endian is 0x0050F204

//-----WPA2-----
#ifdef _WPA2_
#define WPA2_OUI_BIG    ((u32)0x01AC0F00)
#define WPA2_OUI_LITTLE ((u32)0x01AC0F01)
#endif //end def _WPA2_

//Authentication suite
#define OUI_AUTH_WPA_NONE           0x00 //for WPA_NONE
#define OUI_AUTH_8021X				0x01
#define OUI_AUTH_PSK				0x02
//Cipher suite
#define OUI_CIPHER_GROUP_KEY        0x00  //added by ws 05/21/04
#define OUI_CIPHER_WEP_40			0x01
#define OUI_CIPHER_TKIP				0x02
#define OUI_CIPHER_CCMP				0x04
#define OUI_CIPHER_WEP_104			0x05

typedef struct _SUITE_SELECTOR_
{
	union
	{
		u8	Value[4];
		struct _SUIT_
		{
			u8	OUI[3];
			u8	Type;
		}SuitSelector;
	};
}SUITE_SELECTOR;

//--  WPA  --
struct	RSN_Information_Element
{
	u8					Element_ID;
	u8					Length;
	UNALIGNED SUITE_SELECTOR	OuiWPAAdditional;//WPA version 2.0 additional field, and should be 00:50:F2:01
	u16					Version;
	SUITE_SELECTOR		GroupKeySuite;
	u16					PairwiseKeySuiteCount;
	SUITE_SELECTOR		PairwiseKeySuite[1];
}__attribute__ ((packed));
struct RSN_Auth_Sub_Information_Element
{
	u16				AuthKeyMngtSuiteCount;
	SUITE_SELECTOR	AuthKeyMngtSuite[1];
}__attribute__ ((packed));

//--  WPA2  --
struct RSN_Capability_Element
{
  union
  {
	u16	__attribute__ ((packed))	wValue;
    #ifdef _BIG_ENDIAN_	 //20060927 add by anson's endian
    struct _RSN_Capability
    {
    	u16   __attribute__ ((packed))  Reserved2 : 8; // 20051201
	u16   __attribute__ ((packed))  Reserved1 : 2;
	u16   __attribute__ ((packed))  GTK_Replay_Counter : 2;
	u16   __attribute__ ((packed))  PTK_Replay_Counter : 2;
	u16   __attribute__ ((packed))  No_Pairwise : 1;
        u16   __attribute__ ((packed))  Pre_Auth : 1;
    }__attribute__ ((packed))  RSN_Capability;
    #else
    struct _RSN_Capability
    {
        u16   __attribute__ ((packed))  Pre_Auth : 1;
        u16   __attribute__ ((packed))  No_Pairwise : 1;
        u16   __attribute__ ((packed))  PTK_Replay_Counter : 2;
	    u16   __attribute__ ((packed))  GTK_Replay_Counter : 2;
	    u16   __attribute__ ((packed))  Reserved1 : 2;
	    u16   __attribute__ ((packed))  Reserved2 : 8; // 20051201
    }__attribute__ ((packed))  RSN_Capability;
    #endif

  }__attribute__ ((packed)) ;
}__attribute__ ((packed)) ;

#ifdef _WPA2_
typedef struct _PMKID
{
  u8 pValue[16];
}PMKID;

struct	WPA2_RSN_Information_Element
{
	u8					Element_ID;
	u8					Length;
	u16					Version;
	SUITE_SELECTOR		GroupKeySuite;
	u16					PairwiseKeySuiteCount;
	SUITE_SELECTOR		PairwiseKeySuite[1];

}__attribute__ ((packed));

struct WPA2_RSN_Auth_Sub_Information_Element
{
	u16				AuthKeyMngtSuiteCount;
	SUITE_SELECTOR	AuthKeyMngtSuite[1];
}__attribute__ ((packed));


struct PMKID_Information_Element
{
	u16				PMKID_Count;
	PMKID pmkid [16] ;
}__attribute__ ((packed));

#endif //enddef _WPA2_
//============================================================
// MAC Frame structure (different type) and subfield structure
//============================================================
struct MAC_frame_control
{
    u8    mac_frame_info; // a combination of the [Protocol Version, Control Type, Control Subtype]
    #ifdef _BIG_ENDIAN_ //20060927 add by anson's endian
    u8    order:1;
    u8    WEP:1;
    u8    more_data:1;
    u8    pwr_mgt:1;
    u8    retry:1;
    u8    more_frag:1;
    u8    from_ds:1;
    u8    to_ds:1;
    #else
    u8    to_ds:1;
    u8    from_ds:1;
    u8    more_frag:1;
    u8    retry:1;
    u8    pwr_mgt:1;
    u8    more_data:1;
    u8    WEP:1;
    u8    order:1;
    #endif
} __attribute__ ((packed));

struct Management_Frame {
    struct MAC_frame_control frame_control; // 2B, ToDS,FromDS,MoreFrag,MoreData,Order=0
    u16		duration;
    u8		DA[MAC_ADDR_LENGTH];			// Addr1
    u8		SA[MAC_ADDR_LENGTH];			// Addr2
    u8		BSSID[MAC_ADDR_LENGTH];			// Addr3
    u16		Sequence_Control;
    // Management Frame Body <= 325 bytes
    // FCS 4 bytes
}__attribute__ ((packed));

// SW-MAC don't Tx/Rx Control-Frame, HW-MAC do it.
struct Control_Frame {
    struct MAC_frame_control frame_control; // ToDS,FromDS,MoreFrag,Retry,MoreData,WEP,Order=0
    u16		duration;
    u8		RA[MAC_ADDR_LENGTH];
    u8		TA[MAC_ADDR_LENGTH];
    u16		FCS;
}__attribute__ ((packed));

struct Data_Frame {
    struct MAC_frame_control frame_control;
    u16		duration;
    u8		Addr1[MAC_ADDR_LENGTH];
    u8		Addr2[MAC_ADDR_LENGTH];
    u8		Addr3[MAC_ADDR_LENGTH];
    u16		Sequence_Control;
    u8		Addr4[MAC_ADDR_LENGTH]; // only exist when ToDS=FromDS=1
    // Data Frame Body <= 2312
    // FCS
}__attribute__ ((packed));

struct Disassociation_Frame_Body
{
    u16    reasonCode;
}__attribute__ ((packed));

struct Association_Request_Frame_Body
{
    u16    capability_information;
    u16    listenInterval;
    u8     Current_AP_Address[MAC_ADDR_LENGTH];//for reassociation only
    // SSID (2+32 bytes)
    // Supported_Rates (2+8 bytes)
}__attribute__ ((packed));

struct Association_Response_Frame_Body
{
    u16    capability_information;
    u16    statusCode;
    u16    Association_ID;
    struct Supported_Rates_Element supportedRates;
}__attribute__ ((packed));

/*struct Reassociation_Request_Frame_Body
{
    u16    capability_information;
    u16    listenInterval;
    u8     Current_AP_Address[MAC_ADDR_LENGTH];
    // SSID (2+32 bytes)
    // Supported_Rates (2+8 bytes)
};*/
// eliminated by WS 07/22/04 comboined with associateion request frame.

struct Reassociation_Response_Frame_Body
{
    u16    capability_information;
    u16    statusCode;
    u16    Association_ID;
    struct Supported_Rates_Element supportedRates;
}__attribute__ ((packed));

struct Deauthentication_Frame_Body
{
    u16    reasonCode;
}__attribute__ ((packed));


struct Probe_Response_Frame_Body
{
    u16    Timestamp;
    u16    Beacon_Interval;
    u16    Capability_Information;
    // SSID
    // Supported_Rates
    // PHY parameter Set (DS Parameters)
    // CF parameter Set
    // IBSS parameter Set
}__attribute__ ((packed));

struct Authentication_Frame_Body
{
    u16    algorithmNumber;
    u16    sequenceNumber;
    u16    statusCode;
    // NB: don't include ChallengeText in this structure
	// struct Challenge_Text_Element sChallengeTextElement; // wkchen added
}__attribute__ ((packed));


#endif // _MAC_Structure_H_


