
# Copyright 2017-present Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


States:
    ST_EAP_SETUP:
        Events:
            EVT_EAP_SETUP:
                Actions:
                    - _eapSetup
                NextState: ST_EAP_START
    ST_EAP_START:
        Events:
            EVT_EAP_START:
                Actions:
                    - _eapStart
                NextState: ST_EAP_ID_REQ
    ST_EAP_ID_REQ:
        Events:
            EVT_EAP_ID_REQ:
                Actions:
                    - _eapIdReq
                NextState: ST_EAP_PAP_USER_REQ
    ST_EAP_PAP_USER_REQ:
        Events:
            EVT_EAP_PAP_USER_REQ:
                Actions:
                    - _eapPAPUserReq
                NextState: ST_EAP_PAP_PASSWD_REQ
    ST_EAP_PAP_PASSWD_REQ:
        Events:
            EVT_EAP_PAP_PASSWD_REQ:
                Actions:
                    - _eapPAPPassReq
                NextState: ST_EAP_PAP_DONE
        
