/** @file
  This file provides management service interfaces of 802.11 MAC layer. It is used by
  network applications (and drivers) to establish wireless connection with an access
  point (AP).

  Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.5

**/

#ifndef __EFI_WIFI_PROTOCOL_H__
#define __EFI_WIFI_PROTOCOL_H__

#include <Protocol/WiFi2.h>

#define EFI_WIRELESS_MAC_CONNECTION_PROTOCOL_GUID \
  { \
    0xda55bc9, 0x45f8, 0x4bb4, {0x87, 0x19, 0x52, 0x24, 0xf1, 0x8a, 0x4d, 0x45 } \
  }

typedef struct _EFI_WIRELESS_MAC_CONNECTION_PROTOCOL EFI_WIRELESS_MAC_CONNECTION_PROTOCOL;

///
/// EFI_80211_ACC_NET_TYPE
///
typedef enum {
  IeeePrivate           = 0,
  IeeePrivatewithGuest  = 1,
  IeeeChargeablePublic  = 2,
  IeeeFreePublic        = 3,
  IeeePersonal          = 4,
  IeeeEmergencyServOnly = 5,
  IeeeTestOrExp         = 14,
  IeeeWildcard          = 15
} EFI_80211_ACC_NET_TYPE;

///
/// EFI_80211_ASSOCIATE_RESULT_CODE
///
typedef enum {
  AssociateSuccess,
  AssociateRefusedReasonUnspecified,
  AssociateRefusedCapsMismatch,
  AssociateRefusedExtReason,
  AssociateRefusedAPOutOfMemory,
  AssociateRefusedBasicRatesMismatch,
  AssociateRejectedEmergencyServicesNotSupported,
  AssociateRefusedTemporarily
} EFI_80211_ASSOCIATE_RESULT_CODE;

///
/// EFI_80211_SCAN_RESULT_CODE
///
typedef enum {
  ///
  /// The scan operation finished successfully.
  ///
  ScanSuccess,
  ///
  /// The scan operation is not supported in current implementation.
  ///
  ScanNotSupported
} EFI_80211_SCAN_RESULT_CODE;

///
/// EFI_80211_REASON_CODE
///
typedef enum {
  Ieee80211UnspecifiedReason           = 1,
  Ieee80211PreviousAuthenticateInvalid = 2,
  Ieee80211DeauthenticatedSinceLeaving = 3,
  Ieee80211DisassociatedDueToInactive  = 4,
  Ieee80211DisassociatedSinceApUnable  = 5,
  Ieee80211Class2FrameNonauthenticated = 6,
  Ieee80211Class3FrameNonassociated    = 7,
  Ieee80211DisassociatedSinceLeaving   = 8,
  // ...
} EFI_80211_REASON_CODE;

///
/// EFI_80211_DISASSOCIATE_RESULT_CODE
///
typedef enum {
  ///
  /// Disassociation process completed successfully.
  ///
  DisassociateSuccess,
  ///
  /// Disassociation failed due to any input parameter is invalid.
  ///
  DisassociateInvalidParameters
} EFI_80211_DISASSOCIATE_RESULT_CODE;

///
/// EFI_80211_AUTHENTICATION_TYPE
///
typedef enum {
  ///
  /// Open system authentication, admits any STA to the DS.
  ///
  OpenSystem,
  ///
  /// Shared Key authentication relies on WEP to demonstrate knowledge of a WEP
  /// encryption key.
  ///
  SharedKey,
  ///
  /// FT authentication relies on keys derived during the initial mobility domain
  /// association to authenticate the stations.
  ///
  FastBSSTransition,
  ///
  /// SAE authentication uses finite field cryptography to prove knowledge of a shared
  /// password.
  ///
  SAE
} EFI_80211_AUTHENTICATION_TYPE;

///
/// EFI_80211_AUTHENTICATION_RESULT_CODE
///
typedef enum {
  AuthenticateSuccess,
  AuthenticateRefused,
  AuthenticateAnticLoggingTokenRequired,
  AuthenticateFiniteCyclicGroupNotSupported,
  AuthenticationRejected,
  AuthenticateInvalidParameter
} EFI_80211_AUTHENTICATE_RESULT_CODE;

///
/// EFI_80211_ELEMENT_HEADER
///
typedef struct {
  ///
  /// A unique element ID defined in IEEE 802.11 specification.
  ///
  UINT8    ElementID;
  ///
  /// Specifies the number of octets in the element body.
  ///
  UINT8    Length;
} EFI_80211_ELEMENT_HEADER;

