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:

event: should have message attribute which is of the ***Message types (e.g. SuccessMessage, IdentityMessage,…)

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
class chewie.state_machines.eap_state_machine.MethodState

Bases: object

CONTINUE = 'CONTINUE'
END = 'END'
EXPANDED_NAK = 'EXPANDED_NAK'
IDENTITY = 'IDENTITY'
NAK = 'NAK'
NOTIFICATION = 'NOTIFICATION'
PROPOSED = 'PROPOSED'
class chewie.state_machines.eap_state_machine.Policy

Bases: object

Fleshed out enough to support passthrough mode.

static get_decision(eap_resp_data)
static get_next_method(eap_resp_data)
static update()