summaryrefslogtreecommitdiff
path: root/cesar/cp/sta/action
diff options
context:
space:
mode:
authorJérémy Dufour2010-08-30 10:34:25 +0200
committerJérémy Dufour2010-08-31 17:04:46 +0200
commit2bbdf79c46cf21c332af82819c15744baf04de6e (patch)
treeefc29837d886036d12b38eb1b523f2a4b43efe27 /cesar/cp/sta/action
parentc7646eac0053e674d9b69455772db00a53e1e572 (diff)
cesar/cp/{fsm, sta/action}: when SC failed, change to correct state
Diffstat (limited to 'cesar/cp/sta/action')
-rw-r--r--cesar/cp/sta/action/sc.h3
-rw-r--r--cesar/cp/sta/action/src/sc.c20
-rw-r--r--cesar/cp/sta/action/test/utest/inc/scenario_defs.h2
-rw-r--r--cesar/cp/sta/action/test/utest/src/sc.c64
-rw-r--r--cesar/cp/sta/action/test/utest/src/scenario_actions.c1
5 files changed, 90 insertions, 0 deletions
diff --git a/cesar/cp/sta/action/sc.h b/cesar/cp/sta/action/sc.h
index 4d9a8c3ac1..d1d33a40b3 100644
--- a/cesar/cp/sta/action/sc.h
+++ b/cesar/cp/sta/action/sc.h
@@ -225,6 +225,9 @@ cp_sta_action_sc__sc_ucco_track_beacon (cp_t *ctx, cp_beacon_desc_t *beacon,
void
cp_sta_action_sc__sc_sta__avln_failure (cp_t *ctx);
+void
+cp_sta_action_sc__sc_cco__sc_failed (cp_t *ctx);
+
END_DECLS
#endif /* cp_sta_action_sc_h */
diff --git a/cesar/cp/sta/action/src/sc.c b/cesar/cp/sta/action/src/sc.c
index e76a01b5ea..1e359ebdf0 100644
--- a/cesar/cp/sta/action/src/sc.c
+++ b/cesar/cp/sta/action/src/sc.c
@@ -612,3 +612,23 @@ cp_sta_action_sc__sc_sta__avln_failure (cp_t *ctx)
cp_fsm_post (ctx, event);
}
+void
+cp_sta_action_sc__sc_cco__sc_failed (cp_t *ctx)
+{
+ dbg_assert (ctx);
+ cp_net_t *our_net = cp_sta_mgr_get_our_avln (ctx);
+ if (cp_net_is_empty (ctx, our_net))
+ {
+ /* Leave CCo role. */
+ cp_cco_action__cco__unassoc_stop (ctx);
+ if (cp_sta_mgr_net_list_is_empty (ctx))
+ cp_fsm_branch (ctx, SC_CCO, sc_failed, no_sta_no_avln);
+ else
+ cp_fsm_branch (ctx, SC_CCO, sc_failed, no_sta_avln);
+ }
+ else
+ {
+ /* Ok, stay CCo. */
+ cp_fsm_branch (ctx, SC_CCO, sc_failed, sta);
+ }
+}
diff --git a/cesar/cp/sta/action/test/utest/inc/scenario_defs.h b/cesar/cp/sta/action/test/utest/inc/scenario_defs.h
index 2926fef310..d952227ec3 100644
--- a/cesar/cp/sta/action/test/utest/inc/scenario_defs.h
+++ b/cesar/cp/sta/action/test/utest/inc/scenario_defs.h
@@ -132,6 +132,7 @@
sc__sc_join__enter, \
sc__sc_join__leave, \
sc__sc_join__sc_join_req_timeout, \
+ sc__sc_cco__sc_failed, \
sc__sc_timeout, \
sc_add__sc_timeout, \
sc__sc_join__cm_sc_join_cnf, \
@@ -313,6 +314,7 @@ __0 (sc__sc_idle__leave)
__0 (sc__sc_join__enter)
__0 (sc__sc_join__leave)
__0 (sc__sc_join__sc_join_req_timeout)
+__0 (sc__sc_cco__sc_failed)
__0 (sc__sc_timeout)
__0 (sc_add__sc_timeout)
__m (sc__sc_join__cm_sc_join_cnf)
diff --git a/cesar/cp/sta/action/test/utest/src/sc.c b/cesar/cp/sta/action/test/utest/src/sc.c
index 568a65aae1..638065bff3 100644
--- a/cesar/cp/sta/action/test/utest/src/sc.c
+++ b/cesar/cp/sta/action/test/utest/src/sc.c
@@ -133,6 +133,70 @@ sc_basic_test_cases (test_t t)
}
} test_end;
+ test_begin (t, "failure in SC_CCO: no other sta")
+ {
+ /* Create net. */
+ test_sta_action_create_our_net (&ctx, nid, 0);
+ scenario_entry_t sc_main_timeout[] = {
+ /* First, execute transition. */
+ SCENARIO_ACTION (sc__sc_cco__sc_failed),
+ /* Quit CCo role. */
+ SCENARIO_EVENT (cp_cco_action__cco__unassoc_stop),
+ SCENARIO_EVENT (cp_fsm_branch,
+ .branch = CP_FSM_BRANCH (SC_CCO, sc_failed,
+ no_sta_no_avln)),
+ SCENARIO_END
+ };
+ scenario_run (t, sc_main_timeout, &globals);
+ } test_end;
+
+ test_begin (t, "failure in SC_CCO: one sta not in our net")
+ {
+ /* Create net. */
+ test_sta_action_create_our_net (&ctx, nid, 0);
+ /* Another net. */
+ cp_net_t *other_net = cp_sta_mgr_add_avln (&ctx.cp, 0, 1);
+ /* A station. */
+ cp_sta_t *a_sta = cp_sta_mgr_sta_add (&ctx.cp, other_net, 1,
+ sc_add_mac);
+ scenario_entry_t sc_main_timeout[] = {
+ /* First, execute transition. */
+ SCENARIO_ACTION (sc__sc_cco__sc_failed),
+ /* Quit CCo role. */
+ SCENARIO_EVENT (cp_cco_action__cco__unassoc_stop),
+ SCENARIO_EVENT (cp_fsm_branch,
+ .branch = CP_FSM_BRANCH (SC_CCO, sc_failed,
+ no_sta_avln)),
+ SCENARIO_END
+ };
+ scenario_run (t, sc_main_timeout, &globals);
+ /* Clean. */
+ cp_sta_mgr_sta_remove (&ctx.cp, a_sta);
+ slab_release (a_sta);
+ } test_end;
+
+ test_begin (t, "failure in SC_CCO: one sta in our net")
+ {
+ /* Create net. */
+ test_sta_action_create_our_net (&ctx, nid, 0);
+ cp_net_t *net = cp_sta_mgr_get_avln (&ctx.cp, 0, nid);
+ /* A station in our net. */
+ cp_sta_t *a_sta = cp_sta_mgr_sta_add (&ctx.cp, net, 2,
+ sc_add_mac);
+ scenario_entry_t sc_main_timeout[] = {
+ /* First, execute transition. */
+ SCENARIO_ACTION (sc__sc_cco__sc_failed),
+ SCENARIO_EVENT (cp_fsm_branch,
+ .branch = CP_FSM_BRANCH (SC_CCO, sc_failed,
+ sta)),
+ SCENARIO_END
+ };
+ scenario_run (t, sc_main_timeout, &globals);
+ /* Clean. */
+ cp_sta_mgr_sta_remove (&ctx.cp, a_sta);
+ slab_release (a_sta);
+ } test_end;
+
/* Timeout of the whole SC procedure not in SC_ADD. */
test_begin (t, "timeout of SC procedure (not in SC_ADD)")
{
diff --git a/cesar/cp/sta/action/test/utest/src/scenario_actions.c b/cesar/cp/sta/action/test/utest/src/scenario_actions.c
index 0614bdcacc..3556aa8101 100644
--- a/cesar/cp/sta/action/test/utest/src/scenario_actions.c
+++ b/cesar/cp/sta/action/test/utest/src/scenario_actions.c
@@ -191,6 +191,7 @@ __0 (sc__sc_idle__leave)
__0 (sc__sc_join__enter)
__0 (sc__sc_join__leave)
__0 (sc__sc_join__sc_join_req_timeout)
+__0 (sc__sc_cco__sc_failed)
__0 (sc__sc_timeout)
__0 (sc_add__sc_timeout)
__m (sc__sc_join__cm_sc_join_cnf)