///
/// EFI_80211_ELEMENT_REQ
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER    Hdr;
  ///
  /// Start of elements that are requested to be included in the Probe Response frame.
  /// The elements are listed in order of increasing element ID.
  ///
  UINT8                       RequestIDs[1];
} EFI_80211_ELEMENT_REQ;

///
/// EFI_80211_ELEMENT_SSID
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER    Hdr;
  ///
  /// Service set identifier. If Hdr.Length is zero, this field is ignored.
  ///
  UINT8                       SSId[32];
} EFI_80211_ELEMENT_SSID;

///
/// EFI_80211_SCAN_DATA
///
typedef struct {
  ///
  /// Determines whether infrastructure BSS, IBSS, MBSS, or all, are included in the
  /// scan.
  ///
  EFI_80211_BSS_TYPE        BSSType;
  ///
  /// Indicates a specific or wildcard BSSID. Use all binary 1s to represent all SSIDs.
  ///
  EFI_80211_MAC_ADDRESS     BSSId;
  ///
  /// Length in bytes of the SSId. If zero, ignore SSId field.
  ///
  UINT8                     SSIdLen;
  ///
  /// Specifies the desired SSID or the wildcard SSID. Use NULL to represent all SSIDs.
  ///
  UINT8                     *SSId;
  ///
  /// Indicates passive scanning if TRUE.
  ///
  BOOLEAN                   PassiveMode;
  ///
  /// The delay in microseconds to be used prior to transmitting a Probe frame during
  /// active scanning. If zero, the value can be overridden by an
  /// implementation-dependent default value.
  ///
  UINT32                    ProbeDelay;
  ///
  /// Specifies a list of channels that are examined when scanning for a BSS. If set to
  /// NULL, all valid channels will be scanned.
  ///
  UINT32                    *ChannelList;
  ///
  /// Indicates the minimum time in TU to spend on each channel when scanning. If zero,
  /// the value can be overridden by an implementation-dependent default value.
  ///
  UINT32                    MinChannelTime;
  ///
  /// Indicates the maximum time in TU to spend on each channel when scanning. If zero,
  /// the value can be overridden by an implementation-dependent default value.
  ///
  UINT32                    MaxChannelTime;
  ///
  /// Points to an optionally present element. This is an optional parameter and may be
  /// NULL.
  ///
  EFI_80211_ELEMENT_REQ     *RequestInformation;
  ///
  /// Indicates one or more SSID elements that are optionally present. This is an
  /// optional parameter and may be NULL.
  ///
  EFI_80211_ELEMENT_SSID    *SSIDList;
  ///
  /// Specifies a desired specific access network type or the wildcard access network
  /// type. Use 15 as wildcard access network type.
  ///
  EFI_80211_ACC_NET_TYPE    AccessNetworkType;
  ///
  ///  Specifies zero or more elements. This is an optional parameter and may be NULL.
  ///
  UINT8                     *VendorSpecificInfo;
} EFI_80211_SCAN_DATA;

///
/// EFI_80211_COUNTRY_TRIPLET_SUBBAND
///
typedef struct {
  ///
  /// Indicates the lowest channel number in the subband. It has a positive integer
  /// value less than 201.
  ///
  UINT8    FirstChannelNum;
  ///
  /// Indicates the number of channels in the subband.
  ///
  UINT8    NumOfChannels;
  ///
  /// Indicates the maximum power in dBm allowed to be transmitted.
  ///
  UINT8    MaxTxPowerLevel;
} EFI_80211_COUNTRY_TRIPLET_SUBBAND;

///
/// EFI_80211_COUNTRY_TRIPLET_OPERATE
///
typedef struct {
  ///
  /// Indicates the operating extension identifier. It has a positive integer value of
  /// 201 or greater.
  ///
  UINT8    OperatingExtId;
  ///
  /// Index into a set of values for radio equipment set of rules.
  ///
  UINT8    OperatingClass;
  ///
  /// Specifies aAirPropagationTime characteristics used in BSS operation. Refer the
  /// definition of aAirPropagationTime in IEEE 802.11 specification.
  ///
  UINT8    CoverageClass;
} EFI_80211_COUNTRY_TRIPLET_OPERATE;

///
/// EFI_80211_COUNTRY_TRIPLET
///
typedef union {
  ///
  /// The subband triplet.
  ///
  EFI_80211_COUNTRY_TRIPLET_SUBBAND    Subband;
  ///
  /// The operating triplet.
  ///
  EFI_80211_COUNTRY_TRIPLET_OPERATE    Operating;
} EFI_80211_COUNTRY_TRIPLET;

