summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
Diffstat (limited to 'cesar')
-rw-r--r--cesar/bsu/beacon/inc/misc.h6
-rw-r--r--cesar/bsu/src/bsu.c15
-rw-r--r--cesar/bsu/test/utest/src/bsut.c30
-rw-r--r--cesar/cp/beacon/inc/beacon.h2
-rw-r--r--cesar/cp/beacon/src/beacon.c40
5 files changed, 70 insertions, 23 deletions
diff --git a/cesar/bsu/beacon/inc/misc.h b/cesar/bsu/beacon/inc/misc.h
index b968ac85e2..7d8ccbd2dc 100644
--- a/cesar/bsu/beacon/inc/misc.h
+++ b/cesar/bsu/beacon/inc/misc.h
@@ -38,10 +38,10 @@ struct bsu_beacon_bmi_discover_info_t
/** Present. */
u32 present:8;,
/** Reserved. */
- u32 rsvd:24;,
- /** Discover info data in a word. */
- u32 info_data;
+ u32 rsvd:24;
);
+ /** Discover info data in a word. */
+ u32 info_data;
};
typedef struct bsu_beacon_bmi_discover_info_t bsu_beacon_bmi_discover_info_t;
diff --git a/cesar/bsu/src/bsu.c b/cesar/bsu/src/bsu.c
index cd85108b9c..2ac142a070 100644
--- a/cesar/bsu/src/bsu.c
+++ b/cesar/bsu/src/bsu.c
@@ -400,6 +400,10 @@ bsu_beacon_send_prepare (bsu_t *ctx, bsu_beacon_type_t type)
bsu_aclf_bto (ctx->aclf, (s16*) params.bto, COUNT (params.bto));
beacon = bsu_beacon_write (&ctx->beacon, type,
ctx->mac_config, &params);
+ /* Reset the updated flag in the discover info beacon entry. */
+ if (type == BSU_BEACON_TYPE_DISCOVER)
+ bitstream_direct_write (
+ &ctx->beacon.bmis.discover_info.info_data, 0, 0, 1);
/* Send the beacon. */
bsu_beacon_send (ctx, type, beacon, &params);
}
@@ -738,7 +742,10 @@ bsu_update (bsu_beacon_t *beacon, bsu_update_sta_type_t is_sta)
if (lesseq_mod2p32 (bsu_aclf_beacon_period_start_date_next (ctx->aclf),
beacon->beacon_period_start_date)
|| !ctx->activate)
+ {
+ bsu_update_discover_info (&beacon->bmis.discover_info);
ctx->beacon = *beacon;
+ }
/* Data in the beacon had already expired. */
else
{
@@ -891,6 +898,14 @@ bsu_update_discover_info (bsu_beacon_bmi_discover_info_t *discover)
bsu_t *ctx = &bsu_global;
dbg_assert (discover);
arch_dsr_lock ();
+ bool discover_updated = bitstream_direct_read
+ (&discover->info_data, 0, 1);
+ bool current_discover_updated = bitstream_direct_read
+ (&ctx->beacon.bmis.discover_info.info_data, 0, 1);
ctx->beacon.bmis.discover_info = *discover;
+ /* BSU is responsible for reseting the updated flag in this entry. */
+ if (current_discover_updated || discover_updated)
+ bitstream_direct_write (&ctx->beacon.bmis.discover_info.info_data,
+ 0, 1, 1);
arch_dsr_unlock ();
}
diff --git a/cesar/bsu/test/utest/src/bsut.c b/cesar/bsu/test/utest/src/bsut.c
index 86b27dd7cd..6b161b32bf 100644
--- a/cesar/bsu/test/utest/src/bsut.c
+++ b/cesar/bsu/test/utest/src/bsut.c
@@ -12,6 +12,7 @@
*/
#include "common/std.h"
#include "lib/test.h"
+#include "lib/bitstream.h"
#include "bsu/bsu.h"
#include "bsu/test/utest/tests.h"
#include "bsu/beacon/beacon.h"
@@ -703,6 +704,35 @@ test_case_bsu_discover_update (test_t test)
test_fail_unless (memcmp (&beacon.bmis.discover_info,
&t.bsu->beacon.bmis.discover_info,
sizeof (bsu_beacon_bmi_discover_info_t)) == 0);
+ /* change update flag. */
+ bitstream_direct_write (&beacon.bmis.discover_info.info_data, 0, 1,
+ 1);
+ bsu_update_discover_info (&beacon.bmis.discover_info);
+ test_fail_unless (
+ memcmp (&beacon.bmis.discover_info,
+ &t.bsu->beacon.bmis.discover_info,
+ sizeof (bsu_beacon_bmi_discover_info_t)) == 0);
+ /* change update flag. */
+ bitstream_direct_write (&beacon.bmis.discover_info.info_data, 0, 0,
+ 1);
+ bsu_update_discover_info (&beacon.bmis.discover_info);
+ test_fail_unless (
+ memcmp (&beacon.bmis.discover_info,
+ &t.bsu->beacon.bmis.discover_info,
+ sizeof (bsu_beacon_bmi_discover_info_t)) != 0);
+ test_fail_unless (
+ bitstream_direct_read
+ (&t.bsu->beacon.bmis.discover_info.info_data, 0, 1) == true);
+ /* Simulate BSU reset the flag after sending a discover beacon. */
+ t.bsu->beacon.bmis.discover_info = beacon.bmis.discover_info;
+ bsu_update_discover_info (&beacon.bmis.discover_info);
+ test_fail_unless (
+ memcmp (&beacon.bmis.discover_info,
+ &t.bsu->beacon.bmis.discover_info,
+ sizeof (bsu_beacon_bmi_discover_info_t)) == 0);
+ test_fail_unless (
+ bitstream_direct_read
+ (&t.bsu->beacon.bmis.discover_info.info_data, 0, 1) == false);
bsu_test_uninit (&t);
}
test_end;
diff --git a/cesar/cp/beacon/inc/beacon.h b/cesar/cp/beacon/inc/beacon.h
index bfd26dbf12..a65e072664 100644
--- a/cesar/cp/beacon/inc/beacon.h
+++ b/cesar/cp/beacon/inc/beacon.h
@@ -141,7 +141,7 @@ struct cp_beacon_t
/**
* Discover process use by the CCo. */
cp_beacon_discover_t discover;
- cp_beacon_discover_info_t discover_info_last;
+ u32 discover_info_last;
/** Snid countdown structure. */
struct cp_beacon_snid_t snids;
diff --git a/cesar/cp/beacon/src/beacon.c b/cesar/cp/beacon/src/beacon.c
index c3a07859ad..ed29f37c01 100644
--- a/cesar/cp/beacon/src/beacon.c
+++ b/cesar/cp/beacon/src/beacon.c
@@ -74,25 +74,27 @@ cp_beacon_fill_discover_info (cp_t *ctx,
bsu_beacon_bmi_discover_info_t *discover)
{
cp_sta_own_data_t *sta = cp_sta_mgr_get_sta_own_data (ctx);
- cp_beacon_discover_info_t discover_info;
- discover_info.updated = ctx->beacon.discover_info_last.updated;
- discover_info.cco_cap = CP_CCO_LEVEL;
- discover_info.proxy_net_cap = CP_PCO_CAP;
- discover_info.backup_cco_cap = CP_BACKUP_CCO_CAP;
- discover_info.cco_status = cp_sta_own_data_get_cco_status (ctx);
- discover_info.pco_status = cp_sta_own_data_get_pco_status (ctx);
- discover_info.backup_cco_status = false;
- discover_info.num_dis_sta = cp_sta_mgr_get_num_discovered_stas (ctx);
- discover_info.num_dis_net = cp_sta_mgr_get_num_discovered_net (ctx);
- discover_info.authentication =
- cp_sta_own_data_get_authenticated_status (ctx);
- discover_info.status_user_ap_cco = sta->cco_prefered;
- discover_info.rsvd = 0;
- discover_info.updated = (*((u32*)(char*)&ctx->beacon.discover_info_last)
- != *((u32*)(char*)&discover_info));
- discover->info_data = *((u32*)(char*)&discover_info);
- *((u32*)(char*)&ctx->beacon.discover_info_last) =
- *((u32*)(char*)&discover_info);
+ bitstream_t stream;
+ bitstream_write_init (&stream, &discover->info_data, 4);
+ bitstream_write (&stream, 0, 1);
+ bitstream_write (&stream, CP_CCO_LEVEL, 2);
+ bitstream_write (&stream, CP_PCO_CAP, 1);
+ bitstream_write (&stream, CP_BACKUP_CCO_CAP, 1);
+ bitstream_write (&stream, cp_sta_own_data_get_cco_status (ctx), 1);
+ bitstream_write (&stream, cp_sta_own_data_get_pco_status (ctx), 1);
+ bitstream_write (&stream, false, 1);
+ bitstream_write (&stream, cp_sta_mgr_get_num_discovered_stas (ctx), 8);
+ bitstream_write (&stream, cp_sta_mgr_get_num_discovered_net (ctx), 8);
+ bitstream_write (&stream, cp_sta_own_data_get_authenticated_status (ctx),
+ 1);
+ bitstream_write (&stream, sta->cco_prefered, 1);
+ bitstream_write (&stream, 0, 6);
+ bitstream_finalise (&stream);
+ u32 last = bitstream_direct_read (&ctx->beacon.discover_info_last, 1, 31);
+ u32 new = bitstream_direct_read (&discover->info_data, 1, 31);
+ /* Updated ? */
+ bitstream_direct_write (&discover->info_data, 0, new != last, 1);
+ ctx->beacon.discover_info_last = discover->info_data;
discover->present = true;
}