[gsm48] Handle the RR CHAN MODIFY ACK in the gsm04_08_utils

Move the handling code to the gsm_04_08_utils.c and add a
note that the method value needs to be checked.
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index a29d036..12cc362 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1587,11 +1587,7 @@
 		rc = gsm48_rx_rr_pag_resp(msg);
 		break;
 	case GSM48_MT_RR_CHAN_MODE_MODIF_ACK:
-		DEBUGP(DRR, "CHANNEL MODE MODIFY ACK\n");
-		/* We've successfully modified the MS side of the channel,
-		 * now go on to modify the BTS side of the channel */
-		msg->lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;
-		rc = rsl_chan_mode_modify_req(msg->lchan);
+		rc = gsm48_rx_rr_modif_ack(msg);
 		break;
 	case GSM48_MT_RR_STATUS:
 		rc = gsm48_rx_rr_status(msg);
diff --git a/openbsc/src/gsm_04_08_utils.c b/openbsc/src/gsm_04_08_utils.c
index 598775c..2545f33 100644
--- a/openbsc/src/gsm_04_08_utils.c
+++ b/openbsc/src/gsm_04_08_utils.c
@@ -559,3 +559,39 @@
 	return rc;
 }
 
+int gsm48_rx_rr_modif_ack(struct msgb *msg)
+{
+	struct gsm48_hdr *gh = msgb_l3(msg);
+	struct gsm48_chan_mode_modify *mod =
+				(struct gsm48_chan_mode_modify *) gh->data;
+
+	DEBUGP(DRR, "CHANNEL MODE MODIFY ACK\n");
+
+	if (mod->mode != msg->lchan->tch_mode) {
+		DEBUGP(DRR, "CHANNEL MODE change failed. Wanted: %d Got: %d\n",
+			msg->lchan->tch_mode, mod->mode);
+		return -1;
+	}
+
+	/* update the channel type */
+	switch (mod->mode) {
+	case GSM48_CMODE_SIGN:
+		msg->lchan->rsl_cmode = RSL_CMOD_SPD_SIGN;
+		break;
+	case GSM48_CMODE_SPEECH_V1:
+	case GSM48_CMODE_SPEECH_EFR:
+	case GSM48_CMODE_SPEECH_AMR:
+		msg->lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;
+		break;
+	case GSM48_CMODE_DATA_14k5:
+	case GSM48_CMODE_DATA_12k0:
+	case GSM48_CMODE_DATA_6k0:
+	case GSM48_CMODE_DATA_3k6:
+		msg->lchan->rsl_cmode = RSL_CMOD_SPD_DATA;
+		break;
+	}
+
+	/* We've successfully modified the MS side of the channel,
+	 * now go on to modify the BTS side of the channel */
+	return rsl_chan_mode_modify_req(msg->lchan);
+}