///
/// EFI_80211_ELEMENT_COUNTRY
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER     Hdr;
  ///
  /// Specifies country strings in 3 octets.
  ///
  UINT8                        CountryStr[3];
  ///
  /// Indicates a triplet that repeated in country element. The number of triplets is
  /// determined by the Hdr.Length field.
  ///
  EFI_80211_COUNTRY_TRIPLET    CountryTriplet[1];
} EFI_80211_ELEMENT_COUNTRY;

///
/// EFI_80211_ELEMENT_DATA_RSN
///
typedef struct {
  ///
  /// Indicates the version number of the RSNA protocol. Value 1 is defined in current
  /// IEEE 802.11 specification.
  ///
  UINT16    Version;
  ///
  /// Specifies the cipher suite selector used by the BSS to protect group address frames.
  ///
  UINT32    GroupDataCipherSuite;
  ///
  /// Indicates the number of pairwise cipher suite selectors that are contained in
  /// PairwiseCipherSuiteList.
  ///
  // UINT16                             PairwiseCipherSuiteCount;
  ///
  /// Contains a series of cipher suite selectors that indicate the pairwise cipher
  /// suites contained in this element.
  ///
  // UINT32                             PairwiseCipherSuiteList[PairwiseCipherSuiteCount];
  ///
  /// Indicates the number of AKM suite selectors that are contained in AKMSuiteList.
  ///
  // UINT16                             AKMSuiteCount;
  ///
  /// Contains a series of AKM suite selectors that indicate the AKM suites contained in
  /// this element.
  ///
  // UINT32                             AKMSuiteList[AKMSuiteCount];
  ///
  /// Indicates requested or advertised capabilities.
  ///
  // UINT16                             RSNCapabilities;
  ///
  /// Indicates the number of PKMIDs in the PMKIDList.
  ///
  // UINT16                             PMKIDCount;
  ///
  /// Contains zero or more PKMIDs that the STA believes to be valid for the destination
  /// AP.
  // UINT8                              PMKIDList[PMKIDCount][16];
  ///
  /// Specifies the cipher suite selector used by the BSS to protect group addressed
  /// robust management frames.
  ///
  // UINT32                             GroupManagementCipherSuite;
} EFI_80211_ELEMENT_DATA_RSN;

///
/// EFI_80211_ELEMENT_RSN
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER      Hdr;
  ///
  /// Points to RSN element. The size of a RSN element is limited to 255 octets.
  ///
  EFI_80211_ELEMENT_DATA_RSN    *Data;
} EFI_80211_ELEMENT_RSN;

///
/// EFI_80211_ELEMENT_EXT_CAP
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER    Hdr;
  ///
  /// Indicates the capabilities being advertised by the STA transmitting the element.
  /// This is a bit field with variable length. Refer to IEEE 802.11 specification for
  /// bit value.
  ///
  UINT8                       Capabilities[1];
} EFI_80211_ELEMENT_EXT_CAP;

///
/// EFI_80211_BSS_DESCRIPTION
///
typedef struct {
  ///
  /// Indicates a specific BSSID of the found BSS.
  ///
  EFI_80211_MAC_ADDRESS        BSSId;
  ///
  /// Specifies the SSID of the found BSS. If NULL, ignore SSIdLen field.
  ///
  UINT8                        *SSId;
  ///
  /// Specifies the SSID of the found BSS. If NULL, ignore SSIdLen field.
  ///
  UINT8                        SSIdLen;
  ///
  /// Specifies the type of the found BSS.
  ///
  EFI_80211_BSS_TYPE           BSSType;
  ///
  /// The beacon period in TU of the found BSS.
  ///
  UINT16                       BeaconPeriod;
  ///
  /// The timestamp of the received frame from the found BSS.
  ///
  UINT64                       Timestamp;
  ///
  /// The advertised capabilities of the BSS.
  ///
  UINT16                       CapabilityInfo;
  ///
  /// The set of data rates that shall be supported by all STAs that desire to join this
  /// BSS.
  ///
  UINT8                        *BSSBasicRateSet;
  ///
  /// The set of data rates that the peer STA desires to use for communication within
  /// the BSS.
  ///
  UINT8                        *OperationalRateSet;
  ///
  /// The information required to identify the regulatory domain in which the peer STA
  /// is located.
  ///
  EFI_80211_ELEMENT_COUNTRY    *Country;
  ///
  /// The cipher suites and AKM suites supported in the BSS.
  ///
  EFI_80211_ELEMENT_RSN        RSN;
  ///
  /// Specifies the RSSI of the received frame.
  ///
  UINT8                        RSSI;
  ///
  /// Specifies the RCPI of the received frame.
  ///
  UINT8                        RCPIMeasurement;
  ///
  /// Specifies the RSNI of the received frame.
  ///
  UINT8                        RSNIMeasurement;
  ///
  /// Specifies the elements requested by the request element of the Probe Request frame.
  /// This is an optional parameter and may be NULL.
  ///
  UINT8                        *RequestedElements;
  ///
  /// Specifies the BSS membership selectors that represent the set of features that
  /// shall be supported by all STAs to join this BSS.
  ///
  UINT8                        *BSSMembershipSelectorSet;
  ///
  /// Specifies the parameters within the Extended Capabilities element that are
  /// supported by the MAC entity. This is an optional parameter and may be NULL.
  ///
  EFI_80211_ELEMENT_EXT_CAP    *ExtCapElement;
} EFI_80211_BSS_DESCRIPTION;

