summaryrefslogtreecommitdiff
path: root/cesar/cp/eoc/fsm
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/cp/eoc/fsm')
-rw-r--r--cesar/cp/eoc/fsm/Config1
-rw-r--r--cesar/cp/eoc/fsm/Module40
-rw-r--r--cesar/cp/eoc/fsm/src/fsm/cp.conf6
-rw-r--r--cesar/cp/eoc/fsm/src/fsm/cp_eoc_cco.fsm220
-rw-r--r--cesar/cp/eoc/fsm/src/fsm/cp_eoc_sta.fsm253
-rw-r--r--cesar/cp/eoc/fsm/src/fsm/template_defs.h52
-rw-r--r--cesar/cp/eoc/fsm/src/fsm/template_tables.h46
-rw-r--r--cesar/cp/eoc/fsm/src/tables.c37
-rw-r--r--cesar/cp/eoc/fsm/stub/Module4
-rw-r--r--cesar/cp/eoc/fsm/stub/src/fsm_stub.c87
-rw-r--r--cesar/cp/eoc/fsm/test/utest/Config3
-rw-r--r--cesar/cp/eoc/fsm/test/utest/Makefile14
-rw-r--r--cesar/cp/eoc/fsm/test/utest/inc/scenario_defs.h135
-rw-r--r--cesar/cp/eoc/fsm/test/utest/override/cp/inc/context.h35
-rw-r--r--cesar/cp/eoc/fsm/test/utest/override/cp/sta/core/core.h26
-rw-r--r--cesar/cp/eoc/fsm/test/utest/src/actions.c97
-rw-r--r--cesar/cp/eoc/fsm/test/utest/src/fsm_stub.c263
-rw-r--r--cesar/cp/eoc/fsm/test/utest/src/test_fsm.c477
-rw-r--r--cesar/cp/eoc/fsm/test/utest/src/utest.fsm86
19 files changed, 1882 insertions, 0 deletions
diff --git a/cesar/cp/eoc/fsm/Config b/cesar/cp/eoc/fsm/Config
new file mode 100644
index 0000000000..9471e4bb3a
--- /dev/null
+++ b/cesar/cp/eoc/fsm/Config
@@ -0,0 +1 @@
+CONFIG_CP_FSM_DEF = "cp/eoc/fsm/src/fsm/cp_eoc_cco.fsm"
diff --git a/cesar/cp/eoc/fsm/Module b/cesar/cp/eoc/fsm/Module
new file mode 100644
index 0000000000..1dd483c94c
--- /dev/null
+++ b/cesar/cp/eoc/fsm/Module
@@ -0,0 +1,40 @@
+SOURCES := tables.c
+
+MODULES := cp/fsm
+
+ifndef $(MODULE_VAR)_ONCE
+$(MODULE_VAR)_ONCE := 1$(CONFIG_CP_FSM_DEF)
+
+cp_fsm_defs_h := $(OBJ_INC_DIR)/cp_fsm_defs.h
+cp_fsm_tables_h = $(OBJ_INC_DIR)/cp_fsm_tables.h
+CLEAN_FILES += $(cp_fsm_defs_h) $(cp_fsm_tables_h)
+
+COMPILE_DEPS += $(cp_fsm_defs_h)
+
+cp_fsm_deps = $(CONFIG_CP_FSM_DEF:"%"=%) \
+ $(call src2src,cp.conf template_defs.h \
+ template_tables.h,$(MODULE)/src/fsm)
+
+$(cp_fsm_defs_h) $(cp_fsm_tables_h): $(cp_fsm_deps) $(DFAGEN) \
+ $(OBJ_INC_DIR_STAMP)
+ echo $(cp_fsm_deps) ; \
+ python $(DFAGEN) -O $(OBJ_INC_DIR) \
+ -o c -d $< -c $(filter %.conf,$^) -p cp_fsm
+
+CLEAN_FILES += $(OBJ_DIR)/cp_fsm.png $(OBJ_DIR)/cp_fsm.dot
+
+$(OBJ_DIR)/cp_fsm.png: $(OBJ_DIR)/cp_fsm.dot $(OBJ_DIR_STAMP)
+ dot -Tpng -o $@ $<
+
+$(OBJ_DIR)/cp_fsm.dot: $(cp_fsm_deps) $(DFAGEN) $(OBJ_DIR_STAMP)
+ python $(DFAGEN) -O $(OBJ_DIR) -o dot -d $< -p cp_fsm
+
+$(call src2obj,cp/eoc/fsm/src/tables.c,target): $(cp_fsm_tables_h)
+
+else
+# This module rules depend on a configuration item, it need work to be used in
+# several build type.
+ifneq ($($(MODULE_VAR)_ONCE),1$(CONFIG_CP_FSM_DEF))
+$(error Module not safe for multiple build types)
+endif
+endif
diff --git a/cesar/cp/eoc/fsm/src/fsm/cp.conf b/cesar/cp/eoc/fsm/src/fsm/cp.conf
new file mode 100644
index 0000000000..2c50e8d998
--- /dev/null
+++ b/cesar/cp/eoc/fsm/src/fsm/cp.conf
@@ -0,0 +1,6 @@
+[user]
+template-dir = .
+
+[templates]
+template_defs.h = %_defs.h
+template_tables.h = %_tables.h
diff --git a/cesar/cp/eoc/fsm/src/fsm/cp_eoc_cco.fsm b/cesar/cp/eoc/fsm/src/fsm/cp_eoc_cco.fsm
new file mode 100644
index 0000000000..94e305ad51
--- /dev/null
+++ b/cesar/cp/eoc/fsm/src/fsm/cp_eoc_cco.fsm
@@ -0,0 +1,220 @@
+Control Plane CCO FSM
+ CCO FSM for control plane
+
+States:
+ STOPPED
+ STARTED
+ POWER_ON
+ CCO
+ BCCO
+ STOPPING
+
+Events:
+ BEACON
+ BEACON_NOT_RECEIVED
+ BEACON_TIMER_EXPIRES
+ BEACON_WITH_SAME_NID
+ HOIP_EXPIRED
+ HANDOVER_DISCOVERED_STA
+ HANDOVER_DISCOVER_PROCESS_DONE
+ nek_timeout
+ cco__nek_change
+ nek_request
+ to_leave
+ cco__snid_conflict
+ to_poweron
+ to_stop
+ rx_beacon
+ no_beacons
+ net_list_empty
+ sta_status_changed
+ stopped
+ first_com_with_assoc_sta
+ leave_remove_delay
+ discover_info_updated
+ whoru_timeout
+
+ DRV_MAC_STOP
+ MULTI_STA_MME
+
+ DRV_STA_SET_MAC_ADDR_REQ
+ DRV_STA_SET_CCO_PREF_REQ
+ DRV_STA_SET_WAS_CCO_REQ
+ DRV_STA_SET_NPW_REQ
+ DRV_STA_SET_DPW_REQ
+ DRV_STA_SET_SL_REQ
+ DRV_STA_SET_NID_REQ
+ DRV_STA_SET_M_STA_HFID_REQ
+ DRV_STA_SET_U_STA_HFID_REQ
+ DRV_STA_SET_AVLN_HFID_REQ
+ DRV_STA_SET_TONEMASK_REQ
+ DRV_STA_MAC_START_REQ
+ DRV_STA_MAC_STOP_REQ
+ DRV_STA_SC_REQ
+ DRV_STA_SET_KEY_REQ
+ DRV_STA_SET_DAK_REQ
+ DRV_STA_GET_KEY_REQ
+ DRV_STA_STATUS_REQ
+ DRV_STA_SET_CONFIG_REQ
+ DRV_EOC_STA_SET_SLAVE_CONFIG_REQ
+ DRV_EOC_STA_SET_EOC_CONFIG_REQ
+ DRV_MCAST_SET_LIST_REQ
+ DRV_STA_FORCE_ROLE_REQ
+
+ VS_GET_TONEMAP_REQ
+ VS_GET_SNR_REQ
+ VS_GET_LINK_STATS_REQ
+ VS_GET_SPECTRUM_REQ
+ VS_GET_AMP_MAP_REQ
+ VS_GET_STATS_REQ
+ VS_GET_CE_STATS_REQ
+ VS_GET_PB_STATS_REQ
+ VS_GET_MACTOTEI_REQ
+ VS_GET_ATTENUATION_LIST_REQ
+
+ VS_EOC_GET_TOPO_REQ
+ VS_EOC_CCO_SET_WL_REQ
+ VS_EOC_CCO_GET_WL_REQ
+ VS_EOC_CCO_SET_OUT_LEV_IND
+ VS_EOC_SET_PORTS_REQ
+ VS_EOC_CCO_GET_PORTS_REQ
+ VS_EOC_CCO_SET_SERVICES_REQ
+ VS_EOC_CCO_GET_SERVICES_REQ
+ VS_EOC_GET_INFO_REQ
+ VS_EOC_DIAGNOSTIC_INFO_REQ
+ VS_EOC_GET_REAL_TIME_STATISTICS_REQ
+
+ IMAC_GET_DISCOVER_LIST_REQ
+
+ CC_DISCOVER_LIST_REQ
+ CC_DISCOVER_LIST_CNF
+ CC_WHO_RU_REQ
+ CC_WHO_RU_CNF
+ CC_ASSOC_REQ
+ CC_ASSOC_CNF
+ CC_LEAVE_REQ
+ CC_LEAVE_CNF
+ CC_LEAVE_IND
+ CC_LEAVE_RSP
+ CC_SET_TEI_MAP_REQ
+ CC_SET_TEI_MAP_IND
+ CC_RELAY_REQ
+ CC_RELAY_IND
+ CC_HANDOVER_CNF
+ CC_HANDOVER_REQ
+ CC_HANDOVER_INFO_IND
+ CC_HANDOVER_INFO_RSP
+ CM_UNASSOCIATED_STA_IND
+ CM_SET_KEY_REQ
+ CM_SET_KEY_CNF
+ CM_SET_KEY_REQ_PID1
+ CM_SET_KEY_CNF_PID1
+ CM_SET_KEY_REQ_PID3
+ CM_SET_KEY_CNF_PID3
+ CM_GET_KEY_REQ
+ CM_GET_KEY_CNF
+ CM_GET_KEY_REQ_PID0
+ CM_GET_KEY_CNF_PID0
+ CM_GET_KEY_REQ_PID3
+ CM_GET_KEY_CNF_PID3
+ CM_SC_JOIN_REQ
+ CM_SC_JOIN_CNF
+ CM_CHAN_EST_IND
+ CM_TM_UPDATE_IND
+ CM_AMP_MAP_REQ
+ CM_AMP_MAP_CNF
+ CM_BRG_INFO_REQ
+ CM_BRG_INFO_CNF
+ CM_STA_CAP_REQ
+ CM_STA_CAP_CNF
+ CM_NW_INFO_REQ
+ CM_NW_INFO_CNF
+ CM_NW_STATS_REQ
+ CM_NW_STATS_CNF
+ CM_LINK_STATS_REQ
+ CM_HFID_REQ
+ CM_HFID_CNF
+ CM_MME_ERROR_IND
+
+STOPPED:
+ DRV_STA_SET_MAC_ADDR_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_mac_addr_req]
+ DRV_STA_SET_CCO_PREF_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_cco_pref_req]
+ DRV_STA_SET_WAS_CCO_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_was_cco_req]
+ DRV_STA_SET_DPW_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_dpw_req]
+ DRV_STA_SET_NPW_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_npw_req]
+ DRV_STA_SET_NID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_nid_req]
+ DRV_STA_SET_M_STA_HFID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_m_sta_hfid_req]
+ DRV_STA_SET_U_STA_HFID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_u_sta_hfid_req]
+ DRV_STA_SET_AVLN_HFID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_avln_hfid_req]
+ DRV_STA_SET_SL_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_sl_req]
+ DRV_STA_SET_TONEMASK_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_tonemask_req]
+ DRV_STA_SET_KEY_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_key_req]
+ DRV_STA_SET_DAK_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_dak_req]
+ DRV_STA_MAC_START_REQ -> STARTED [cp_sta_action_drv__stopped__drv_sta_mac_start_req]
+ DRV_STA_SET_CONFIG_REQ -> . [cp_sta_action_drv__drv_sta_set_config_req]
+ DRV_EOC_STA_SET_SLAVE_CONFIG_REQ -> . [cp_eoc_sta_action_drv__drv_sta_set_slave_config_req]
+ DRV_EOC_STA_SET_EOC_CONFIG_REQ -> . [cp_eoc_sta_action_drv__drv_sta_set_eoc_config_req]
+
+STARTED:
+ to_poweron -> POWER_ON [cp_eoc_cco_action_poweron__idle__to_poweron]
+ VS_GET_TONEMAP_REQ -> . [cp_sta_action_vs__started__vs_get_tonemap_req]
+ VS_GET_SNR_REQ -> . [cp_sta_action_vs__started__vs_get_snr_req]
+
+POWER_ON:
+ BEACON_TIMER_EXPIRES -> . [cp_beacon_beacon_not_received]
+ BEACON_NOT_RECEIVED -> CCO [cp_eoc_cco_action_send_central_beacon]
+ rx_beacon -> BCCO [cp_eoc_cco_action__power_on_rx_beacon]
+
+CCO:
+ DRV_STA_MAC_STOP_REQ -> STOPPING [cp_sta_action_drv__started__drv_sta_mac_stop_req]
+ DRV_STA_GET_KEY_REQ -> . [cp_sta_action_drv__drv_sta_get_key_req]
+ DRV_MCAST_SET_LIST_REQ -> . [cp_eoc_cco_action_drv__drv_mcast_set_list_req]
+ VS_EOC_CCO_GET_WL_REQ -> . [cp_eoc_cco_action_vs__stopped__vs_cco_get_wl_req]
+ VS_EOC_CCO_SET_WL_REQ -> . [cp_eoc_cco_action_vs__stopped__vs_cco_set_wl_req]
+ VS_EOC_SET_PORTS_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_set_ports_req]
+ VS_EOC_CCO_GET_PORTS_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_cco_get_ports_req]
+ VS_EOC_CCO_SET_SERVICES_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_cco_set_services_req]
+ VS_EOC_CCO_GET_SERVICES_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_cco_get_services_req]
+ VS_EOC_GET_INFO_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_get_info_req]
+ VS_EOC_DIAGNOSTIC_INFO_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_diagnostic_info_req]
+ VS_EOC_GET_REAL_TIME_STATISTICS_REQ -> . [cp_eoc_sta_action_vs__vs_eoc_get_real_time_statistics_req]
+ BEACON_TIMER_EXPIRES -> . [cp_eoc_cco_action_send_central_beacon]
+ MULTI_STA_MME -> . [cp_eoc_cco_action_event_dispatch]
+ CM_CHAN_EST_IND -> . [ce_tx_process__cm_chan_est_ind]
+ CM_TM_UPDATE_IND -> . [ce_tx_process__cm_update_tm_ind]
+ VS_EOC_GET_TOPO_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_get_topo_req]
+ first_com_with_assoc_sta -> . [NULL]
+ PREV: cp_sta_action_bridge_first_com
+ CM_BRG_INFO_CNF -> . [cp_sta_action_process_cm_brg_info_cnf]
+ CM_BRG_INFO_REQ -> . [cp_sta_action_process_cm_brg_info_req]
+ VS_GET_TONEMAP_REQ -> . [cp_sta_action_vs__started__vs_get_tonemap_req]
+ VS_GET_SNR_REQ -> . [cp_sta_action_vs__started__vs_get_snr_req]
+ CM_NW_STATS_REQ -> . [cp_sta_action_process_cm_nw_stats_req]
+ CM_LINK_STATS_REQ -> . [cp_sta_action_process_cm_link_stats_req]
+ CM_NW_INFO_REQ -> . [cp_sta_action_process_cm_nw_info_req]
+ CM_SET_KEY_CNF -> . [cp_eoc_cco_action__set_key_cnf]
+ nek_timeout:no -> . [cp_eoc_cco_action_nek_change_timeout]
+ nek_timeout:yes -> .
+ leave_remove_delay -> . [cp_eoc_cco_action__cco__leave_remove_timeout]
+ VS_GET_STATS_REQ -> . [cp_sta_action_vs__started__vs_get_stats_req]
+ CM_STA_CAP_REQ -> . [cp_sta_action_process_cm_sta_cap_req]
+ cco__nek_change -> . [cp_eoc_cco_action_nek_provide]
+ VS_GET_CE_STATS_REQ -> . [cp_sta_action_vs__started__vs_get_ce_stats_req]
+ VS_GET_PB_STATS_REQ -> . [cp_sta_action_vs__started__vs_get_pb_stats_req]
+ VS_GET_MACTOTEI_REQ -> . [cp_sta_action_vs__started__vs_get_mactotei_req]
+
+BCCO:
+ DRV_STA_MAC_STOP_REQ -> STOPPING [cp_eoc_cco_action__bcco_drv_mac_stop]
+ BEACON_NOT_RECEIVED -> CCO [cp_eoc_cco_action__bcco_no_beacons]
+ VS_EOC_GET_TOPO_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_get_topo_req]
+ VS_GET_TONEMAP_REQ -> . [cp_sta_action_vs__started__vs_get_tonemap_req]
+ VS_GET_SNR_REQ -> . [cp_sta_action_vs__started__vs_get_snr_req]
+
+CCO, BCCO:
+ CC_DISCOVER_LIST_REQ -> . [cp_sta_action_process_cc_discover_list_req]
+
+STOPPING:
+ VS_EOC_GET_TOPO_REQ -> . [cp_eoc_cco_action_vs_eoc__cco__vs_eoc_get_topo_req]
+ to_stop -> . [cp_sta_action_poweron__many__to_idle]
+ stopped -> STOPPED [cp_sta_action_drv__stopping__stopped]
+ send DRV_STA_MAC_STOP.CNF
diff --git a/cesar/cp/eoc/fsm/src/fsm/cp_eoc_sta.fsm b/cesar/cp/eoc/fsm/src/fsm/cp_eoc_sta.fsm
new file mode 100644
index 0000000000..c60b92f202
--- /dev/null
+++ b/cesar/cp/eoc/fsm/src/fsm/cp_eoc_sta.fsm
@@ -0,0 +1,253 @@
+Control Plane STA FSM
+ STA FSM for control plane.
+
+States:
+ STOPPED
+ STARTED
+ STOPPING
+ DETECTING_BEACON
+ UNASSOCIATED [enter=cp_eoc_sta_action_unassoc__start_retry_timer leave=cp_eoc_sta_action_unassoc__stop_retry_timer]
+ ASSOCIATING [enter=cp_sta_action_assoc__start_retry_timer leave=cp_sta_action_assoc__stop_retry_timer]
+ ASSOCIATED [enter=cp_sta_action_assoc__start_retry_timer leave=cp_sta_action_assoc__stop_retry_timer]
+ AUTHENTICATED
+ SLEEP_UNASSOCIATED
+ SLEEP_AUTHENTICATED
+
+Events:
+ BEACON
+ BEACON_NOT_RECEIVED
+ BEACON_TIMER_EXPIRES
+ BEACON_WITH_SAME_NID
+ HOIP_EXPIRED
+ HANDOVER_DISCOVERED_STA
+ HANDOVER_DISCOVER_PROCESS_DONE
+ to_poweron
+ to_stop
+ stopped
+ nd_beacon
+ timeout_associating
+ timeout_unassociating
+ no_beacons
+ enter_sleep_unassociated
+ retry_unassociated
+ exit_sleep_unassociated
+ sleep_enter_cnf
+ sleep_exit_rsp
+ encrypt_payload_rsp
+ cco__nek_change
+ nek_request
+ to_leave
+ first_com_with_assoc_sta
+ discover_info_updated
+ whoru_timeout
+ cco__snid_conflict
+
+ DRV_STA_SET_MAC_ADDR_REQ
+ DRV_STA_SET_CCO_PREF_REQ
+ DRV_STA_SET_WAS_CCO_REQ
+ DRV_STA_SET_NPW_REQ
+ DRV_STA_SET_DPW_REQ
+ DRV_STA_SET_SL_REQ
+ DRV_STA_SET_NID_REQ
+ DRV_STA_SET_M_STA_HFID_REQ
+ DRV_STA_SET_U_STA_HFID_REQ
+ DRV_STA_SET_AVLN_HFID_REQ
+ DRV_STA_SET_TONEMASK_REQ
+ DRV_STA_MAC_START_REQ
+ DRV_STA_MAC_STOP_REQ
+ DRV_STA_SC_REQ
+ DRV_STA_SET_KEY_REQ
+ DRV_STA_SET_DAK_REQ
+ DRV_STA_GET_KEY_REQ
+ DRV_STA_STATUS_REQ
+ DRV_STA_SET_CONFIG_REQ
+ DRV_EOC_STA_SET_SLAVE_CONFIG_REQ
+ DRV_EOC_STA_SET_EOC_CONFIG_REQ
+ DRV_MCAST_SET_LIST_REQ
+ DRV_STA_FORCE_ROLE_REQ
+
+ VS_GET_TONEMAP_REQ
+ VS_GET_SNR_REQ
+ VS_GET_LINK_STATS_REQ
+ VS_GET_SPECTRUM_REQ
+ VS_GET_AMP_MAP_REQ
+ VS_GET_STATS_REQ
+ VS_GET_CE_STATS_REQ
+ VS_GET_PB_STATS_REQ
+ VS_GET_MACTOTEI_REQ
+ VS_GET_ATTENUATION_LIST_REQ
+
+ VS_EOC_GET_TOPO_REQ
+ VS_EOC_CCO_SET_WL_REQ
+ VS_EOC_CCO_GET_WL_REQ
+ VS_EOC_CCO_SET_OUT_LEV_IND
+ VS_EOC_SET_PORTS_REQ
+ VS_EOC_CCO_GET_PORTS_REQ
+ VS_EOC_CCO_SET_SERVICES_REQ
+ VS_EOC_CCO_GET_SERVICES_REQ
+ VS_EOC_GET_INFO_REQ
+ VS_EOC_DIAGNOSTIC_INFO_REQ
+ VS_EOC_GET_REAL_TIME_STATISTICS_REQ
+ IMAC_GET_DISCOVER_LIST_REQ
+
+ CC_DISCOVER_LIST_REQ
+ CC_DISCOVER_LIST_CNF
+ CC_WHO_RU_REQ
+ CC_WHO_RU_CNF
+ CC_ASSOC_REQ
+ CC_ASSOC_CNF
+ CC_LEAVE_REQ
+ CC_LEAVE_CNF
+ CC_LEAVE_IND
+ CC_LEAVE_RSP
+ CC_SET_TEI_MAP_REQ
+ CC_SET_TEI_MAP_IND
+ CC_RELAY_REQ
+ CC_RELAY_IND
+ CC_HANDOVER_CNF
+ CC_HANDOVER_REQ
+ CC_HANDOVER_INFO_IND
+ CC_HANDOVER_INFO_RSP
+ CM_UNASSOCIATED_STA_IND
+ CM_SET_KEY_REQ
+ CM_SET_KEY_CNF
+ CM_SET_KEY_REQ_PID1
+ CM_SET_KEY_CNF_PID1
+ CM_SET_KEY_REQ_PID3
+ CM_SET_KEY_CNF_PID3
+ CM_GET_KEY_REQ
+ CM_GET_KEY_CNF
+ CM_GET_KEY_REQ_PID0
+ CM_GET_KEY_CNF_PID0
+ CM_GET_KEY_REQ_PID3
+ CM_GET_KEY_CNF_PID3
+ CM_SC_JOIN_REQ
+ CM_SC_JOIN_CNF
+ CM_CHAN_EST_IND
+ CM_TM_UPDATE_IND
+ CM_AMP_MAP_REQ
+ CM_AMP_MAP_CNF
+ CM_BRG_INFO_REQ
+ CM_BRG_INFO_CNF
+ CM_STA_CAP_REQ
+ CM_STA_CAP_CNF
+ CM_NW_INFO_REQ
+ CM_NW_INFO_CNF
+ CM_NW_STATS_REQ
+ CM_NW_STATS_CNF
+ CM_LINK_STATS_REQ
+ CM_HFID_REQ
+ CM_HFID_CNF
+ CM_MME_ERROR_IND
+
+STOPPED:
+ DRV_STA_SET_MAC_ADDR_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_mac_addr_req]
+ DRV_STA_SET_CCO_PREF_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_cco_pref_req]
+ DRV_STA_SET_WAS_CCO_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_was_cco_req]
+ DRV_STA_SET_DPW_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_dpw_req]
+ DRV_STA_SET_NPW_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_npw_req]
+ DRV_STA_SET_NID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_nid_req]
+ DRV_STA_SET_M_STA_HFID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_m_sta_hfid_req]
+ DRV_STA_SET_U_STA_HFID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_u_sta_hfid_req]
+ DRV_STA_SET_AVLN_HFID_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_avln_hfid_req]
+ DRV_STA_SET_SL_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_sl_req]
+ DRV_STA_SET_TONEMASK_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_tonemask_req]
+ DRV_STA_SET_KEY_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_key_req]
+ DRV_STA_SET_DAK_REQ -> . [cp_sta_action_drv__stopped__drv_sta_set_dak_req]
+ DRV_STA_MAC_START_REQ -> STARTED [cp_sta_action_drv__stopped__drv_sta_mac_start_req]
+ DRV_STA_SET_CONFIG_REQ -> . [cp_sta_action_drv__drv_sta_set_config_req]
+ DRV_EOC_STA_SET_SLAVE_CONFIG_REQ -> . [cp_eoc_sta_action_drv__drv_sta_set_slave_config_req]
+ DRV_EOC_STA_SET_EOC_CONFIG_REQ -> . [cp_eoc_sta_action_drv__drv_sta_set_eoc_config_req]
+
+STARTED:
+ to_poweron -> DETECTING_BEACON [cp_sta_action_poweron__idle__to_poweron]
+ VS_GET_TONEMAP_REQ -> . [cp_sta_action_vs__started__vs_get_tonemap_req]
+ VS_GET_SNR_REQ -> . [cp_sta_action_vs__started__vs_get_snr_req]
+
+DETECTING_BEACON:
+ BEACON -> . [cp_eoc_sta_action_detect__beacon_received]
+ nd_beacon -> ASSOCIATING [cp_eoc_sta_action_assoc__detecting_detected]
+ no_beacons -> . [cp_eoc_sta_action_assoc__detecting_no_beacons]
+
+UNASSOCIATED:
+ enter_sleep_unassociated -> SLEEP_UNASSOCIATED [NULL]
+ retry_unassociated -> DETECTING_BEACON [NULL]
+ timeout_unassociating -> DETECTING_BEACON [NULL]
+ no_beacons -> . [cp_eoc_sta_action_assoc__unassoc_no_beacons]
+ BEACON -> . [cp_eoc_sta_action_unassoc__beacon_received]
+
+ASSOCIATING:
+ timeout_associating: retry -> DETECTING_BEACON [cp_eoc_sta_action_assoc__associating_timeout]
+ timeout_associating: no_retry -> UNASSOCIATED
+ CC_ASSOC_CNF: success -> ASSOCIATED [cp_eoc_sta_action_assoc__associating_cnf]
+ CC_ASSOC_CNF: unsuccess -> UNASSOCIATED
+ CC_ASSOC_CNF: unrelated -> .
+ no_beacons -> UNASSOCIATED [cp_eoc_sta_action_assoc__associating_no_beacons]
+
+ASSOCIATED:
+ CM_GET_KEY_CNF: all_keys_granted -> AUTHENTICATED [cp_eoc_sta_action_assoc__associated_key_cnf]
+ CM_GET_KEY_CNF: not_granted -> UNASSOCIATED
+ CM_GET_KEY_CNF: unrelated -> UNASSOCIATED
+ encrypt_payload_rsp -> UNASSOCIATED [cp_eoc_sta_action_assoc__associated_encrypt_payload_rsp]
+ no_beacons -> UNASSOCIATED [cp_eoc_sta_action_assoc__associated_no_beacons]
+ timeout_associating -> UNASSOCIATED [cp_eoc_sta_action_assoc__associated_timeout]
+ CC_LEAVE_IND: ok -> DETECTING_BEACON [cp_eoc_sta_action_assoc__associated_leave]
+ send CC_LEAVE.RSP
+ CC_LEAVE_IND: nok -> .
+
+AUTHENTICATED:
+ CM_GET_KEY_CNF -> . [cp_eoc_sta_action_auth__authenticated_key_cnf]
+ sleep_enter_cnf -> SLEEP_AUTHENTICATED [NULL]
+ no_beacons -> DETECTING_BEACON [cp_eoc_sta_action_assoc__authenticated_no_beacons]
+ CC_LEAVE_IND: ok -> DETECTING_BEACON [cp_eoc_sta_action_assoc__authenticated_leave]
+ send CC_LEAVE.RSP
+ CC_LEAVE_IND: nok -> .
+ DRV_STA_MAC_STOP_REQ -> STOPPING [cp_sta_action_drv__started__drv_sta_mac_stop_req]
+ CM_SET_KEY_REQ -> . [cp_eoc_sta_action_auth__authenticated_set_key_req]
+ VS_EOC_CCO_SET_OUT_LEV_IND -> . [cp_eoc_sta_action_auth__authenticated_set_out_lev]
+ CM_STA_CAP_REQ -> . [cp_sta_action_process_cm_sta_cap_req]
+ VS_GET_TONEMAP_REQ -> . [cp_sta_action_vs__started__vs_get_tonemap_req]
+ VS_GET_SNR_REQ -> . [cp_sta_action_vs__started__vs_get_snr_req]
+ CM_LINK_STATS_REQ -> . [cp_sta_action_process_cm_link_stats_req]
+ CM_NW_INFO_REQ -> . [cp_sta_action_process_cm_nw_info_req]
+ CM_NW_STATS_REQ -> . [cp_sta_action_process_cm_nw_stats_req]
+ VS_GET_STATS_REQ -> . [cp_sta_action_vs__started__vs_get_stats_req]
+ VS_GET_CE_STATS_REQ -> . [cp_sta_action_vs__started__vs_get_ce_stats_req]
+ VS_GET_PB_STATS_REQ -> . [cp_sta_action_vs__started__vs_get_pb_stats_req]
+ VS_GET_MACTOTEI_REQ -> . [cp_sta_action_vs__started__vs_get_mactotei_req]
+
+DETECTING_BEACON, UNASSOCIATED, ASSOCIATING, ASSOCIATED, AUTHENTICATED, SLEEP_AUTHENTICATED:
+ BEACON_TIMER_EXPIRES -> . [cp_beacon_beacon_not_received]
+ BEACON_NOT_RECEIVED -> . [cp_eoc_sta_action_assoc__beacon_not_received]
+ VS_EOC_GET_INFO_REQ -> . [cp_eoc_sta_action_vs__vs_eoc_get_info_req]
+ VS_EOC_DIAGNOSTIC_INFO_REQ -> . [cp_eoc_sta_action_vs__vs_eoc_diagnostic_info_req]
+ VS_EOC_GET_REAL_TIME_STATISTICS_REQ -> . [cp_eoc_sta_action_vs__vs_eoc_get_real_time_statistics_req]
+ to_leave -> DETECTING_BEACON [cp_eoc_sta_action_sta_clear_status]
+
+ASSOCIATING:
+ BEACON -> . [cp_eoc_sta_action_assoc__beacon_received]
+
+ASSOCIATED, AUTHENTICATED, SLEEP_AUTHENTICATED:
+ BEACON -> . [cp_eoc_sta_action_auth__beacon_received]
+
+ASSOCIATED, AUTHENTICATED:
+ CM_CHAN_EST_IND -> . [ce_tx_process__cm_chan_est_ind]
+ CM_TM_UPDATE_IND -> . [ce_tx_process__cm_update_tm_ind]
+
+AUTHENTICATED:
+ first_com_with_assoc_sta -> . [NULL]
+ cp_sta_action_bridge_first_com
+ CM_BRG_INFO_CNF -> . [cp_sta_action_process_cm_brg_info_cnf]
+ CM_BRG_INFO_REQ -> . [cp_sta_action_process_cm_brg_info_req]
+
+SLEEP_UNASSOCIATED:
+ exit_sleep_unassociated -> UNASSOCIATED [NULL]
+
+SLEEP_AUTHENTICATED:
+ sleep_exit_rsp -> AUTHENTICATED [NULL]
+ no_beacons -> UNASSOCIATED [NULL]
+
+STOPPING:
+ to_stop -> . [cp_sta_action_poweron__many__to_idle]
+ stopped -> STOPPED [cp_sta_action_drv__stopping__stopped]
+ send DRV_STA_MAC_STOP.CNF
diff --git a/cesar/cp/eoc/fsm/src/fsm/template_defs.h b/cesar/cp/eoc/fsm/src/fsm/template_defs.h
new file mode 100644
index 0000000000..d61762c492
--- /dev/null
+++ b/cesar/cp/eoc/fsm/src/fsm/template_defs.h
@@ -0,0 +1,52 @@
+#ifndef %(prefix)s_defs_h
+#define %(prefix)s_defs_h
+/*
+ * THIS IS AN AUTOMATICALLY GENERATED FILE, DO NOT EDIT!
+ *
+ * %(name)s
+ *
+%(*comments)s */
+
+/* %(name)s states. */
+enum %(prefix)s_state_t
+{
+%(states)s %(PREFIX)s_STATE_NB
+};
+typedef enum %(prefix)s_state_t %(prefix)s_state_t;
+
+/* %(name)s events types. */
+enum %(prefix)s_event_type_t
+{
+%(events,%(PREFIX)s_EVENT_TYPE_%(event)s)s %(PREFIX)s_EVENT_TYPE_NB
+};
+typedef enum %(prefix)s_event_type_t %(prefix)s_event_type_t;
+
+/* This macro enables checks for branches used in the wrong state/event
+ * combination. */
+#define _BRANCH(state, event, to) \
+ ((%(PREFIX)s_STATE_ ## state) << 16 \
+ | (%(PREFIX)s_EVENT_TYPE_ ## event) << 8 \
+ | (%(PREFIX)s_STATE_ ## to))
+
+/* %(name)s branches. */
+enum %(prefix)s_branch_t
+{
+%(branches)s};
+typedef enum %(prefix)s_branch_t %(prefix)s_branch_t;
+
+#undef _BRANCH
+
+/* %(name)s transition type. */
+typedef void *%(prefix)s_transition_t;
+
+/* %(name)s enter/leave type. */
+typedef void (*%(prefix)s_enter_leave_t) (cp_t *ctx);
+
+/* Value to use to follow a given branch. */
+#define %(PREFIX)s_BRANCH(state, event, branch) \
+ %(PREFIX)s_BRANCH__ ## state ## __ ## event ## __ ## branch
+
+/* %(name)s number of initial states. */
+#define %(PREFIX)s_INITIAL_NB %(initials_nb)s
+
+#endif /* %(prefix)s_defs_h */
diff --git a/cesar/cp/eoc/fsm/src/fsm/template_tables.h b/cesar/cp/eoc/fsm/src/fsm/template_tables.h
new file mode 100644
index 0000000000..c13300cd28
--- /dev/null
+++ b/cesar/cp/eoc/fsm/src/fsm/template_tables.h
@@ -0,0 +1,46 @@
+/*
+ * THIS IS AN AUTOMATICALLY GENERATED FILE, DO NOT EDIT!
+ *
+ * %(name)s
+ *
+%(*comments)s */
+
+/* %(name)s transition table. */
+const %(prefix)s_transition_t
+%(prefix)s_transition_table[%(PREFIX)s_STATE_NB][%(PREFIX)s_EVENT_TYPE_NB] = {
+%(transition_table)s};
+
+/* %(name)s only branch table. */
+const %(prefix)s_state_t
+%(prefix)s_only_branch_table[%(PREFIX)s_STATE_NB][%(PREFIX)s_EVENT_TYPE_NB] = {
+%(only_branch_table)s};
+
+/* %(name)s state enter table. */
+const %(prefix)s_enter_leave_t
+%(prefix)s_enter_table[%(PREFIX)s_STATE_NB] = {
+%(states,%(@enter|NULL)s)s};
+
+/* %(name)s state leave table. */
+const %(prefix)s_enter_leave_t
+%(prefix)s_leave_table[%(PREFIX)s_STATE_NB] = {
+%(states,%(@leave|NULL)s)s};
+
+/* %(name)s initial states table. */
+const %(prefix)s_state_t
+%(prefix)s_initials_table[%(PREFIX)s_INITIAL_NB] = {
+%(initials)s};
+
+#if CONFIG_TRACE
+
+/* %(name)s state names table. */
+const char *
+%(prefix)s_state_names_table[%(PREFIX)s_STATE_NB] = {
+%(states,"%(state)s")s};
+
+/* %(name)s event names table. */
+const char *
+%(prefix)s_event_names_table[%(PREFIX)s_EVENT_TYPE_NB] = {
+%(events,"%(event)s")s};
+
+#endif /* CONFIG_TRACE */
+
diff --git a/cesar/cp/eoc/fsm/src/tables.c b/cesar/cp/eoc/fsm/src/tables.c
new file mode 100644
index 0000000000..198de59da8
--- /dev/null
+++ b/cesar/cp/eoc/fsm/src/tables.c
@@ -0,0 +1,37 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file cp/eoc/fsm/src/tables.c
+ * \brief EoC FSM tables.
+ * \ingroup cp_eoc_fsm
+ */
+#include "common/std.h"
+
+#include "cp/fsm/fsm.h"
+#include "cp/fsm/inc/tables.h"
+
+#include "ce/tx/tx.h"
+#include "cp/beacon/beacon.h"
+
+#include "cp/eoc/cco/action/cco_action.h"
+#include "cp/eoc/sta/action/action.h"
+#include "cp/eoc/beacon/beacon.h"
+
+
+/* CE TX stub. */
+void
+ce_tx_process__cm_chan_est_ind (cp_t *ctx, cp_mme_rx_t *mme)
+ __attribute__((weak));
+
+void
+ce_tx_process__cm_chan_est_ind (cp_t *ctx, cp_mme_rx_t *mme)
+{
+}
+
+/* Include generated tables. */
+#include "cp_fsm_tables.h"
diff --git a/cesar/cp/eoc/fsm/stub/Module b/cesar/cp/eoc/fsm/stub/Module
new file mode 100644
index 0000000000..da8170171b
--- /dev/null
+++ b/cesar/cp/eoc/fsm/stub/Module
@@ -0,0 +1,4 @@
+SOURCES := fsm_stub.c
+MODULES := cp/eoc/fsm
+cp_eoc_fsm_MODULE_SOURCES := $(call default,cp_eoc_fsm_MODULE_SOURCES,)
+cp_fsm_MODULE_SOURCES := $(call default,cp_fsm_MODULE_SOURCES,)
diff --git a/cesar/cp/eoc/fsm/stub/src/fsm_stub.c b/cesar/cp/eoc/fsm/stub/src/fsm_stub.c
new file mode 100644
index 0000000000..dd915b4f63
--- /dev/null
+++ b/cesar/cp/eoc/fsm/stub/src/fsm_stub.c
@@ -0,0 +1,87 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file cp/eoc/fsm/stub/src/fsm_stub.c
+ * \brief Generic FSM stub.
+ * \ingroup cp_eoc_fsm_stub
+ */
+#include "common/std.h"
+#include "cp/fsm/fsm.h"
+
+void
+cp_fsm_init (cp_t *ctx) __attribute__ ((weak));
+void
+cp_fsm_init (cp_t *ctx) { }
+
+void
+cp_fsm_uninit (cp_t *ctx) __attribute__ ((weak));
+void
+cp_fsm_uninit (cp_t *ctx) {}
+
+void
+cp_fsm_process (cp_t *ctx) __attribute__ ((weak));
+void
+cp_fsm_process (cp_t *ctx) {}
+
+void
+cp_fsm_process_urgent (cp_t *ctx) __attribute__ ((weak));
+void
+cp_fsm_process_urgent (cp_t *ctx) {}
+
+void
+cp_fsm_post (cp_t *ctx, cp_fsm_event_t *event) __attribute__ ((weak));
+void
+cp_fsm_post (cp_t *ctx, cp_fsm_event_t *event) {}
+
+void
+cp_fsm_trigger (cp_t *ctx, cp_fsm_event_t *event) __attribute__ ((weak));
+void
+cp_fsm_trigger (cp_t *ctx, cp_fsm_event_t *event) {}
+
+void
+cp_fsm_post_urgent (cp_t *ctx, cp_fsm_event_t *event) __attribute__ ((weak));
+void
+cp_fsm_post_urgent (cp_t *ctx, cp_fsm_event_t *event) {}
+
+void
+cp_fsm_branch_ (cp_t *ctx, cp_fsm_branch_t branch) __attribute__ ((weak));
+void
+cp_fsm_branch_ (cp_t *ctx, cp_fsm_branch_t branch) {}
+
+cp_fsm_event_t *
+cp_fsm_event_bare_new (cp_t *ctx, cp_fsm_event_type_t type)
+ __attribute__ ((weak));
+cp_fsm_event_t *
+cp_fsm_event_bare_new (cp_t *ctx, cp_fsm_event_type_t type)
+{ return INVALID_PTR; }
+
+cp_fsm_event_t *
+cp_fsm_event_mme_new (cp_t *ctx, cp_fsm_event_type_t type, cp_mme_rx_t *mme)
+ __attribute__ ((weak));
+cp_fsm_event_t *
+cp_fsm_event_mme_new (cp_t *ctx, cp_fsm_event_type_t type, cp_mme_rx_t *mme)
+{ return INVALID_PTR; }
+
+cp_fsm_event_t *
+cp_fsm_event_sta_new (cp_t *ctx, cp_fsm_event_type_t type,
+ cp_net_t *net, cp_sta_t *sta) __attribute__ ((weak));
+cp_fsm_event_t *
+cp_fsm_event_sta_new (cp_t *ctx, cp_fsm_event_type_t type,
+ cp_net_t *net, cp_sta_t *sta)
+{ return INVALID_PTR; }
+
+cp_fsm_event_t *
+cp_fsm_event_beacon_new (cp_t *ctx, cp_fsm_event_type_t type,
+ bsu_beacon_t *beacon, cp_net_t *net,
+ cp_sta_t *sta) __attribute__ ((weak));
+cp_fsm_event_t *
+cp_fsm_event_beacon_new (cp_t *ctx, cp_fsm_event_type_t type,
+ bsu_beacon_t *beacon, cp_net_t *net,
+ cp_sta_t *sta)
+{ return INVALID_PTR; }
+
diff --git a/cesar/cp/eoc/fsm/test/utest/Config b/cesar/cp/eoc/fsm/test/utest/Config
new file mode 100644
index 0000000000..7378106168
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/Config
@@ -0,0 +1,3 @@
+CONFIG_CP_EOC = y
+CONFIG_DEBUG_FATAL_CATCH = y
+CONFIG_CP_FSM_DEF = "cp/eoc/fsm/test/utest/src/utest.fsm"
diff --git a/cesar/cp/eoc/fsm/test/utest/Makefile b/cesar/cp/eoc/fsm/test/utest/Makefile
new file mode 100644
index 0000000000..7cf4406e65
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/Makefile
@@ -0,0 +1,14 @@
+BASE = ../../../../..
+
+INCLUDES = cp/eoc/fsm/test/utest cp/eoc/fsm/test/utest/override
+
+HOST_PROGRAMS = test_fsm
+test_fsm_SOURCES = test_fsm.c fsm_stub.c actions.c
+test_fsm_MODULES = lib lib/scenario cp/eoc/fsm
+test_fsm_CONFIG_MODULES = cp/eoc mac/common
+cp_eoc_fsm_MODULE_SOURCES :=
+
+cp_MODULE_MODULES =
+cp_MODULE_SOURCES = $(if $(filter y,$(CONFIG_TRACE)),trace.c,)
+
+include $(BASE)/common/make/top.mk
diff --git a/cesar/cp/eoc/fsm/test/utest/inc/scenario_defs.h b/cesar/cp/eoc/fsm/test/utest/inc/scenario_defs.h
new file mode 100644
index 0000000000..a91c3fe4d8
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/inc/scenario_defs.h
@@ -0,0 +1,135 @@
+#ifndef inc_scenario_defs_h
+#define inc_scenario_defs_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file inc/scenario_defs.h
+ * \brief Scenario definitions.
+ * \ingroup test
+ */
+
+#include "cp/types.h"
+#include "cp/mme.h"
+#include "cp/fsm/fsm.h"
+
+/* Scenario globals. */
+#define SCENARIO_DEFS_GLOBALS \
+ cp_t *cp;
+
+/* Scenario actions. */
+#define SCENARIO_DEFS_ACTIONS \
+ post_and_process, \
+ post, \
+ trigger, \
+ post_urgent, \
+ process, \
+ process_urgent
+
+typedef struct
+{
+ cp_fsm_event_type_t type;
+ cp_mme_rx_t *mme;
+ bsu_beacon_t *beacon;
+ cp_net_t *net;
+ cp_sta_t *sta;
+} scenario_action_event_param_t;
+
+typedef scenario_action_event_param_t scenario_action_post_and_process_t;
+typedef scenario_action_event_param_t scenario_action_post_t;
+typedef scenario_action_event_param_t scenario_action_trigger_t;
+typedef scenario_action_event_param_t scenario_action_post_urgent_t;
+typedef scenario_empty_t scenario_action_process_t;
+typedef scenario_empty_t scenario_action_process_urgent_t;
+
+void
+scenario_action_post_and_process_cb (scenario_globals_t *globals,
+ scenario_params_t *params);
+
+void
+scenario_action_post_cb (scenario_globals_t *globals,
+ scenario_params_t *params);
+
+void
+scenario_action_trigger_cb (scenario_globals_t *globals,
+ scenario_params_t *params);
+
+void
+scenario_action_post_urgent_cb (scenario_globals_t *globals,
+ scenario_params_t *params);
+
+void
+scenario_action_process_cb (scenario_globals_t *globals,
+ scenario_params_t *params);
+
+void
+scenario_action_process_urgent_cb (scenario_globals_t *globals,
+ scenario_params_t *params);
+
+/* Scenario events. */
+#define SCENARIO_DEFS_EVENTS \
+ cp_fsm__STATE1__event1, \
+ cp_fsm__STATE1__event2, \
+ cp_fsm__STATE1__event_mme, \
+ cp_fsm__STATE1__event_sta, \
+ cp_fsm__STATE1__event_beacon, \
+ cp_fsm__STATE1__eventb, \
+ cp_fsm__STATE1__long_event, \
+ cp_fsm__STATE1__urgent_event, \
+ cp_fsm__STATE2__event3, \
+ cp_fsm__STATE3__event1, \
+ cp_fsm__STATE3__event2, \
+ cp_fsm__STATE3__urgent_event, \
+ cp_fsm__STATE4__event1, \
+ cp_fsm__STATE5__enter, \
+ cp_fsm__STATE5__leave, \
+ cp_fsm__STATE6__enter, \
+ cp_fsm__STATE6__leave, \
+ cp_fsm__STATEA__eventb, \
+ cp_fsm__STATEB__eventa
+
+typedef struct
+{
+ cp_fsm_branch_t branch;
+} scenario_event_transition_with_branch_t;
+
+typedef scenario_empty_t scenario_event_cp_fsm__STATE1__event1_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE1__event2_t;
+typedef struct
+{
+ cp_mme_rx_t *mme;
+} scenario_event_cp_fsm__STATE1__event_mme_t;
+typedef struct
+{
+ cp_net_t *net;
+ cp_sta_t *sta;
+} scenario_event_cp_fsm__STATE1__event_sta_t;
+typedef struct
+{
+ bsu_beacon_t *beacon;
+ cp_net_t *net;
+ cp_sta_t *sta;
+} scenario_event_cp_fsm__STATE1__event_beacon_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE1__eventb_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE1__long_event_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE1__urgent_event_t;
+typedef scenario_event_transition_with_branch_t
+scenario_event_cp_fsm__STATE2__event3_t;
+typedef scenario_event_transition_with_branch_t
+scenario_event_cp_fsm__STATE3__event1_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE3__event2_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE3__urgent_event_t;
+typedef scenario_event_transition_with_branch_t
+scenario_event_cp_fsm__STATE4__event1_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE5__enter_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE5__leave_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE6__enter_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATE6__leave_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATEA__eventb_t;
+typedef scenario_empty_t scenario_event_cp_fsm__STATEB__eventa_t;
+
+#endif /* inc_scenario_defs_h */
diff --git a/cesar/cp/eoc/fsm/test/utest/override/cp/inc/context.h b/cesar/cp/eoc/fsm/test/utest/override/cp/inc/context.h
new file mode 100644
index 0000000000..edc1fde804
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/override/cp/inc/context.h
@@ -0,0 +1,35 @@
+#ifndef override_cp_inc_context_h
+#define override_cp_inc_context_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file override/cp/inc/context.h
+ * \brief Control plane context override.
+ * \ingroup test
+ */
+
+#include "cp/fsm/fsm.h"
+#include "cp/fsm/inc/context.h"
+#include "cp/inc/trace.h"
+
+struct cp_t
+{
+#if CONFIG_TRACE
+ /** Trace context. */
+ trace_buffer_t trace;
+#endif /* CONFIG_TRACE */
+
+ /** FSM context. */
+ cp_fsm_t fsm;
+ /** STA core flag. */
+ bool sta_core_flag;
+ /** STA core urgent flag. */
+ bool sta_core_urgent_flag;
+};
+
+#endif /* override_cp_inc_context_h */
diff --git a/cesar/cp/eoc/fsm/test/utest/override/cp/sta/core/core.h b/cesar/cp/eoc/fsm/test/utest/override/cp/sta/core/core.h
new file mode 100644
index 0000000000..352368b45b
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/override/cp/sta/core/core.h
@@ -0,0 +1,26 @@
+#ifndef override_cp_sta_core_core_h
+#define override_cp_sta_core_core_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file override/cp/sta/core/core.h
+ * \brief STA Core override.
+ * \ingroup test
+ */
+
+BEGIN_DECLS
+
+void
+cp_sta_core_signal_fsm_event (cp_t *ctx);
+
+void
+cp_sta_core_signal_fsm_urgent_event (cp_t *ctx);
+
+END_DECLS
+
+#endif /* override_cp_sta_core_core_h */
diff --git a/cesar/cp/eoc/fsm/test/utest/src/actions.c b/cesar/cp/eoc/fsm/test/utest/src/actions.c
new file mode 100644
index 0000000000..b8d344a32f
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/src/actions.c
@@ -0,0 +1,97 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file src/actions.c
+ * \brief Scenario actions.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "lib/scenario/scenario.h"
+
+#include "cp/inc/context.h"
+
+cp_fsm_event_t *
+scenario_action_make_event (cp_t *cp, scenario_action_event_param_t *ep)
+{
+ cp_fsm_event_t *event;
+ if (ep->mme)
+ event = cp_fsm_event_mme_new (cp, ep->type, ep->mme);
+ else if (ep->beacon)
+ event = cp_fsm_event_beacon_new (cp, ep->type, ep->beacon, ep->net,
+ ep->sta);
+ else if (ep->sta)
+ event = cp_fsm_event_sta_new (cp, ep->type, ep->net, ep->sta);
+ else
+ event = cp_fsm_event_bare_new (cp, ep->type);
+ return event;
+}
+
+void
+scenario_action_post_and_process_cb (scenario_globals_t *globals,
+ scenario_params_t *params)
+{
+ test_within (scenario.t);
+ scenario_action_post_and_process_t *p = &params->action_post_and_process;
+ cp_fsm_post (globals->cp, scenario_action_make_event (globals->cp, p));
+ test_fail_unless (globals->cp->sta_core_flag);
+ globals->cp->sta_core_flag = false;
+ cp_fsm_process (globals->cp);
+}
+
+void
+scenario_action_post_cb (scenario_globals_t *globals,
+ scenario_params_t *params)
+{
+ test_within (scenario.t);
+ scenario_action_post_t *p = &params->action_post;
+ cp_fsm_post (globals->cp, scenario_action_make_event (globals->cp, p));
+ test_fail_unless (globals->cp->sta_core_flag);
+}
+
+void
+scenario_action_trigger_cb (scenario_globals_t *globals,
+ scenario_params_t *params)
+{
+ test_within (scenario.t);
+ scenario_action_trigger_t *p = &params->action_trigger;
+ cp_fsm_trigger (globals->cp, scenario_action_make_event (globals->cp, p));
+ test_fail_unless (globals->cp->sta_core_flag);
+}
+
+void
+scenario_action_post_urgent_cb (scenario_globals_t *globals,
+ scenario_params_t *params)
+{
+ test_within (scenario.t);
+ scenario_action_post_urgent_t *p = &params->action_post_urgent;
+ cp_fsm_post_urgent (globals->cp,
+ scenario_action_make_event (globals->cp, p));
+ test_fail_unless (globals->cp->sta_core_urgent_flag);
+}
+
+void
+scenario_action_process_cb (scenario_globals_t *globals,
+ scenario_params_t *params)
+{
+ test_within (scenario.t);
+ test_fail_unless (globals->cp->sta_core_flag);
+ globals->cp->sta_core_flag = false;
+ cp_fsm_process (globals->cp);
+}
+
+void
+scenario_action_process_urgent_cb (scenario_globals_t *globals,
+ scenario_params_t *params)
+{
+ test_within (scenario.t);
+ test_fail_unless (globals->cp->sta_core_urgent_flag);
+ globals->cp->sta_core_urgent_flag = false;
+ cp_fsm_process_urgent (globals->cp);
+}
+
diff --git a/cesar/cp/eoc/fsm/test/utest/src/fsm_stub.c b/cesar/cp/eoc/fsm/test/utest/src/fsm_stub.c
new file mode 100644
index 0000000000..ee8c8bea9e
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/src/fsm_stub.c
@@ -0,0 +1,263 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file src/fsm_stub.c
+ * \brief Override FSM tables.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "lib/scenario/scenario.h"
+
+#include "cp/fsm/fsm.h"
+#include "cp/fsm/inc/tables.h"
+
+int cp_fsm__STATE1__enter_nb;
+int cp_fsm__STATE2__enter_nb;
+
+void
+cp_fsm__STATE1__enter (cp_t *ctx);
+
+void
+cp_fsm__STATE1__event1 (cp_t *ctx);
+
+void
+cp_fsm__STATE1__event2 (cp_t *ctx);
+
+void
+cp_fsm__STATE1__error_event_no_branch (cp_t *ctx);
+
+void
+cp_fsm__STATE1__error_event_bad_branch (cp_t *ctx);
+
+void
+cp_fsm__STATE1__error_event_dup_branch (cp_t *ctx);
+
+void
+cp_fsm__STATE1__error_urgent_event_branch (cp_t *ctx);
+
+void
+cp_fsm__STATE1__event_mme (cp_t *ctx, cp_mme_rx_t *mme);
+
+void
+cp_fsm__STATE1__event_sta (cp_t *ctx, cp_net_t *net, cp_sta_t *sta);
+
+void
+cp_fsm__STATE1__event_beacon (cp_t *ctx, bsu_beacon_t *beacon,
+ cp_net_t *net, cp_sta_t *sta);
+
+void
+cp_fsm__STATE1__eventb (cp_t *ctx);
+
+void
+cp_fsm__STATE1__long_event (cp_t *ctx);
+
+void
+cp_fsm__STATE1__urgent_event (cp_t *ctx);
+
+void
+cp_fsm__STATE2__enter (cp_t *ctx);
+
+void
+cp_fsm__STATE2__event3 (cp_t *ctx);
+
+void
+cp_fsm__STATE3__event1 (cp_t *ctx);
+
+void
+cp_fsm__STATE3__event2 (cp_t *ctx);
+
+void
+cp_fsm__STATE3__urgent_event (cp_t *ctx);
+
+void
+cp_fsm__STATE4__event1 (cp_t *ctx);
+
+void
+cp_fsm__STATE5__enter (cp_t *ctx);
+
+void
+cp_fsm__STATE5__leave (cp_t *ctx);
+
+void
+cp_fsm__STATE6__enter (cp_t *ctx);
+
+void
+cp_fsm__STATE6__leave (cp_t *ctx);
+
+void
+cp_fsm__STATEA__eventb (cp_t *ctx);
+
+void
+cp_fsm__STATEB__eventa (cp_t *ctx);
+
+/* Include generated tables. */
+#include "cp_fsm_tables.h"
+
+void
+cp_fsm__STATE1__enter (cp_t *ctx)
+{
+ cp_fsm__STATE1__enter_nb++;
+}
+
+void
+cp_fsm__STATE1__event1 (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE1__event1);
+}
+
+void
+cp_fsm__STATE1__event2 (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE1__event2);
+}
+
+void
+cp_fsm__STATE1__error_event_no_branch (cp_t *ctx)
+{
+ /* Do not choose branch. */
+}
+
+void
+cp_fsm__STATE1__error_event_bad_branch (cp_t *ctx)
+{
+ cp_fsm_branch (ctx, STATE2, event3, branch1);
+}
+
+void
+cp_fsm__STATE1__error_event_dup_branch (cp_t *ctx)
+{
+ cp_fsm_branch (ctx, STATE1, error_event_dup_branch, branch1);
+ cp_fsm_branch (ctx, STATE1, error_event_dup_branch, branch2);
+}
+
+void
+cp_fsm__STATE1__error_urgent_event_branch (cp_t *ctx)
+{
+ cp_fsm_branch (ctx, STATE1, error_urgent_event_branch, branch1);
+}
+
+void
+cp_fsm__STATE1__event_mme (cp_t *ctx, cp_mme_rx_t *mme)
+{
+ scenario_event (cp_fsm__STATE1__event_mme, param);
+ test_fail_unless (mme == param->mme);
+}
+
+void
+cp_fsm__STATE1__event_sta (cp_t *ctx, cp_net_t *net, cp_sta_t *sta)
+{
+ scenario_event (cp_fsm__STATE1__event_sta, param);
+ test_fail_unless (net == param->net);
+ test_fail_unless (sta == param->sta);
+}
+
+void
+cp_fsm__STATE1__event_beacon (cp_t *ctx, bsu_beacon_t *beacon,
+ cp_net_t *net, cp_sta_t *sta)
+{
+ scenario_event (cp_fsm__STATE1__event_beacon, param);
+ test_fail_unless (beacon == param->beacon);
+ test_fail_unless (net == param->net);
+ test_fail_unless (sta == param->sta);
+}
+
+void
+cp_fsm__STATE1__eventb (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE1__eventb);
+}
+
+void
+cp_fsm__STATE1__long_event (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE1__long_event);
+ cp_fsm_process_urgent (ctx);
+}
+
+void
+cp_fsm__STATE1__urgent_event (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE1__urgent_event);
+}
+
+void
+cp_fsm__STATE2__enter (cp_t *ctx)
+{
+ cp_fsm__STATE2__enter_nb++;
+}
+
+void
+cp_fsm__STATE2__event3 (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE2__event3, param);
+ cp_fsm_branch_ (ctx, param->branch);
+}
+
+void
+cp_fsm__STATE3__event1 (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE3__event1, param);
+ cp_fsm_branch_ (ctx, param->branch);
+}
+
+void
+cp_fsm__STATE3__event2 (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE3__event2);
+}
+
+void
+cp_fsm__STATE3__urgent_event (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE3__urgent_event);
+}
+
+void
+cp_fsm__STATE4__event1 (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE4__event1, param);
+ cp_fsm_branch_ (ctx, param->branch);
+}
+
+void
+cp_fsm__STATE5__enter (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE5__enter);
+}
+
+void
+cp_fsm__STATE5__leave (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE5__leave);
+}
+
+void
+cp_fsm__STATE6__enter (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE6__enter);
+}
+
+void
+cp_fsm__STATE6__leave (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATE6__leave);
+}
+
+void
+cp_fsm__STATEA__eventb (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATEA__eventb);
+}
+
+void
+cp_fsm__STATEB__eventa (cp_t *ctx)
+{
+ scenario_event (cp_fsm__STATEB__eventa);
+}
+
diff --git a/cesar/cp/eoc/fsm/test/utest/src/test_fsm.c b/cesar/cp/eoc/fsm/test/utest/src/test_fsm.c
new file mode 100644
index 0000000000..54a17abc6d
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/src/test_fsm.c
@@ -0,0 +1,477 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2008 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file src/test_fsm.c
+ * \brief Test FSM module.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "lib/blk.h"
+#include "lib/test.h"
+#include "lib/scenario/scenario.h"
+
+#include "cp/fsm/fsm.h"
+
+#include "cp/inc/context.h"
+
+#include "cp/sta/core/core.h"
+
+extern int cp_fsm__STATE1__enter_nb;
+extern int cp_fsm__STATE2__enter_nb;
+
+void
+test_fsm_basic_test_case (test_t t)
+{
+ test_case_begin (t, "basic");
+ cp_t cp;
+ cp.sta_core_urgent_flag = false;
+ cp_trace_init (&cp);
+ slab_cache_t cache;
+ slab_cache_init (&cache, "dummy", 1, NULL);
+ cp_mme_rx_t *mme = slab_alloc (&cache);
+ cp_sta_t *sta = slab_alloc (&cache);
+ cp_net_t *net = (void *) 0x9abcdef0;
+ bsu_beacon_t *beacon = blk_alloc ();
+ test_begin (t, "bare")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ /* STATE1 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE1__event1),
+ /* STATE1 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event2),
+ SCENARIO_EVENT (cp_fsm__STATE1__event2),
+ /* STATE2 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event3),
+ SCENARIO_EVENT (cp_fsm__STATE2__event3,
+ .branch = CP_FSM_BRANCH (STATE2, event3, branch1)),
+ /* STATE3 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE3__event1,
+ .branch = CP_FSM_BRANCH (STATE3, event1, branch2)),
+ /* STATE3 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event2),
+ SCENARIO_EVENT (cp_fsm__STATE3__event2),
+ /* STATE2 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event3),
+ SCENARIO_EVENT (cp_fsm__STATE2__event3,
+ .branch = CP_FSM_BRANCH (STATE2, event3, branch2)),
+ /* STATE4 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE4__event1,
+ .branch = CP_FSM_BRANCH (STATE4, event1, branch2)),
+ /* STATE4 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE4__event1,
+ .branch = CP_FSM_BRANCH (STATE4, event1, branch1)),
+ /* STATE1 */
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "mme")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event_mme, .mme = mme),
+ SCENARIO_EVENT (cp_fsm__STATE1__event_mme, .mme = mme),
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "sta")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event_sta,
+ .net = net, .sta = sta),
+ SCENARIO_EVENT (cp_fsm__STATE1__event_sta,
+ .net = net, .sta = sta),
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "beacon")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event_beacon,
+ .beacon = beacon, .net = net, .sta = sta),
+ SCENARIO_EVENT (cp_fsm__STATE1__event_beacon,
+ .beacon = beacon, .net = net, .sta = sta),
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "dual")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ /* STATE1, STATEA */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_eventb),
+ SCENARIO_EVENT (cp_fsm__STATE1__eventb),
+ SCENARIO_EVENT (cp_fsm__STATEA__eventb),
+ /* STATE3, STATEB */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_eventa),
+ SCENARIO_EVENT (cp_fsm__STATEB__eventa),
+ /* STATE3, STATEA */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE3__event1,
+ .branch = CP_FSM_BRANCH (STATE3, event1, branch1)),
+ /* STATE1, STATEA */
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ test_fail_unless (cp.fsm.active_states[1] == CP_FSM_STATE_STATEA);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "no action")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ /* STATE1 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event_no_action),
+ /* STATE3 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE3__event1,
+ .branch = CP_FSM_BRANCH (STATE3, event1, branch1)),
+ /* STATE1 */
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "enter leave")
+ {
+ cp_fsm__STATE1__enter_nb = 0;
+ cp_fsm__STATE2__enter_nb = 0;
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ /* STATE1 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event5),
+ SCENARIO_EVENT (cp_fsm__STATE5__enter),
+ /* STATE5 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event5),
+ /* No enter/leave here. */
+ /* STATE5 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event6),
+ SCENARIO_EVENT (cp_fsm__STATE5__leave),
+ SCENARIO_EVENT (cp_fsm__STATE6__enter),
+ /* STATE6 */
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE6__leave),
+ /* STATE1 */
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ test_fail_unless (cp_fsm__STATE1__enter_nb == 2);
+ test_fail_unless (cp_fsm__STATE2__enter_nb == 0);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "trigger")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ /* STATE1 */
+ SCENARIO_ACTION (post, .type = CP_FSM_EVENT_TYPE_event3),
+ SCENARIO_ACTION (trigger, .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_ACTION (trigger, .type = CP_FSM_EVENT_TYPE_event2),
+ SCENARIO_ACTION (process),
+ SCENARIO_EVENT (cp_fsm__STATE1__event1),
+ SCENARIO_ACTION (process),
+ SCENARIO_EVENT (cp_fsm__STATE1__event2),
+ /* STATE2 */
+ SCENARIO_ACTION (process),
+ SCENARIO_EVENT (cp_fsm__STATE2__event3,
+ .branch = CP_FSM_BRANCH (STATE2, event3, branch1)),
+ /* STATE3 */
+ SCENARIO_ACTION (trigger, .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_ACTION (process),
+ SCENARIO_EVENT (cp_fsm__STATE3__event1,
+ .branch = CP_FSM_BRANCH (STATE3, event1, branch1)),
+ /* STATE1 */
+ /* Now, test some insertion corner cases. */
+ SCENARIO_ACTION (trigger, .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_ACTION (trigger, .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_ACTION (post, .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ test_begin (t, "urgent")
+ {
+ cp_fsm_init (&cp);
+ cp.sta_core_flag = false;
+ scenario_entry_t entries[] = {
+ /* STATE1 */
+ SCENARIO_ACTION (post, .type = CP_FSM_EVENT_TYPE_long_event),
+ SCENARIO_ACTION (post_urgent,
+ .type = CP_FSM_EVENT_TYPE_urgent_event),
+ SCENARIO_ACTION (process),
+ SCENARIO_EVENT (cp_fsm__STATE1__long_event),
+ SCENARIO_EVENT (cp_fsm__STATE1__urgent_event),
+ /* STATE3 */
+ SCENARIO_ACTION (post_urgent,
+ .type = CP_FSM_EVENT_TYPE_urgent_event),
+ SCENARIO_ACTION (post_urgent,
+ .type = CP_FSM_EVENT_TYPE_urgent_event),
+ SCENARIO_ACTION (process_urgent),
+ SCENARIO_EVENT (cp_fsm__STATE3__urgent_event),
+ SCENARIO_ACTION (process_urgent),
+ SCENARIO_EVENT (cp_fsm__STATE3__urgent_event),
+ SCENARIO_ACTION (post_and_process,
+ .type = CP_FSM_EVENT_TYPE_event1),
+ SCENARIO_EVENT (cp_fsm__STATE3__event1,
+ .branch = CP_FSM_BRANCH (STATE3, event1, branch1)),
+ SCENARIO_END
+ };
+ scenario_globals_t globals = {
+ .cp = &cp,
+ };
+ scenario_run (t, entries, &globals);
+ test_fail_unless (cp.fsm.active_states[0] == CP_FSM_STATE_STATE1);
+ cp_fsm_uninit (&cp);
+ } test_end;
+ slab_release (mme);
+ slab_release (sta);
+ slab_cache_uninit (&cache);
+ blk_release (beacon);
+#if CONFIG_TRACE
+ trace_buffer_dbg_dump (&cp.trace);
+#endif /* CONFIG_TRACE */
+ cp_trace_uninit (&cp);
+}
+
+void
+test_fsm_error_test_case (test_t t)
+{
+ test_case_begin (t, "error");
+ cp_t cp;
+ cp_trace_init (&cp);
+ test_begin (t, "no branch")
+ {
+ cp_fsm_init (&cp);
+ cp_fsm_event_t *event = cp_fsm_event_bare_new (
+ &cp, CP_FSM_EVENT_TYPE_error_event_no_branch);
+ cp_fsm_post (&cp, event);
+ const char *asserted = NULL;
+ dbg_fatal_try_begin
+ {
+ cp_fsm_process (&cp);
+ }
+ dbg_fatal_try_catch (const char *msg)
+ {
+ slab_release (event); /* Was not release due to assert. */
+ asserted = msg;
+ }
+ dbg_fatal_try_end;
+ test_fail_unless (asserted);
+ } test_end;
+ test_begin (t, "bad branch")
+ {
+ cp_fsm_init (&cp);
+ cp_fsm_event_t *event = cp_fsm_event_bare_new (
+ &cp, CP_FSM_EVENT_TYPE_error_event_bad_branch);
+ cp_fsm_post (&cp, event);
+ const char *asserted = NULL;
+ dbg_fatal_try_begin
+ {
+ cp_fsm_process (&cp);
+ }
+ dbg_fatal_try_catch (const char *msg)
+ {
+ slab_release (event); /* Was not release due to assert. */
+ asserted = msg;
+ }
+ dbg_fatal_try_end;
+ test_fail_unless (asserted);
+ } test_end;
+ test_begin (t, "dup branch")
+ {
+ cp_fsm_init (&cp);
+ cp_fsm_event_t *event = cp_fsm_event_bare_new (
+ &cp, CP_FSM_EVENT_TYPE_error_event_dup_branch);
+ cp_fsm_post (&cp, event);
+ const char *asserted = NULL;
+ dbg_fatal_try_begin
+ {
+ cp_fsm_process (&cp);
+ }
+ dbg_fatal_try_catch (const char *msg)
+ {
+ slab_release (event); /* Was not release due to assert. */
+ asserted = msg;
+ }
+ dbg_fatal_try_end;
+ test_fail_unless (asserted);
+ } test_end;
+ test_begin (t, "not in transition")
+ {
+ cp_fsm_init (&cp);
+ const char *asserted = NULL;
+ dbg_fatal_try_begin
+ {
+ cp_fsm_branch (&cp, STATE1, error_event_no_branch, branch1);
+ }
+ dbg_fatal_try_catch (const char *msg)
+ {
+ asserted = msg;
+ }
+ dbg_fatal_try_end;
+ test_fail_unless (asserted);
+ } test_end;
+ test_begin (t, "transition for urgent event")
+ {
+ cp_fsm_init (&cp);
+ cp_fsm_event_t *event = cp_fsm_event_bare_new (
+ &cp, CP_FSM_EVENT_TYPE_error_urgent_event_transition);
+ cp_fsm_post_urgent (&cp, event);
+ const char *asserted = NULL;
+ dbg_fatal_try_begin
+ {
+ cp_fsm_process_urgent (&cp);
+ }
+ dbg_fatal_try_catch (const char *msg)
+ {
+ slab_release (event); /* Was not release due to assert. */
+ asserted = msg;
+ }
+ dbg_fatal_try_end;
+ test_fail_unless (asserted);
+ } test_end;
+ test_begin (t, "branch for urgent event")
+ {
+ cp_fsm_init (&cp);
+ cp_fsm_event_t *event = cp_fsm_event_bare_new (
+ &cp, CP_FSM_EVENT_TYPE_error_urgent_event_branch);
+ cp_fsm_post_urgent (&cp, event);
+ const char *asserted = NULL;
+ dbg_fatal_try_begin
+ {
+ cp_fsm_process_urgent (&cp);
+ }
+ dbg_fatal_try_catch (const char *msg)
+ {
+ slab_release (event); /* Was not release due to assert. */
+ asserted = msg;
+ }
+ dbg_fatal_try_end;
+ test_fail_unless (asserted);
+ } test_end;
+#if CONFIG_TRACE
+ trace_buffer_dbg_dump (&cp.trace);
+#endif /* CONFIG_TRACE */
+ cp_trace_uninit (&cp);
+}
+
+void
+test_fsm_test_suite (test_t t)
+{
+ test_suite_begin (t, "fsm");
+ test_fsm_basic_test_case (t);
+ test_fsm_error_test_case (t);
+ test_case_begin (t, "memory");
+ test_begin (t, "memory")
+ {
+ test_fail_unless (blk_check_memory ());
+ } test_end;
+}
+
+void
+cp_sta_core_signal_fsm_event (cp_t *ctx)
+{
+ dbg_assert (ctx);
+ ctx->sta_core_flag = true;
+}
+
+void
+cp_sta_core_signal_fsm_urgent_event (cp_t *ctx)
+{
+ dbg_assert (ctx);
+ ctx->sta_core_urgent_flag = true;
+}
+
+int
+main (int argc, char **argv)
+{
+ test_t t;
+ trace_init ();
+ test_init (t, argc, argv);
+ test_fsm_test_suite (t);
+ trace_uninit ();
+ test_result (t);
+ return test_nb_failed (t) == 0 ? 0 : 1;
+}
+
diff --git a/cesar/cp/eoc/fsm/test/utest/src/utest.fsm b/cesar/cp/eoc/fsm/test/utest/src/utest.fsm
new file mode 100644
index 0000000000..f251cb6708
--- /dev/null
+++ b/cesar/cp/eoc/fsm/test/utest/src/utest.fsm
@@ -0,0 +1,86 @@
+Test Control Plane FSM
+ Test FSM for engine test.
+
+States:
+ STATE1 [enter=cp_fsm__STATE1__enter]
+ STATE2 [enter=cp_fsm__STATE2__enter]
+ STATE3
+ STATE4
+ STATE5 [enter=cp_fsm__STATE5__enter leave=cp_fsm__STATE5__leave]
+ STATE6 [enter=cp_fsm__STATE6__enter leave=cp_fsm__STATE6__leave]
+ *STATEA
+ STATEB
+
+Events:
+ event1
+ event2
+ event3
+ event4
+ event5
+ event6
+ error_event_no_branch
+ test error conditions: no branch selected
+ error_event_bad_branch
+ test error conditions: branch not for this event
+ error_event_dup_branch
+ test error conditions: branch selected two times
+ error_urgent_event_transition
+ test error conditions: urgent event with transition
+ error_urgent_event_branch
+ test error conditions: urgent event with branch
+ event_mme
+ event_sta
+ event_beacon
+ event_no_action
+ eventa
+ eventb
+ long_event
+ long event handling triggering a urgent process
+ urgent_event
+
+STATE1:
+ event1 -> .
+ event2 -> STATE2
+ event5 -> STATE5 [NULL]
+ error_event_no_branch: branch1 -> .
+ error_event_no_branch: branch2 -> .
+ error_event_bad_branch: branch1 -> .
+ error_event_bad_branch: branch2 -> .
+ error_event_dup_branch: branch1 -> .
+ error_event_dup_branch: branch2 -> .
+ error_urgent_event_transition -> STATE2 [NULL]
+ error_urgent_event_branch: branch1 -> .
+ error_urgent_event_branch: branch2 -> .
+ event_mme -> .
+ event_sta -> .
+ event_beacon -> .
+ event_no_action -> STATE3 [NULL]
+ eventb -> STATE3
+ long_event -> STATE3
+ urgent_event -> .
+
+STATE2:
+ event3: branch1 -> STATE3
+ event3: branch2 -> STATE4
+
+STATE3:
+ event2 -> STATE2
+ urgent_event -> .
+
+STATE3, STATE4:
+ event1: branch1 -> STATE1
+ event1: branch2 -> .
+
+STATE5:
+ event5 -> . [NULL]
+ event6 -> STATE6 [NULL]
+
+STATE6:
+ event1 -> STATE1 [NULL]
+
+STATEA:
+ eventb -> STATEB
+
+STATEB:
+ eventa -> STATEA
+