summaryrefslogtreecommitdiff
path: root/cesar/bsu/src
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/bsu/src')
-rw-r--r--cesar/bsu/src/bsu.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/cesar/bsu/src/bsu.c b/cesar/bsu/src/bsu.c
index 59c6c97b5b..f81fb12b36 100644
--- a/cesar/bsu/src/bsu.c
+++ b/cesar/bsu/src/bsu.c
@@ -1258,6 +1258,22 @@ bsu_update (bsu_t *ctx, bsu_beacon_t *beacon, bsu_update_sta_type_t is_sta)
&& beacon->bmis.ps.ps[0].pscd
< beacon->bmis.ps.ps[1].pscd));
dbg_assert (beacon->vf.hm < MAC_COEXISTENCE_NB);
+
+ bool restore_bmi_eks = false;
+ bsu_beacon_bmi_eks_t bmi_eks;
+ if (ctx->is_sta == BSU_UPDATE_STA_TYPE_CCO
+ && ctx->sta_avln->beacon.bmis.eks.present)
+ {
+ /* 1) The cp should only set eks.present once, just to inform the bsu.
+ * 2) There shouldn't be a key change in the middle of another key
+ * change. */
+ dbg_assert (!beacon->bmis.eks.present);
+
+ /* Backup the current key change data. */
+ bmi_eks = ctx->sta_avln->beacon.bmis.eks;
+ restore_bmi_eks = true;
+ }
+
/* If the data provided are for the next beacon period. */
if (lesseq_mod2p32 (bsu_aclf_beacon_period_start_date_next (ctx->aclf),
beacon->beacon_period_start_date)
@@ -1285,9 +1301,7 @@ bsu_update (bsu_t *ctx, bsu_beacon_t *beacon, bsu_update_sta_type_t is_sta)
ctx->sta_avln->beacon.bmis.region = beacon->bmis.region;
/* Process the beacon entry with countdowns. */
bsu_update__persistent_schedules (ctx, beacon);
- if (beacon->bmis.eks.present
- && !ctx->sta_avln->beacon.bmis.eks.present)
- ctx->sta_avln->beacon.bmis.eks = beacon->bmis.eks;
+ ctx->sta_avln->beacon.bmis.eks = beacon->bmis.eks;
if (beacon->bmis.handover.present
&& !ctx->sta_avln->beacon.bmis.handover.present)
ctx->sta_avln->beacon.bmis.handover = beacon->bmis.handover;
@@ -1314,6 +1328,10 @@ bsu_update (bsu_t *ctx, bsu_beacon_t *beacon, bsu_update_sta_type_t is_sta)
ctx->sta_avln->beacon.bmis.discover_info =
beacon->bmis.discover_info;
}
+
+ if (restore_bmi_eks)
+ ctx->sta_avln->beacon.bmis.eks = bmi_eks;
+
arch_dsr_unlock ();
}