///
/// EFI_80211_SUBELEMENT_INFO
///
typedef struct {
  ///
  /// Indicates the unique identifier within the containing element or sub-element.
  ///
  UINT8    SubElementID;
  ///
  /// Specifies the number of octets in the Data field.
  ///
  UINT8    Length;
  ///
  /// A variable length data buffer.
  ///
  UINT8    Data[1];
} EFI_80211_SUBELEMENT_INFO;

///
/// EFI_80211_MULTIPLE_BSSID
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER     Hdr;
  ///
  /// Indicates the maximum number of BSSIDs in the multiple BSSID set. When Indicator
  /// is set to n, 2n is the maximum number.
  ///
  UINT8                        Indicator;
  ///
  /// Contains zero or more sub-elements.
  ///
  EFI_80211_SUBELEMENT_INFO    SubElement[1];
} EFI_80211_MULTIPLE_BSSID;

///
/// EFI_80211_BSS_DESP_PILOT
///
typedef struct {
  ///
  /// Indicates a specific BSSID of the found BSS.
  ///
  EFI_80211_MAC_ADDRESS       BSSId;
  ///
  /// Specifies the type of the found BSS.
  ///
  EFI_80211_BSS_TYPE          BSSType;
  ///
  /// One octet field to report condensed capability information.
  ///
  UINT8                       ConCapInfo;
  ///
  /// Two octet's field to report condensed country string.
  ///
  UINT8                       ConCountryStr[2];
  ///
  /// Indicates the operating class value for the operating channel.
  ///
  UINT8                       OperatingClass;
  ///
  /// Indicates the operating channel.
  ///
  UINT8                       Channel;
  ///
  /// Indicates the measurement pilot interval in TU.
  ///
  UINT8                       Interval;
  ///
  /// Indicates that the BSS is within a multiple BSSID set.
  ///
  EFI_80211_MULTIPLE_BSSID    *MultipleBSSID;
  ///
  /// Specifies the RCPI of the received frame.
  ///
  UINT8                       RCPIMeasurement;
  ///
  /// Specifies the RSNI of the received frame.
  ///
  UINT8                       RSNIMeasurement;
} EFI_80211_BSS_DESP_PILOT;

///
/// EFI_80211_SCAN_RESULT
///
typedef struct {
  ///
  /// The number of EFI_80211_BSS_DESCRIPTION in BSSDespSet. If zero, BSSDespSet should
  /// be ignored.
  ///
  UINTN                        NumOfBSSDesp;
  ///
  /// Points to zero or more instances of EFI_80211_BSS_DESCRIPTION.
  ///
  EFI_80211_BSS_DESCRIPTION    **BSSDespSet;
  ///
  /// The number of EFI_80211_BSS_DESP_PILOT in BSSDespFromPilotSet. If zero,
  /// BSSDespFromPilotSet should be ignored.
  ///
  UINTN                        NumofBSSDespFromPilot;
  ///
  /// Points to zero or more instances of EFI_80211_BSS_DESP_PILOT.
  ///
  EFI_80211_BSS_DESP_PILOT     **BSSDespFromPilotSet;
  ///
  /// Specifies zero or more elements. This is an optional parameter and may be NULL.
  ///
  UINT8                        *VendorSpecificInfo;
} EFI_80211_SCAN_RESULT;

///
/// EFI_80211_SCAN_DATA_TOKEN
///
typedef struct {
  ///
  /// This Event will be signaled after the Status field is updated by the EFI Wireless
  /// MAC Connection Protocol driver. The type of Event must be EFI_NOTIFY_SIGNAL.
  ///
  EFI_EVENT    Event;
  ///
  /// Will be set to one of the following values:
  ///   EFI_SUCCESS:       Scan operation completed successfully.
  ///   EFI_NOT_FOUND:     Failed to find available BSS.
  ///   EFI_DEVICE_ERROR:  An unexpected network or system error occurred.
  ///   EFI_ACCESS_DENIED: The scan operation is not completed due to some underlying
  ///                      hardware or software state.
  ///   EFI_NOT_READY:     The scan operation is started but not yet completed.
  EFI_STATUS                    Status;
  ///
  /// Pointer to the scan data.
  ///
  EFI_80211_SCAN_DATA           *Data;
  ///
  /// Indicates the scan state.
  ///
  EFI_80211_SCAN_RESULT_CODE    ResultCode;
  ///
  /// Indicates the scan result. It is caller's responsibility to free this buffer.
  ///
  EFI_80211_SCAN_RESULT         *Result;
} EFI_80211_SCAN_DATA_TOKEN;

