/*++

Copyright (c) 1999, Microsoft Corporation

Module Name:

    eapol.h

Abstract:

    This module contains declarations which will be used by other processes.
    This may be placed in sdk\inc


Revision History:

    sachins, Apr 23 2000, Created

--*/


#ifndef _EAPOL_H_
#define _EAPOL_H_

//
// Structure:   EAPOL_STATS
//

typedef struct _EAPOL_STATS 
{
    DWORD           dwEAPOLFramesRcvd;
    DWORD           dwEAPOLFramesXmt;
    DWORD           dwEAPOLStartFramesXmt;
    DWORD           dwEAPOLLogoffFramesXmt;
    DWORD           dwEAPRespIdFramesXmt;
    DWORD           dwEAPRespFramesXmt;
    DWORD           dwEAPReqIdFramesRcvd;
    DWORD           dwEAPReqFramesRcvd;
    DWORD           dwEAPOLInvalidFramesRcvd;
    DWORD           dwEAPLengthErrorFramesRcvd;
    DWORD           dwEAPOLLastFrameVersion;
    BYTE            bEAPOLLastFrameSource[6];      // assuming 6-byte MAC addr
} EAPOL_STATS, *PEAPOL_STATS;

//
// Structure:   EAPOL_CONFIG
//

typedef struct _EAPOL_CONFIG 
{

    DWORD           dwheldPeriod;       // Time in seconds, for which the
                                        // port will be held in HELD state
    DWORD           dwauthPeriod;       // Time in seconds, for which the 
                                        // port will wait in AUTHENTICATING/
                                        // ACQUIRED state waiting for requests
    DWORD           dwstartPeriod;      // Time in seconds, the port will
                                        // wait in CONNECTING state, before
                                        // re-issuing EAPOL_START packet
    DWORD           dwmaxStart;         // Max number of EAPOL_Start packets
                                        // that can be sent out without any
                                        // response

} EAPOL_CONFIG, *PEAPOL_CONFIG;

//
// EAPOL states
//

typedef enum _EAPOL_STATE 
{
    EAPOLSTATE_LOGOFF,
    EAPOLSTATE_DISCONNECTED,
    EAPOLSTATE_CONNECTING,
    EAPOLSTATE_ACQUIRED,
    EAPOLSTATE_AUTHENTICATING,
    EAPOLSTATE_HELD,
    EAPOLSTATE_AUTHENTICATED
} EAPOL_STATE;

//
// Structure: EAPOL_CUSTOM_AUTH_DATA
//

typedef struct _EAPOL_CUSTOM_AUTH_DATA
{
    DWORD       dwSizeOfCustomAuthData;
    BYTE        pbCustomAuthData[1];
} EAPOL_CUSTOM_AUTH_DATA, *PEAPOL_CUSTOM_AUTH_DATA;

//
// Structure: EAPOL_EAP_UI_DATA
//

typedef struct _EAPOL_EAP_UI_DATA
{
    DWORD       dwContextId;
    PBYTE       pEapUIData;
    DWORD       dwSizeOfEapUIData;
} EAPOL_EAP_UI_DATA, *PEAPOL_EAP_UI_DATA;


// Definitions common to elport.c and eleap.c

//
// Defines states for the EAP protocol.
//

typedef enum _EAPSTATE 
{
    EAPSTATE_Initial,
    EAPSTATE_IdentityRequestSent,
    EAPSTATE_Working,
    EAPSTATE_EapPacketSentToAuthServer,
    EAPSTATE_EapPacketSentToClient,
    EAPSTATE_NotificationSentToClient

}   EAPSTATE;

typedef enum _EAPTYPE 
{
    EAPTYPE_Identity    = 1,
    EAPTYPE_Notification,
    EAPTYPE_Nak,
    EAPTYPE_MD5Challenge,
    EAPTYPE_SKey,
    EAPTYPE_GenericTokenCard

} EAPTYPE;

//
// Actions that need to be performed on EAP data after it is processed
//

typedef enum _ELEAP_ACTION
{
    ELEAP_NoAction,
    ELEAP_Done,
    ELEAP_SendAndDone,
    ELEAP_Send
} ELEAP_ACTION;


//
// EAPOL Authentication Types - Used for MACHINE_AUTH
//

typedef enum _EAPOL_AUTHENTICATION_TYPE
{
    EAPOL_UNAUTHENTICATED_ACCESS,
    EAPOL_USER_AUTHENTICATION,
    EAPOL_MACHINE_AUTHENTICATION
} EAPOL_AUTHENTICATION_TYPE;


#endif  // _EAPOL_H_