chewie.state_machines.eap_state_machine module
Loosely based on RFC4137 ‘EAP State Machines’ with some interpretation
- class chewie.state_machines.eap_state_machine.Decision
Bases:
object
- CONTINUE = 'CONTINUE'
- FAILURE = 'FAILURE'
- PASSTHROUGH = 'PASSTHROUGH'
- SUCCESS = 'SUCCESS'
- class chewie.state_machines.eap_state_machine.FullEAPStateMachine(eap_output_queue, radius_output_queue, src_mac, timer_scheduler, auth_handler, failure_handler, logoff_handler, log_prefix)
Bases:
AbstractStateMachine
Based on RFC 4137 section 7 (EAP Full Authenticator). Only acts in passthrough mode (no local method support).
- AAA_IDLE = 'AAA_IDLE'
- AAA_REQUEST = 'AAA_REQUEST'
- AAA_RESPONSE = 'AAA_RESPONSE'
- COMPLETION_STATES = [<State('FAILURE2')@140402059870064>, <State('TIMEOUT_FAILURE2')@140402059004320>, <State('LOGOFF')@140402059006240>, <State('LOGOFF2')@140402059006336>, <State('FAILURE')@140402059006576>, <State('TIMEOUT_FAILURE')@140402059007200>, <State('SUCCESS2')@140402059870160>, <State('SUCCESS')@140402059869728>]
- CORE_TRANSITIONS = [{'conditions': ['is_port_enabled'], 'dest': 'NO_STATE', 'source': 'DISABLED', 'trigger': 'process'}, {'dest': 'SELECT_ACTION', 'source': 'INITIALIZE', 'trigger': 'process'}, {'dest': 'PROPOSED_METHOD', 'source': 'SELECT_ACTION', 'trigger': 'process', 'unless': ['is_decision_failure', 'is_decision_passthrough', 'is_decision_success']}, {'conditions': ['is_decision_failure'], 'dest': 'FAILURE', 'source': 'SELECT_ACTION', 'trigger': 'process'}, {'conditions': ['is_decision_success'], 'dest': 'SUCCESS', 'source': 'SELECT_ACTION', 'trigger': 'process'}, {'conditions': ['is_decision_passthrough'], 'dest': 'INITIALIZE_PASSTHROUGH', 'source': 'SELECT_ACTION', 'trigger': 'process'}, {'dest': 'METHOD_REQUEST', 'source': 'PROPOSED_METHOD', 'trigger': 'process'}, {'dest': 'SEND_REQUEST', 'source': 'METHOD_REQUEST', 'trigger': 'process'}, {'dest': 'IDLE', 'source': 'SEND_REQUEST', 'trigger': 'process'}, {'conditions': ['is_retrans_while_equal_0'], 'dest': 'RETRANSMIT', 'source': 'IDLE', 'trigger': 'process'}, {'conditions': ['is_eap_resp'], 'dest': 'RECEIVED', 'source': 'IDLE', 'trigger': 'process'}, {'conditions': ['is_retrans_count_greater_max_retrans'], 'dest': 'TIMEOUT_FAILURE', 'source': 'RETRANSMIT', 'trigger': 'process'}, {'dest': 'IDLE', 'source': 'RETRANSMIT', 'trigger': 'process', 'unless': ['is_retrans_count_greater_max_retrans']}, {'conditions': ['is_enter_nak'], 'dest': 'NAK', 'source': 'RECEIVED', 'trigger': 'process'}, {'conditions': ['is_enter_integrity_check'], 'dest': 'INTEGRITY_CHECK', 'source': 'RECEIVED', 'trigger': 'process'}, {'dest': 'DISCARD', 'source': 'RECEIVED', 'trigger': 'process', 'unless': ['is_enter_nak', 'is_enter_integrity_check']}, {'dest': 'IDLE', 'source': 'DISCARD', 'trigger': 'process'}, {'dest': 'SELECT_ACTION', 'source': 'NAK', 'trigger': 'process'}, {'conditions': ['is_ignore'], 'dest': 'DISCARD', 'source': 'INTEGRITY_CHECK', 'trigger': 'process'}, {'dest': 'METHOD_RESPONSE', 'source': 'INTEGRITY_CHECK', 'trigger': 'process', 'unless': ['is_ignore']}, {'conditions': ['is_method_state_equal_end'], 'dest': 'SELECT_ACTION', 'source': 'METHOD_RESPONSE', 'trigger': 'process'}, {'dest': 'METHOD_REQUEST', 'source': 'METHOD_RESPONSE', 'trigger': 'process', 'unless': ['is_method_state_equal_end']}, {'conditions': ['is_current_id_none'], 'dest': 'AAA_IDLE', 'source': 'INITIALIZE_PASSTHROUGH', 'trigger': 'process'}, {'dest': 'AAA_REQUEST', 'source': 'INITIALIZE_PASSTHROUGH', 'trigger': 'process', 'unless': ['is_current_id_none']}, {'dest': 'AAA_IDLE', 'source': 'AAA_REQUEST', 'trigger': 'process'}, {'conditions': ['is_aaa_timeout'], 'dest': 'TIMEOUT_FAILURE2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_fail'], 'dest': 'FAILURE2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_success'], 'dest': 'SUCCESS2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_eap_req'], 'dest': 'AAA_RESPONSE', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_eap_no_req'], 'dest': 'DISCARD2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'dest': 'IDLE2', 'source': 'DISCARD2', 'trigger': 'process'}, {'dest': 'SEND_REQUEST2', 'source': 'AAA_RESPONSE', 'trigger': 'process'}, {'dest': 'IDLE2', 'source': 'SEND_REQUEST2', 'trigger': 'process'}, {'conditions': ['is_retrans_while_equal_0'], 'dest': 'RETRANSMIT2', 'source': 'IDLE2', 'trigger': 'process'}, {'conditions': ['is_eap_resp'], 'dest': 'RECEIVED2', 'source': 'IDLE2', 'trigger': 'process'}, {'conditions': ['is_retrans_count_greater_max_retrans'], 'dest': 'TIMEOUT_FAILURE2', 'source': 'RETRANSMIT2', 'trigger': 'process'}, {'dest': 'IDLE2', 'source': 'RETRANSMIT2', 'trigger': 'process', 'unless': ['is_retrans_count_greater_max_retrans']}, {'conditions': ['is_rx_resp', 'is_resp_id_equal_current_id'], 'dest': 'AAA_REQUEST', 'source': 'RECEIVED2', 'trigger': 'process'}, {'conditions': ['is_enter_discard2'], 'dest': 'DISCARD2', 'source': 'RECEIVED2', 'trigger': 'process'}, {'conditions': ['is_logoff'], 'dest': 'LOGOFF', 'source': 'SUCCESS', 'trigger': 'process'}, {'conditions': ['is_logoff'], 'dest': 'LOGOFF2', 'source': 'SUCCESS2', 'trigger': 'process'}]
- DEFAULT_SESSION_TIMEOUT = 3600
- DEFAULT_TIMEOUT = 5
- DISABLED = 'DISABLED'
- DISCARD = 'DISCARD'
- DISCARD2 = 'DISCARD2'
- ERROR_TRANSITIONS = [{'dest': 'DISABLED', 'source': '*', 'trigger': 'process', 'unless': ['is_port_enabled']}, {'conditions': ['is_port_enabled', 'is_eap_restart'], 'dest': 'INITIALIZE', 'source': '*', 'trigger': 'process'}]
- FAILURE = 'FAILURE'
- FAILURE2 = 'FAILURE2'
- FAILURE_STATES = [<State('FAILURE2')@140402059870064>, <State('TIMEOUT_FAILURE2')@140402059004320>, <State('LOGOFF')@140402059006240>, <State('LOGOFF2')@140402059006336>, <State('FAILURE')@140402059006576>, <State('TIMEOUT_FAILURE')@140402059007200>]
- IDLE = 'IDLE'
- IDLE2 = 'IDLE2'
- INITIALIZE = 'INITIALIZE'
- INITIALIZE_PASSTRHOUGH = 'INITIALIZE_PASSTHROUGH'
- INITIAL_STATE = 'DISABLED'
- INTEGRITY_CHECK = 'INTEGRITY_CHECK'
- LOGOFF = 'LOGOFF'
- LOGOFF2 = 'LOGOFF2'
- MAX_RETRANS = 5
- METHOD_REQUEST = 'METHOD_REQUEST'
- METHOD_RESPONSE = 'METHOD_RESPONSE'
- NAK = 'NAK'
- NO_STATE = 'NO_STATE'
- PROGRESS_STATES = [<State('NO_STATE')@140402059007392>, <State('DISABLED')@140402059012672>, <State('INITIALIZE')@140402059044768>, <State('IDLE')@140402059044672>, <State('RECEIVED')@140402059044576>, <State('INTEGRITY_CHECK')@140402059038480>, <State('METHOD_RESPONSE')@140402059038576>, <State('METHOD_REQUEST')@140402059038672>, <State('PROPOSED_METHOD')@140402059038768>, <State('SELECT_ACTION')@140402059037184>, <State('SEND_REQUEST')@140402059037280>, <State('DISCARD')@140402059037376>, <State('NAK')@140402059037472>, <State('RETRANSMIT')@140402059037568>, <State('INITIALIZE_PASSTHROUGH')@140402059037664>, <State('IDLE2')@140402059037760>, <State('RECEIVED2')@140402059037856>, <State('AAA_IDLE')@140402059037952>, <State('AAA_REQUEST')@140402059038048>, <State('AAA_RESPONSE')@140402059050912>, <State('SEND_REQUEST2')@140402059047696>, <State('DISCARD2')@140402059047792>, <State('RETRANSMIT2')@140402059047888>]
- PROPOSE_METHOD = 'PROPOSED_METHOD'
- RADIUS_RETRANSMIT_TIMEOUT = 5
- RECEIVED = 'RECEIVED'
- RECEIVED2 = 'RECEIVED2'
- RETRANSMIT = 'RETRANSMIT'
- RETRANSMIT2 = 'RETRANSMIT2'
- SELECT_ACTION = 'SELECT_ACTION'
- SEND_REQUEST = 'SEND_REQUEST'
- SEND_REQUEST2 = 'SEND_REQUEST2'
- STATES = [<State('FAILURE2')@140402059870064>, <State('TIMEOUT_FAILURE2')@140402059004320>, <State('LOGOFF')@140402059006240>, <State('LOGOFF2')@140402059006336>, <State('FAILURE')@140402059006576>, <State('TIMEOUT_FAILURE')@140402059007200>, <State('SUCCESS2')@140402059870160>, <State('SUCCESS')@140402059869728>, <State('NO_STATE')@140402059007392>, <State('DISABLED')@140402059012672>, <State('INITIALIZE')@140402059044768>, <State('IDLE')@140402059044672>, <State('RECEIVED')@140402059044576>, <State('INTEGRITY_CHECK')@140402059038480>, <State('METHOD_RESPONSE')@140402059038576>, <State('METHOD_REQUEST')@140402059038672>, <State('PROPOSED_METHOD')@140402059038768>, <State('SELECT_ACTION')@140402059037184>, <State('SEND_REQUEST')@140402059037280>, <State('DISCARD')@140402059037376>, <State('NAK')@140402059037472>, <State('RETRANSMIT')@140402059037568>, <State('INITIALIZE_PASSTHROUGH')@140402059037664>, <State('IDLE2')@140402059037760>, <State('RECEIVED2')@140402059037856>, <State('AAA_IDLE')@140402059037952>, <State('AAA_REQUEST')@140402059038048>, <State('AAA_RESPONSE')@140402059050912>, <State('SEND_REQUEST2')@140402059047696>, <State('DISCARD2')@140402059047792>, <State('RETRANSMIT2')@140402059047888>]
- SUCCESS = 'SUCCESS'
- SUCCESS2 = 'SUCCESS2'
- SUCCESS_STATES = [<State('SUCCESS2')@140402059870160>, <State('SUCCESS')@140402059869728>]
- TIMEOUT_FAILURE = 'TIMEOUT_FAILURE'
- TIMEOUT_FAILURE2 = 'TIMEOUT_FAILURE2'
- TRANSITIONS = [{'dest': 'DISABLED', 'source': '*', 'trigger': 'process', 'unless': ['is_port_enabled']}, {'conditions': ['is_port_enabled', 'is_eap_restart'], 'dest': 'INITIALIZE', 'source': '*', 'trigger': 'process'}, {'conditions': ['is_port_enabled'], 'dest': 'NO_STATE', 'source': 'DISABLED', 'trigger': 'process'}, {'dest': 'SELECT_ACTION', 'source': 'INITIALIZE', 'trigger': 'process'}, {'dest': 'PROPOSED_METHOD', 'source': 'SELECT_ACTION', 'trigger': 'process', 'unless': ['is_decision_failure', 'is_decision_passthrough', 'is_decision_success']}, {'conditions': ['is_decision_failure'], 'dest': 'FAILURE', 'source': 'SELECT_ACTION', 'trigger': 'process'}, {'conditions': ['is_decision_success'], 'dest': 'SUCCESS', 'source': 'SELECT_ACTION', 'trigger': 'process'}, {'conditions': ['is_decision_passthrough'], 'dest': 'INITIALIZE_PASSTHROUGH', 'source': 'SELECT_ACTION', 'trigger': 'process'}, {'dest': 'METHOD_REQUEST', 'source': 'PROPOSED_METHOD', 'trigger': 'process'}, {'dest': 'SEND_REQUEST', 'source': 'METHOD_REQUEST', 'trigger': 'process'}, {'dest': 'IDLE', 'source': 'SEND_REQUEST', 'trigger': 'process'}, {'conditions': ['is_retrans_while_equal_0'], 'dest': 'RETRANSMIT', 'source': 'IDLE', 'trigger': 'process'}, {'conditions': ['is_eap_resp'], 'dest': 'RECEIVED', 'source': 'IDLE', 'trigger': 'process'}, {'conditions': ['is_retrans_count_greater_max_retrans'], 'dest': 'TIMEOUT_FAILURE', 'source': 'RETRANSMIT', 'trigger': 'process'}, {'dest': 'IDLE', 'source': 'RETRANSMIT', 'trigger': 'process', 'unless': ['is_retrans_count_greater_max_retrans']}, {'conditions': ['is_enter_nak'], 'dest': 'NAK', 'source': 'RECEIVED', 'trigger': 'process'}, {'conditions': ['is_enter_integrity_check'], 'dest': 'INTEGRITY_CHECK', 'source': 'RECEIVED', 'trigger': 'process'}, {'dest': 'DISCARD', 'source': 'RECEIVED', 'trigger': 'process', 'unless': ['is_enter_nak', 'is_enter_integrity_check']}, {'dest': 'IDLE', 'source': 'DISCARD', 'trigger': 'process'}, {'dest': 'SELECT_ACTION', 'source': 'NAK', 'trigger': 'process'}, {'conditions': ['is_ignore'], 'dest': 'DISCARD', 'source': 'INTEGRITY_CHECK', 'trigger': 'process'}, {'dest': 'METHOD_RESPONSE', 'source': 'INTEGRITY_CHECK', 'trigger': 'process', 'unless': ['is_ignore']}, {'conditions': ['is_method_state_equal_end'], 'dest': 'SELECT_ACTION', 'source': 'METHOD_RESPONSE', 'trigger': 'process'}, {'dest': 'METHOD_REQUEST', 'source': 'METHOD_RESPONSE', 'trigger': 'process', 'unless': ['is_method_state_equal_end']}, {'conditions': ['is_current_id_none'], 'dest': 'AAA_IDLE', 'source': 'INITIALIZE_PASSTHROUGH', 'trigger': 'process'}, {'dest': 'AAA_REQUEST', 'source': 'INITIALIZE_PASSTHROUGH', 'trigger': 'process', 'unless': ['is_current_id_none']}, {'dest': 'AAA_IDLE', 'source': 'AAA_REQUEST', 'trigger': 'process'}, {'conditions': ['is_aaa_timeout'], 'dest': 'TIMEOUT_FAILURE2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_fail'], 'dest': 'FAILURE2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_success'], 'dest': 'SUCCESS2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_eap_req'], 'dest': 'AAA_RESPONSE', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'conditions': ['is_aaa_eap_no_req'], 'dest': 'DISCARD2', 'source': 'AAA_IDLE', 'trigger': 'process'}, {'dest': 'IDLE2', 'source': 'DISCARD2', 'trigger': 'process'}, {'dest': 'SEND_REQUEST2', 'source': 'AAA_RESPONSE', 'trigger': 'process'}, {'dest': 'IDLE2', 'source': 'SEND_REQUEST2', 'trigger': 'process'}, {'conditions': ['is_retrans_while_equal_0'], 'dest': 'RETRANSMIT2', 'source': 'IDLE2', 'trigger': 'process'}, {'conditions': ['is_eap_resp'], 'dest': 'RECEIVED2', 'source': 'IDLE2', 'trigger': 'process'}, {'conditions': ['is_retrans_count_greater_max_retrans'], 'dest': 'TIMEOUT_FAILURE2', 'source': 'RETRANSMIT2', 'trigger': 'process'}, {'dest': 'IDLE2', 'source': 'RETRANSMIT2', 'trigger': 'process', 'unless': ['is_retrans_count_greater_max_retrans']}, {'conditions': ['is_rx_resp', 'is_resp_id_equal_current_id'], 'dest': 'AAA_REQUEST', 'source': 'RECEIVED2', 'trigger': 'process'}, {'conditions': ['is_enter_discard2'], 'dest': 'DISCARD2', 'source': 'RECEIVED2', 'trigger': 'process'}, {'conditions': ['is_logoff'], 'dest': 'LOGOFF', 'source': 'SUCCESS', 'trigger': 'process'}, {'conditions': ['is_logoff'], 'dest': 'LOGOFF2', 'source': 'SUCCESS2', 'trigger': 'process'}]
- aaa_eap_key_available = None
- aaa_eap_key_data = None
- aaa_eap_no_req = None
- aaa_eap_req = None
- aaa_eap_req_data = None
- aaa_eap_resp = None
- aaa_eap_resp_data = None
- aaa_fail = None
- aaa_identity = None
- aaa_idle_state(*args, **kwargs)
Method that gets called for logging
- aaa_method_timeout = None
- aaa_request_state(*args, **kwargs)
Method that gets called for logging
- aaa_response_state(*args, **kwargs)
Method that gets called for logging
- aaa_success = None
- aaa_timeout = None
- build_failure()
Creates an EAP Failure Packet. Returns an EAP packet
- build_success()
Creates an EAP Success Packet. Returns an EAP packet
- calculate_timeout(retrans_count, eap_srtt, eap_rttvar, method_timeout)
https://tools.ietf.org/html/rfc3748#section-4.3 Args:
retrans_count: eap_srtt: eap_rttvar: method_timeout:
- Returns:
Milliseconds
- current_id = None
- current_method = None
- decision = None
- disabled_state(*args, **kwargs)
Method that gets called for logging
- discard2_state(*args, **kwargs)
Method that gets called for logging
- discard_state(*args, **kwargs)
Method that gets called for logging
- eap_fail = None
- eap_key_available = None
- eap_key_data = None
- eap_logoff = None
- eap_no_req = None
- eap_output_messages = None
- eap_req = None
- eap_req_data = None
- eap_resp = None
- eap_resp_data = None
- eap_restart = None
- eap_rttvar = None
- eap_srtt = None
- eap_success = None
- eap_timeout = None
- event(event)
Processes an event. Output is via the eap/radius queue. and again will be of type ***Message. Args:
- failure2_state(*args, **kwargs)
Method that gets called for logging
- failure_state(*args, **kwargs)
Method that gets called for logging
- filter_id = None
- get_id()
Determines the identifier value chosen by the AAA server for the current EAP request. The return value is an integer.
- handle_logoff()
Notify the logoff callback
- handle_message_received()
Main state machine loop
- handle_success()
Notify the success callback and sets a timer event to expire this session
- idle2_state(*args, **kwargs)
Method that gets called for logging
- idle_state(*args, **kwargs)
Method that gets called for logging
- ignore = None
- initialize_passthrough_state(*args, **kwargs)
Method that gets called for logging
- initialize_state(*args, **kwargs)
Method that gets called for logging
- integrity_check_state(*args, **kwargs)
Method that gets called for logging
- is_aaa_eap_no_req()
- is_aaa_eap_req()
- is_aaa_fail()
- is_aaa_success()
- is_aaa_timeout()
- is_current_id_none()
- is_decision_failure()
- is_decision_passthrough()
- is_decision_success()
- is_eap_resp()
- is_eap_restart()
- is_enter_discard2()
- is_enter_integrity_check()
- is_enter_nak()
- is_ignore()
- is_in_progress()
Returns true if the state machine is currently in progress
- is_logoff()
- is_method_state_equal_end()
- is_port_enabled()
- is_resp_id_equal_current_id()
- is_retrans_count_greater_max_retrans()
- is_retrans_while_equal_0()
- is_rx_resp()
- is_success()
Returns true if the state machine currently in a successful completion state and enabled
- last_req_data = None
- logoff = None
- logoff2_state(*args, **kwargs)
Method that gets called for logging
- logoff_state(*args, **kwargs)
Method that gets called for logging
- lower_layer_reset()
Sets variables that are meant to be set by the lower layer RFC4137 5.1.2 (standalone authenticator to Lower Layer)
- machine = None
- message_event_received(event)
Sets variables for the Eap message being received. Args:
event (EventMessageReceived): event being processed.
- method_request_state(*args, **kwargs)
Method that gets called for logging
- method_response_state(*args, **kwargs)
Method that gets called for logging
- method_state = None
- method_timeout = None
- nak_state(*args, **kwargs)
Method that gets called for logging
- next_id()
Determines the next identifier value to use, based on the previous one. Returns:
integer
- override_current_id = None
- parse_eap_resp()
- Returns:
int, int, EAP Type (str)
- port_enabled = None
- port_id_mac = None
- port_status_event_received(event)
Sets variables for the port status change (link up/down) being received. Args:
event (EventPortStatusChange):
- process_radius_message(event)
Process radius message (set and extract radius specific variables)
- propose_method_state(*args, **kwargs)
Method that gets called for logging
- radius_state_attribute = None
- radius_tunnel_private_group_id = None
- received2_state(*args, **kwargs)
Method that gets called for logging
- received_state(*args, **kwargs)
Method that gets called for logging
- reset_state(*args, **kwargs)
Method that gets called for logging
- resp_id = None
- resp_method = None
- retrans_count = None
- retrans_while = None
- retransmit2_state(*args, **kwargs)
Method that gets called for logging
- retransmit_state(*args, **kwargs)
Method that gets called for logging
- rx_resp = None
- select_action_state(*args, **kwargs)
Method that gets called for logging
- send_request2_state(*args, **kwargs)
Method that gets called for logging
- send_request_state(*args, **kwargs)
Method that gets called for logging
- sent_count = 0
- session_timeout = 3600
- session_timeout_event_received()
process session timeout event
- session_timeout_job = None
- set_timer(timeout)
Sets a timer to trigger a retransmit if no packet received.
- set_vars_from_radius(attributes)
Set the statemachine variables from attributes received in the radius message. If variable does not exist in the radius message, it is reset to the default Args:
attributes (dict): attributes to be set.
- src_mac = None
- state = None
- strip_eap_from_radius_packet(radius)
Build a EventRadiusMessageReceived from a radius message
- success2_state(*args, **kwargs)
Method that gets called for logging
- success_state(*args, **kwargs)
Method that gets called for logging
- timeout_failure2_state(*args, **kwargs)
Method that gets called for logging
- timeout_failure_state(*args, **kwargs)
Method that gets called for logging
- timer_expired_event_received(event)
Check if the event has been replied to. and set variables. Args:
event (EventTimerExpired): event to process
- Returns:
True if this event is being ignored and no further processing is required. Otherwise False.
- class chewie.state_machines.eap_state_machine.MPassthrough
Bases:
object
M = Method, so if we wanted to do MD5 locally (not passthrough), we’d Have class MMD5 with it’s own implementation of the methods below
- build_req(current_id)
- check(eap_resp_data)
- Args:
eap_resp_data (Message):
- Returns:
True if packet should be ignored. otherwise False if packet is good.
- done = False
- get_key()
- get_timeout()
- init(src_mac)
- is_done()
- process(eap_resp_data)
- reset()
- src_mac = None