///
/// EFI_80211_ELEMENT_SUPP_CHANNEL_TUPLE
///
typedef struct {
  ///
  /// The first channel number in a subband of supported channels.
  ///
  UINT8    FirstChannelNumber;
  ///
  /// The number of channels in a subband of supported channels.
  ///
  UINT8    NumberOfChannels;
} EFI_80211_ELEMENT_SUPP_CHANNEL_TUPLE;

///
/// EFI_80211_ELEMENT_SUPP_CHANNEL
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER                Hdr;
  ///
  /// Indicates one or more tuples of (first channel, number of channels).
  ///
  EFI_80211_ELEMENT_SUPP_CHANNEL_TUPLE    Subband[1];
} EFI_80211_ELEMENT_SUPP_CHANNEL;

///
/// EFI_80211_ASSOCIATE_DATA
///
typedef struct {
  ///
  /// Specifies the address of the peer MAC entity to associate with.
  ///
  EFI_80211_MAC_ADDRESS             BSSId;
  ///
  /// Specifies the requested operational capabilities to the AP in 2 octets.
  ///
  UINT16                            CapabilityInfo;
  ///
  /// Specifies a time limit in TU, after which the associate procedure is terminated.
  ///
  UINT32                            FailureTimeout;
  ///
  /// Specifies if in power save mode, how often the STA awakes and listens for the next
  /// beacon frame in TU.
  ///
  UINT32                            ListenInterval;
  ///
  /// Indicates a list of channels in which the STA is capable of operating.
  ///
  EFI_80211_ELEMENT_SUPP_CHANNEL    *Channels;
  ///
  /// The cipher suites and AKM suites selected by the STA.
  ///
  EFI_80211_ELEMENT_RSN             RSN;
  ///
  /// Specifies the parameters within the Extended Capabilities element that are
  /// supported by the MAC entity.  This is an optional parameter and may be NULL.
  ///
  EFI_80211_ELEMENT_EXT_CAP         *ExtCapElement;
  ///
  /// Specifies zero or more elements. This is an optional parameter and may be NULL.
  ///
  UINT8                             *VendorSpecificInfo;
} EFI_80211_ASSOCIATE_DATA;

///
/// EFI_80211_ELEMENT_TIMEOUT_VAL
///
typedef struct {
  ///
  /// Common header of an element.
  ///
  EFI_80211_ELEMENT_HEADER    Hdr;
  ///
  /// Specifies the timeout interval type.
  ///
  UINT8                       Type;
  ///
  /// Specifies the timeout interval value.
  ///
  UINT32                      Value;
} EFI_80211_ELEMENT_TIMEOUT_VAL;

///
/// EFI_80211_ASSOCIATE_RESULT
///
typedef struct {
  ///
  /// Specifies the address of the peer MAC entity from which the association request
  /// was received.
  ///
  EFI_80211_MAC_ADDRESS            BSSId;
  ///
  /// Specifies the operational capabilities advertised by the AP.
  ///
  UINT16                           CapabilityInfo;
  ///
  /// Specifies the association ID value assigned by the AP.
  ///
  UINT16                           AssociationID;
  ///
  /// Indicates the measured RCPI of the corresponding association request frame. It is
  /// an optional parameter and is set to zero if unavailable.
  ///
  UINT8                            RCPIValue;
  ///
  /// Indicates the measured RSNI at the time the corresponding association request
  /// frame was received. It is an optional parameter and is set to zero if unavailable.
  ///
  UINT8                            RSNIValue;
  ///
  /// Specifies the parameters within the Extended Capabilities element that are
  /// supported by the MAC entity.  This is an optional parameter and may be NULL.
  ///
  EFI_80211_ELEMENT_EXT_CAP        *ExtCapElement;
  ///
  /// Specifies the timeout interval when the result code is AssociateRefusedTemporarily.
  ///
  EFI_80211_ELEMENT_TIMEOUT_VAL    TimeoutInterval;
  ///
  /// Specifies zero or more elements. This is an optional parameter and may be NULL.
  ///
  UINT8                            *VendorSpecificInfo;
} EFI_80211_ASSOCIATE_RESULT;

