From 5a42547715c815a37d33de0addfdb85d03ff6e7a Mon Sep 17 00:00:00 2001 From: dufour Date: Wed, 9 Sep 2009 13:08:44 +0000 Subject: * 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 --- cesar/ce/rx/cp/inc/mme.h | 16 ++++++ cesar/ce/rx/cp/src/mme.c | 100 +++++++++++++++++++++++++++++++++++-- cesar/ce/rx/cp/test/src/test_mme.c | 71 ++++++++++++++++++++++---- 3 files changed, 173 insertions(+), 14 deletions(-) (limited to 'cesar/ce/rx/cp') 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 @@ -355,6 +355,101 @@ ce_rx_mme_send_cm_chan_est_ind (cp_t *ctx, cp_sta_t *sta, tonemaps_t *tms, tms->expiration_s = TONEMAPS_LIFE_DURATION_S - 1; } +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, @@ -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 @@ -92,6 +92,58 @@ mme_test_generate_header_cm_chan_est_ind (cp_t *cp, tonemaps_t *tms, return count; } +/** + * 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; -- cgit v1.2.3