summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorNélio Laranjeiro2011-02-09 14:54:52 +0100
committerNélio Laranjeiro2011-02-18 17:27:32 +0100
commitd0b3049c4fd2e5d1956055df7f61c503c683b22b (patch)
tree6f35458db7531d5c118d2fe6d3893f188ed219eb /cesar
parent2d33ff1894ffcd08101906487225b08a98322ab1 (diff)
cesar/cp/beacon: carefully process same network beacons, refs #2235
When a STA or CCo receives a beacon from its NID and SNID it should be careful and check some other data before processing it. See the ticket for all details.
Diffstat (limited to 'cesar')
-rw-r--r--cesar/cp/beacon/src/beacon.c311
-rw-r--r--cesar/cp/beacon/test/src/beacon.c55
-rw-r--r--cesar/cp/sta/action/src/action.c2
-rw-r--r--cesar/cp/sta/action/test/utest/inc/test_sta_action.h13
-rw-r--r--cesar/cp/sta/action/test/utest/src/beacon_stub.c6
-rw-r--r--cesar/cp/sta/action/test/utest/src/poweron.c57
-rw-r--r--cesar/cp/sta/action/test/utest/src/sc.c64
-rw-r--r--cesar/cp/sta/action/test/utest/src/test_sta_action.c14
-rw-r--r--cesar/cp/sta/mgr/sta_own_data.h4
9 files changed, 367 insertions, 159 deletions
diff --git a/cesar/cp/beacon/src/beacon.c b/cesar/cp/beacon/src/beacon.c
index 7ee0e6cfaf..b69cf9c83d 100644
--- a/cesar/cp/beacon/src/beacon.c
+++ b/cesar/cp/beacon/src/beacon.c
@@ -611,6 +611,197 @@ cp_beacon_poweron_init (cp_t *ctx)
}
/**
+ * Process the central beacon received.
+ * \param ctx the module context.
+ * \param beacon the beacon to process.
+ * \param net the network associated with the beacon.
+ * \return the station from the sta_mgr if the beacon has been processed.
+ */
+static cp_sta_t*
+cp_beacon_process_beacon_central (
+ cp_t *ctx, bsu_beacon_t *beacon, cp_net_t *net)
+{
+ cp_sta_t *sta = NULL;
+ mac_t cco_mac = beacon->bmis.mac_address.present ?
+ beacon->bmis.mac_address.mac_address : MAC_ZERO;
+ cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (ctx);
+ /* I Should follow instruction from the beacon only if I track it. */
+ if (own->nid_track == beacon->vf.nid
+ && own->tei_track == beacon->vf.stei
+ && beacon->params.rx_parameters.snid
+ == cp_sta_own_data_get_snid (ctx)
+ && own->cco_mac_addr_track == cco_mac)
+ {
+ net->hm = beacon->vf.hm;
+ net->avln_num_slots = beacon->vf.numslots;
+ cp_net_set_access (ctx, net, beacon->params.rx_parameters.access);
+ cp_net_set_slot_id_and_usage (ctx, net, beacon->vf.slotid,
+ beacon->vf.slotusage);
+ sta = cp_beacon_update_sta_peer (ctx, beacon, net);
+ if (beacon->params.frequency_error_valid
+ && ctx->beacon.spoc_update_interval_ms
+ && less_mod2p32 (
+ ctx->beacon.spoc_update_date, phy_date ()))
+ {
+ cp_beacon_clk_sync_call_spoc (
+ 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);
+ }
+ /* I'm at least associated. */
+ if (cp_sta_own_data_get_tei (ctx))
+ {
+ /* Update the countdowns. */
+ if (beacon->bmis.change_snid.present)
+ {
+ ctx->beacon.snids.snidcd
+ = beacon->bmis.change_snid.snidccd;
+ ctx->beacon.snids.snid
+ = beacon->bmis.change_snid.new_snid;
+ }
+ if (beacon->bmis.change_hm.present)
+ {
+ ctx->beacon.hm.hmcd =
+ beacon->bmis.change_hm.hmccd;
+ ctx->beacon.hm.hm = beacon->bmis.change_hm.newhm;
+ }
+ if (beacon->bmis.handover.present)
+ {
+ ctx->beacon.hoip.hoipcd =
+ beacon->bmis.handover.hcd;
+ ctx->beacon.hoip.cco = beacon->bmis.handover.tei;
+ }
+ if (beacon->bmis.eks.present)
+ {
+ ctx->beacon.eks.kccd = beacon->bmis.eks.kccd;
+ ctx->beacon.eks.kbc = beacon->bmis.eks.kbc;
+ ctx->beacon.eks.new_eks =
+ beacon->bmis.eks.new_eks;
+ }
+ /** Update the schedules. */
+ cp_beacon_sta_compute_schedules (ctx, beacon);
+ bsu_beacon_bmi_discover_info_t discover;
+ cp_beacon_fill_discover_info (ctx, &discover);
+ bsu_update_discover_info (&discover);
+ /** Program the timer. */
+ cp_beacon_reconfigure_timer (ctx, false);
+ }
+ }
+ /* I'm not associated or the beacon comes from another Network. */
+ else if (!cp_sta_own_data_get_tei (ctx)
+ || (cp_sta_own_data_get_nid (ctx) != beacon->vf.nid
+ || (cp_sta_own_data_get_nid (ctx) == beacon->vf.nid
+ && cp_sta_own_data_get_snid (ctx)
+ != beacon->params.rx_parameters.snid)))
+ {
+ net->hm = beacon->vf.hm;
+ net->avln_num_slots = beacon->vf.numslots;
+ cp_net_set_access (ctx, net, beacon->params.rx_parameters.access);
+ cp_net_set_slot_id_and_usage (ctx, net, beacon->vf.slotid,
+ beacon->vf.slotusage);
+ sta = cp_beacon_update_sta_peer (ctx, beacon, net);
+ }
+ return sta;
+}
+
+/**
+ * Process the discover beacon received.
+ * \param ctx the module context.
+ * \param beacon the beacon to process.
+ * \param net the network associated with the beacon.
+ * \return the station from the sta_mgr if the beacon has been processed.
+ */
+static cp_sta_t*
+cp_beacon_process_beacon_discover (
+ cp_t *ctx, bsu_beacon_t *beacon, cp_net_t *net)
+{
+ mac_t peer_mac = beacon->bmis.mac_address.present ?
+ beacon->bmis.mac_address.mac_address : MAC_ZERO;
+ cp_sta_t *sta = cp_sta_mgr_sta_get_from_mac (ctx, peer_mac);
+ /* The station exists in the station manager. */
+ if (sta && cp_sta_get_tei (sta) == beacon->vf.stei)
+ {
+ sta = cp_beacon_update_sta_peer (ctx, beacon, net);
+ /* Discover beacons from our AVLN. */
+ if (cp_sta_own_data_get_tei (ctx)
+ && cp_sta_mgr_get_our_avln (ctx) == net)
+ {
+ bool updated = bitstream_direct_read (
+ &beacon->bmis.discover_info.info_data, 0, 1);
+ if (updated)
+ {
+ cp_fsm_event_t *event = cp_fsm_event_sta_new (
+ ctx, CP_FSM_EVENT_TYPE_discover_info_updated,
+ net, sta);
+ cp_fsm_post (ctx, event);
+ }
+ }
+ /* This reference is return by the station update peer. */
+ slab_release (sta);
+ }
+ /* Station does not exits, only the station from another AVLN should be
+ * added in the station manager. */
+ else if (beacon->vf.nid != cp_sta_own_data_get_nid (ctx)
+ || (beacon->vf.nid == cp_sta_own_data_get_nid (ctx)
+ && beacon->params.rx_parameters.snid
+ != cp_sta_own_data_get_snid (ctx)))
+ {
+ sta = cp_beacon_update_sta_peer (ctx, beacon, net);
+ /* This reference is return by the station update peer. */
+ slab_release (sta);
+ }
+ return sta;
+}
+
+/**
+ * Process beacons.
+ * \param ctx the module context.
+ * \param beacon the beacon to process.
+ */
+static void
+cp_beacon_process_beacon (cp_t *ctx, bsu_beacon_t *beacon)
+{
+ /** Add network and station info to local data. */
+ cp_net_t *net = cp_sta_mgr_add_avln (
+ ctx, beacon->params.rx_parameters.snid, beacon->vf.nid);
+ /** If no NET object available, do not process this beacon.
+ * This can happen on SNID conflict when some AVLN are powered on at
+ * the time, the SNID conflict will cause the CP to create a net
+ * object for each new tuple of {nid, snid}. STA mgr garbage should
+ * resolve the problem by removing the old AVLN but it takes its
+ * time. */
+ if (net && MAC_TEI_IS_STA (beacon->vf.stei))
+ {
+ cp_sta_t *sta = NULL;
+ if (beacon->vf.bt == BSU_BEACON_TYPE_CENTRAL)
+ sta = cp_beacon_process_beacon_central (ctx, beacon, net);
+ else if (beacon->vf.bt == BSU_BEACON_TYPE_DISCOVER)
+ sta = cp_beacon_process_beacon_discover (ctx, beacon, net);
+ /* Is the SNID in conflict. */
+ if (cp_sta_own_data_get_cco_status (ctx))
+ {
+ cp_net_t *our_net = cp_sta_mgr_get_our_avln (ctx);
+ if (our_net != net
+ && cp_net_get_snid (ctx, our_net)
+ == cp_net_get_snid (ctx, net)
+ && ctx->beacon.snids.snidcd == 0)
+ cp_fsm_post_new_event (ctx, bare, snid_conflict);
+ }
+ /* Raise the event in the FSM for station action. */
+ if (sta
+ && (beacon->vf.bt == BSU_BEACON_TYPE_CENTRAL
+ || beacon->vf.bt == BSU_BEACON_TYPE_PROXY))
+ cp_fsm_post_new_event (
+ ctx, beacon, BEACON, beacon, net, sta);
+ /* Release my reference on the STA. */
+ if (sta)
+ slab_release (sta);
+ }
+}
+
+/**
* Process the first beacon in the received list.
* \param ctx the control plane context.
*/
@@ -618,9 +809,6 @@ void
cp_beacon_get_and_process_beacon (cp_t *ctx)
{
dbg_assert (ctx);
- cp_net_t *net;
- cp_sta_t *sta;
- cp_sta_own_data_t *own;
bsu_beacon_t *beacon;
/** check the countdowns. */
cp_beacon_countdowns (ctx);
@@ -637,117 +825,7 @@ cp_beacon_get_and_process_beacon (cp_t *ctx)
BEACON_BEACON_PROCESS, phy_date(), beacon->vf.nid,
beacon->params.rx_parameters.snid, beacon->vf.stei,
beacon->vf.bt, beacon->params.rx_parameters.bts);
- /** Add network and station info to local data. */
- net = cp_sta_mgr_add_avln (
- ctx, beacon->params.rx_parameters.snid, beacon->vf.nid);
- /** If no NET object available, do not process this beacon.
- * This can happen on SNID conflict when some AVLN are powered on at
- * the time, the SNID conflict will cause the CP to create a net
- * object for each new tuple of {nid, snid}. STA mgr garbage should
- * resolve the problem by removing the old AVLN but it takes its
- * time. */
- if (net)
- {
- net->hm = beacon->vf.hm;
- net->avln_num_slots = beacon->vf.numslots;
- cp_net_set_access (ctx, net, beacon->params.rx_parameters.access);
- cp_net_set_slot_id_and_usage (ctx, net, beacon->vf.slotid,
- beacon->vf.slotusage);
- dbg_assert (beacon->vf.stei == MAC_TEI_UNASSOCIATED
- || MAC_TEI_IS_STA (beacon->vf.stei));
- sta = cp_beacon_update_sta_peer (ctx, beacon, net);
- /** Our station is associated and the beacon is from our CCo. */
- own = cp_sta_mgr_get_sta_own_data (ctx);
- if (beacon->vf.bt == BSU_BEACON_TYPE_CENTRAL
- && beacon->vf.nid == own->nid_track
- && beacon->vf.stei == own->tei_track
- && beacon->params.rx_parameters.snid
- == cp_sta_own_data_get_snid (ctx))
- {
- if (beacon->params.frequency_error_valid
- && ctx->beacon.spoc_update_interval_ms
- && less_mod2p32 (
- ctx->beacon.spoc_update_date, phy_date ()))
- {
- cp_beacon_clk_sync_call_spoc (
- 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))
- {
- /* Update the countdowns. */
- if (beacon->bmis.change_snid.present)
- {
- ctx->beacon.snids.snidcd
- = beacon->bmis.change_snid.snidccd;
- ctx->beacon.snids.snid
- = beacon->bmis.change_snid.new_snid;
- }
- if (beacon->bmis.change_hm.present)
- {
- ctx->beacon.hm.hmcd =
- beacon->bmis.change_hm.hmccd;
- ctx->beacon.hm.hm = beacon->bmis.change_hm.newhm;
- }
- if (beacon->bmis.handover.present)
- {
- ctx->beacon.hoip.hoipcd =
- beacon->bmis.handover.hcd;
- ctx->beacon.hoip.cco = beacon->bmis.handover.tei;
- }
- if (beacon->bmis.eks.present)
- {
- ctx->beacon.eks.kccd = beacon->bmis.eks.kccd;
- ctx->beacon.eks.kbc = beacon->bmis.eks.kbc;
- ctx->beacon.eks.new_eks =
- beacon->bmis.eks.new_eks;
- }
- /** Update the schedules. */
- cp_beacon_sta_compute_schedules (ctx, beacon);
- bsu_beacon_bmi_discover_info_t discover;
- cp_beacon_fill_discover_info (ctx, &discover);
- bsu_update_discover_info (&discover);
- /** Program the timer. */
- cp_beacon_reconfigure_timer (ctx, false);
- }
- }
- /* Discover beacons from our AVLN. */
- else if (cp_sta_own_data_get_tei (ctx)
- && beacon->vf.bt == BSU_BEACON_TYPE_DISCOVER
- && beacon->vf.nid == cp_sta_own_data_get_nid (ctx)
- && beacon->params.rx_parameters.snid
- == cp_sta_own_data_get_snid (ctx))
- {
- bool updated = bitstream_direct_read (
- &beacon->bmis.discover_info.info_data, 0, 1);
- if (updated)
- {
- cp_fsm_event_t *event = cp_fsm_event_sta_new (
- ctx, CP_FSM_EVENT_TYPE_discover_info_updated,
- net, sta);
- cp_fsm_post (ctx, event);
- }
- }
- else if (cp_sta_own_data_get_cco_status (ctx))
- {
- /* Is the SNID in conflict. */
- cp_net_t *our_net = cp_sta_mgr_get_our_avln (ctx);
- if (our_net != net
- && cp_net_get_snid (ctx, our_net)
- == cp_net_get_snid (ctx, net)
- && ctx->beacon.snids.snidcd == 0)
- cp_fsm_post_new_event (ctx, bare, snid_conflict);
- }
- /** Raise the event in the FSM for station action. */
- if (beacon->vf.bt == BSU_BEACON_TYPE_CENTRAL
- || beacon->vf.bt == BSU_BEACON_TYPE_PROXY)
- cp_fsm_post_new_event (
- ctx, beacon, BEACON, beacon, net, sta);
- slab_release (sta);
- }
+ cp_beacon_process_beacon (ctx, beacon);
/** Release the beacon. */
blk_release (beacon);
}
@@ -762,6 +840,10 @@ cp_beacon_process_tracked_avln (cp_t *ctx, bsu_beacon_t *beacon,
dbg_assert (beacon);
dbg_assert (net);
own = cp_sta_mgr_get_sta_own_data (ctx);
+ own->nid_track = beacon->vf.nid;
+ own->tei_track = beacon->vf.stei;
+ own->cco_mac_addr_track = beacon->bmis.mac_address.present ?
+ beacon->bmis.mac_address.mac_address : MAC_ZERO;
own->hybrid_mode = beacon->vf.hm;
/* SPOC. */
ctx->beacon.spoc_update_date = phy_date ();
@@ -785,6 +867,7 @@ cp_beacon_process_untracked_avln (cp_t *ctx)
cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (ctx);
own->nid_track = 0;
own->tei_track = 0;
+ own->cco_mac_addr_track = MAC_ZERO;
/* Reset SPOC. */
ctx->beacon.spoc_updated = false;
cp_beacon_clk_sync_call_spoc (ctx, 0);
diff --git a/cesar/cp/beacon/test/src/beacon.c b/cesar/cp/beacon/test/src/beacon.c
index d6cc87e82d..c72f02670b 100644
--- a/cesar/cp/beacon/test/src/beacon.c
+++ b/cesar/cp/beacon/test/src/beacon.c
@@ -1313,6 +1313,8 @@ test_suite_beacon_mac_address_bentry (test_t test)
cp_sta_own_data_set_mac_address (&cp, 0x23456789abcull);
cp_sta_mgr_set_our_avln (&cp, net);
own->nid_track = 1;
+ own->tei_track = 1;
+ own->cco_mac_addr_track = MAC_ZERO;
/** Create a central beacon. */
beacon = test_new_beacon ();
beacon->bmis.mac_address.present = false;
@@ -1324,7 +1326,58 @@ test_suite_beacon_mac_address_bentry (test_t test)
test_fail_unless (cp_sta_get_mac_address (cco) == MAC_BROADCAST);
test_fail_unless (cp_sta_get_cco_status (cco) == true);
slab_release (cco);
-
+ /* Mac address in the central beacon is present, but our track on the
+ * mac address is still MAC_ZERO. */
+ beacon = test_new_beacon ();
+ beacon->bmis.mac_address.present = true;
+ beacon->bmis.mac_address.mac_address = 0x12345678abcull;
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ cco = cp_net_get_cco (&cp, net);
+ test_fail_unless (cco);
+ /* The beacon is not processed. */
+ test_fail_unless (cp_sta_get_mac_address (cco)
+ != beacon->bmis.mac_address.mac_address);
+ test_fail_unless (cp_sta_get_cco_status (cco) == true);
+ slab_release (cco);
+ /* MAC address tracked is different from our CCo. */
+ beacon = test_new_beacon ();
+ beacon->bmis.mac_address.present = true;
+ beacon->bmis.mac_address.mac_address = 0x0013d7000001ull;
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ cco = cp_net_get_cco (&cp, net);
+ test_fail_unless (cco);
+ test_fail_unless (cp_sta_get_mac_address (cco)
+ != beacon->bmis.mac_address.mac_address);
+ test_fail_unless (cp_sta_get_cco_status (cco) == true);
+ slab_release (cco);
+ /* Set the track mac address. */
+ own->cco_mac_addr_track = 0x0013d7000001ull;
+ /* This beacon should be processed as our CCo's central beacon. */
+ beacon = test_new_beacon ();
+ beacon->bmis.mac_address.present = true;
+ beacon->bmis.mac_address.mac_address = 0x0013d7000001ull;
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ cco = cp_net_get_cco (&cp, net);
+ test_fail_unless (cco);
+ test_fail_unless (cp_sta_get_mac_address (cco)
+ == beacon->bmis.mac_address.mac_address);
+ test_fail_unless (cp_sta_get_cco_status (cco) == true);
+ slab_release (cco);
+ /* This one should no be processed as our CCo's central beacon. It
+ * comes from another one. */
+ beacon = test_new_beacon ();
+ beacon->bmis.mac_address.present = true;
+ beacon->bmis.mac_address.mac_address = 0x12345678abcull;
+ cp_beacon_receive (&cp, beacon);
+ cp_beacon_get_and_process_beacon (&cp);
+ cco = cp_net_get_cco (&cp, net);
+ test_fail_unless (cco);
+ test_fail_unless (cp_sta_get_mac_address (cco) == 0x0013d7000001ull);
+ test_fail_unless (cp_sta_get_cco_status (cco) == true);
+ slab_release (cco);
cp_beacon_uninit (&cp);
cp_sta_mgr_uninit (&cp);
dbg_check (mac_store_sta_remove (cp.mac_store, 1));
diff --git a/cesar/cp/sta/action/src/action.c b/cesar/cp/sta/action/src/action.c
index 6c8cebc2e7..8eae7e567a 100644
--- a/cesar/cp/sta/action/src/action.c
+++ b/cesar/cp/sta/action/src/action.c
@@ -72,8 +72,6 @@ cp_sta_action_beacon_match_and_join (cp_t *ctx,
)
)
{
- own_data->nid_track = its_nid;
- own_data->tei_track = its_tei;
cp_sta_own_data_set_snid (ctx, its_snid);
cp_beacon_process_tracked_avln (ctx, beacon, net);
}
diff --git a/cesar/cp/sta/action/test/utest/inc/test_sta_action.h b/cesar/cp/sta/action/test/utest/inc/test_sta_action.h
index 48172abd46..87c4cf1fa6 100644
--- a/cesar/cp/sta/action/test/utest/inc/test_sta_action.h
+++ b/cesar/cp/sta/action/test/utest/inc/test_sta_action.h
@@ -53,4 +53,17 @@ void
test_sta_action_create_our_net (test_sta_action_t *ctx, cp_nid_t nid,
cp_snid_t snid);
+/**
+ * Fill the beacon with the NID, SNID, STEI and MAC address if valid.
+ * \param beacon the beacon to fill.
+ * \param nid the network Identifier of the CCo.
+ * \param snid the short network identifier of the CCo.
+ * \param stei the source TEI of the CCo.
+ * \param mac the Mac address of the CCo.
+ */
+void
+test_sta_action_beacon_create (
+ bsu_beacon_t *beacon, cp_nid_t nid, cp_snid_t snid, cp_tei_t stei,
+ mac_t mac);
+
#endif /* inc_test_sta_action_h */
diff --git a/cesar/cp/sta/action/test/utest/src/beacon_stub.c b/cesar/cp/sta/action/test/utest/src/beacon_stub.c
index 40f4cac38f..5215548568 100644
--- a/cesar/cp/sta/action/test/utest/src/beacon_stub.c
+++ b/cesar/cp/sta/action/test/utest/src/beacon_stub.c
@@ -13,6 +13,7 @@
#include "common/std.h"
#include "cp/beacon/beacon.h"
+#include "cp/sta/mgr/sta_mgr.h"
#include "lib/scenario/scenario.h"
@@ -30,6 +31,11 @@ cp_beacon_process_tracked_avln (cp_t *ctx, bsu_beacon_t *beacon,
dbg_assert (ctx);
dbg_assert (beacon);
dbg_assert (net);
+ cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (ctx);
+ own->nid_track = beacon->vf.nid;
+ own->tei_track = beacon->vf.stei;
+ own->cco_mac_addr_track = beacon->bmis.mac_address.present ?
+ beacon->bmis.mac_address.mac_address : MAC_ZERO;
scenario_event (cp_beacon_process_tracked_avln, param);
test_fail_unless (beacon == param->beacon);
test_fail_unless (net == param->net);
diff --git a/cesar/cp/sta/action/test/utest/src/poweron.c b/cesar/cp/sta/action/test/utest/src/poweron.c
index 1bf0e54613..1bbf0a86e4 100644
--- a/cesar/cp/sta/action/test/utest/src/poweron.c
+++ b/cesar/cp/sta/action/test/utest/src/poweron.c
@@ -28,7 +28,8 @@ poweron_test_cases (test_t t)
cp_nid_t nid = 0x111111111111ull;
cp_net_t *net;
cp_sta_t *sta;
- bsu_beacon_t *beacon = INVALID_PTR;
+ bsu_beacon_t beacon;
+ test_sta_action_beacon_create (&beacon, nid, 0, 1, 0);
/* Poweron start. */
test_case_begin (t, "poweron start");
test_sta_action_reset (&ctx);
@@ -172,18 +173,22 @@ poweron_test_cases (test_t t)
net = cp_sta_mgr_add_avln (cp, 2, nid + 1);
sta = cp_sta_mgr_sta_add (cp, net, 1, 0x112233445566ull);
cp_net_set_cco (cp, net, 1);
+ test_sta_action_beacon_create (&beacon, cp_net_get_nid (cp, net),
+ cp_net_get_snid (cp, net),
+ cp_sta_get_tei (sta),
+ cp_sta_get_mac_address (sta));
slab_release (sta);
scenario_entry_t entries[] = {
/* POWERON. */
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (POWERON, BEACON,
no_nid_match)),
/* USTA. */
- SCENARIO_ACTION (poweron__usta__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__usta__beacon, .beacon = &beacon,
.net = net, .sta = sta),
/* No tracking change, already done. */
SCENARIO_EVENT (cp_fsm_branch,
@@ -205,13 +210,13 @@ poweron_test_cases (test_t t)
slab_release (sta);
scenario_entry_t entries[] = {
/* POWERON. */
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (POWERON, BEACON,
no_nid_match)),
/* USTA. */
- SCENARIO_ACTION (poweron__usta__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__usta__beacon, .beacon = &beacon,
.net = net, .sta = sta),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (USTA, BEACON,
@@ -228,18 +233,24 @@ poweron_test_cases (test_t t)
test_begin (t, "nid match cco")
{
cp_net_set_cco (cp, net, 1);
+ cp_sta_t *cco = cp_net_get_cco (cp, net);
+ test_sta_action_beacon_create (&beacon, cp_net_get_nid (cp, net),
+ cp_net_get_snid (cp, net),
+ cp_sta_get_tei (cco),
+ cp_sta_get_mac_address (cco));
+ slab_release (cco);
scenario_entry_t entries[] = {
/* POWERON SPOC not updated. */
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (POWERON, BEACON,
no_nid_match)),
/* POWERON SPOC updated. */
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = true),
SCENARIO_EVENT (cp_fsm_event_bare_new,
@@ -248,7 +259,7 @@ poweron_test_cases (test_t t)
.branch = CP_FSM_BRANCH (POWERON, BEACON,
nid_match)),
/* USTA. */
- SCENARIO_ACTION (poweron__usta__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__usta__beacon, .beacon = &beacon,
.net = net, .sta = sta),
/* No tracking change, already done. */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
@@ -256,7 +267,7 @@ poweron_test_cases (test_t t)
.branch = CP_FSM_BRANCH (USTA, BEACON,
no_nid_match)),
/* USTA SPOC updated. */
- SCENARIO_ACTION (poweron__usta__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__usta__beacon, .beacon = &beacon,
.net = net, .sta = sta),
/* No tracking change, already done. */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = true),
@@ -296,22 +307,22 @@ poweron_test_cases (test_t t)
scenario_entry_t entries[] = {
/* POWERON SPOC not updated. */
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (POWERON, BEACON,
no_nid_match)),
/* other net and cco. */
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = other_net, .sta = other_sta),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (POWERON, BEACON,
no_nid_match)),
/* USTA. */
- SCENARIO_ACTION (poweron__usta__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__usta__beacon, .beacon = &beacon,
.net = other_net, .sta = other_sta),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (USTA, BEACON,
@@ -536,7 +547,7 @@ poweron_test_cases (test_t t)
.delay_min_ms = CP_DISCOVER_PERIOD_MAX_MS,
.delay_max_ms = CP_DISCOVER_PERIOD_MAX_MS),
SCENARIO_EVENT (cp_cco_action_start),
- SCENARIO_ACTION (poweron__ucco__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__ucco__beacon, .beacon = &beacon,
.net = net, .sta = other_cco),
SCENARIO_EVENT (cp_beacon_reconfigure_timer),
SCENARIO_EVENT (cp_fsm_branch,
@@ -644,9 +655,9 @@ poweron_test_cases (test_t t)
cp_sta_own_data_set_nid (cp, nid);
slab_release (sta);
scenario_entry_t entries[] = {
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_fsm_branch,
@@ -674,9 +685,9 @@ poweron_test_cases (test_t t)
cp_sta_own_data_set_nid (cp, nid);
slab_release (sta);
scenario_entry_t entries[] = {
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_fsm_branch,
@@ -692,10 +703,10 @@ poweron_test_cases (test_t t)
/* Only the TEI tracked has changed. */
own_data->tei_track = 10;
scenario_entry_t entries2[] = {
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
/* Tracking does not change.
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net), */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_fsm_branch,
@@ -711,7 +722,7 @@ poweron_test_cases (test_t t)
/* Tracked NET is blacklisted. */
net->blacklisted = true;
scenario_entry_t entries3[] = {
- SCENARIO_ACTION (poweron__poweron__beacon, .beacon = beacon,
+ SCENARIO_ACTION (poweron__poweron__beacon, .beacon = &beacon,
.net = net, .sta = sta),
SCENARIO_EVENT (cp_fsm_branch,
.branch = CP_FSM_BRANCH (POWERON, BEACON,
diff --git a/cesar/cp/sta/action/test/utest/src/sc.c b/cesar/cp/sta/action/test/utest/src/sc.c
index b0c0de9607..fe6b32260a 100644
--- a/cesar/cp/sta/action/test/utest/src/sc.c
+++ b/cesar/cp/sta/action/test/utest/src/sc.c
@@ -285,7 +285,11 @@ sc_basic_test_cases (test_t t)
{
/* Some initialisation for the scenario. */
/* False beacon. */
- bsu_beacon_t *beacon = INVALID_PTR;
+ bsu_beacon_t beacon;
+ bsu_beacon_t beacon_other_net;
+ /* Reset tracking. */
+ cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (&ctx.cp);
+ own->tei_track = own->cco_mac_addr_track = own->nid_track = 0;
/* Create net. */
test_sta_action_create_our_net (&ctx, nid, 0);
cp_net_t *net = cp_sta_mgr_get_avln (&ctx.cp, 0, nid);
@@ -299,6 +303,16 @@ sc_basic_test_cases (test_t t)
sc_add_mac2);
cp_net_set_cco (&ctx.cp, net, 1);
cp_net_set_cco (&ctx.cp, other_net2, 1);
+ cp_sta_t *cco = cp_net_get_cco (&ctx.cp, net);
+ own->tei_track = own->cco_mac_addr_track = own->nid_track = 0;
+ test_sta_action_beacon_create (
+ &beacon, cp_net_get_nid (&ctx.cp, net),
+ cp_net_get_snid (&ctx.cp, net), cp_sta_get_tei (cco),
+ cp_sta_get_mac_address (cco));
+ slab_release (cco);
+ test_sta_action_beacon_create (
+ &beacon_other_net, cp_net_get_nid (&ctx.cp, other_net),
+ cp_net_get_snid (&ctx.cp, other_net), 1, 1);
/* STA replies to SC.JOIN.REQ. */
scenario_entry_t sc_join_reply[] = {
/* Run start of SC join procedure. */
@@ -325,12 +339,12 @@ sc_basic_test_cases (test_t t)
/* Nothing to do. */
/* A beacon has arrived. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon_other_net,
.net = other_net,
.sta = sc_add_sta),
/* Track it. */
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
- .net = other_net),
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon =
+ &beacon_other_net, .net = other_net),
/* Beacon is wrong, nid differs. */
/* Stay in SC_WAIT_BEACON. */
SCENARIO_EVENT (cp_fsm_branch,
@@ -338,12 +352,12 @@ sc_basic_test_cases (test_t t)
nid_differs)),
/* A second beacon has arrived. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = net,
.sta = sc_add_sta),
/* Beacon is ok, SPOC is not updated, do not start assoc. */
/* Track it. */
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
SCENARIO_EVENT (cp_fsm_branch,
@@ -351,7 +365,7 @@ sc_basic_test_cases (test_t t)
nid_differs)),
/* A third beacon has arrived. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = other_net2,
.sta = sc_add_sta2),
/* Beacon is not ok, snid is wrong. */
@@ -360,7 +374,7 @@ sc_basic_test_cases (test_t t)
nid_differs)),
/* Beacon is ok, start assoc. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = net,
.sta = sc_add_sta),
SCENARIO_EVENT (cp_beacon_synchronised, .ok = true),
@@ -863,7 +877,7 @@ sc_basic_test_cases (test_t t)
/* Some initialisation for the scenario. */
/* False beacon. */
- bsu_beacon_t *beacon = INVALID_PTR;
+ bsu_beacon_t beacon;
/* Create net. */
test_sta_action_create_our_net (&ctx, nid, 0);
cp_net_t *net = cp_sta_mgr_get_avln (&ctx.cp, 0, nid);
@@ -872,6 +886,12 @@ sc_basic_test_cases (test_t t)
cp_sta_t *sc_add_sta = cp_sta_mgr_sta_add (&ctx.cp, net, 3,
sc_add_mac);
cp_net_set_cco (&ctx.cp, net, 3);
+ cp_sta_t *cco = cp_net_get_cco (&ctx.cp, net);
+ test_sta_action_beacon_create (
+ &beacon, cp_net_get_nid (&ctx.cp, net),
+ cp_net_get_snid (&ctx.cp, net), cp_sta_get_tei (cco),
+ cp_sta_get_mac_address (cco));
+ slab_release (cco);
cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (&ctx.cp);
own->tei_track = 3;
/* The "host" peer. */
@@ -945,11 +965,11 @@ sc_basic_test_cases (test_t t)
/* Nothing to do. */
/* A beacon has arrived. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = net,
.sta = sc_add_sta),
/* Track it: already tracking it.
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net), */
/* Beacon is ok, start assoc. */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
@@ -958,11 +978,11 @@ sc_basic_test_cases (test_t t)
nid_differs)),
/* A beacon has arrived. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = net,
.sta = sc_add_sta),
/* Track it: already done
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net), */
/* Beacon is ok, start assoc. */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = true),
@@ -1131,7 +1151,7 @@ sc_basic_test_cases (test_t t)
{
/* Some initialisation for the scenario. */
/* False beacon. */
- bsu_beacon_t *beacon = INVALID_PTR;
+ bsu_beacon_t beacon;
/* Create net. */
test_sta_action_create_our_net (&ctx, nid, 0);
cp_net_t *net = cp_sta_mgr_get_avln (&ctx.cp, 0, nid);
@@ -1141,6 +1161,12 @@ sc_basic_test_cases (test_t t)
sc_add_mac);
cp_sta_own_data_set_tei (&ctx.cp, 0);
cp_net_set_cco (&ctx.cp, net, 3);
+ cp_sta_t *cco = cp_net_get_cco (&ctx.cp, net);
+ test_sta_action_beacon_create (
+ &beacon, cp_net_get_nid (&ctx.cp, net),
+ cp_net_get_snid (&ctx.cp, net), cp_sta_get_tei (cco),
+ cp_sta_get_mac_address (cco));
+ slab_release (cco);
/* The "host" peer. */
cp_mme_peer_t host_peer = CP_MME_PEER (cp_sta_own_data_get_mac_address (&ctx.cp),
MAC_TEI_FOREIGN);
@@ -1211,11 +1237,11 @@ sc_basic_test_cases (test_t t)
/* A beacon has arrived. */
/* Let's pretend it has been posted for the SC FSM first. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = net,
.sta = sc_add_sta),
/* Track it: already done
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net), */
/* Beacon is ok, start assoc. */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = false),
@@ -1224,11 +1250,11 @@ sc_basic_test_cases (test_t t)
nid_differs)),
/* New beacon. */
SCENARIO_ACTION (sc__sc_wait_beacon__beacon,
- .beacon = beacon,
+ .beacon = &beacon,
.net = net,
.sta = sc_add_sta),
/* Track it: already done
- SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = beacon,
+ SCENARIO_EVENT (cp_beacon_process_tracked_avln, .beacon = &beacon,
.net = net), */
/* Beacon is ok, start assoc. */
SCENARIO_EVENT (cp_beacon_synchronised, .ok = true),
@@ -1252,7 +1278,7 @@ sc_basic_test_cases (test_t t)
/* Handle SC_UCCO =BEACON=> SC_USTA. */
/* Leave SC_UCCO: nothing to do. */
/* Handle transition. */
- SCENARIO_ACTION (sc__sc_ucco_track_beacon, .beacon = beacon,
+ SCENARIO_ACTION (sc__sc_ucco_track_beacon, .beacon = &beacon,
.net = net, .sta = sc_add_sta),
/* Change to STA behaviour. */
SCENARIO_EVENT (cp_beacon_reconfigure_timer),
diff --git a/cesar/cp/sta/action/test/utest/src/test_sta_action.c b/cesar/cp/sta/action/test/utest/src/test_sta_action.c
index 7f5b9d511a..1469e86c65 100644
--- a/cesar/cp/sta/action/test/utest/src/test_sta_action.c
+++ b/cesar/cp/sta/action/test/utest/src/test_sta_action.c
@@ -90,6 +90,20 @@ test_sta_action_create_our_net (test_sta_action_t *ctx, cp_nid_t nid,
cp_sta_mgr_set_our_avln (cp, our_net);
}
+void
+test_sta_action_beacon_create (
+ bsu_beacon_t *beacon, cp_nid_t nid, cp_snid_t snid, cp_tei_t stei,
+ mac_t mac)
+{
+ memset (beacon, 0, sizeof (bsu_beacon_t));
+ beacon->vf.bt = BSU_BEACON_TYPE_CENTRAL;
+ beacon->vf.nid = nid;
+ beacon->params.rx_parameters.snid = snid;
+ beacon->vf.stei = stei;
+ beacon->bmis.mac_address.present = MAC_IS_VALID (mac);
+ beacon->bmis.mac_address.mac_address = mac;
+}
+
int
main (int argc, char **argv)
{
diff --git a/cesar/cp/sta/mgr/sta_own_data.h b/cesar/cp/sta/mgr/sta_own_data.h
index 6d1478bde8..871e6853d5 100644
--- a/cesar/cp/sta/mgr/sta_own_data.h
+++ b/cesar/cp/sta/mgr/sta_own_data.h
@@ -65,6 +65,10 @@ struct cp_sta_own_data_t
*/
cp_tei_t tei_track;
+ /** CCo's mac address to track. Mac address is not a mandatory field i.e.
+ * MAC_ZERO is allowed. */
+ mac_t cco_mac_addr_track;
+
/**
* The PCo to discuss with.
*/