Remove speech codec list from bearer_cap for phase 1 mobile station

According to TS 04.08 Clause 10.5.4.5.1, the octet 3a etc. shall not be
included, if only GSM full/half rate speech version 1 is supported.

As phase 1 mobile stations only support FR and HR speech, the speech
list in the bearer capability must be reduced to the codecs listed
above. If there is none of these codecs left, the call is rejected.

The octet 3a etc. must be omitted when encoding bearer capability for
phase 1 mobile stations. This is done by removing the speech list.

I do not use a "codec filter", because it is not required. The phase 1
mobile station can only respond with codecs it supports, so no filtering
is required.

Related: OS#6461
Change-Id: Idd267dad0ade18cee7d5be813a57e1ee3168e2db
diff --git a/src/libmsc/codec_mapping.c b/src/libmsc/codec_mapping.c
index bb5968f..f3a707b 100644
--- a/src/libmsc/codec_mapping.c
+++ b/src/libmsc/codec_mapping.c
@@ -343,6 +343,37 @@
 	return 0;
 }
 
+/* Bearer capability for phase 1 mobile stations must not have a speech version list. It uses the the radio capability
+ * to select the codec. The speech version list is removed. If no phase 1 codec was in the speech version list, an
+ * error is returned also. */
+int bearer_cap_filter_rev_lev(struct gsm_mncc_bearer_cap *bearer_cap, uint8_t rev_lev)
+{
+	bool fr_present = false, hr_present = false;
+	int i;
+
+	if (rev_lev > 0)
+		return 0;
+
+
+	for (i = 0; bearer_cap->speech_ver[i] >= 0; i++) {
+		switch (bearer_cap->speech_ver[i]) {
+		case GSM48_BCAP_SV_FR:
+			fr_present = true;
+			break;
+		case GSM48_BCAP_SV_HR:
+			hr_present = true;
+			break;
+		}
+	}
+
+	bearer_cap->speech_ver[0] = -1;
+
+	if (!fr_present && !hr_present)
+		return -ENOTSUP;
+
+	return 0;
+}
+
 /* Try to convert the SDP audio codec name to Speech Versions to append to Bearer Capabilities.
  * Return the number of Speech Version entries added (some may add more than one, others may be unknown/unapplicable and
  * return 0). */
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index fc4f730..c27caab 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -950,6 +950,13 @@
 			msgb_free(msg);
 			return rc;
 		}
+		rc = bearer_cap_filter_rev_lev(&bearer_cap, trans->vsub->classmark.classmark1.rev_lev);
+		if (rc) {
+			LOG_TRANS(trans, LOGL_ERROR, "No codec offered is supported by phase 1 mobile.\n");
+			trans_free(trans);
+			msgb_free(msg);
+			return rc;
+		}
 		break;
 	case GSM48_BCAP_ITCAP_3k1_AUDIO:
 	case GSM48_BCAP_ITCAP_FAX_G3:
@@ -1136,6 +1143,7 @@
 				  trans->bearer_cap.transfer);
 			return -EINVAL;
 		}
+		bearer_cap_filter_rev_lev(&proceeding->bearer_cap, trans->vsub->classmark.classmark1.rev_lev);
 		gsm48_encode_bearer_cap(msg, 0, &proceeding->bearer_cap);
 		memcpy(&trans->bearer_cap, &proceeding->bearer_cap, sizeof(trans->bearer_cap));
 	}
@@ -1851,6 +1859,7 @@
 	gsm48_start_cc_timer(trans, 0x323, GSM48_T323);
 
 	/* bearer capability */
+	bearer_cap_filter_rev_lev(&modify->bearer_cap, trans->vsub->classmark.classmark1.rev_lev);
 	gsm48_encode_bearer_cap(msg, 1, &modify->bearer_cap);
 	memcpy(&trans->bearer_cap, &modify->bearer_cap, sizeof(trans->bearer_cap));
 
@@ -1898,6 +1907,7 @@
 	gh->msg_type = GSM48_MT_CC_MODIFY_COMPL;
 
 	/* bearer capability */
+	bearer_cap_filter_rev_lev(&modify->bearer_cap, trans->vsub->classmark.classmark1.rev_lev);
 	gsm48_encode_bearer_cap(msg, 1, &modify->bearer_cap);
 	memcpy(&trans->bearer_cap, &modify->bearer_cap, sizeof(trans->bearer_cap));
 
@@ -1951,6 +1961,7 @@
 	gh->msg_type = GSM48_MT_CC_MODIFY_REJECT;
 
 	/* bearer capability */
+	bearer_cap_filter_rev_lev(&modify->bearer_cap, trans->vsub->classmark.classmark1.rev_lev);
 	gsm48_encode_bearer_cap(msg, 1, &modify->bearer_cap);
 	memcpy(&trans->bearer_cap, &modify->bearer_cap, sizeof(trans->bearer_cap));
 	/* cause */