summaryrefslogtreecommitdiff
path: root/cesar/bsu/src
diff options
context:
space:
mode:
authorYacine Belkadi2013-04-02 16:54:39 +0200
committerYacine Belkadi2013-05-22 10:53:35 +0200
commit7d5605d2370e0bf0ef1227cba9e4f5d7b37e839c (patch)
treeff9ab206693868fcb8d1f6633bb3d46bae721efc /cesar/bsu/src
parent218968f193cd9f21b4330ee6d2bfac99d8c4f068 (diff)
cesar/bsu: add bsu_handle_key_change(), refs #3794
In preparation for next commits, regroup KCCD related actions in a new function: bsu_handle_key_change().
Diffstat (limited to 'cesar/bsu/src')
-rw-r--r--cesar/bsu/src/bsu.c30
1 files changed, 24 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);