osmo-ttcn3-hacks/library/GSUP_Types.ttcn

691 lines
18 KiB
Plaintext

module GSUP_Types {
/* GSUP_Types, defining abstract TTCN-3 data types for the GSUP protocol.
*
* GSUP is a non-standard protocol used between OsmoMSC/OsmoSGSN and OsmoHLR
* in order to replace the complex TCAP/MAP protocol.
*
* (C) 2017 by Harald Welte <laforge@gnumonks.org>
* All rights reserved.
*
* Released under the terms of GNU General Public License, Version 2 or
* (at your option) any later version.
*/
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),
OSMO_GSUP_SESSION_ID_IE ('30'O),
OSMO_GSUP_SESSION_STATE_IE ('31'O),
OSMO_GSUP_SS_INFO_IE ('35'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),
OSMO_GSUP_MSGT_PROC_SS_REQUEST ('00100000'B),
OSMO_GSUP_MSGT_PROC_SS_ERROR ('00100001'B),
OSMO_GSUP_MSGT_PROC_SS_RESULT ('00100010'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 enumerated GSUP_SessionState {
OSMO_GSUP_SESSION_STATE_NONE (0),
OSMO_GSUP_SESSION_STATE_BEGIN (1),
OSMO_GSUP_SESSION_STATE_CONTINUE (2),
OSMO_GSUP_SESSION_STATE_END (3)
} with { variant "FIELDLENGTH(8)" };
type record GSUP_MSISDN {
uint8_t len,
hexstring digits optional
} with { variant (len) "LENGTHTO(digits)" };
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;
auth_tuple, tag = OSMO_GSUP_AUTH_TUPLE_IE;
auts, tag = OSMO_GSUP_AUTS_IE;
rand, tag = OSMO_GSUP_RAND_IE;
sres, tag = OSMO_GSUP_SRES_IE;
kc, tag = OSMO_GSUP_KC_IE;
ik, tag = OSMO_GSUP_IK_IE;
ck, tag = OSMO_GSUP_CK_IE;
autn, tag = OSMO_GSUP_AUTN_IE;
res, tag = OSMO_GSUP_RES_IE;
msisdn, tag = OSMO_GSUP_MSISDN_IE;
hlr_number, tag = OSMO_GSUP_HLR_NUMBER_IE;
cn_domain, tag = OSMO_GSUP_CN_DOMAIN_IE;
pdp_info, tag = OSMO_GSUP_PDP_INFO_IE;
apn, tag = OSMO_GSUP_ACCESS_POINT_NAME_IE;
pdp_qos, tag = OSMO_GSUP_PDP_QOS_IE;
pdp_type, tag = OSMO_GSUP_PDP_TYPE_IE;
charg_char, tag = OSMO_GSUP_CHARG_CHAR_IE;
session_state, tag = OSMO_GSUP_SESSION_STATE_IE;
session_id, tag = OSMO_GSUP_SESSION_ID_IE;
ss_info, tag = OSMO_GSUP_SS_INFO_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 auth_tuple,
octetstring auts,
octetstring rand,
octetstring sres,
octetstring kc,
octetstring ik,
octetstring ck,
octetstring autn,
octetstring res,
GSUP_MSISDN msisdn,
octetstring hlr_number,
GSUP_CnDomain cn_domain,
/* PDP context + nested IEs */
GSUP_IEs pdp_info,
octetstring apn,
octetstring pdp_qos,
OCT2 pdp_type,
octetstring charg_char,
/* Session information */
GSUP_SessionState session_state,
OCT4 session_id,
/* Supplementary Services */
octetstring ss_info
};
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)" };
function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
/* if last digit is 'F', then there's an odd number of digits and we must strip the F */
var integer num_digits := lengthof(gsup.ies[0].val.imsi);
if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
}
}
}
function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
if (ischosen(gsup.ies[0].val.imsi)) {
/* if number of digits is odd, add a 'F' as padding at the end */
var integer num_digits := lengthof(gsup.ies[0].val.imsi);
if (num_digits rem 2 == 1) {
gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
}
}
}
template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
BIT3 ton := '000'B,
BIT4 npi := '0000'B) := {
len := 0, /* overwritten */
/* numberingPlanIdentification := npi,
typeOfNumber := ton,
ext1 := '0'B, */
digits := digits
}
template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
template BIT3 ton := ?,
template BIT4 npi := ?) := {
len := ?,
/* numberingPlanIdentification := npi,
typeOfNumber := ton,
ext1 := '0'B, */
digits := digits
}
template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
octetstring kc) := {
tag := OSMO_GSUP_AUTH_TUPLE_IE,
len := 0, /* overwritten */
val := {
auth_tuple := {
valueof(ts_GSUP_IE_RAND(rand)),
valueof(ts_GSUP_IE_SRES(sres)),
valueof(ts_GSUP_IE_Kc(kc))
}
}
}
template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
octetstring kc, octetstring ik,
octetstring ck, octetstring autn,
octetstring res) := {
tag := OSMO_GSUP_AUTH_TUPLE_IE,
len := 0, /* overwritten */
val := {
auth_tuple := {
valueof(ts_GSUP_IE_RAND(rand)),
valueof(ts_GSUP_IE_SRES(sres)),
valueof(ts_GSUP_IE_Kc(kc)),
valueof(ts_GSUP_IE_IK(ik)),
valueof(ts_GSUP_IE_CK(ck)),
valueof(ts_GSUP_IE_AUTN(autn)),
valueof(ts_GSUP_IE_RES(res))
}
}
}
template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
tag := OSMO_GSUP_PDP_INFO_IE,
len := 0, /* overwritten */
val := {
pdp_info := {
valueof(ts_GSUP_IE_APN(apn)),
valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
}
}
}
template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
tag := OSMO_GSUP_PDP_TYPE_IE,
len := 0,
val := {
pdp_type := pdp_type
}
}
template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
tag := OSMO_GSUP_PDP_QOS_IE,
len := 0,
val := {
pdp_qos := pdp_qos
}
}
template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
msg_type := msgt,
ies := ies
}
template GSUP_PDU tr_GSUP_IMSI(template GSUP_MessageType msgt := ?, template hexstring imsi) := {
msg_type := msgt,
ies := { tr_GSUP_IE_IMSI(imsi), * }
}
template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
msg_type := msgt,
ies := ies
}
template (value) 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_REQ(template hexstring imsi) :=
tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
template GSUP_PDU tr_GSUP_SAI_RES(template hexstring imsi) :=
tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE), * });
template (value) GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi) :=
ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, {
valueof(ts_GSUP_IE_IMSI(imsi)) });
template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi) :=
ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) });
template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi) :=
tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, imsi);
template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?) :=
tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn) :=
ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)) });
template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?) :=
tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_MSISDN(msisdn), * });
template (value) GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi) :=
ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, {
valueof(ts_GSUP_IE_IMSI(imsi)) });
template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
valueof(ts_GSUP_IE_IMSI(imsi)) });
template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
tr_GSUP_IE_IMSI(imsi), * });
template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
tag := OSMO_GSUP_CANCEL_TYPE_IE,
len := 0, /* overwritten */
val := {
cancel_type := ctype
}
}
template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
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_MSISDN(hexstring msisdn) := {
tag := OSMO_GSUP_MSISDN_IE,
len := 0, /* overwritten */
val := {
msisdn := ts_GSUP_MSISDN(msisdn)
}
}
template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
tag := OSMO_GSUP_MSISDN_IE,
len := ?,
val := {
msisdn := tr_GSUP_MSISDN(msisdn)
}
}
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
}
}
template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
tag := OSMO_GSUP_SRES_IE,
len := 0, /* overwritten */
val := {
sres := sres
}
}
template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
tag := OSMO_GSUP_KC_IE,
len := 0, /* overwritten */
val := {
kc := kc
}
}
template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
tag := OSMO_GSUP_IK_IE,
len := 0, /* overwritten */
val := {
ik := ik
}
}
template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
tag := OSMO_GSUP_CK_IE,
len := 0, /* overwritten */
val := {
ck := ck
}
}
template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
tag := OSMO_GSUP_AUTN_IE,
len := 0, /* overwritten */
val := {
autn := autn
}
}
template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
tag := OSMO_GSUP_RES_IE,
len := 0, /* overwritten */
val := {
res := res
}
}
template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
len := 0, /* overwritten */
val := {
apn := apn
}
}
template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := {
tag := OSMO_GSUP_CN_DOMAIN_IE,
len := 0, /* overwritten */
val := {
cn_domain := dom
}
}
template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
tag := OSMO_GSUP_SESSION_ID_IE,
len := 0, /* overwritten */
val := {
session_id := sid
}
}
template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
tag := OSMO_GSUP_SESSION_ID_IE,
len := ?,
val := {
session_id := sid
}
}
template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
tag := OSMO_GSUP_SESSION_STATE_IE,
len := 0, /* overwritten */
val := {
session_state := state
}
}
template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
tag := OSMO_GSUP_SESSION_STATE_IE,
len := ?,
val := {
session_state := state
}
}
template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
tag := OSMO_GSUP_SS_INFO_IE,
len := 0, /* overwritten */
val := {
ss_info := ss
}
}
template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
tag := OSMO_GSUP_SS_INFO_IE,
len := ?,
val := {
ss_info := ss
}
}
private function f_gen_ts_ss_ies(
hexstring imsi,
OCT4 sid,
GSUP_SessionState state,
template (omit) octetstring ss
) return GSUP_IEs {
/* Mandatory IEs */
var GSUP_IEs ies := {
valueof(ts_GSUP_IE_IMSI(imsi)),
valueof(ts_GSUP_IE_SessionId(sid)),
valueof(ts_GSUP_IE_SessionState(state))
};
/* Optional SS payload */
if (isvalue(ss)) {
ies[3] := valueof(ts_GSUP_IE_SSInfo(valueof(ss)));
}
return ies;
}
private function f_gen_tr_ss_ies(
template hexstring imsi,
template OCT4 sid := ?,
template GSUP_SessionState state := ?,
template octetstring ss := ?
) return template GSUP_IEs {
/* Mandatory IEs */
var template GSUP_IEs ies := {
tr_GSUP_IE_IMSI(imsi),
tr_GSUP_IE_SessionId(sid),
tr_GSUP_IE_SessionState(state)
};
/* Optional SS payload */
if (istemplatekind(ss, "*")) {
ies[3] := *;
} else if (not istemplatekind(ss, "omit")) {
ies[3] := tr_GSUP_IE_SSInfo(ss);
}
return ies;
}
template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
hexstring imsi,
OCT4 sid,
GSUP_SessionState state,
template (omit) octetstring ss := omit
) := ts_GSUP(
OSMO_GSUP_MSGT_PROC_SS_REQUEST,
f_gen_ts_ss_ies(imsi, sid, state, ss)
);
template GSUP_PDU tr_GSUP_PROC_SS_REQ(
template hexstring imsi,
template OCT4 sid := ?,
template GSUP_SessionState state := ?,
template octetstring ss := *
) := tr_GSUP(
OSMO_GSUP_MSGT_PROC_SS_REQUEST,
f_gen_tr_ss_ies(imsi, sid, state, ss)
);
template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
hexstring imsi,
OCT4 sid,
GSUP_SessionState state,
template (omit) octetstring ss := omit
) := ts_GSUP(
OSMO_GSUP_MSGT_PROC_SS_RESULT,
f_gen_ts_ss_ies(imsi, sid, state, ss)
);
template GSUP_PDU tr_GSUP_PROC_SS_RES(
template hexstring imsi,
template OCT4 sid := ?,
template GSUP_SessionState state := ?,
template octetstring ss := *
) := tr_GSUP(
OSMO_GSUP_MSGT_PROC_SS_RESULT,
f_gen_tr_ss_ies(imsi, sid, state, ss)
);
template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
hexstring imsi,
OCT4 sid,
integer cause
) := ts_GSUP(
OSMO_GSUP_MSGT_PROC_SS_ERROR,
{
valueof(ts_GSUP_IE_IMSI(imsi)),
valueof(ts_GSUP_IE_SessionId(sid)),
valueof(ts_GSUP_IE_Cause(cause))
}
);
template GSUP_PDU tr_GSUP_PROC_SS_ERR(
template hexstring imsi,
template OCT4 sid := ?,
template integer cause := ?
) := tr_GSUP(
OSMO_GSUP_MSGT_PROC_SS_ERROR,
{
tr_GSUP_IE_IMSI(imsi),
tr_GSUP_IE_SessionId(sid),
tr_GSUP_IE_Cause(cause)
}
);
} with { encode "RAW"; variant "FIELDORDER(msb)" }