summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
Diffstat (limited to 'cesar')
-rw-r--r--cesar/bsu/src/bsu.c1
-rw-r--r--cesar/bsu/test/utest/src/bsut.c9
-rw-r--r--cesar/cp/av/beacon/test/utest/src/beacon.c29
-rw-r--r--cesar/cp/beacon/src/beacon.c38
4 files changed, 48 insertions, 29 deletions
diff --git a/cesar/bsu/src/bsu.c b/cesar/bsu/src/bsu.c
index 68e4c9d206..1a0bb1273a 100644
--- a/cesar/bsu/src/bsu.c
+++ b/cesar/bsu/src/bsu.c
@@ -798,6 +798,7 @@ bsu_beacon_inform_beacon_not_received (bsu_t *ctx)
/* Send a fake beacon to the cp. */
bsu_beacon_t *fake_beacon = blk_alloc ();
dbg_assert (fake_beacon);
+ fake_beacon->bmis.eks = ctx->sta_avln->beacon.bmis.eks;
bsu_beacon_send_upper_layer (ctx, fake_beacon,
BSU_BEACON_DIRECTION_FROM_BSU);
}
diff --git a/cesar/bsu/test/utest/src/bsut.c b/cesar/bsu/test/utest/src/bsut.c
index 0edc94d8c3..3ca968ed4c 100644
--- a/cesar/bsu/test/utest/src/bsut.c
+++ b/cesar/bsu/test/utest/src/bsut.c
@@ -771,11 +771,20 @@ test_case_bsu_timer_event (test_t test)
t.bsu->sta_avln->beacon.beacon_period_start_date
= bpsd0 - t.bsu->aclf->beacon_period_tck;
+ t.bsu->sta_avln->beacon.bmis.eks.present = true;
+ t.bsu->sta_avln->beacon.bmis.eks.kccd = 2;
+ t.bsu->sta_avln->beacon.bmis.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
+ t.bsu->sta_avln->beacon.bmis.eks.new_eks = 7;
+
bsu_timer_event_process (t.bsu);
test_fail_unless (t.ul.beacon != INVALID_PTR);
test_fail_unless (t.ul.beacon->params.direction
== BSU_BEACON_DIRECTION_FROM_BSU);
+ test_fail_unless (t.ul.beacon->bmis.eks.present == true);
+ test_fail_unless (t.ul.beacon->bmis.eks.kccd == 2);
+ test_fail_unless (t.ul.beacon->bmis.eks.kbc == BSU_BEACON_EKS_KBC_NEK);
+ test_fail_unless (t.ul.beacon->bmis.eks.new_eks == 7);
blk_release (t.ul.beacon);
t.ul.beacon = INVALID_PTR;
diff --git a/cesar/cp/av/beacon/test/utest/src/beacon.c b/cesar/cp/av/beacon/test/utest/src/beacon.c
index 3be921f164..ce9d6f8b23 100644
--- a/cesar/cp/av/beacon/test/utest/src/beacon.c
+++ b/cesar/cp/av/beacon/test/utest/src/beacon.c
@@ -565,7 +565,6 @@ void
test_case_beacon_eks_change_sta (test_t test)
{
test_case_begin (test, "Station");
- u32 last_countdown_call_date = phy_date () - BSU_ACLF_BP_60HZ_TCK - 100;
test_begin (test, "Beacon reception")
{
bsu_beacon_t *beacon;
@@ -601,7 +600,6 @@ test_case_beacon_eks_change_sta (test_t test)
test_fail_unless (ctx.cp.beacon.eks.new_eks == MAC_EKS_MIN);
/* launch the test. */
cp_beacon_receive (&ctx.cp, beacon);
- ctx.cp.beacon.last_countdown_call_date = last_countdown_call_date;
cp_beacon_get_and_process_beacon (&ctx.cp);
test_fail_unless (ctx.cp.beacon.eks.kccd == 2);
test_fail_unless (ctx.cp.beacon.eks.kbc == BSU_BEACON_EKS_KBC_NEK);
@@ -613,10 +611,12 @@ test_case_beacon_eks_change_sta (test_t test)
ref_eks_next);
/* Create the beacon. */
beacon = test_new_beacon ();
+ beacon->bmis.eks.present = true;
beacon->bmis.eks.kccd = 1;
+ beacon->bmis.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
+ beacon->bmis.eks.new_eks = MAC_EKS_MIN + 1;
/* launch the test. */
cp_beacon_receive (&ctx.cp, beacon);
- ctx.cp.beacon.last_countdown_call_date = last_countdown_call_date;
cp_beacon_get_and_process_beacon (&ctx.cp);
test_fail_unless (ctx.cp.beacon.eks.kccd == 1);
test_fail_unless (ctx.cp.beacon.eks.kbc == BSU_BEACON_EKS_KBC_NEK);
@@ -632,7 +632,6 @@ test_case_beacon_eks_change_sta (test_t test)
beacon->bmis.nbe--;
/* launch the test. */
cp_beacon_receive (&ctx.cp, beacon);
- ctx.cp.beacon.last_countdown_call_date = last_countdown_call_date;
cp_beacon_get_and_process_beacon (&ctx.cp);
test_fail_unless (ctx.cp.beacon.eks.kccd == 0);
test_fail_unless (ctx.cp.beacon.eks.kbc == BSU_BEACON_EKS_KBC_NB);
@@ -674,20 +673,34 @@ test_case_beacon_eks_change_sta (test_t test)
cp_sta_own_data_set_mac_address (&ctx.cp, 0x23456789abcull);
cp_sta_mgr_set_our_avln (&ctx.cp, net);
+ bsu_beacon_t *fake_beacon = blk_alloc ();
+ dbg_assert (fake_beacon);
+ memset (fake_beacon, 0, sizeof (bsu_beacon_t));
+ fake_beacon->params.direction = BSU_BEACON_DIRECTION_FROM_BSU;
+ fake_beacon->bmis.eks.present = true;
+ fake_beacon->bmis.eks.kccd = 1;
+ fake_beacon->bmis.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
+ fake_beacon->bmis.eks.new_eks = MAC_EKS_MIN + 1;
+
/* Configure the test. */
ctx.cp.beacon.eks.kccd = 2;
ctx.cp.beacon.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
ctx.cp.beacon.eks.new_eks = MAC_EKS_MIN + 1;
- ctx.cp.beacon.last_countdown_call_date = last_countdown_call_date;
- cp_beacon_beacon_not_received (&ctx.cp);
+ cp_beacon_receive (&ctx.cp, fake_beacon);
+ cp_beacon_get_and_process_beacon (&ctx.cp);
test_fail_unless (ctx.cp.beacon.eks.kccd == 1);
test_fail_unless (ctx.cp.beacon.eks.kbc == BSU_BEACON_EKS_KBC_NEK);
test_fail_unless (ctx.cp.beacon.eks.new_eks == MAC_EKS_MIN + 1);
- ctx.cp.beacon.last_countdown_call_date = last_countdown_call_date;
- cp_beacon_beacon_not_received (&ctx.cp);
+ fake_beacon = blk_alloc ();
+ memset (fake_beacon, 0, sizeof (bsu_beacon_t));
+ fake_beacon->params.direction = BSU_BEACON_DIRECTION_FROM_BSU;
+ fake_beacon->bmis.eks.present = false;
+
+ cp_beacon_receive (&ctx.cp, fake_beacon);
+ cp_beacon_get_and_process_beacon (&ctx.cp);
test_fail_unless (ctx.cp.beacon.eks.kccd == 0);
test_fail_unless (ctx.cp.beacon.eks.kbc == BSU_BEACON_EKS_KBC_NB);
diff --git a/cesar/cp/beacon/src/beacon.c b/cesar/cp/beacon/src/beacon.c
index bb1c34270f..f1385de89a 100644
--- a/cesar/cp/beacon/src/beacon.c
+++ b/cesar/cp/beacon/src/beacon.c
@@ -451,27 +451,6 @@ cp_beacon_countdowns (cp_t *ctx)
else
ctx->beacon.hoip.hoipcd -= bp_nb;
}
- /* EKS ... */
- if (!cp_sta_own_data_get_cco_status (ctx)
- && ctx->beacon.eks.kccd)
- {
- if (ctx->beacon.eks.kccd <= bp_nb)
- ctx->beacon.eks.kccd = 0;
- else
- ctx->beacon.eks.kccd -= bp_nb;
-
- if (!ctx->beacon.eks.kccd &&
- (ctx->beacon.eks.kbc == BSU_BEACON_EKS_KBC_NEK))
- {
- /* The countdown elapsed and we check the current nek index */
- if (ctx->mac_config->nek[
- bsu_nek_index_current (ctx->bsu)].eks == MAC_EKS_CLEAR)
- /* Countdown elapsed and no NEK is available */
- cp_fsm_trigger_new_event (ctx, bare, to_leave);
-
- ctx->beacon.eks.kbc = BSU_BEACON_EKS_KBC_NB;
- }
- }
}
else
{
@@ -603,6 +582,22 @@ cp_beacon_process_bmi_eks (cp_t *ctx, const bsu_beacon_t *beacon)
ctx->beacon.eks.kbc = beacon->bmis.eks.kbc;
ctx->beacon.eks.new_eks = beacon->bmis.eks.new_eks;
}
+ else
+ {
+ if (ctx->beacon.eks.kccd == 1)
+ {
+ if (ctx->beacon.eks.kbc == BSU_BEACON_EKS_KBC_NEK)
+ {
+ if (ctx->mac_config->nek[
+ bsu_nek_index_current (ctx->bsu)].eks == MAC_EKS_CLEAR)
+ /* Countdown elapsed and no NEK is available */
+ cp_fsm_trigger_new_event (ctx, bare, to_leave);
+
+ ctx->beacon.eks.kbc = BSU_BEACON_EKS_KBC_NB;
+ }
+ }
+ ctx->beacon.eks.kccd = 0;
+ }
}
/**
@@ -616,6 +611,7 @@ cp_beacon__bsu_inform__beacon_not_received (cp_t *ctx,
const bsu_beacon_t *fake_beacon)
{
dbg_assert (!cp_sta_own_data_get_cco_status (ctx));
+ cp_beacon_process_bmi_eks (ctx, fake_beacon);
}
/**