///
/// EFI_80211_ASSOCIATE_DATA_TOKEN
///
typedef struct {
  ///
  /// This Event will be signaled after the Status field is updated by the EFI Wireless
  /// MAC Connection Protocol driver. The type of Event must be EFI_NOTIFY_SIGNAL.
  ///
  EFI_EVENT                          Event;
  ///
  /// Will be set to one of the following values:
  ///   EFI_SUCCESS:      Association operation completed successfully.
  ///   EFI_DEVICE_ERROR: An unexpected network or system error occurred.
  ///
  EFI_STATUS                         Status;
  ///
  /// Pointer to the association data.
  ///
  EFI_80211_ASSOCIATE_DATA           *Data;
  ///
  /// Indicates the association state.
  ///
  EFI_80211_ASSOCIATE_RESULT_CODE    ResultCode;
  ///
  /// Indicates the association result. It is caller's responsibility to free this
  /// buffer.
  ///
  EFI_80211_ASSOCIATE_RESULT         *Result;
} EFI_80211_ASSOCIATE_DATA_TOKEN;

///
/// EFI_80211_DISASSOCIATE_DATA
///
typedef struct {
  ///
  /// Specifies the address of the peer MAC entity with which to perform the
  /// disassociation process.
  ///
  EFI_80211_MAC_ADDRESS    BSSId;
  ///
  /// Specifies the reason for initiating the disassociation process.
  ///
  EFI_80211_REASON_CODE    ReasonCode;
  ///
  /// Zero or more elements, may be NULL.
  ///
  UINT8                    *VendorSpecificInfo;
} EFI_80211_DISASSOCIATE_DATA;

///
/// EFI_80211_DISASSOCIATE_DATA_TOKEN
///
typedef struct {
  ///
  /// This Event will be signaled after the Status field is updated by the EFI Wireless
  /// MAC Connection Protocol driver. The type of Event must be EFI_NOTIFY_SIGNAL.
  ///
  EFI_EVENT    Event;
  ///
  /// Will be set to one of the following values:
  ///   EFI_SUCCESS:       Disassociation operation completed successfully.
  ///   EFI_DEVICE_ERROR:  An unexpected network or system error occurred.
  ///   EFI_ACCESS_DENIED: The disassociation operation is not completed due to some
  ///                      underlying hardware or software state.
  ///   EFI_NOT_READY:     The disassociation operation is started but not yet completed.
  ///
  EFI_STATUS                            Status;
  ///
  /// Pointer to the disassociation data.
  ///
  EFI_80211_DISASSOCIATE_DATA           *Data;
  ///
  /// Indicates the disassociation state.
  ///
  EFI_80211_DISASSOCIATE_RESULT_CODE    ResultCode;
} EFI_80211_DISASSOCIATE_DATA_TOKEN;

///
/// EFI_80211_AUTHENTICATION_DATA
///
typedef struct {
  ///
  /// Specifies the address of the peer MAC entity with which to perform the
  /// authentication process.
  ///
  EFI_80211_MAC_ADDRESS            BSSId;
  ///
  /// Specifies the type of authentication algorithm to use during the authentication
  /// process.
  ///
  EFI_80211_AUTHENTICATION_TYPE    AuthType;
  ///
  /// Specifies a time limit in TU after which the authentication procedure is
  /// terminated.
  ///
  UINT32                           FailureTimeout;
  ///
  /// Specifies the set of elements to be included in the first message of the FT
  /// authentication sequence, may be NULL.
  ///
  UINT8                            *FTContent;
  ///
  /// Specifies the set of elements to be included in the SAE Commit Message or SAE
  /// Confirm Message, may be NULL.
  ///
  UINT8                            *SAEContent;
  ///
  /// Zero or more elements, may be NULL.
  ///
  UINT8                            *VendorSpecificInfo;
} EFI_80211_AUTHENTICATE_DATA;

///
/// EFI_80211_AUTHENTICATION_RESULT
///
typedef struct {
  ///
  /// Specifies the address of the peer MAC entity from which the authentication request
  /// was received.
  ///
  EFI_80211_MAC_ADDRESS    BSSId;
  ///
  /// Specifies the set of elements to be included in the second message of the FT
  /// authentication sequence, may be NULL.
  ///
  UINT8                    *FTContent;
  ///
  /// Specifies the set of elements to be included in the SAE Commit Message or SAE
  /// Confirm Message, may be NULL.
  ///
  UINT8                    *SAEContent;
  ///
  /// Zero or more elements, may be NULL.
  ///
  UINT8                    *VendorSpecificInfo;
} EFI_80211_AUTHENTICATE_RESULT;

