summaryrefslogtreecommitdiff
path: root/cesar/bsu/beacon/src
diff options
context:
space:
mode:
authorlaranjeiro2010-05-17 10:57:14 +0000
committerlaranjeiro2010-05-17 10:57:14 +0000
commit23909e2782fbc74de857a34dd3c2fa2f8f1cc41f (patch)
treeba0e7e88e79727d880e19c43b43e1112dcf39825 /cesar/bsu/beacon/src
parent1ebd137b26fb3d5ef30794d642c68d97e82235f3 (diff)
cesar/bsu/beacon: add function to get track information from beacon
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@7092 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/bsu/beacon/src')
-rw-r--r--cesar/bsu/beacon/src/beacon.c133
1 files changed, 92 insertions, 41 deletions
diff --git a/cesar/bsu/beacon/src/beacon.c b/cesar/bsu/beacon/src/beacon.c
index eae58a00a1..58eb2c6079 100644
--- a/cesar/bsu/beacon/src/beacon.c
+++ b/cesar/bsu/beacon/src/beacon.c
@@ -18,6 +18,18 @@
#include "cp/defs.h"
/**
+ * Get the NID from the beacon.
+ * \param beacon the beacon to extract the NID.
+ * \return the NID.
+ */
+static inline u64
+bsu_beacon_read_nid (pb_beacon_t *beacon, bitstream_t *stream)
+{
+ return ((u64) bitstream_read (stream, 22)) << 32
+ | beacon->first_data_word;
+}
+
+/**
* Write the beacon variant fields.
* \param phy_beacon the beacon bloc.
* \param stream the bitstream context.
@@ -525,8 +537,7 @@ bsu_beacon_read_variant_fields (pb_beacon_t *phy_beacon,
bsu_beacon_t *beacon,
bsu_beacon_type_t *type, u8 *tei)
{
- beacon->vf.nid = ((u64) bitstream_read (stream, 22)) << 32
- | phy_beacon->first_data_word;
+ beacon->vf.nid = bsu_beacon_read_nid (phy_beacon, stream);
beacon->vf.hm = bitstream_read (stream, 2);
*tei = bitstream_read (stream, 8);
*type = bitstream_read (stream, 3);
@@ -613,45 +624,6 @@ bsu_beacon_read_bmi_bpsto (bitstream_t *stream, bsu_beacon_bmi_bpsto_t *bpsto)
bpsto->bpsto = bitstream_read (stream, 24);
}
-void
-bsu_beacon_read_schedules (pb_beacon_t *beacon,
- bsu_beacon_schedules_t *schedules)
-{
- bitstream_t stream;
- int 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);
- schedules->hm[0] = bitstream_read (&stream, 2);
- /* Skip the end of variant fields. */
- bitstream_skip (&stream, 40);
- /* Read number of beacon entry. */
- nbe = bitstream_read (&stream, 8);
- for (i = 0; i < nbe; i++)
- {
- header = bitstream_read (&stream, 8);
- length = bitstream_read (&stream, 8);
- if (header == BSU_BEACON_ENTRY_HEADER_NON_PERSISTENT_SCHEDULE)
- bsu_beacon_read_bmi_non_persistent (&stream, &schedules->nps);
- else if (header == BSU_BEACON_ENTRY_HEADER_PERSISTENT_SCHEDULE)
- bsu_beacon_read_bmi_persistent (&stream,
- &schedules->ps.ps[nb_persistent++]);
- else if (header ==
- BSU_BEACON_ENTRY_HEADER_BEACON_PERIOD_START_TIME_OFFSET)
- bsu_beacon_read_bmi_bpsto (&stream, &schedules->bpsto);
- else
- /* skip entry. */
- bitstream_skip (&stream, length * 8);
- }
- bitstream_finalise (&stream);
- schedules->ps.nb = nb_persistent;
-}
-
/**
* Read the beacon entry header and length.
* \param stream the bitstream context.
@@ -1025,3 +997,82 @@ bsu_beacon_countdown (bsu_beacon_t *beacon)
beacon->bmis.change_snid.present = beacon->bmis.change_snid.snidccd;
}
}
+
+void
+bsu_beacon_read_schedules (pb_beacon_t *beacon,
+ bsu_beacon_schedules_t *schedules)
+{
+ bitstream_t stream;
+ uint i, j, nbe, nb_persistent = 0;
+ bsu_beacon_entry_header_t header;
+ bsu_beacon_bmi_change_snid_t snid;
+ bsu_beacon_bmi_eks_t eks;
+ bsu_beacon_bmi_change_hybrid_mode_t hm;
+ 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);
+ schedules->hm[0] = bitstream_read (&stream, 2);
+ /* Skip the end of variant fields. */
+ bitstream_skip (&stream, 40);
+ /* Read number of beacon entry. */
+ nbe = bitstream_read (&stream, 8);
+ for (i = 0; i < nbe; i++)
+ {
+ header = bitstream_read (&stream, 8);
+ length = bitstream_read (&stream, 8);
+ 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, &eks);
+ if (eks.kbc == BSU_BEACON_EKS_KBC_NEK)
+ {
+ for (j = eks.kccd; j < COUNT (schedules->nek_switch); j++)
+ schedules->nek_switch [j] = eks.new_eks;
+ }
+ break;
+ case BSU_BEACON_ENTRY_HEADER_CHANGE_SNID:
+ bsu_beacon_read_bmi_change_snid (&stream, &snid);
+ for (j = snid.snidccd; j < COUNT (schedules->snid); j++)
+ schedules->snid [j] = snid.new_snid;
+ break;
+ case BSU_BEACON_ENTRY_HEADER_CHANGE_HM:
+ bsu_beacon_read_bmi_change_hm (&stream, &hm);
+ for (j = hm.hmccd; j < COUNT (schedules->hm); j++)
+ schedules->hm[j] = hm.newhm;
+ break;
+ default:
+ /* 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)
+{
+ bitstream_t stream;
+ bitstream_read_init (&stream, beacon->data, BSU_BEACON_SIZE);
+ tinfo->nid = bsu_beacon_read_nid (beacon, &stream);
+ /* Skip the hm. */
+ bitstream_skip (&stream, 2);
+ tinfo->tei = bitstream_read (&stream, 8);
+ tinfo->bt = bitstream_read (&stream, 3);
+ bitstream_finalise (&stream);
+}