windows-nt/Source/XPSP1/NT/net/ias/providers/ntuser/eap/eapfsm.h
2020-09-26 16:20:57 +08:00

106 lines
2.7 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// eapfsm.h
//
// SYNOPSIS
//
// Declares the class EAPFSM
//
// MODIFICATION HISTORY
//
// 08/26/1998 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _EAPFSM_H_
#define _EAPFSM_H_
#if _MSC_VER >= 1000
#pragma once
#endif
#include <raseapif.h>
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// EAPFSM
//
// DESCRIPTION
//
// Implements a Finite State Machine governing the EAP session lifecycle.
// The state machine must be shown all incoming packets and all outgoing
// actions. The main purpose of the FSM is to decide how to respond to
// incoming messages.
//
///////////////////////////////////////////////////////////////////////////////
class EAPFSM
{
public:
EAPFSM(BYTE eapType) throw ()
: eapType(eapType),
state(0),
naks(0)
{ }
// Actions in response to messages.
enum Action
{
MAKE_MESSAGE, // Invoke RasEapMakeMessage.
REPLAY_LAST, // Replay the last response from the DLL.
FAIL_NEGOTIATE, // Negotiation failed -- reject the user.
DISCARD // Unexpected packet -- silently discard.
};
// Called whenever the EAP extension DLL generates a new response.
void onDllEvent(
PPP_EAP_ACTION action,
const PPP_EAP_PACKET& sendPacket
) throw ();
// Called whenever a new packet is received.
Action onReceiveEvent(
const PPP_EAP_PACKET& recvPkt
) throw ();
protected:
// Returns TRUE if the packet is an expected reponse.
BOOL isExpected(const PPP_EAP_PACKET& recvPkt) const throw ()
{
return (recvPkt.Id == expectedId) || passive;
}
// Returns TRUE if the packet is a repeat.
BOOL isRepeat(const PPP_EAP_PACKET& recvPkt) const throw ()
{
return (recvPkt.Id == lastId) && (recvPkt.Data[0] == lastType);
}
/////////
// Various states for an EAP session.
/////////
enum State
{
STATE_INITIAL = 0,
STATE_NEGOTIATING = 1,
STATE_ACTIVE = 2,
STATE_DONE = 3
};
BYTE eapType; // EAP type being negotiated.
BYTE state; // State of the session.
BYTE naks; // Number of NAK's received so far.
BYTE passive; // Non-zero if we're in passive listening mode.
BYTE lastId; // Last packet ID received.
BYTE lastType; // Last packet type received.
BYTE expectedId; // Next packet ID expected.
};
#endif // _EAPFSM_H_