状态机迁移通过定义“通用宏”实现
代码路径
wpa_supplicant-2.10/src/utils/state_machine.h
1.状态转换
SM_STEP(machine)
----》SM_STEP_RUN(machine)
wpas调用“SM_STEP_RUN”,通过“通用宏”调用状态迁移实现函数SM_STEP()
2.进入某个状态后EA
SM_STATE(machine, state)
---->SM_ENTER(machine, state)
---->SM_ENTER_GLOBAL(machine, state) utc直接进入
wpas调用SM_ENTER或SM_ENTER_GLOBAL,通过通用宏进入EA实现函数SM_STATE
3.进入某个状态后打印
SM_ENTRY(machine, state)
状态机使用到的参数都声明在sm结构体中
struct eapol_sm ------ EAPOL状态机的状态类型、变量、处理函数
struct eap_sm ------EAP状态机的状态类型和处理函数
在eap_i.h中还有些EAP变量
举例:关联流程状态切换
wpa_supplicant_event_assoc
-----》eapol_sm_notify_portEnabled(wpa_s->eapol, true);
-----》eapol_sm_step(sm)
-----》进入状态机的联动,循环处理各个状态机的状态变换,直到4个状态机稳定
-----〉SM_STEP_RUN(SUPP_PAE) ----》 SM_STEP(SUPP_PAE)进入PAE状态机
-----〉SM_STEP_RUN(KEY_RX) ----》 SM_STEP(KEY_RX)进入key状态机
-----〉SM_STEP_RUN(SUPP_BE) -----》 SM_STEP(SUPP_BE)进入BE状态机
-----〉eap_peer_sm_step(sm->eap) 返回零EAP状态无变化
日志会打印“EAPOL: SUPP BE entering state IDLE"等状态转换