library/MNCC: implement MNCCv8 encoding/decoding support
Change-Id: I5488c5a4cc671e1d6a0d35b2ff4bdda0b0b48c00
Related: OS#5164, OS#5282
diff --git a/library/MNCC_Emulation.ttcn b/library/MNCC_Emulation.ttcn
index 66294a4..85556c1 100644
--- a/library/MNCC_Emulation.ttcn
+++ b/library/MNCC_Emulation.ttcn
@@ -38,7 +38,7 @@
import from UD_Types all;
modulepar {
- int mp_mncc_version := 7;
+ int mp_mncc_version := 8;
}
/* General "base class" component definition, of which specific implementations
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;
}
diff --git a/library/MNCC_Types.ttcn b/library/MNCC_Types.ttcn
index e396892..1de34a0 100644
--- a/library/MNCC_Types.ttcn
+++ b/library/MNCC_Types.ttcn
@@ -362,6 +362,7 @@
uint8_t lchan_type, /* empty in OSmoMSC */
uint8_t lchan_mode, /* empty in OsmoMSC */
+ octetstring gcr optional,
charstring sdp optional
};
@@ -472,6 +473,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -503,6 +505,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -537,6 +540,7 @@
imsi := imsi,
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -570,6 +574,7 @@
imsi := imsi,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -604,6 +609,7 @@
imsi := imsi,
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -636,6 +642,7 @@
imsi := imsi,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -670,6 +677,7 @@
imsi := imsi,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -703,6 +711,7 @@
imsi := imsi,
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -735,6 +744,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -767,6 +777,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -809,6 +820,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -841,6 +853,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -875,6 +888,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -908,6 +922,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -944,6 +959,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -978,6 +994,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1012,6 +1029,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1046,6 +1064,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1079,6 +1098,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1115,6 +1135,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1148,6 +1169,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1181,6 +1203,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1213,6 +1236,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1248,6 +1272,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1281,6 +1306,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1316,6 +1342,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1350,6 +1377,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1384,6 +1412,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1417,6 +1446,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1450,6 +1480,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1481,6 +1512,7 @@
imsi := ?,
lchan_type := 0,
lchan_mode := 0,
+ gcr := *,
sdp := *
}
}
@@ -1529,6 +1561,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1561,6 +1594,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1593,6 +1627,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1625,6 +1660,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1657,6 +1693,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1697,6 +1734,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1729,6 +1767,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1761,6 +1800,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1794,6 +1834,7 @@
imsi := ?,
lchan_type := ?,
lchan_mode := ?,
+ gcr := *,
sdp := *
}
}
@@ -1826,6 +1867,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
@@ -1859,6 +1901,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := *,
sdp := *
}
}
@@ -1899,6 +1942,7 @@
imsi := "",
lchan_type := 0,
lchan_mode := 0,
+ gcr := omit,
sdp := omit
}
}
diff --git a/library/mncc.h b/library/mncc.h
index 1e45c37..f70f9bd 100644
--- a/library/mncc.h
+++ b/library/mncc.h
@@ -230,6 +230,7 @@
#define MNCC_F_CCCAP 0x0800
#define MNCC_F_KEYPAD 0x1000
#define MNCC_F_SIGNAL 0x2000
+#define MNCC_F_GCR 0x4000
struct gsm_mncc {
/* context based information */
@@ -267,7 +268,15 @@
unsigned char lchan_type;
unsigned char lchan_mode;
- char sdp[1024];
+ union {
+ struct {
+ char sdp[1024];
+ } v7;
+ struct {
+ uint8_t gcr[16];
+ char sdp[1024];
+ } v8;
+ };
};
struct gsm_data_frame {