library/MNCC: implement MNCCv8 encoding/decoding support

Change-Id: I5488c5a4cc671e1d6a0d35b2ff4bdda0b0b48c00
Related: OS#5164, OS#5282
diff --git a/library/MNCC_EncDec.cc b/library/MNCC_EncDec.cc
index f896cd3..ffc2aa8 100644
--- a/library/MNCC_EncDec.cc
+++ b/library/MNCC_EncDec.cc
@@ -9,7 +9,7 @@
 
 BOOLEAN set__MNCC__version(INTEGER const& version)
 {
-	if (version != 7)
+	if (version != 7 && version != 8)
 		return false;
 	mncc_sock_version = version;
 	return true;
@@ -184,9 +184,19 @@
 		strncpy(mncc.imsi, in_sig.imsi(), sizeof(mncc.imsi));
 		mncc.lchan_type = in_sig.lchan__type();
 		mncc.lchan_mode = in_sig.lchan__mode();
+		if (in_sig.gcr().is_value()) {
+			const OCTETSTRING &gcr = in_sig.gcr();
+			if (mncc_sock_version < 8)
+				TTCN_error("GCR is only available since MNCCv8");
+			memcpy(&mncc.v8.gcr[0], gcr, sizeof(mncc.v8.gcr));
+			mncc.fields |= MNCC_F_GCR;
+		}
 		if (in_sig.sdp().is_value()) {
 			const CHARSTRING &sdp = in_sig.sdp();
-			strncpy(&mncc.sdp[0], sdp, sizeof(mncc.sdp));
+			if (mncc_sock_version > 7)
+				strncpy(&mncc.v8.sdp[0], sdp, sizeof(mncc.v8.sdp));
+			else
+				strncpy(&mncc.v7.sdp[0], sdp, sizeof(mncc.v7.sdp));
 		}
 		ret_val = OCTETSTRING(sizeof(mncc), (uint8_t *)&mncc);
 		}
@@ -361,7 +371,13 @@
 		sign.imsi() = CHARSTRING(in_mncc->imsi);
 		sign.lchan__type() = in_mncc->lchan_type;
 		sign.lchan__mode() = in_mncc->lchan_mode;
-		sign.sdp() = in_mncc->sdp;
+		if (mncc_sock_version > 7) {
+			if (in_mncc->fields & MNCC_F_GCR)
+				sign.gcr() = OCTETSTRING(sizeof(in_mncc->v8.gcr), in_mncc->v8.gcr);
+			sign.sdp() = in_mncc->v8.sdp;
+		} else {
+			sign.sdp() = in_mncc->v7.sdp;
+		}
 		u.signal() = sign;
 		break;
 	}