GSUP Support and first test against OsmoHLR
Change-Id: Idd7a6aca1ab193da39294f49a3adc4c1cd7cecff
diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
new file mode 100644
index 0000000..b994d1f
--- /dev/null
+++ b/library/GSUP_Types.ttcn
@@ -0,0 +1,197 @@
+module GSUP_Types {
+
+import from General_Types all;
+import from Osmocom_Types all;
+
+type enumerated GSUP_IEI {
+ OSMO_GSUP_IMSI_IE ('01'O),
+ OSMO_GSUP_CAUSE_IE ('02'O),
+ OSMO_GSUP_AUTH_TUPLE_IE ('03'O),
+ OSMO_GSUP_PDP_INFO_COMPL_IE ('04'O),
+ OSMO_GSUP_PDP_INFO_IE ('05'O),
+ OSMO_GSUP_CANCEL_TYPE_IE ('06'O),
+ OSMO_GSUP_FREEZE_PTMSI_IE ('07'O),
+ OSMO_GSUP_MSISDN_IE ('08'O),
+ OSMO_GSUP_HLR_NUMBER_IE ('09'O),
+ OSMO_GSUP_PDP_CONTEXT_ID_IE ('10'O),
+ OSMO_GSUP_PDP_TYPE_IE ('11'O),
+ OSMO_GSUP_ACCESS_POINT_NAME_IE ('12'O),
+ OSMO_GSUP_PDP_QOS_IE ('13'O),
+ OSMO_GSUP_CHARG_CHAR_IE ('14'O),
+
+ OSMO_GSUP_RAND_IE ('20'O),
+ OSMO_GSUP_SRES_IE ('21'O),
+ OSMO_GSUP_KC_IE ('22'O),
+ OSMO_GSUP_IK_IE ('23'O),
+ OSMO_GSUP_CK_IE ('24'O),
+ OSMO_GSUP_AUTN_IE ('25'O),
+ OSMO_GSUP_AUTS_IE ('26'O),
+ OSMO_GSUP_RES_IE ('27'O),
+ OSMO_GSUP_CN_DOMAIN_IE ('28'O)
+} with { variant "FIELDLENGTH(8)" };
+
+type enumerated GSUP_MessageType {
+ OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST ('00000100'B),
+ OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR ('00000101'B),
+ OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT ('00000110'B),
+
+ OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST ('00001000'B),
+ OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR ('00001001'B),
+ OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT ('00001010'B),
+
+ OSMO_GSUP_MSGT_AUTH_FAIL_REPORT ('00001011'B),
+
+ OSMO_GSUP_MSGT_PURGE_MS_REQUEST ('00001100'B),
+ OSMO_GSUP_MSGT_PURGE_MS_ERROR ('00001101'B),
+ OSMO_GSUP_MSGT_PURGE_MS_RESULT ('00001110'B),
+
+ OSMO_GSUP_MSGT_INSERT_DATA_REQUEST ('00010000'B),
+ OSMO_GSUP_MSGT_INSERT_DATA_ERROR ('00010001'B),
+ OSMO_GSUP_MSGT_INSERT_DATA_RESULT ('00010010'B),
+
+ OSMO_GSUP_MSGT_DELETE_DATA_REQUEST ('00010100'B),
+ OSMO_GSUP_MSGT_DELETE_DATA_ERROR ('00010101'B),
+ OSMO_GSUP_MSGT_DELETE_DATA_RESULT ('00010110'B),
+
+ OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST ('00011100'B),
+ OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR ('00011101'B),
+ OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT ('00011110'B)
+} with { variant "FIELDLENGTH(8)" };
+
+type enumerated GSUP_CancelType {
+ OSMO_GSUP_CANCEL_TYPE_UPDATE (1),
+ OSMO_GSUP_CANCEL_TYPE_WITHDRAW (2)
+} with { variant "FIELDLENGTH(8)" };
+
+type enumerated GSUP_CnDomain {
+ OSMO_GSUP_CN_DOMAIN_PS (1),
+ OSMO_GSUP_CN_DOMAIN_CS (2)
+} with { variant "FIELDLENGTH(8)" };
+
+type record GSUP_IE {
+ GSUP_IEI tag,
+ uint8_t len,
+ GSUP_IeValue val
+} with { variant (len) "LENGTHTO(val)"
+ variant (val) "CROSSTAG(imsi, tag = OSMO_GSUP_IMSI_IE;
+ cause, tag = OSMO_GSUP_CAUSE_IE;
+ cancel_type, tag = OSMO_GSUP_CANCEL_TYPE_IE;
+ auts, tag = OSMO_GSUP_AUTS_IE;
+ rand, tag = OSMO_GSUP_RAND_IE;
+ msisdn, tag = OSMO_GSUP_MSISDN_IE;
+ hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
+ cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
+ charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE)"
+};
+
+type record of GSUP_IE GSUP_IEs;
+
+type union GSUP_IeValue {
+ hexstring imsi,
+ integer cause,
+ GSUP_CancelType cancel_type,
+ //boolean pdp_info_compl,
+ //boolean freeze_ptmsi,
+ GSUP_IEs pdp_info,
+ GSUP_IEs auth_tuple,
+ octetstring auts,
+ octetstring rand,
+ hexstring msisdn,
+ octetstring hlr_number,
+ GSUP_CnDomain cn_domain,
+ octetstring charg_char
+};
+
+type record GSUP_PDU {
+ GSUP_MessageType msg_type,
+ GSUP_IEs ies
+};
+
+external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
+ with { extension "prototype(convert) encode(RAW)" };
+
+external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
+ with { extension "prototype(convert) decode(RAW)" };
+
+
+template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
+ msg_type := msgt,
+ ies := ies
+}
+
+template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
+ msg_type := msgt,
+ ies := ies
+}
+
+template GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
+ ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
+
+template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
+ tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
+ tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
+
+template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
+ tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
+ tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
+
+
+
+template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
+ tag := iei,
+ len := ?,
+ val := val
+}
+
+template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
+ tag := OSMO_GSUP_IMSI_IE,
+ len := 0, /* overwritten */
+ val := {
+ imsi := imsi
+ }
+}
+
+template GSUP_IE tr_GSUP_IE_IMSI(template hexstring imsi) := {
+ tag := OSMO_GSUP_IMSI_IE,
+ len := ?,
+ val := {
+ imsi := imsi
+ }
+}
+
+template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
+ tag := OSMO_GSUP_CAUSE_IE,
+ len := 0, /* overwritten */
+ val := {
+ cause := cause
+ }
+}
+
+template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
+ tag := OSMO_GSUP_CAUSE_IE,
+ len := ?,
+ val := {
+ cause := cause
+ }
+}
+
+template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
+ tag := OSMO_GSUP_AUTS_IE,
+ len := 0, /* overwritten */
+ val := {
+ auts := auts
+ }
+}
+
+template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
+ tag := OSMO_GSUP_RAND_IE,
+ len := 0, /* overwritten */
+ val := {
+ rand := rand
+ }
+}
+
+
+
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" }
diff --git a/library/IPA_Emulation.ttcn b/library/IPA_Emulation.ttcn
index ddedb39..9bad69f 100644
--- a/library/IPA_Emulation.ttcn
+++ b/library/IPA_Emulation.ttcn
@@ -17,6 +17,7 @@
import from RSL_Types all;
import from MGCP_Types all;
+import from GSUP_Types all;
import from Osmocom_CTRL_Types all;
@@ -99,6 +100,12 @@
inout CtrlMessage, ASP_IPA_Event;
} with { extension "internal" }
+/* Client port for CTRL inside IPA */
+type port IPA_GSUP_PT message {
+ inout GSUP_PDU, ASP_IPA_Event;
+} with { extension "internal" }
+
+
type component IPA_Emulation_CT {
/* down-facing port to IPA codec port */
port IPA_CODEC_PT IPA_PORT;
@@ -110,6 +117,9 @@
port IPA_RSL_PT IPA_RSL_PORT;
/* up-facing port for CTRL */
port IPA_CTRL_PT IPA_CTRL_PORT;
+ /* up-facing port for GSUP */
+ port IPA_GSUP_PT IPA_GSUP_PORT;
+
/* up-facing port for other streams */
port IPA_SP_PT IPA_SP_PORT;
@@ -193,6 +203,9 @@
if (IPA_CTRL_PORT.checkstate("Connected")) {
IPA_CTRL_PORT.send(evt);
}
+ if (IPA_GSUP_PORT.checkstate("Connected")) {
+ IPA_GSUP_PORT.send(evt);
+ }
/* FIXME: to other ports */
}
@@ -348,6 +361,10 @@
IPA_CTRL_PORT.send(dec_CtrlMessage(msg_ch));
}
+private function f_gsup_to_user(octetstring msg) runs on IPA_Emulation_CT {
+ IPA_GSUP_PORT.send(dec_GSUP_PDU(msg));
+}
+
private function f_mgcp_to_ud(octetstring payload) runs on IPA_Emulation_CT return ASP_IPA_Unitdata {
if (mp_ipa_mgcp_uses_osmo_ext) {
return valueof(t_ASP_IPA_UD(IPAC_PROTO_MGCP_OLD, payload));
@@ -365,6 +382,7 @@
var MgcpCommand mgcp_cmd;
var MgcpResponse mgcp_rsp;
var CtrlMessage ctrl_msg;
+ var GSUP_PDU gsup_msg;
var octetstring payload;
var ASP_RSL_Unitdata rsl;
@@ -399,6 +417,8 @@
f_mgcp_to_user(ipa_rx.msg);
} case (IPAC_PROTO_EXT_CTRL) {
f_ctrl_to_user(ipa_rx.msg);
+ } case (IPAC_PROTO_EXT_GSUP) {
+ f_gsup_to_user(ipa_rx.msg);
} case else {
IPA_SP_PORT.send(f_to_asp(ipa_rx));
}
@@ -451,6 +471,12 @@
IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud));
}
+ [] IPA_GSUP_PORT.receive(GSUP_PDU:?) -> value gsup_msg {
+ payload := enc_GSUP_PDU(gsup_msg);
+ ipa_ud := valueof(t_ASP_IPA_UD(IPAC_PROTO_OSMO, payload, IPAC_PROTO_EXT_GSUP));
+ IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud));
+ }
+
/* Received RSL -> down into IPA */
[] IPA_RSL_PORT.receive(ASP_RSL_Unitdata:?) -> value rsl {
IPA_PORT.send(f_from_rsl(g_ipa_conn_id, rsl));