summaryrefslogtreecommitdiff
path: root/cesar/cp/sta/action
diff options
context:
space:
mode:
authorNélio Laranjeiro2010-12-07 17:42:25 +0100
committerNélio Laranjeiro2010-12-08 10:18:24 +0100
commitad2227112648cb9141dbad84b8d549b11cae1e0b (patch)
tree0727102605d5146ff2e712a8d8705c8afbc97973 /cesar/cp/sta/action
parentfa81ee2cb662315ae336ab2f2486015c88da578e (diff)
cesar/cp/{sta/action, sta/mgr}: add a correct status for UCCo, closes #2146
Change the DRV_STA_STATUS.IND generation to inform linux when the CCo is an UCCo.
Diffstat (limited to 'cesar/cp/sta/action')
-rw-r--r--cesar/cp/sta/action/src/drv.c11
-rw-r--r--cesar/cp/sta/action/test/utest/src/drv.c64
2 files changed, 65 insertions, 10 deletions
diff --git a/cesar/cp/sta/action/src/drv.c b/cesar/cp/sta/action/src/drv.c
index 292f7ad47c..ba1707a384 100644
--- a/cesar/cp/sta/action/src/drv.c
+++ b/cesar/cp/sta/action/src/drv.c
@@ -446,7 +446,16 @@ cp_sta_action_drv__drv_sta_status_common (cp_t *ctx,
dbg_assert (ctx);
dbg_assert (data);
- if (cp_sta_own_data_get_tei (ctx) == MAC_TEI_UNASSOCIATED)
+ if (cp_sta_own_data_get_cco_status (ctx))
+ {
+ cp_net_t *net = cp_sta_mgr_get_our_avln (ctx);
+ data->cco = CP_MSG_DRV_STA_STATUS_CCO_CCO;
+ if (net->num_associated_stas)
+ data->status = CP_MSG_DRV_STA_STATUS_STATUS_AUTH;
+ else
+ data->status = CP_MSG_DRV_STA_STATUS_STATUS_UNASSOC;
+ }
+ else if (cp_sta_own_data_get_tei (ctx) == MAC_TEI_UNASSOCIATED)
{
data->status = CP_MSG_DRV_STA_STATUS_STATUS_UNASSOC;
data->cco = CP_MSG_DRV_STA_STATUS_CCO_STA;
diff --git a/cesar/cp/sta/action/test/utest/src/drv.c b/cesar/cp/sta/action/test/utest/src/drv.c
index 6634136d46..7f471319d5 100644
--- a/cesar/cp/sta/action/test/utest/src/drv.c
+++ b/cesar/cp/sta/action/test/utest/src/drv.c
@@ -620,19 +620,19 @@ drv_get_sta_status_test_case (test_t t)
{
test_sta_action_t ctx;
test_case_begin (t, "DRV_GET_STA_STATUS");
+ cp_mme_peer_t peer = CP_MME_PEER(0x1, MAC_TEI_FOREIGN);
+ test_sta_action_init (&ctx);
- test_begin (t, "Good and bad")
- {
- cp_mme_peer_t peer = CP_MME_PEER(0x1, MAC_TEI_FOREIGN);
- test_sta_action_init (&ctx);
+ scenario_globals_t globals = {
+ .cp = &ctx.cp,
+ };
- scenario_globals_t globals = {
- .cp = &ctx.cp,
- };
+ cp_sta_own_data_set_tei (&ctx.cp, 1);
+ cp_sta_own_data_set_security_level (&ctx.cp, CP_SECURITY_LEVEL_HS);
- cp_sta_own_data_set_tei (&ctx.cp, 1);
- cp_sta_own_data_set_security_level (&ctx.cp, CP_SECURITY_LEVEL_HS);
+ test_begin (t, "Good and bad")
+ {
scenario_entry_t entries[] = {
SCENARIO_ACTION (drv__drv_sta_status_req,
.peer = peer),
@@ -663,6 +663,52 @@ drv_get_sta_status_test_case (test_t t)
scenario_run (t, entries, &globals);
}
test_end;
+ test_begin (t, "UCCo/CCo status")
+ {
+ scenario_entry_t entries_ucco[] = {
+ SCENARIO_ACTION (drv__drv_sta_status_req,
+ .peer = peer),
+ SCENARIO_EVENT (cp_msg_drv_sta_status_req_receive,
+ .ok = true),
+ SCENARIO_EVENT (cp_msg_drv_sta_status_cnf_send,
+ .peer = peer,
+ .result = CP_MSG_DRV_RESULT_SUCCESS,
+ .status = CP_MSG_DRV_STA_STATUS_STATUS_UNASSOC,
+ .cco = CP_MSG_DRV_STA_STATUS_CCO_CCO,
+ .preferred_cco = false,
+ .backup_cco = false,
+ .simple_connect = false),
+ SCENARIO_END
+ };
+ /* Set our AVLN. */
+ cp_snid_t snid = cp_sta_own_data_get_snid (&ctx.cp);
+ cp_nid_t nid = cp_sta_own_data_get_nid (&ctx.cp);
+ cp_net_t *net = cp_sta_mgr_add_avln (&ctx.cp, snid, nid);
+ cp_sta_mgr_set_our_avln (&ctx.cp, net);
+ cp_sta_own_data_set_cco_status (&ctx.cp, true);
+ net->num_associated_stas = 0;
+ scenario_run (t, entries_ucco, &globals);
+
+ scenario_entry_t entries_cco[] = {
+ SCENARIO_ACTION (drv__drv_sta_status_req,
+ .peer = peer),
+ SCENARIO_EVENT (cp_msg_drv_sta_status_req_receive,
+ .ok = true),
+ SCENARIO_EVENT (cp_msg_drv_sta_status_cnf_send,
+ .peer = peer,
+ .result = CP_MSG_DRV_RESULT_SUCCESS,
+ .status = CP_MSG_DRV_STA_STATUS_STATUS_AUTH,
+ .cco = CP_MSG_DRV_STA_STATUS_CCO_CCO,
+ .preferred_cco = false,
+ .backup_cco = false,
+ .simple_connect = false),
+ SCENARIO_END
+ };
+ /* Set our AVLN. */
+ net->num_associated_stas = 1;
+ scenario_run (t, entries_cco, &globals);
+ }
+ test_end;
}
void