summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorNélio Laranjeiro2011-01-13 10:54:47 +0100
committerNélio Laranjeiro2011-01-18 18:36:57 +0100
commit7c8f4653d487c51c9f6f9f159f6573586f57171e (patch)
treea147d2badb60aaf4aae936aaee0eb132218e1af6 /cesar
parentae32e5f3766fc16db83ffa3e6940c0bc4ea237c0 (diff)
cesar/{bsu,cp/beacon}: update SPOC only if frequency error is valid, refs #2187
Diffstat (limited to 'cesar')
-rw-r--r--cesar/bsu/beacon/beacon.h2
-rw-r--r--cesar/bsu/src/bsu.c2
-rw-r--r--cesar/bsu/test/utest/src/bsut.c4
-rw-r--r--cesar/cp/beacon/beacon.h8
-rw-r--r--cesar/cp/beacon/inc/beacon.h2
-rw-r--r--cesar/cp/beacon/src/beacon.c15
-rw-r--r--cesar/cp/beacon/test/src/beacon.c51
-rw-r--r--cesar/cp/beacon/test/src/bsu_stub.c2
8 files changed, 84 insertions, 2 deletions
diff --git a/cesar/bsu/beacon/beacon.h b/cesar/bsu/beacon/beacon.h
index 68d931d15b..11e58edc1c 100644
--- a/cesar/bsu/beacon/beacon.h
+++ b/cesar/bsu/beacon/beacon.h
@@ -44,6 +44,8 @@ struct bsu_beacon_params_t
s32 frequency_error;
/** Tick offset, difference between the NTB and PHY Date clock. */
u32 ntb_offset_tck;
+ /** Frequency error is valid. */
+ bool frequency_error_valid;
};
typedef struct bsu_beacon_params_t bsu_beacon_params_t;
diff --git a/cesar/bsu/src/bsu.c b/cesar/bsu/src/bsu.c
index e8d80d99bc..64c0448f33 100644
--- a/cesar/bsu/src/bsu.c
+++ b/cesar/bsu/src/bsu.c
@@ -903,6 +903,8 @@ bsu_beacon_process (bsu_t *ctx, pb_beacon_t *beacon,
bsu_beacon->params.frequency_error =
FIXED (avln->sync.fe, BSU_NTB_FIXED_POINT);
bsu_beacon->params.ntb_offset_tck = avln->sync.ntb_offset_tck;
+ bsu_beacon->params.frequency_error_valid =
+ avln->sync.second_shoot;
}
}
else
diff --git a/cesar/bsu/test/utest/src/bsut.c b/cesar/bsu/test/utest/src/bsut.c
index 9f4b73b0f1..46c59c5be0 100644
--- a/cesar/bsu/test/utest/src/bsut.c
+++ b/cesar/bsu/test/utest/src/bsut.c
@@ -80,6 +80,7 @@ test_case_bsu_process (test_t test)
bprocessed = bsu_beacon_process (t.bsu, bneighbour, &bpneighbour_rx);
/* Central beacon processed ? */
test_fail_unless (bprocessed);
+ test_fail_unless (!bprocessed->params.frequency_error_valid);
test_fail_unless (t.bsu->avlns[0].snid == bpneighbour_rx.snid);
test_fail_unless (t.bsu->avlns[0].beacon.vf.nid
== beacon_neighbour.vf.nid);
@@ -97,6 +98,7 @@ test_case_bsu_process (test_t test)
== beacon_neighbour.vf.nid);
/* NTB called ? */
test_fail_unless (t.bsu->avlns[0].sync.init == true);
+ test_fail_unless (bprocessed->params.frequency_error_valid);
blk_release_desc ((blk_t*) bneighbour);
test_fail_unless (t.bsu->beacon_nb_recv [BSU_BEACON_TYPE_CENTRAL]
== 2);
@@ -133,6 +135,8 @@ test_case_bsu_process (test_t test)
== 3);
/* NTB called ? */
test_fail_unless (t.bsu->sta_avln->sync.init == true);
+ test_fail_unless (t.bsu->sta_avln->sync.second_shoot);
+ test_fail_unless (bprocessed->params.frequency_error_valid);
blk_release_desc ((blk_t*) b);
blk_release (bprocessed);
}
diff --git a/cesar/cp/beacon/beacon.h b/cesar/cp/beacon/beacon.h
index ca2fbc1748..ccecfa00d6 100644
--- a/cesar/cp/beacon/beacon.h
+++ b/cesar/cp/beacon/beacon.h
@@ -195,6 +195,14 @@ cp_beacon_any_countdown_active (cp_t *ctx);
void
cp_beacon_fill (cp_t *ctx, bsu_beacon_t *beacon);
+/**
+ * Return the synchronisation status with an AVLN.
+ * \param ctx the module context.
+ * \return true if synchronised.
+ */
+bool
+cp_beacon_synchronised (cp_t *ctx);
+
END_DECLS
#endif /* cp_beacon_beacon_h */
diff --git a/cesar/cp/beacon/inc/beacon.h b/cesar/cp/beacon/inc/beacon.h
index 07a595fbce..523f57d530 100644
--- a/cesar/cp/beacon/inc/beacon.h
+++ b/cesar/cp/beacon/inc/beacon.h
@@ -165,6 +165,8 @@ struct cp_beacon_t
u32 spoc_update_date;
/** SPOC coefficients update interval, or 0 to disable. */
u32 spoc_update_interval_ms;
+ /** SPOC updated flag. */
+ bool spoc_updated;
};
#endif /* cp_beacon_inc_beacon_h */
diff --git a/cesar/cp/beacon/src/beacon.c b/cesar/cp/beacon/src/beacon.c
index 87f8f393bc..a1df940117 100644
--- a/cesar/cp/beacon/src/beacon.c
+++ b/cesar/cp/beacon/src/beacon.c
@@ -664,7 +664,8 @@ cp_beacon_get_and_process_beacon (cp_t *ctx)
&& beacon->params.rx_parameters.snid
== cp_sta_own_data_get_snid (ctx))
{
- if (ctx->beacon.spoc_update_interval_ms
+ if (beacon->params.frequency_error_valid
+ && ctx->beacon.spoc_update_interval_ms
&& less_mod2p32 (
ctx->beacon.spoc_update_date, phy_date ()))
{
@@ -672,6 +673,7 @@ cp_beacon_get_and_process_beacon (cp_t *ctx)
ctx, beacon->params.frequency_error);
ctx->beacon.spoc_update_date = phy_date ()
+ MAC_MS_TO_TCK (ctx->beacon.spoc_update_interval_ms);
+ ctx->beacon.spoc_updated = true;
CP_TRACE_VERBOSE (SPOC, beacon->params.frequency_error);
}
if (cp_sta_own_data_get_tei (ctx))
@@ -761,7 +763,9 @@ cp_beacon_process_tracked_avln (cp_t *ctx, bsu_beacon_t *beacon,
dbg_assert (net);
own = cp_sta_mgr_get_sta_own_data (ctx);
own->hybrid_mode = beacon->vf.hm;
+ /* SPOC. */
ctx->beacon.spoc_update_date = phy_date ();
+ ctx->beacon.spoc_updated = false;
/** Update the schedules. */
cp_beacon_sta_compute_schedules (ctx, beacon);
bsu_beacon_bmi_discover_info_t discover;
@@ -780,6 +784,7 @@ cp_beacon_process_untracked_avln (cp_t *ctx)
own->nid_track = 0;
own->tei_track = 0;
/* Reset SPOC. */
+ ctx->beacon.spoc_updated = false;
cp_beacon_clk_sync_call_spoc (ctx, 0);
/* Inform BSU. */
bsu_untrack_avln ();
@@ -945,3 +950,11 @@ cp_beacon_any_countdown_active (cp_t *ctx)
|| (ctx->beacon.hm.hmcd)
|| (ctx->beacon.hoip.hoipcd));
}
+
+bool
+cp_beacon_synchronised (cp_t *ctx)
+{
+ dbg_assert (ctx);
+ return ctx->beacon.spoc_updated
+ || ctx->beacon.spoc_update_interval_ms == 0;
+}
diff --git a/cesar/cp/beacon/test/src/beacon.c b/cesar/cp/beacon/test/src/beacon.c
index f021411afe..7176c265cc 100644
--- a/cesar/cp/beacon/test/src/beacon.c
+++ b/cesar/cp/beacon/test/src/beacon.c
@@ -71,6 +71,7 @@ test_new_beacon (void)
beacon->params.rx_parameters.snid = 0;
beacon->params.rx_parameters.access = HPAV_ACCESS_IN_HOME;
beacon->params.direction = BSU_BEACON_DIRECTION_FROM_PLC;
+ beacon->params.frequency_error_valid = false;
return beacon;
}
@@ -1390,6 +1391,55 @@ test_suite_beacon_no_net (test_t t)
test_end;
}
+void
+test_suite_beacon_spoc_update (test_t test)
+{
+ cp_t cp;
+ cp_beacon_init (&cp);
+ cp_sta_mgr_init (&cp);
+ cp_cco_region_init (&cp);
+ cp_cco_bw_init (&cp);
+ test_suite_begin (test, "SPOC update");
+ test_case_begin (test, "Frequency error invalid and valid");
+ test_begin (test, "SPOC only updated if F.E. is valid")
+ {
+ cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (&cp);
+ cp.beacon.spoc_update_interval_ms = 1;
+ bsu_beacon_t *beacon = test_new_beacon ();
+ cp_sta_mgr_add_avln (&cp, beacon->params.rx_parameters.snid,
+ beacon->vf.nid);
+ cp.beacon.spoc_update_date = phy_date () - 1;
+ cp_sta_own_data_set_nid (&cp, beacon->vf.nid);
+ own->nid_track = beacon->vf.nid;
+ own->tei_track = beacon->vf.stei;
+ /* Process a received beacon with a frequency error invalid. */
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ test_fail_unless (!cp.beacon.spoc_updated);
+ /* This received beacon has a valid frequency error, SPOC should be
+ * updated. */
+ beacon = test_new_beacon ();
+ beacon->params.frequency_error_valid = true;
+ cp.beacon.spoc_update_date = phy_date () - 1;
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ test_fail_unless (cp.beacon.spoc_updated);
+ /* This received beacon has a invalid frequency error. SPOC updated
+ * flag stay at true. */
+ beacon = test_new_beacon ();
+ beacon->params.frequency_error_valid = false;
+ cp.beacon.spoc_update_date = phy_date () - 1;
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ test_fail_unless (cp.beacon.spoc_updated);
+ }
+ test_end;
+ cp_cco_region_uninit (&cp);
+ cp_cco_bw_uninit (&cp);
+ cp_sta_mgr_uninit (&cp);
+ cp_beacon_uninit (&cp);
+}
+
int
main (void)
{
@@ -1405,6 +1455,7 @@ main (void)
test_suite_beacon_eks_change (test);
test_suite_beacon_mac_address_bentry (test);
test_suite_beacon_no_net (test);
+ test_suite_beacon_spoc_update (test);
test_case_begin (test, "Memory allocation");
test_begin (test, "memory leaks")
diff --git a/cesar/cp/beacon/test/src/bsu_stub.c b/cesar/cp/beacon/test/src/bsu_stub.c
index 6a32c2e73d..a56c84b680 100644
--- a/cesar/cp/beacon/test/src/bsu_stub.c
+++ b/cesar/cp/beacon/test/src/bsu_stub.c
@@ -37,7 +37,7 @@ bsu_aclf_beacon_period_start_date_next (bsu_aclf_t *ctx)
u32
bsu_aclf_beacon_period_tck (bsu_aclf_t *ctx)
{
- return ctx->beacon_period;
+ return BSU_ACLF_BP_50HZ_TCK;
}
u32