osmo-ttcn3-hacks/library/GTPv2_Templates.ttcn

324 lines
8.2 KiB
Plaintext

module GTPv2_Templates {
/* (C) 2019 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.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
import from General_Types all;
import from Osmocom_Types all;
import from GTPv2_Types all;
private function fs_GTP2C_t_bit(template (omit) OCT4 teid) return BIT1 {
if (istemplatekind(teid, "omit")) {
return '0'B;
} else {
return '1'B;
}
}
private function fs_GTP2C_p_bit(template (omit) PDU_GTPCv2 piggyback) return BIT1 {
if (istemplatekind(piggyback, "omit")) {
return '0'B;
} else {
return '1'B;
}
}
template (present) PDU_GTPCv2 tr_PDU_GTP2C(template OCT4 teid := ?,
template (present) GTPCv2_PDUs pdus := ?,
template PDU_GTPCv2 piggyback := omit) := {
spare := '000'B,
t_Bit := ?,
p_Bit := ?,
version := '010'B,
messageType := ?,
lengthf := ?,
tEID := teid,
sequenceNumber := ?,
spare3 := '00'O,
gtpcv2_pdu := pdus,
piggybackPDU_GTPCv2 := piggyback
}
/* 8.3 */
template (value) IMSI ts_GTP2C_Imsi(template (value) hexstring imsi) := {
elementIdentifier := '01'O,
lengthIndicator := 0, /* overwritten */
instance := '0000'B,
spare := '0000'B,
iMSI_Value := imsi
}
template (present) IMSI tr_GTP2C_Imsi(template (present) hexstring imsi) := {
elementIdentifier := '01'O,
lengthIndicator := ?,
instance := ?,
spare := '0000'B,
iMSI_Value := imsi
}
/* 8.4-1 */
/*
type enumerated GTP2C_Cause {
Local_Detach (2),
Complete_Detach (3),
RAT_changed_from_3GPP_to_Non_3GPP (4),
ISR_deactivation (5),
Error_Ind_from_RNC_eNB_SGSN_MME (5),
IMSI_Detach_Only (7),
Reactivation_Required (8),
}
*/
const integer c_GTP2C_Cause_LocalDetach := 1;
/* 8.4 */
template (value) Cause ts_GTP2C_Cause(template (value) OCT1 cause,
template (value) BIT1 cs) := {
elementIdentifier := '02'O,
lengthIndicator := 0, /* overwritten */
instance := '0000'B,
spare := '0000'B,
causeValue := cause,
cS := cs,
bCE := '0'B,
pCE := '0'B,
spare2 := '00000'B,
typeOfOffendingIE := omit,
lengthIndicator2 := omit,
instanceOfOffendingIE := omit,
spare3 := omit
}
template (present) Cause tr_GTP2C_Cause(template (present) OCT1 cause) := {
elementIdentifier := '02'O,
lengthIndicator := ?,
instance := ?,
spare := '0000'B,
causeValue := cause,
cS := ?,
bCE := ?,
pCE := ?,
spare2 := '00000'B,
typeOfOffendingIE := *,
lengthIndicator2 := *,
instanceOfOffendingIE := *,
spare3 := *
}
/* 8.5 */
template (value) AccessPointName ts_GTP2C_APN(template (value) octetstring apn) := {
elementIdentifier := '48'O,
lengthIndicator := 0, /* overwritten */
instance := '0000'B,
spare := '0000'B,
aPN_Value := apn
}
template (present) AccessPointName tr_GTP2C_APN(template (present) octetstring apn) := {
elementIdentifier := '48'O,
lengthIndicator := ?,
instance := ?,
spare := '0000'B,
aPN_Value := apn
}
/* 8.14 */
template (value) PDN_AddressAllocation
ts_GTP2C_PdnAddrAlloc(template (value) BIT3 pdn_type,
template (value) PDN_Address_and_Prefix addr_pfx) := {
elementIdentifier := '4F'O,
lengthIndicator := 0, /* overwritten */
instance := '0000'B,
spare := '0000'B,
pDN_Type := pdn_type,
spare2 := '00000'B,
pDN_Address_and_Prefix := addr_pfx
}
template (present) PDN_AddressAllocation
tr_GTP2C_PdnAddrAlloc(template (present) BIT3 pdn_type,
template (present) PDN_Address_and_Prefix addr_pfx) := {
elementIdentifier := '4F'O,
lengthIndicator := ?,
instance := ?,
spare := '0000'B,
pDN_Type := pdn_type,
spare2 := '00000'B,
pDN_Address_and_Prefix := addr_pfx
}
template (value) PDN_AddressAllocation
ts_GTP2C_PdnAddrAlloc_v4(template (value) OCT4 addr) :=
ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
template (present) PDN_AddressAllocation
tr_GTP2C_PdnAddrAlloc_v4(template (present) OCT4 addr) :=
ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});
/* 8.17 */
template (value) RAT_Type ts_GTP2C_RatType(template (value) integer rat) := {
elementIdentifier := '53'O,
lengthIndicator := 0, /* overwritten */
instance := '0000'B,
spare := '0000'B,
rAT_TypeValue := rat,
additionalOctets := omit
}
template (present) RAT_Type tr_GTP2C_RatType(template (present) integer rat) := {
elementIdentifier := '53'O,
lengthIndicator := ?,
instance := ?,
spare := '0000'B,
rAT_TypeValue := rat,
additionalOctets := *
}
/* 8.22 */
private function f_bit4oct(template (omit) octetstring os) return BIT1
{
if (istemplatekind(os, "omit")) {
return '0'B;
} else {
return '1'B;
}
}
template (value) FullyQualifiedTEID
ts_GTP2C_FTEID(integer if_type, OCT4 teid, template (omit) OCT4 v4_addr := omit,
template (omit) OCT16 v6_addr := omit) := {
elementIdentifier := '57'O,
lengthIndicator := 0, /* overwritten */
instance := '0000'B,
spare := '0000'B,
interfaceType := if_type,
v6_Flag := f_bit4oct(v4_addr),
v4_Flag := f_bit4oct(v6_addr),
tEID_GRE_Key := teid,
iPv4_Address := v4_addr,
iPv6_Address := v6_addr,
additionalOctets := omit
}
template (present) FullyQualifiedTEID
tr_GTP2C_FTEID(template (present) integer if_type, template (present) OCT4 teid,
template OCT4 v4_addr := omit,
template OCT16 v6_addr := omit) := {
elementIdentifier := '57'O,
lengthIndicator := ?,
instance := ?,
spare := '0000'B,
interfaceType := if_type,
v6_Flag := ?,
v4_Flag := ?,
tEID_GRE_Key := teid,
iPv4_Address := v4_addr,
iPv6_Address := v6_addr,
additionalOctets := omit
}
template (value) PDU_GTPCv2 ts_PDU_GTP2C(template (omit) OCT4 teid, template (value) OCT3 seq,
template (value) OCT1 msg_type,
template (value) GTPCv2_PDUs pdus,
template (omit) PDU_GTPCv2 piggyback := omit) := {
spare := '000'B,
t_Bit := fs_GTP2C_t_bit(teid),
p_Bit := fs_GTP2C_p_bit(piggyback),
version := '010'B,
messageType := msg_type,
lengthf := 0, /* overwritten */
tEID := teid,
sequenceNumber := seq,
spare3 := '00'O,
gtpcv2_pdu := pdus,
piggybackPDU_GTPCv2 := piggyback
}
template (present) PDU_GTPCv2
tr_GTP2C_CreateSessionReq(template (present) hexstring imsi) := tr_PDU_GTP2C('00000000'O, {
createSessionRequest := {
iMSI := tr_GTP2C_Imsi(imsi),
mSISDN := *,
mEI := *,
userLocationInfo := ?,
servingNetwork := ?,
rAT_Type := tr_GTP2C_RatType(6),
indication := *,
fullyQualifiedTEID := ?,
accessPointName := tr_GTP2C_APN('012a'O), // '*'
selectionMode := ?,
pDN_Type := ?,
pDN_AddressAllocation := ?,
maxAPN_Restriction := ?,
ambr := *,
linkedEPS_Bearer_ID := omit,
trustedWLANModeIndication := omit,
protocolConfigOptions := omit,
bearerContextGrouped := ?,
traceInformation := *,
recovery := omit,
csid := omit,
uE_TimeZone := ?,
user_CSG_Information := omit,
chargingCharacteristics := ?,
lDN := omit,
signallingPriorityIndication := *,
iP_Addr := omit,
portNumber := omit,
aPCO := omit,
trustedWLANAccessNetworkIdentifier := omit,
cNOperatorSelectionEntity := omit,
presenceReportingAreaInformation := omit,
overloadControlInformationGrouped := omit,
originationTimeStamp := *,
maximumWaitTime := *,
wLANLocationTimestamp := omit,
nBIFOMContainer := omit,
remoteUEContextGrouped := *,
nodeIdentifier := *,
extendedProtocolConfigOptions := omit,
servingPLMNRateControl := omit,
counter := omit,
privateExtension := omit
}});
template (value) PDU_GTPCv2
ts_GTP2C_CreateSessionResp(template (value) FullyQualifiedTEID_List fteids,
template (value) PDN_AddressAllocation addr) :=
ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {
createSessionResponse := {
cause := ts_GTP2C_Cause(int2oct(16, 1), '0'B),
changeReportingAction := omit,
cSG_InformationReportingAction := omit,
heNBInformationReporting := omit,
fullyQualifiedTEID := fteids,
pDN_AddressAllocation := addr,
aPN_Restriction := omit,
ambr := omit,
linkedEPS_Bearer_ID := omit,
protocolConfigOptions := omit,
bearerContextGrouped := omit,
recovery := omit,
chargingGatewayName := omit,
chargingGatewayAddress := omit,
csid := omit,
lDN := omit,
pGW_Back_OffTime := omit,
aPCO := omit,
trustedWLANIPv4Parameters := omit,
indicationFlags := omit,
presenceReportingAreaAction := omit,
loadControlInformationGrouped := omit,
overloadControlInformationGrouped := omit,
nBIFOMContainer := omit,
pDNConnectionChargingID := omit,
extendedProtocolConfigOptions := omit,
privateExtension := omit
}});
}