///
/// EFI_80211_AUTHENTICATE_DATA_TOKEN
///
typedef struct {
  ///
  /// This Event will be signaled after the Status field is updated by the EFI Wireless
  /// MAC Connection Protocol driver. The type of Event must be EFI_NOTIFY_SIGNAL.
  ///
  EFI_EVENT    Event;
  ///
  /// Will be set to one of the following values:
  ///   EFI_SUCCESS: Authentication operation completed successfully.
  ///   EFI_PROTOCOL_ERROR: Peer MAC entity rejects the authentication.
  ///   EFI_NO_RESPONSE:    Peer MAC entity does not response the authentication request.
  ///   EFI_DEVICE_ERROR:   An unexpected network or system error occurred.
  ///   EFI_ACCESS_DENIED:  The authentication operation is not completed due to some
  ///                       underlying hardware or software state.
  ///   EFI_NOT_READY:      The authentication operation is started but not yet completed.
  ///
  EFI_STATUS                            Status;
  ///
  /// Pointer to the authentication data.
  ///
  EFI_80211_AUTHENTICATE_DATA           *Data;
  ///
  /// Indicates the association state.
  ///
  EFI_80211_AUTHENTICATE_RESULT_CODE    ResultCode;
  ///
  /// Indicates the association result. It is caller's responsibility to free this
  /// buffer.
  ///
  EFI_80211_AUTHENTICATE_RESULT         *Result;
} EFI_80211_AUTHENTICATE_DATA_TOKEN;

///
/// EFI_80211_DEAUTHENTICATE_DATA
///
typedef struct {
  ///
  /// Specifies the address of the peer MAC entity with which to perform the
  /// deauthentication process.
  ///
  EFI_80211_MAC_ADDRESS    BSSId;
  ///
  /// Specifies the reason for initiating the deauthentication process.
  ///
  EFI_80211_REASON_CODE    ReasonCode;
  ///
  /// Zero or more elements, may be NULL.
  ///
  UINT8                    *VendorSpecificInfo;
} EFI_80211_DEAUTHENTICATE_DATA;

///
/// EFI_80211_DEAUTHENTICATE_DATA_TOKEN
///
typedef struct {
  ///
  /// This Event will be signaled after the Status field is updated by the EFI Wireless
  /// MAC Connection Protocol driver. The type of Event must be EFI_NOTIFY_SIGNAL.
  ///
  EFI_EVENT    Event;
  ///
  /// Will be set to one of the following values:
  ///   EFI_SUCCESS:       Deauthentication operation completed successfully.
  ///   EFI_DEVICE_ERROR:  An unexpected network or system error occurred.
  ///   EFI_ACCESS_DENIED: The deauthentication operation is not completed due to some
  ///                      underlying hardware or software state.
  ///   EFI_NOT_READY:     The deauthentication operation is started but not yet
  ///                      completed.
  ///
  EFI_STATUS                       Status;
  ///
  /// Pointer to the deauthentication data.
  ///
  EFI_80211_DEAUTHENTICATE_DATA    *Data;
} EFI_80211_DEAUTHENTICATE_DATA_TOKEN;

