summaryrefslogtreecommitdiff
path: root/cesar/cp/eoc/sta/action
diff options
context:
space:
mode:
authorNélio Laranjeiro2012-07-05 15:10:03 +0200
committerNélio Laranjeiro2012-07-23 16:27:55 +0200
commita30b524d93cc46485e4201257070e7e21528424f (patch)
tree138a12171eaccc0115eeae471f4f68ac66756bd4 /cesar/cp/eoc/sta/action
parentda47f4519435f00cea65b5a720ac831f434fcc0b (diff)
cesar/cp/eoc/sta/{action,mgr}: take random snid on startup, closes #3222
Diffstat (limited to 'cesar/cp/eoc/sta/action')
-rw-r--r--cesar/cp/eoc/sta/action/src/assoc_slave.c18
-rw-r--r--cesar/cp/eoc/sta/action/test/utest_eoc/src/assoc.c37
2 files changed, 37 insertions, 18 deletions
diff --git a/cesar/cp/eoc/sta/action/src/assoc_slave.c b/cesar/cp/eoc/sta/action/src/assoc_slave.c
index a6c8dae7e3..84a7018bf2 100644
--- a/cesar/cp/eoc/sta/action/src/assoc_slave.c
+++ b/cesar/cp/eoc/sta/action/src/assoc_slave.c
@@ -100,20 +100,22 @@ cp_eoc_sta_action_detect__beacon_received (cp_t *ctx, bsu_beacon_t *beacon,
dbg_assert (net);
dbg_assert (sta);
+ cp_snid_t our_snid = cp_sta_own_data_get_snid (ctx);
cp_nid_t our_nid = cp_sta_own_data_get_nid (ctx);
+ cp_snid_t its_snid = cp_net_get_snid (ctx, net);
cp_nid_t its_nid = cp_net_get_nid (ctx, net);
- cp_nid_t its_snid = cp_net_get_snid (ctx, net);
cp_sta_own_data_t *own_data = cp_sta_mgr_get_sta_own_data (ctx);
ctx->sta_action.assoc.beacon_loss = 0;
if (our_nid == its_nid)
{
/* Synchronised and tracking the beacon. */
- if (cp_beacon_synchronised (ctx)
+ if (our_snid == its_snid
&& own_data->tei_track == beacon->vf.stei
&& beacon->bmis.mac_address.present
&& own_data->cco_mac_addr_track
- == beacon->bmis.mac_address.mac_address)
+ == beacon->bmis.mac_address.mac_address
+ && cp_beacon_synchronised (ctx))
{
if (ctx->sta_action.assoc.init_count > 0)
ctx->sta_action.assoc.init_count--;
@@ -124,7 +126,11 @@ cp_eoc_sta_action_detect__beacon_received (cp_t *ctx, bsu_beacon_t *beacon,
}
}
/* No tracking track it.. */
- else if (own_data->tei_track == MAC_TEI_UNASSOCIATED)
+ else if (own_data->tei_track == MAC_TEI_UNASSOCIATED
+ || (our_snid != its_snid
+ && beacon->bmis.mac_address.present
+ && own_data->cco_mac_addr_track
+ == beacon->bmis.mac_address.mac_address))
{
cp_sta_mgr_set_tracking (ctx, its_snid, its_nid);
cp_beacon_process_tracked_avln (ctx, beacon, net);
@@ -176,8 +182,8 @@ cp_eoc_sta_action_auth__beacon_received (cp_t *ctx, bsu_beacon_t *beacon,
auth_time++;
mem = 0;
char temp[128];
- sprintf (temp, "sta=%d blk=%d sar[%d,%d,%d,%d,%d,%d,%d] pb[%d]\n",
- auth_time, blk_free_nb (),
+ sprintf (temp, "sta=%d snid=%d blk=%d sar[%d,%d,%d,%d,%d,%d,%d] pb[%d]\n",
+ auth_time, cp_sta_own_data_get_snid (ctx), blk_free_nb (),
SUB_STAT (rx_jobs_count),
ctx->sar->stats.rx_jobs_waiting_count,
SUB_STAT (rx_pb_count),
diff --git a/cesar/cp/eoc/sta/action/test/utest_eoc/src/assoc.c b/cesar/cp/eoc/sta/action/test/utest_eoc/src/assoc.c
index a81a73da4a..840c46a9d9 100644
--- a/cesar/cp/eoc/sta/action/test/utest_eoc/src/assoc.c
+++ b/cesar/cp/eoc/sta/action/test/utest_eoc/src/assoc.c
@@ -24,21 +24,12 @@ assoc_create_master (test_t t, test_sta_action_t *ctx, cp_snid_t snid,
cp_nid_t nid, cp_tei_t master_tei, mac_t master_mac,
cp_net_t **master_net, cp_sta_t **master)
{
- /* Clean current state. */
- if (*master)
- slab_release (*master);
- cp_sta_mgr_uninit (&ctx->cp);
- cp_sta_mgr_init (&ctx->cp);
- /* Set our NID/SNID. */
- cp_sta_own_data_set_nid (&ctx->cp, nid);
- cp_sta_own_data_set_snid (&ctx->cp, 0);
/* Create a Master to associate with. */
*master_net = cp_sta_mgr_add_avln (&ctx->cp, snid, nid);
dbg_assert (*master_net);
*master = cp_sta_mgr_sta_add (
&ctx->cp, *master_net, master_tei, master_mac);
- if (master_tei)
- cp_net_set_cco (&ctx->cp, *master_net, master_tei);
+ cp_net_set_cco (&ctx->cp, *master_net, master_tei);
}
void
@@ -91,6 +82,12 @@ assoc_test_case_basic (test_t t)
const mac_t master2_mac = 0x222222222222ull;
cp_sta_t *master2 = NULL;
+ const cp_tei_t master3_tei = 1;
+ const mac_t master3_mac = 0x333333333333ull;
+ cp_net_t *master3_net = NULL;
+ cp_sta_t *master3 = NULL;
+ const cp_snid_t master3_snid = snid + 1;
+
assoc_create_master (t, &ctx, snid, nid, master2_tei, master2_mac,
&master_net, &master2);
@@ -98,6 +95,9 @@ assoc_test_case_basic (test_t t)
assoc_create_master (t, &ctx, snid, nid, master_tei, master_mac,
&master_net, &master);
+ assoc_create_master (t, &ctx, master3_snid, nid, master3_tei,
+ master3_mac, &master3_net, &master3);
+
bsu_beacon_t beacon_master;
test_sta_action_beacon_create (&beacon_master, nid, snid,
master_tei, master_mac);
@@ -105,6 +105,13 @@ assoc_test_case_basic (test_t t)
test_sta_action_beacon_create (&beacon_master2, nid, snid,
master2_tei, master2_mac);
+ bsu_beacon_t beacon_master3;
+ test_sta_action_beacon_create (&beacon_master3, nid, master3_snid,
+ master3_tei, master3_mac);
+
+ cp_sta_own_data_set_nid (&ctx.cp, nid);
+ cp_sta_own_data_set_snid (&ctx.cp, 0xf);
+
ctx.cp.sta_action.assoc.init_count = 1;
test_begin (t, "Receive a beacon from the master, synchronisation")
{
@@ -114,7 +121,6 @@ assoc_test_case_basic (test_t t)
.beacon = &beacon_master,
.net = master_net,
.sta = master),
- SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_beacon_process_tracked_avln,
.beacon = &beacon_master,
.net = master_net),
@@ -143,7 +149,12 @@ assoc_test_case_basic (test_t t)
.beacon = &beacon_master2,
.net = master_net,
.sta = master2),
- SCENARIO_EVENT (cp_beacon_synchronised, .ok = true),
+ /* With a Master which as a snid different. It should not
+ * associate */
+ SCENARIO_ACTION (detect__beacon_received,
+ .beacon = &beacon_master3,
+ .net = master3_net,
+ .sta = master3),
SCENARIO_END
};
scenario_run (t, entries, &globals);
@@ -152,6 +163,8 @@ assoc_test_case_basic (test_t t)
test_fail_unless (own->tei_track == master_tei);
test_fail_unless (own->cco_mac_addr_track = master_mac);
test_fail_unless (own->nid_track = nid);
+ test_fail_unless (cp_sta_own_data_get_snid (&ctx.cp)
+ == cp_net_get_snid (&ctx.cp, master_net));
}
test_end;