210 lines
5.5 KiB
Plaintext
210 lines
5.5 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)
|
|
} 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)" }
|