summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cesar/bsu/src/bsu.c30
-rw-r--r--cesar/bsu/test/utest/src/bsut.c92
2 files changed, 116 insertions, 6 deletions
diff --git a/cesar/bsu/src/bsu.c b/cesar/bsu/src/bsu.c
index fc680a243b..0e82455c95 100644
--- a/cesar/bsu/src/bsu.c
+++ b/cesar/bsu/src/bsu.c
@@ -649,8 +649,6 @@ bsu_avln_countdown_beacon_entries (bsu_t *ctx, bsu_avln_t *avln)
avln->beacon.bmis.change_snid.snidccd--;
if (avln->beacon.bmis.change_hm.present)
avln->beacon.bmis.change_hm.hmccd--;
- if (avln->beacon.bmis.eks.present)
- avln->beacon.bmis.eks.kccd--;
}
/**
@@ -677,12 +675,31 @@ bsu_avln_countdown_beacon_entries_apply_changes (bsu_t *ctx, bsu_avln_t *avln)
avln->beacon.bmis.change_hm.present = false;
avln->beacon.vf.hm = avln->beacon.bmis.change_hm.newhm;
}
- if (avln->beacon.bmis.eks.present
- && avln->beacon.bmis.eks.kccd == 1)
+}
+
+/**
+ * Handle Key change related actions.
+ * \param ctx bsu context.
+ * This should be done after programming the CA with the current schedules to
+ * have data ready for next awake.
+ */
+PRIVATE void
+bsu_handle_key_change (bsu_t *ctx)
+{
+ dbg_assert (ctx);
+ bsu_avln_t *avln = ctx->sta_avln;
+
+ if (avln->beacon.bmis.eks.present)
{
- avln->beacon.bmis.eks.present = false;
- if (avln->beacon.bmis.eks.kbc == BSU_BEACON_EKS_KBC_NEK)
+ if ((avln->beacon.bmis.eks.kbc == BSU_BEACON_EKS_KBC_NEK)
+ && (avln->beacon.bmis.eks.kccd == 1))
ctx->nek_switch = !ctx->nek_switch;
+
+ /* Prepare for next beacon period, in case we don't get the beacon. */
+ if (avln->beacon.bmis.eks.kccd > 1)
+ avln->beacon.bmis.eks.kccd--;
+ else
+ avln->beacon.bmis.eks.present = false;
}
}
@@ -872,6 +889,7 @@ bsu_timer_event_process (void *ud)
bsu_ca_schedules (ctx, ctx->sta_avln, 2);
bsu_avln_countdown_beacon_entries_apply_changes (ctx, ctx->sta_avln);
bsu_avln_countdown_beacon_entries (ctx, ctx->sta_avln);
+ bsu_handle_key_change (ctx);
bsu_aclf_track_powerline (ctx->aclf);
if (ctx->is_sta == BSU_UPDATE_STA_TYPE_STA)
bsu_aclf_shift_beacon_period_start_date (ctx->aclf);
diff --git a/cesar/bsu/test/utest/src/bsut.c b/cesar/bsu/test/utest/src/bsut.c
index c2d9260716..08d2ad206a 100644
--- a/cesar/bsu/test/utest/src/bsut.c
+++ b/cesar/bsu/test/utest/src/bsut.c
@@ -39,6 +39,9 @@ bsu_beacon_process__avln_tracked (bsu_t *ctx, bsu_beacon_t *beacon,
pbproc_rx_beacon_params_t *params);
void
+bsu_handle_key_change (bsu_t *ctx);
+
+void
test_case_bsu_process (test_t test)
{
uint i;
@@ -808,6 +811,94 @@ test_case_bsu_nek_index (test_t test)
bsu_test_uninit (&t);
}
+void
+test_case_bsu_handle_key_change (test_t test)
+{
+ test_case_begin (test, "Handle key change");
+ bsu_test_t t;
+ bsu_test_init (&t);
+ test_begin (test, "No key bentry");
+ {
+ t.bsu->nek_switch = 0;
+ t.bsu->sta_avln->beacon.bmis.eks.present = false;
+ t.bsu->sta_avln->beacon.bmis.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
+ t.bsu->sta_avln->beacon.bmis.eks.kccd = 1;
+
+ bsu_handle_key_change (t.bsu);
+
+ test_fail_unless (t.bsu->nek_switch == 0);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.present == false);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kbc
+ == BSU_BEACON_EKS_KBC_NEK);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kccd == 1);
+ }
+ test_end;
+ test_begin (test, "Key bentry:Not NEK");
+ {
+ t.bsu->nek_switch = 0;
+ t.bsu->sta_avln->beacon.bmis.eks.present = true;
+ t.bsu->sta_avln->beacon.bmis.eks.kbc = BSU_BEACON_EKS_KBC_NMK;
+ t.bsu->sta_avln->beacon.bmis.eks.kccd = 4;
+
+ bsu_handle_key_change (t.bsu);
+
+ test_fail_unless (t.bsu->nek_switch == 0);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.present == true);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kbc
+ == BSU_BEACON_EKS_KBC_NMK);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kccd == 3);
+ }
+ test_end;
+ test_begin (test, "Key bentry:NEK");
+ {
+ t.bsu->nek_switch = 0;
+ t.bsu->sta_avln->beacon.bmis.eks.present = true;
+ t.bsu->sta_avln->beacon.bmis.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
+ t.bsu->sta_avln->beacon.bmis.eks.kccd = 4;
+
+ bsu_handle_key_change (t.bsu);
+
+ test_fail_unless (t.bsu->nek_switch == 0);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.present == true);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kbc
+ == BSU_BEACON_EKS_KBC_NEK);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kccd == 3);
+ }
+ test_end;
+ test_begin (test, "Key bentry:Not NEK:KCCD == 1");
+ {
+ t.bsu->nek_switch = 0;
+ t.bsu->sta_avln->beacon.bmis.eks.present = true;
+ t.bsu->sta_avln->beacon.bmis.eks.kbc = BSU_BEACON_EKS_KBC_NMK;
+ t.bsu->sta_avln->beacon.bmis.eks.kccd = 1;
+
+ bsu_handle_key_change (t.bsu);
+
+ test_fail_unless (t.bsu->nek_switch == 0);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.present == false);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kbc
+ == BSU_BEACON_EKS_KBC_NMK);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kccd == 1);
+ }
+ test_end;
+ test_begin (test, "Key bentry:NEK:KCCD == 1");
+ {
+ t.bsu->nek_switch = 0;
+ t.bsu->sta_avln->beacon.bmis.eks.present = true;
+ t.bsu->sta_avln->beacon.bmis.eks.kbc = BSU_BEACON_EKS_KBC_NEK;
+ t.bsu->sta_avln->beacon.bmis.eks.kccd = 1;
+
+ bsu_handle_key_change (t.bsu);
+
+ test_fail_unless (t.bsu->nek_switch == 1);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.present == false);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kbc
+ == BSU_BEACON_EKS_KBC_NEK);
+ test_fail_unless (t.bsu->sta_avln->beacon.bmis.eks.kccd == 1);
+ }
+ test_end;
+ bsu_test_uninit (&t);
+}
void
test_case_bsu_discover_update (test_t test)
@@ -1045,6 +1136,7 @@ test_suite_bsu (test_t t)
test_case_bsu_timer_event (t);
test_case_bsu_persistent_schedules_update (t);
test_case_bsu_nek_index (t);
+ test_case_bsu_handle_key_change (t);
test_case_bsu_discover_update (t);
test_case_bsu_add_avln_array_full (t);
test_case_bsu_avln_remove (t);