summaryrefslogtreecommitdiff
path: root/cesar/ce/rx/cp
diff options
context:
space:
mode:
authordufour2009-09-09 13:08:44 +0000
committerdufour2009-09-09 13:08:44 +0000
commit5a42547715c815a37d33de0addfdb85d03ff6e7a (patch)
treef2ad94b61f3216f6065c3c88ac52ebfe4d892f33 /cesar/ce/rx/cp
parentee6a1a8b322d10b2d486453adcaf48d147bfad4c (diff)
* ce/rx/cp:
- add support to send CM_TM_UPDATE.IND MME, - update test to check it, - force usage of public API in test when sending MME. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@5471 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/ce/rx/cp')
-rw-r--r--cesar/ce/rx/cp/inc/mme.h16
-rw-r--r--cesar/ce/rx/cp/src/mme.c100
-rw-r--r--cesar/ce/rx/cp/test/src/test_mme.c71
3 files changed, 173 insertions, 14 deletions
diff --git a/cesar/ce/rx/cp/inc/mme.h b/cesar/ce/rx/cp/inc/mme.h
index 9484a42186..ec11d1e63d 100644
--- a/cesar/ce/rx/cp/inc/mme.h
+++ b/cesar/ce/rx/cp/inc/mme.h
@@ -101,6 +101,22 @@ ce_rx_mme_send_cm_chan_est_ind (cp_t *ctx, cp_sta_t *sta, tonemaps_t *tms,
bool initial_ce, u8 new_tmi, u8 default_tmi,
u32 tmi_list, tonemap_intervals_t *int_list);
+/**
+ * Send a CM_TM_UPDATE.IND MME to another STA.
+ * \param ctx the Control Plane context.
+ * \param sta the destination of the CM_CHAN_EST.IND MME.
+ * \param tms the RX tone maps structure.
+ * \param new_tmi the new tone map index value.
+ * \param old_tmi the old tone map which was used to create the new one.
+ * \param default_tmi the default TMI.
+ * \param tmi_list the valid list of TMI.
+ * \param int_list the list of intervals.
+ */
+void
+ce_rx_mme_send_cm_tm_update_ind (cp_t *ctx, cp_sta_t *sta, tonemaps_t *tms,
+ u8 new_tmi, u8 old_tmi, u8 default_tmi,
+ u32 tmi_list, tonemap_intervals_t *int_list);
+
END_DECLS
#endif /* ce_rx_cp_inc_mme_h */
diff --git a/cesar/ce/rx/cp/src/mme.c b/cesar/ce/rx/cp/src/mme.c
index f3925d0d48..de500a4e10 100644
--- a/cesar/ce/rx/cp/src/mme.c
+++ b/cesar/ce/rx/cp/src/mme.c
@@ -356,6 +356,101 @@ ce_rx_mme_send_cm_chan_est_ind (cp_t *ctx, cp_sta_t *sta, tonemaps_t *tms,
}
void
+ce_rx_mme_send_cm_tm_update_ind (cp_t *ctx, cp_sta_t *sta, tonemaps_t *tms,
+ u8 new_tmi, u8 old_tmi, u8 default_tmi,
+ u32 tmi_list, tonemap_intervals_t *int_list)
+{
+ /* Check parameters. */
+ dbg_assert (ctx);
+ dbg_assert (sta);
+ dbg_assert (tms);
+ dbg_assert ((new_tmi >> 5) == 0x000);
+ dbg_assert ((old_tmi >> 5) == 0x000);
+ dbg_assert ((default_tmi >> 5) == 0x000);
+ dbg_assert (int_list);
+
+ cp_mme_peer_t peer;
+ cp_sta_get_peer (sta, &peer);
+
+ /* Build MME. */
+ cp_mme_tx_t *mme = cp_msg_mme_init (ctx, &peer, CM_CHAN_EST_IND);
+ dbg_assert (mme);
+
+ bitstream_write (&mme->bitstream, default_tmi, 8);
+ /* TMI AV valid list. */
+ u8 tm_count = 0;
+ uint i;
+ for (i = NEGOCIATED_TONEMAP_INDEX_FIRST; i < TONEMAP_INDEX_NB ; i++)
+ {
+ if (tmi_list & (1 << i))
+ tm_count++;
+ }
+ dbg_assert (tm_count || default_tmi < PHY_MOD_ROBO_NB);
+ bitstream_write (&mme->bitstream, tm_count, 8);
+ for (i = NEGOCIATED_TONEMAP_INDEX_FIRST; i < TONEMAP_INDEX_NB; i++)
+ if (tmi_list & (1 << i))
+ {
+ bitstream_write (&mme->bitstream, i, 8);
+ tm_count--;
+ }
+ dbg_assert (tm_count == 0);
+
+ /* Intervals. */
+ bitstream_write (&mme->bitstream, int_list->intervals_nb, 8);
+ for (i = 0; i < int_list->intervals_nb; i++)
+ {
+ bitstream_write (&mme->bitstream,
+ int_list->interval[i].end_offset_atu, 16);
+ bitstream_write (&mme->bitstream, int_list->interval[i].tmi, 8);
+ }
+
+ /* Old TMI. */
+ bitstream_write (&mme->bitstream, old_tmi, 8);
+ /* New TMI. */
+ bitstream_write (&mme->bitstream, new_tmi, 8);
+
+ if (new_tmi)
+ {
+ /* Get tone map. */
+ tonemap_t *new_tm = tms->tm[new_tmi];
+ dbg_assert (new_tm);
+ tonemap_t *old_tm = tms->tm[old_tmi];
+ dbg_assert (old_tm);
+ bitstream_write (&mme->bitstream, new_tm->cpf, 8);
+ bitstream_write (&mme->bitstream, new_tm->fecrate, 8);
+ bitstream_write (&mme->bitstream, new_tm->gil, 8);
+ /* Copy position in the bitstream. */
+ uint cbd_len_pos = bitstream_written_bits (&mme->bitstream);
+ /* CBD length. */
+ bitstream_write (&mme->bitstream, 0, 16);
+
+ u16 pos = 0, count = 0;
+ u8 mod1, mod2;
+ CE_RX_CP_READ_BEGIN (old_tm, new_tm,
+ ctx->mac_config->tonemask_info.tonemask,
+ mod1, mod2)
+ {
+ if (mod1 != mod2)
+ {
+ /* Compute and write CBUD: [count:new_mod]. */
+ bitstream_write (&mme->bitstream, (pos << 4) || mod2, 16);
+ count++;
+ }
+ pos++;
+ }
+ CE_RX_CP_READ_END;
+ bitstream_direct_write (mme->p_mme, cbd_len_pos, count, 16);
+ }
+ bitstream_write_finalise (&mme->bitstream);
+
+ /* Send. */
+ cp_msg_mme_send (ctx, mme);
+
+ /* Restart expiration timer. */
+ tms->expiration_s = TONEMAPS_LIFE_DURATION_S - 1;
+}
+
+void
ce_rx_cp_mme_send_tone_map (cp_t *ctx, cp_sta_t *sta, u32 tmi_list,
u8 default_tmi, tonemap_intervals_t *int_list,
u8 new_tmi, u8 old_tmi, tonemaps_t *tms,
@@ -412,9 +507,8 @@ ce_rx_mme_refresh_tone_map_list (cp_t *ctx, cp_sta_t *sta, u32 tmi_list, u8
default_tmi, tonemap_intervals_t *int_list,
tonemaps_t *tms)
{
- /* FIXME: use CM_TM_UPDATE.IND is better. */
- ce_rx_mme_send_cm_chan_est_ind (ctx, sta, tms, false, 0, default_tmi,
- tmi_list, int_list);
+ ce_rx_mme_send_cm_tm_update_ind (ctx, sta, tms, 0, default_tmi,
+ default_tmi, tmi_list, int_list);
/* Set refresh counter when there is some TMI enabled. */
if (tmi_list)
tms->refresh_counter_s = CE_RX_REFRESH_TONE_MAP_S;
diff --git a/cesar/ce/rx/cp/test/src/test_mme.c b/cesar/ce/rx/cp/test/src/test_mme.c
index 4b531ed5df..0d3feb4aa9 100644
--- a/cesar/ce/rx/cp/test/src/test_mme.c
+++ b/cesar/ce/rx/cp/test/src/test_mme.c
@@ -93,6 +93,58 @@ mme_test_generate_header_cm_chan_est_ind (cp_t *cp, tonemaps_t *tms,
}
/**
+ * Generate header of MME CM_CHAN_EST.IND.
+ */
+uint
+mme_test_generate_cm_tm_update_ind (cp_t *cp, tonemaps_t *tms,
+ u8 default_tmi, u32 tmi_list,
+ tonemap_intervals_t *int_list, u8 old_tmi)
+{
+ uint count = 0;
+ dbg_assert (cp);
+ dbg_assert (tms);
+ bitstream_t *bt = cp->vect_bt;
+ bitstream_write_init (bt, cp->vect, ETH_PACKET_MAX_SIZE);
+ bitstream_write (bt, default_tmi, 8);
+ count++;
+ u8 tmi_count = 0;
+ uint i;
+ for (i = NEGOCIATED_TONEMAP_INDEX_FIRST; i < TONEMAP_INDEX_NB ; i++)
+ {
+ if (tmi_list & (1 << i))
+ tmi_count++;
+ }
+ bitstream_write (bt, tmi_count, 8);
+ count++;
+ for (i = NEGOCIATED_TONEMAP_INDEX_FIRST; i < TONEMAP_INDEX_NB ; i++)
+ if (tmi_list & (1 << i))
+ {
+ bitstream_write (bt, i, 8);
+ count++;
+ }
+ if (int_list)
+ {
+ bitstream_write (bt, int_list->intervals_nb, 8);
+ count++;
+ for (i = 0; i < int_list->intervals_nb; i++)
+ {
+ bitstream_write (bt, int_list->interval[i].end_offset_atu, 16);
+ count += 2;
+ bitstream_write (bt, int_list->interval[i].tmi, 8);
+ count++;
+ }
+ }
+ else
+ {
+ bitstream_write (bt, 0, 8);
+ count++;
+ }
+ bitstream_write (bt, old_tmi, 8);
+ count++;
+ return count;
+}
+
+/**
* If there is a tone map, add the header of the tone map to the
* CM_CHAN_EST.IND MME.
*/
@@ -250,9 +302,8 @@ mme_test_suite (test_t t)
test_begin (t, "CM_CHAN_EST.IND: refresh TMI list: empty list")
{
- cp.vect_size = mme_test_generate_header_cm_chan_est_ind (&cp, tms, 1,
- 1, 0, NULL,
- 0);
+ cp.vect_size = mme_test_generate_cm_tm_update_ind (&cp, tms, 1, 1,
+ NULL, 1);
mme_test_generate_end_cm_chan_est_ind (&cp);
/* No interval. */
tonemap_intervals_t int_list;
@@ -269,9 +320,8 @@ mme_test_suite (test_t t)
int_list.intervals_nb = 0;
u32 tmi_list = (1 << 5) | (1 << 1);
u8 default_tmi = 5;
- cp.vect_size = mme_test_generate_header_cm_chan_est_ind
- (&cp, tms, 1, default_tmi, tmi_list, &int_list,
- 0);
+ cp.vect_size = mme_test_generate_cm_tm_update_ind
+ (&cp, tms, default_tmi, tmi_list, &int_list, default_tmi);
mme_test_generate_end_cm_chan_est_ind (&cp);
ce_rx_mme_refresh_tone_map_list (&cp, &sta, tmi_list, default_tmi,
&int_list, tms);
@@ -289,12 +339,11 @@ mme_test_suite (test_t t)
int_list.interval[0].tmi = 1;
u32 tmi_list = (1 << 5) | (1 << 1);
u8 default_tmi = 5;
- cp.vect_size = mme_test_generate_header_cm_chan_est_ind
- (&cp, tms, 1, default_tmi, tmi_list, &int_list,
- 0);
+ cp.vect_size = mme_test_generate_cm_tm_update_ind
+ (&cp, tms, default_tmi, tmi_list, &int_list, default_tmi);
mme_test_generate_end_cm_chan_est_ind (&cp);
- ce_rx_cp_mme_send_tone_map
- (&cp, &sta, tmi_list, default_tmi, &int_list, 0, 0, tms, false);
+ ce_rx_mme_refresh_tone_map_list (&cp, &sta, tmi_list, default_tmi,
+ &int_list, tms);
/* Refresh should be set. */
test_fail_if (tms->refresh_counter_s != CE_RX_REFRESH_TONE_MAP_S);
} test_end;