module GTPv2_Templates { /* (C) 2019 by Harald Welte * 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 }}); }