mme: Add GTPv2 support
this includes a GTPv2_CodecPort (for the usual transcoding) as wella as an empty GTPv2_PrivateExtensions.ttcn without which the TITAN GTPv2 ProtocolModule won't compile. Change-Id: I1c1b8409077103dd4e64e467d21d33d8c9c4ac95
This commit is contained in:
parent
95333a16eb
commit
0f7d03a787
|
@ -0,0 +1,57 @@
|
|||
/* dual-faced port sitting on top of IPL4_asp UDP to encode/decode GTPv2C
|
||||
* (C) 2019 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
|
||||
*/
|
||||
|
||||
|
||||
module GTPv2_CodecPort {
|
||||
import from IPL4asp_PortType all;
|
||||
import from IPL4asp_Types all;
|
||||
import from GTPv2C_Types all;
|
||||
|
||||
/* identifies a remote peer (sender or receiver) */
|
||||
type record GtpPeer {
|
||||
ConnectionId connId,
|
||||
HostName remName,
|
||||
PortNumber remPort
|
||||
}
|
||||
|
||||
/* Decoded GTP2C (Control Plane), used in send and receive direction */
|
||||
type record Gtp2cUnitdata {
|
||||
GtpPeer peer,
|
||||
PDU_GTPCv2 gtpc
|
||||
}
|
||||
|
||||
/* Translation port on top of IPL4asp; ASP_Event passed through transparently */
|
||||
type port GTPv2C_PT message {
|
||||
out Gtp2cUnitdata;
|
||||
in Gtp2cUnitdata,
|
||||
ASP_ConnId_ReadyToRelease,
|
||||
ASP_Event;
|
||||
} with { extension "user IPL4asp_PT
|
||||
out(Gtp2cUnitdata -> ASP_SendTo: function(f_enc_Gtp2cUD))
|
||||
in(ASP_RecvFrom -> Gtp2cUnitdata: function(f_dec_Gtp2cUD);
|
||||
ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
|
||||
ASP_Event -> ASP_Event: simple)" }
|
||||
|
||||
private function f_enc_Gtp2cUD(in Gtp2cUnitdata in_ud, out ASP_SendTo out_ud) {
|
||||
out_ud.connId := in_ud.peer.connId;
|
||||
out_ud.remName := in_ud.peer.remName;
|
||||
out_ud.remPort := in_ud.peer.remPort;
|
||||
out_ud.proto := { udp := {} };
|
||||
out_ud.msg := enc_PDU_GTPCv2(in_ud.gtpc);
|
||||
} with { extension "prototype(fast)" };
|
||||
|
||||
private function f_dec_Gtp2cUD(in ASP_RecvFrom in_ud, out Gtp2cUnitdata out_ud) {
|
||||
out_ud.peer.connId := in_ud.connId;
|
||||
out_ud.peer.remName := in_ud.remName;
|
||||
out_ud.peer.remPort := in_ud.remPort;
|
||||
out_ud.gtpc := dec_PDU_GTPCv2(in_ud.msg);
|
||||
} with { extension "prototype(fast)" };
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
module GTPv2_PrivateExtensions {
|
||||
|
||||
/* This is a small stub module to make GTPv2_Types.ttcn from
|
||||
* titan.ProtocolModules.GTPv2_v13.7.0 compile */
|
||||
|
||||
import from General_Types all;
|
||||
|
||||
type record PrivateExtension {
|
||||
OCT1 elementIdentifier,
|
||||
LIN2_BO_LAST lengthIndicator,
|
||||
BIT4 instance,
|
||||
BIT4 spare,
|
||||
octetstring data
|
||||
} with {
|
||||
variant (lengthIndicator) "LENGTHTO(data)";
|
||||
variant "PRESENCE (elementIdentifier = 'FE'O; )"
|
||||
}
|
||||
|
||||
type record of PrivateExtension PrivateExtension_List;
|
||||
|
||||
} with{ encode "RAW" }
|
|
@ -0,0 +1,323 @@
|
|||
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
|
||||
}});
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -35,6 +35,14 @@ DIR=$BASEDIR/titan.ProtocolModules.NAS_EPS_15.2.0.1/src
|
|||
FILES="NAS_EPS_Types.ttcn"
|
||||
gen_links $DIR $FILES
|
||||
|
||||
DIR=$BASEDIR/titan.ProtocolModules.GTPv2_v13.7.0/src
|
||||
FILES="GTPv2_Types.ttcn"
|
||||
gen_links $DIR $FILES
|
||||
|
||||
DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src
|
||||
FILES="GTPC_EncDec.cc GTPC_Types.ttcn GTPU_EncDec.cc GTPU_Types.ttcn"
|
||||
gen_links $DIR $FILES
|
||||
|
||||
DIR=../library/s1ap
|
||||
FILES="S1AP_CommonDataTypes.asn S1AP_Constants.asn S1AP_Containers.asn S1AP_IEs.asn S1AP_PDU_Contents.asn
|
||||
S1AP_PDU_Descriptions.asn "
|
||||
|
@ -46,7 +54,7 @@ FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Na
|
|||
FILES+="SGsAP_Templates.ttcn SGsAP_CodecPort.ttcn SGsAP_CodecPort_CtrlFunct.ttcn SGsAP_CodecPort_CtrlFunctDef.cc SGsAP_Emulation.ttcn DNS_Helpers.ttcn "
|
||||
FILES+="L3_Templates.ttcn "
|
||||
FILES+="S1AP_CodecPort.ttcn S1AP_CodecPort_CtrlFunctDef.cc S1AP_CodecPort_CtrlFunct.ttcn S1AP_Emulation.ttcn "
|
||||
FILES+="NAS_Templates.ttcn "
|
||||
FILES+="NAS_Templates.ttcn GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "
|
||||
gen_links $DIR $FILES
|
||||
|
||||
ignore_pp_results
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
FILES="*.ttcn *.asn *.c IPL4asp_PT.cc IPL4asp_discovery.cc Native_FunctionDefs.cc SGsAP_CodecPort_CtrlFunctDef.cc S1AP_CodecPort_CtrlFunctDef.cc TCCConversion.cc TCCEncoding.cc TCCInterface.cc TELNETasp_PT.cc S1AP_EncDec.cc LTE_CryptoFunctionDefs.cc "
|
||||
FILES="*.ttcn *.asn *.c IPL4asp_PT.cc IPL4asp_discovery.cc Native_FunctionDefs.cc SGsAP_CodecPort_CtrlFunctDef.cc S1AP_CodecPort_CtrlFunctDef.cc TCCConversion.cc TCCEncoding.cc TCCInterface.cc TELNETasp_PT.cc S1AP_EncDec.cc LTE_CryptoFunctionDefs.cc GTPU_EncDec.cc GTPC_EncDec.cc "
|
||||
|
||||
export CPPFLAGS_TTCN3=""
|
||||
|
||||
|
|
Loading…
Reference in New Issue