summaryrefslogtreecommitdiff
path: root/cesar/cp/sta
diff options
context:
space:
mode:
authorlaranjeiro2009-10-21 10:56:28 +0000
committerlaranjeiro2009-10-21 10:56:28 +0000
commitf8cb447dbc14a33edf2df989855f7265d0e1364e (patch)
treea76c84cc276b45c7017dfeb8b02b173d0a5f83e2 /cesar/cp/sta
parentfb88f74338cd396f37daefa0b9e79abceace7279 (diff)
cesar/cp/sta/action
Add unit test to handle the CCo's Mac address as broadcast. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6214 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/cp/sta')
-rw-r--r--cesar/cp/sta/action/src/assoc.c6
-rw-r--r--cesar/cp/sta/action/test/utest/src/assoc.c68
2 files changed, 72 insertions, 2 deletions
diff --git a/cesar/cp/sta/action/src/assoc.c b/cesar/cp/sta/action/src/assoc.c
index c0dff3bbf3..6e67a1ca6f 100644
--- a/cesar/cp/sta/action/src/assoc.c
+++ b/cesar/cp/sta/action/src/assoc.c
@@ -190,8 +190,10 @@ cp_sta_action_assoc__wait_assoc_cnf__cc_assoc_cnf__common (cp_t *ctx,
/* Set our net to the CCo net. */
our_net = ctx->sta_action.assoc.cco_net;
cp_sta_mgr_set_our_avln (ctx, our_net);
- /* Promote UCCo to CCo. */
- if (ctx->sta_action.assoc.peer.tei == 0)
+ /* Promote UCCo to CCo.
+ Or the CCo's mac address was not know. */
+ if ((ctx->sta_action.assoc.peer.tei == MAC_TEI_UNASSOCIATED)
+ || (ctx->sta_action.assoc.peer.mac == MAC_BROADCAST))
{
cp_sta_t *cco = cp_sta_mgr_sta_add (ctx, our_net,
mme->peer.tei,
diff --git a/cesar/cp/sta/action/test/utest/src/assoc.c b/cesar/cp/sta/action/test/utest/src/assoc.c
index 3a36559d81..42308854b0 100644
--- a/cesar/cp/sta/action/test/utest/src/assoc.c
+++ b/cesar/cp/sta/action/test/utest/src/assoc.c
@@ -815,10 +815,78 @@ assoc_basic_test_cases (test_t t)
}
void
+assoc_basic_test_cases_cco_unknow_mac_addr (test_t t)
+{
+ test_sta_action_t ctx;
+ test_sta_action_init (&ctx);
+ cp_sta_action_init (&ctx.cp);
+ scenario_globals_t globals = {
+ .cp = &ctx.cp,
+ };
+
+ test_case_begin (t, "assoc");
+ /* Create a CCo to associate with. */
+ const cp_snid_t snid = 2;
+ const cp_nid_t nid = 0xf11111111111ull;
+ const cp_tei_t cco_tei = 1, sta_tei = 2;
+ const mac_t cco_mac = 0x111111111111ull;
+ cp_net_t *cco_net;
+ cp_sta_t *cco = NULL;
+ cp_mme_peer_t cco_peer = CP_MME_PEER (cco_mac, cco_tei);
+ /* Association test. */
+ scenario_entry_t associate_entries[] = {
+ SCENARIO_ACTION (assoc_start, .cco_net = cco_net, .cco = cco),
+ SCENARIO_EVENT (cp_fsm_event_bare_new,
+ .type = CP_FSM_EVENT_TYPE_to_assoc),
+ SCENARIO_ACTION (assoc__unassociated__to_assoc),
+ SCENARIO_EVENT (cp_msg_cc_assoc_req_send,
+ .peer = CP_MME_PEER (MAC_BROADCAST, cco_tei),
+ .request_type = CP_MSG_CC_ASSOC_REQ_TYPE_NEW,
+ .nid = nid, .cco_cap = CP_CCO_LEVEL,
+ .proxy_cap = CP_PCO_CAP),
+ SCENARIO_ACTION (assoc__wait_assoc_cnf__cc_assoc_cnf,
+ .peer = cco_peer),
+ SCENARIO_EVENT (cp_msg_cc_assoc_cnf_receive, .ok = true,
+ .result = CP_MSG_CC_ASSOC_CNF_RESULT_SUCCESS,
+ .nid = nid, .snid = snid, .sta_tei = sta_tei,
+ .lease_time_min = 15),
+ SCENARIO_EVENT (cp_sta_core_gen_timed_event,
+ .delay_min_ms = 10 * 60 * 1000,
+ .delay_max_ms = 10 * 60 * 1000),
+ SCENARIO_EVENT (cp_msg_cm_get_key_req_send,
+ .peer = cco_peer, .peks = CP_MME_PEKS_NMK,
+ .pid = 0, .pmn = 1, .relayed = false,
+ .key_type = CP_MSG_KEY_NEK, .nid = nid),
+ SCENARIO_EVENT (cp_fsm_branch,
+ .branch = CP_FSM_BRANCH (WAIT_ASSOC_CONF,
+ CC_ASSOC_CNF, ok)),
+ SCENARIO_END
+ };
+ test_begin (t, "ok")
+ {
+ assoc_create_cco (t, &ctx, snid, nid, cco_tei, MAC_BROADCAST, &cco_net,
+ &cco, associate_entries);
+ scenario_run (t, associate_entries, &globals);
+ test_fail_unless (cp_sta_own_data_get_nid (&ctx.cp) == nid);
+ test_fail_unless (cp_sta_own_data_get_snid (&ctx.cp) == snid);
+ test_fail_unless (cp_sta_own_data_get_tei (&ctx.cp) == sta_tei);
+ cp_net_t *our_net = cp_sta_mgr_get_our_avln (&ctx.cp);
+ cp_sta_t *our_cco = cp_net_get_cco (&ctx.cp, our_net);
+ test_fail_unless (our_cco == cco);
+ test_fail_unless (cp_sta_get_mac_address (our_cco) == cco_mac);
+ slab_release (our_cco);
+ } test_end;
+ /* Cleanup. */
+ slab_release (cco);
+ test_sta_action_uninit (&ctx);
+}
+
+void
assoc_test_suite (test_t t)
{
test_suite_begin (t, "assoc");
assoc_basic_test_cases (t);
+ assoc_basic_test_cases_cco_unknow_mac_addr (t);
test_case_begin (t, "memory");
test_begin (t, "memory")
{