summaryrefslogtreecommitdiff
path: root/cesar/bsu/beacon/src
diff options
context:
space:
mode:
authorNélio Laranjeiro2010-09-13 11:53:40 +0200
committerNélio Laranjeiro2010-09-16 16:58:31 +0200
commit1cf60860f32d2283564f23c22366f3ee4dd99d0d (patch)
tree717949a833d60be96583f647fef0373a4fb3c212 /cesar/bsu/beacon/src
parentd080b1117d9a2e4f7dea1391c218dd65ead6eac3 (diff)
cesar/bsu: read the whole beacon on reception, refs #1873
Diffstat (limited to 'cesar/bsu/beacon/src')
-rw-r--r--cesar/bsu/beacon/src/beacon.c110
1 files changed, 42 insertions, 68 deletions
diff --git a/cesar/bsu/beacon/src/beacon.c b/cesar/bsu/beacon/src/beacon.c
index c545225207..e43b344030 100644
--- a/cesar/bsu/beacon/src/beacon.c
+++ b/cesar/bsu/beacon/src/beacon.c
@@ -32,6 +32,43 @@ bsu_beacon_schedules_reset (bsu_beacon_schedules_t *schedule)
}
/**
+ * Reset the MPDU variant fields of the beacon.
+ * \param beacon the bsu beacon structure to reset.
+ */
+static void
+bsu_beacon_reset (bsu_beacon_t *beacon)
+{
+ beacon->beacon_period_start_date = 0;
+ beacon->vf.nid = 0;
+ beacon->vf.hm = 0;
+ beacon->vf.ncnr = 0;
+ beacon->vf.npsm = 0;
+ beacon->vf.numslots = 0;
+ beacon->vf.slotusage = 0;
+ beacon->vf.slotid = 0;
+ beacon->vf.aclsss = 0;
+ beacon->vf.hoip = 0;
+ beacon->vf.rtsbf = 0;
+ beacon->vf.nm = 0;
+ beacon->vf.ccocap = 0;
+ beacon->vf.rsvd = 0;
+ beacon->bmis.nbe = 0;
+ beacon->bmis.region.nb = 0;
+ beacon->bmis.ps.nb = 0;
+ beacon->bmis.nps.ns = 0;
+ beacon->bmis.discover.present = false;
+ beacon->bmis.bpsto.present = false;
+ beacon->bmis.eks.present = false;
+ beacon->bmis.handover.present = false;
+ beacon->bmis.relocation.present = false;
+ beacon->bmis.aclsc.present = false;
+ beacon->bmis.cns.present = false;
+ beacon->bmis.change_hm.present = false;
+ beacon->bmis.change_snid.present = false;
+ beacon->bmis.mac_address_present.present = false;
+}
+
+/**
* Get the NID from the beacon.
* \param beacon the beacon to extract the NID.
* \return the NID.
@@ -533,7 +570,10 @@ bsu_beacon_write (bsu_beacon_t *beacon, bsu_beacon_type_t type,
bsu_beacon_write_bmi_change_snid (&stream,
&beacon->bmis.change_snid);
bitstream_finalise (&stream);
- params->bpsto = pbbeacon->data + offset;
+ if (beacon->bmis.bpsto.present)
+ params->bpsto = pbbeacon->data + offset;
+ else
+ params->bpsto = NULL;
return pbbeacon;
}
@@ -844,6 +884,7 @@ bsu_beacon_read (pb_beacon_t *pbbeacon, bsu_beacon_t *beacon,
if (pbbeacon->phy_pb.pb_rx.pb_measurement.crc_error)
return false;
/* Initialise the data needed for the job. */
+ bsu_beacon_reset (beacon);
bitstream_read_init (&stream, pbbeacon->data, BSU_BEACON_SIZE);
ok = bsu_beacon_read_variant_fields (
pbbeacon, &stream, beacon, type, tei);
@@ -1017,73 +1058,6 @@ bsu_beacon_countdown (bsu_beacon_t *beacon)
}
void
-bsu_beacon_read_schedules (pb_beacon_t *beacon,
- bsu_beacon_schedules_t *schedules,
- bsu_beacon_bmi_discover_t *discover,
- mac_coexistence_mode_t *hm)
-{
- bitstream_t stream;
- uint i, nbe, nb_persistent = 0;
- bsu_beacon_entry_header_t header;
- uint length;
- dbg_assert (beacon);
- dbg_assert (schedules);
- /* Initialise the bitstream context to read the beacon. */
- bitstream_read_init (&stream, beacon->data, BSU_BEACON_SIZE);
- /* Skip the NID. */
- bitstream_skip (&stream, 22);
- *hm = bitstream_read (&stream, 2);
- /* Skip the variant fields until network mode. */
- bitstream_skip (&stream, 32);
- schedules->nm = bitstream_read (&stream, 2);
- /* Skip the end of variant fields. */
- bitstream_skip (&stream, 6);
- /* Read number of beacon entry. */
- nbe = bitstream_read (&stream, 8);
- /* Reset schedule data. */
- bsu_beacon_schedules_reset (schedules);
- for (i = 0; i < nbe; i++)
- {
- if (bsu_beacon_read_bmi_header (&stream, &header, &length))
- {
- switch (header)
- {
- case BSU_BEACON_ENTRY_HEADER_NON_PERSISTENT_SCHEDULE:
- bsu_beacon_read_bmi_non_persistent (&stream, &schedules->nps);
- break;
- case BSU_BEACON_ENTRY_HEADER_PERSISTENT_SCHEDULE:
- bsu_beacon_read_bmi_persistent (
- &stream, &schedules->ps.ps[nb_persistent++]);
- break;
- case BSU_BEACON_ENTRY_HEADER_BEACON_PERIOD_START_TIME_OFFSET:
- bsu_beacon_read_bmi_bpsto (&stream, &schedules->bpsto);
- break;
- case BSU_BEACON_ENTRY_HEADER_ENCRYPTION_KEY_CHANGE:
- bsu_beacon_read_bmi_eks (&stream, &schedules->eks);
- break;
- case BSU_BEACON_ENTRY_HEADER_CHANGE_SNID:
- bsu_beacon_read_bmi_change_snid (&stream, &schedules->snid);
- break;
- case BSU_BEACON_ENTRY_HEADER_CHANGE_HM:
- bsu_beacon_read_bmi_change_hm (&stream, &schedules->hm);
- break;
- case BSU_BEACON_ENTRY_HEADER_DISCOVER:
- bsu_beacon_read_bmi_discover (&stream, discover);
- break;
- default:
- /* skip entry. */
- bitstream_skip (&stream, length * 8);
- }
- }
- else
- /* skip entry. */
- bitstream_skip (&stream, length * 8);
- }
- bitstream_finalise (&stream);
- schedules->ps.nb = nb_persistent;
-}
-
-void
bsu_beacon_read_track_info (pb_beacon_t *beacon,
bsu_beacon_track_info_t *tinfo)
{