BSC: Implement RSL_IE_MultirateCfg and use it in BSC_Tests

Change-Id: I0a5ddce570c0fd70f096d897b0b609d20b552ff7
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index 09cd717..46fb952 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -111,6 +111,9 @@
 	/* BTS3 */ { trx_num := 1, tsc := 4 }
 }
 
+private const RSL_IE_Body mr_conf_amr_5_90 :=
+	valueof(RSL_IE_Body:{multirate_cfg := ts_RSL_MultirateCfg(true, 0, '00000100'B /* 5,90k */)});
+
 /* per-BTS state which we keep */
 type record BTS_State {
 	/* component reference to the IPA_Client component used for RSL */
@@ -4504,17 +4507,10 @@
 	/* Note: This setups the codec configuration. The parameter payload in
 	 * mr_conf must be consistant with the parameter codecElements in pars
 	 * and also must match the amr-config in osmo-bsc.cfg! */
-	var RSL_IE_Body mr_conf := {
-		other := {
-			len := 2,
-			payload := '2804'O
-		}
-	};
-
 	pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecAMR_F}));
 	pars.ass_codec_list.codecElements[0].s0_7 := '00000100'B; /* 5,90k */
 	pars.ass_codec_list.codecElements[0].s8_15 := '01010111'B;
-	pars.expect_mr_conf_ie := mr_conf;
+	pars.expect_mr_conf_ie := mr_conf_amr_5_90;
 
 	f_init(1, true);
 	f_sleep(1.0);
@@ -4539,17 +4535,10 @@
 	var MSC_ConnHdlr vc_conn;
 
 	/* See note above */
-	var RSL_IE_Body mr_conf := {
-		other := {
-			len := 2,
-			payload := '2804'O
-		}
-	};
-
 	pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecAMR_H}));
 	pars.ass_codec_list.codecElements[0].s0_7 := '00000100'B; /* 5,90k */
 	pars.ass_codec_list.codecElements[0].s8_15 := '00000111'B;
-	pars.expect_mr_conf_ie := mr_conf;
+	pars.expect_mr_conf_ie := mr_conf_amr_5_90;
 
 	f_init(1, true);
 	f_sleep(1.0);
@@ -4598,17 +4587,11 @@
 	var TestHdlrParams pars := f_gen_test_hdlr_pars();
 	var MSC_ConnHdlr vc_conn;
 
-	var RSL_IE_Body mr_conf := {
-		other := {
-			len := 2,
-			payload := '2004'O /* <- expect ICMI=0, smod=00 */
-		}
-	};
-
 	pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecAMR_F}));
 	pars.ass_codec_list.codecElements[0].s0_7 := '00000100'B; /* 5,90k */
 	pars.ass_codec_list.codecElements[0].s8_15 := '01010111'B;
-	pars.expect_mr_conf_ie := mr_conf;
+	/* expect ICMI=0, smod=00: */
+	pars.expect_mr_conf_ie := valueof(RSL_IE_Body:{multirate_cfg := ts_RSL_MultirateCfg(false, 0, '00000100'B /* 5,90k */)});
 
 	f_init(1, true);
 	f_sleep(1.0);
diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn
index 6f8846f..6c45ca9 100644
--- a/library/RSL_Types.ttcn
+++ b/library/RSL_Types.ttcn
@@ -814,6 +814,31 @@
 		slot_count := slot_count
 	}
 
+	/* 9.3.52, 3GPP TS 44.018 10.5.2.21aa  */
+	type record RSL_IE_MultirateCfg {
+		uint8_t 	len,
+		uint3_t		mr_speech_ver,
+		boolean		nscb,
+		boolean		icmi,
+		BIT1		spare,
+		uint2_t		start_mode,
+		BIT8		amr_codec_modes,
+		octetstring	parameters
+	} with {
+		variant (len) "LENGTHTO(mr_speech_ver,nscb,icmi,spare,start_mode,amr_codec_modes,parameters)"
+	};
+	template (value) RSL_IE_MultirateCfg ts_RSL_MultirateCfg(boolean icmi := true, uint2_t start_mode := 0,
+								 BIT8 amr_codec_modes := '00000100'B /* 5,90k */) := {
+		len := 2,
+		mr_speech_ver := 1,
+		nscb := false,
+		icmi := icmi,
+		spare := '0'B,
+		start_mode := start_mode,
+		amr_codec_modes := amr_codec_modes,
+		parameters := ''O
+	}
+
 	/* 9.3.53 */
 	type record RSL_IE_MultirateCtrl {
 		uint3_t		spare,
@@ -952,6 +977,7 @@
 		RSL_IE_MS_Power		ms_power,
 		RSL_IE_MS_Power_Parameters ms_power_params,
 		uint8_t			timing_adv,
+		RSL_IE_MultirateCfg	multirate_cfg,
 		RSL_IE_MultirateCtrl	multirate_ctrl,
 		uint8_t			msg_id,
 		RSL_IE_FrameNumber	frame_nr,
@@ -1014,6 +1040,7 @@
 					ms_power, iei = RSL_IE_MS_POWER;
 					ms_power_params, iei = RSL_IE_MS_POWER_PARAM;
 					timing_adv, iei = RSL_IE_TIMING_ADVANCE;
+					multirate_cfg, iei = RSL_IE_MR_CONFIG;
 					multirate_ctrl, iei = RSL_IE_MR_CONTROL;
 					msg_id, iei = RSL_IE_MSG_ID;