/**
  Request a survey of potential BSSs that administrator can later elect to try to join.

  The Scan() function returns the description of the set of BSSs detected by the scan
  process. Passive scan operation is performed by default.

  @param[in]  This                Pointer to the EFI_WIRELESS_MAC_CONNECTION_PROTOCOL
                                  instance.
  @param[in]  Data                Pointer to the scan token.

  @retval EFI_SUCCESS             The operation completed successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  Data is NULL.
                                  Data->Data is NULL.
  @retval EFI_UNSUPPORTED         One or more of the input parameters are not supported
                                  by this implementation.
  @retval EFI_ALREADY_STARTED     The scan operation is already started.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_WIRELESS_MAC_CONNECTION_SCAN)(
  IN EFI_WIRELESS_MAC_CONNECTION_PROTOCOL        *This,
  IN EFI_80211_SCAN_DATA_TOKEN                   *Data
  );

/**
  Request an association with a specified peer MAC entity that is within an AP.

  The Associate() function provides the capability for MAC layer to become associated
  with an AP.

  @param[in]  This                Pointer to the EFI_WIRELESS_MAC_CONNECTION_PROTOCOL
                                  instance.
  @param[in]  Data                Pointer to the association token.

  @retval EFI_SUCCESS             The operation completed successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  Data is NULL.
                                  Data->Data is NULL.
  @retval EFI_UNSUPPORTED         One or more of the input parameters are not supported
                                  by this implementation.
  @retval EFI_ALREADY_STARTED     The association process is already started.
  @retval EFI_NOT_READY           Authentication is not performed before this association
                                  process.
  @retval EFI_NOT_FOUND           The specified peer MAC entity is not found.
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_WIRELESS_MAC_CONNECTION_ASSOCIATE)(
  IN EFI_WIRELESS_MAC_CONNECTION_PROTOCOL        *This,
  IN EFI_80211_ASSOCIATE_DATA_TOKEN              *Data
  );

/**
  Request a disassociation with a specified peer MAC entity.

  The Disassociate() function is invoked to terminate an existing association.
  Disassociation is a notification and cannot be refused by the receiving peer except
  when management frame protection is negotiated and the message integrity check fails.

  @param[in]  This                Pointer to the EFI_WIRELESS_MAC_CONNECTION_PROTOCOL
                                  instance.
  @param[in]  Data                Pointer to the disassociation token.

  @retval EFI_SUCCESS             The operation completed successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  Data is NULL.
  @retval EFI_ALREADY_STARTED     The disassociation process is already started.
  @retval EFI_NOT_READY           The disassociation service is invoked to a
                                  nonexistent association relationship.
  @retval EFI_NOT_FOUND           The specified peer MAC entity is not found.
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_WIRELESS_MAC_CONNECTION_DISASSOCIATE)(
  IN EFI_WIRELESS_MAC_CONNECTION_PROTOCOL        *This,
  IN EFI_80211_DISASSOCIATE_DATA_TOKEN           *Data
  );

/**
  Request the process of establishing an authentication relationship with a peer MAC
  entity.

  The Authenticate() function requests authentication with a specified peer MAC entity.
  This service might be time-consuming thus is designed to be invoked independently of
  the association service.

  @param[in]  This                Pointer to the EFI_WIRELESS_MAC_CONNECTION_PROTOCOL
                                  instance.
  @param[in]  Data                Pointer to the authentication token.

  @retval EFI_SUCCESS             The operation completed successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  Data is NULL.
                                  Data.Data is NULL.
  @retval EFI_UNSUPPORTED         One or more of the input parameters are not supported
                                  by this implementation.
  @retval EFI_ALREADY_STARTED     The authentication process is already started.
  @retval EFI_NOT_FOUND           The specified peer MAC entity is not found.
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_WIRELESS_MAC_CONNECTION_AUTHENTICATE)(
  IN EFI_WIRELESS_MAC_CONNECTION_PROTOCOL        *This,
  IN EFI_80211_AUTHENTICATE_DATA_TOKEN           *Data
  );

/**
  Invalidate the authentication relationship with a peer MAC entity.

  The Deauthenticate() function requests that the authentication relationship with a
  specified peer MAC entity be invalidated. Deauthentication is a notification and when
  it is sent out the association at the transmitting station is terminated.

  @param[in]  This                Pointer to the EFI_WIRELESS_MAC_CONNECTION_PROTOCOL
                                  instance.
  @param[in]  Data                Pointer to the deauthentication token.

  @retval EFI_SUCCESS             The operation completed successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  Data is NULL.
                                  Data.Data is NULL.
  @retval EFI_ALREADY_STARTED     The deauthentication process is already started.
  @retval EFI_NOT_READY           The deauthentication service is invoked to a
                                  nonexistent association or authentication relationship.
  @retval EFI_NOT_FOUND           The specified peer MAC entity is not found.
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_WIRELESS_MAC_CONNECTION_DEAUTHENTICATE)(
  IN EFI_WIRELESS_MAC_CONNECTION_PROTOCOL        *This,
  IN EFI_80211_DEAUTHENTICATE_DATA_TOKEN         *Data
  );

///
/// The EFI_WIRELESS_MAC_CONNECTION_PROTOCOL is designed to provide management service
/// interfaces for the EFI wireless network stack to establish wireless connection with
/// AP. An EFI Wireless MAC Connection Protocol instance will be installed on each
/// communication device that the EFI wireless network stack runs on.
///
struct _EFI_WIRELESS_MAC_CONNECTION_PROTOCOL {
  EFI_WIRELESS_MAC_CONNECTION_SCAN              Scan;
  EFI_WIRELESS_MAC_CONNECTION_ASSOCIATE         Associate;
  EFI_WIRELESS_MAC_CONNECTION_DISASSOCIATE      Disassociate;
  EFI_WIRELESS_MAC_CONNECTION_AUTHENTICATE      Authenticate;
  EFI_WIRELESS_MAC_CONNECTION_DEAUTHENTICATE    Deauthenticate;
};

extern EFI_GUID  gEfiWiFiProtocolGuid;

#endif
