From df32723446f5280fe65bd0ef4f25790e39ec8087 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 28 Dec 2017 22:51:51 +0100 Subject: GSUP Support and first test against OsmoHLR Change-Id: Idd7a6aca1ab193da39294f49a3adc4c1cd7cecff --- bsc-nat/gen_links.sh | 2 +- bsc/gen_links.sh | 2 +- hlr/GSUP_Test.ttcn | 54 +++++++++++++ hlr/Makefile | 193 ++++++++++++++++++++++++++++++++++++++++++++ hlr/gen_links.sh | 38 +++++++++ hlr/regen_makefile.sh | 7 ++ library/GSUP_Types.ttcn | 197 +++++++++++++++++++++++++++++++++++++++++++++ library/IPA_Emulation.ttcn | 26 ++++++ selftest/gen_links.sh | 2 +- 9 files changed, 518 insertions(+), 3 deletions(-) create mode 100644 hlr/GSUP_Test.ttcn create mode 100644 hlr/Makefile create mode 100755 hlr/gen_links.sh create mode 100755 hlr/regen_makefile.sh create mode 100644 library/GSUP_Types.ttcn diff --git a/bsc-nat/gen_links.sh b/bsc-nat/gen_links.sh index 9a45c890..65b16028 100755 --- a/bsc-nat/gen_links.sh +++ b/bsc-nat/gen_links.sh @@ -55,5 +55,5 @@ FILES="RTP_EncDec.cc RTP_Types.ttcn" gen_links $DIR $FILES DIR=../library -FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc RSL_Types.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn" +FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc RSL_Types.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn BSSAP_CodecPort.ttcn GSUP_Types.ttcn" gen_links $DIR $FILES diff --git a/bsc/gen_links.sh b/bsc/gen_links.sh index 4316966e..14771a7b 100755 --- a/bsc/gen_links.sh +++ b/bsc/gen_links.sh @@ -76,5 +76,5 @@ FILES="RTP_EncDec.cc RTP_Types.ttcn" gen_links $DIR $FILES DIR=../library -FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn" +FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn BSSMAP_Emulation.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn GSUP_Types.ttcn" gen_links $DIR $FILES diff --git a/hlr/GSUP_Test.ttcn b/hlr/GSUP_Test.ttcn new file mode 100644 index 00000000..11183698 --- /dev/null +++ b/hlr/GSUP_Test.ttcn @@ -0,0 +1,54 @@ +module GSUP_Test { + +import from GSUP_Types all; +import from IPA_Emulation all; + +type component test_CT { + var IPA_Emulation_CT vc_IPA; + var IPA_CCM_Parameters ccm_pars; + port IPA_GSUP_PT GSUP; +}; + +modulepar { + charstring mp_hlr_ip := "127.0.0.1"; + integer mp_hlr_gsup_port := 4222; + integer mp_hlr_ctrl_port := 4259; +}; + +function f_init() runs on test_CT { + ccm_pars := c_IPA_default_ccm_pars; + ccm_pars.name := "Osmocom TTCN-3 GSUP Simulator"; + + vc_IPA := IPA_Emulation_CT.create("IPA"); + map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT); + connect(vc_IPA:IPA_GSUP_PORT, self:GSUP); + vc_IPA.start(IPA_Emulation.main_client(mp_hlr_ip, mp_hlr_gsup_port, "", -1, ccm_pars)); +} + +testcase TC_gsup_sai_err_invalid_imsi() runs on test_CT { + var hexstring imsi; + timer T := 10.0; + + f_init(); + + imsi := '01234'H; + GSUP.send(valueof(ts_GSUP_SAI_REQ(imsi))); + T.start; + alt { + [] GSUP.receive(tr_GSUP_SAI_ERR(imsi, 17)) { + setverdict(pass); + } + [] GSUP.receive(tr_GSUP_SAI_RES(imsi)) { + setverdict(fail); + } + [] T.timeout { + setverdict(inconc); + } + } +} + +control { + execute( TC_gsup_sai_err_invalid_imsi() ); +}; + +}; diff --git a/hlr/Makefile b/hlr/Makefile new file mode 100644 index 00000000..3f0952ae --- /dev/null +++ b/hlr/Makefile @@ -0,0 +1,193 @@ +# This Makefile was generated by the Makefile Generator +# of the TTCN-3 Test Executor version CRL 113 200/6 R3A +# for Harald Welte (laforge@nataraja) on Thu Dec 28 17:35:00 2017 + +# Copyright (c) 2000-2017 Ericsson Telecom AB + +# The following make commands are available: +# - make, make all Builds the executable test suite. +# - make archive Archives all source files. +# - make check Checks the semantics of TTCN-3 and ASN.1modules. +# - make port Generates port skeletons. +# - make clean Removes all generated files. +# - make compile Translates TTCN-3 and ASN.1 modules to C++. +# - make dep Creates/updates dependency list. +# - make executable Builds the executable test suite. +# - make library Builds the library archive. +# - make objects Builds the object files without linking the executable. +# - make shared_objects Builds the shared object files without linking the executable. +# +# Set these variables... +# + +# The path of your TTCN-3 Test Executor installation: +# Uncomment this line to override the environment variable. +ifndef TTCN3_DIR +TTCN3_DIR = /usr +endif + +# Your platform: (SOLARIS, SOLARIS8, LINUX, FREEBSD or WIN32) +PLATFORM = LINUX + +# Your C++ compiler: +# (if you change the platform, you may need to change the compiler) +CXX = g++ + +# Flags for the C++ preprocessor (and makedepend as well): +CPPFLAGS = -D$(PLATFORM) -DMAKEDEPEND_RUN -I$(TTCN3_DIR)/include -I/usr/include/titan + +# Flags for the C++ compiler: +CXXFLAGS = -Wall -fPIC + +# Flags for the linker: +LDFLAGS = -L /usr/lib/titan -fPIC + +ifeq ($(PLATFORM), WIN32) +# Silence linker warnings. +LDFLAGS += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc +endif + +# Utility to create library files +AR = ar +ARFLAGS = + +# Flags for the TTCN-3 and ASN.1 compiler: +COMPILER_FLAGS = -L + +# Execution mode: (either ttcn3 or ttcn3-parallel) +TTCN3_LIB = ttcn3-parallel-dynamic + +# The path of your libxml2 installation: +# If you do not have your own one, leave it unchanged. +XMLDIR = $(TTCN3_DIR) + +# Directory to store the archived source files: +# Note: you can set any directory except ./archive +ARCHIVE_DIR = backup + +# +# You may change these variables. Add your files if necessary... +# + +# TTCN-3 modules of this project: +TTCN3_MODULES = GSUP_Test.ttcn GSM_Types.ttcn GSUP_Types.ttcn General_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_Emulation.ttcn IPA_Types.ttcn IPL4asp_Functions.ttcn IPL4asp_PortType.ttcn IPL4asp_Types.ttcn MGCP_CodecPort.ttcn MGCP_Types.ttcn MTP3asp_PortType.ttcn MTP3asp_Types.ttcn Osmocom_CTRL_Types.ttcn Osmocom_Types.ttcn RSL_Types.ttcn SDP_Types.ttcn Socket_API_Definitions.ttcn TCCConversion_Functions.ttcn TCCInterface_Functions.ttcn + +# ASN.1 modules of this project: +ASN1_MODULES = + +# C++ source & header files generated from the TTCN-3 & ASN.1 modules of +# this project: +GENERATED_SOURCES = GSUP_Test.cc GSM_Types.cc GSUP_Types.cc General_Types.cc IPA_CodecPort.cc IPA_CodecPort_CtrlFunct.cc IPA_Emulation.cc IPA_Types.cc IPL4asp_Functions.cc IPL4asp_PortType.cc IPL4asp_Types.cc MGCP_CodecPort.cc MGCP_Types.cc MTP3asp_PortType.cc MTP3asp_Types.cc Osmocom_CTRL_Types.cc Osmocom_Types.cc RSL_Types.cc SDP_Types.cc Socket_API_Definitions.cc TCCConversion_Functions.cc TCCInterface_Functions.cc +GENERATED_HEADERS = GSUP_Test.hh GSM_Types.hh GSUP_Types.hh General_Types.hh IPA_CodecPort.hh IPA_CodecPort_CtrlFunct.hh IPA_Emulation.hh IPA_Types.hh IPL4asp_Functions.hh IPL4asp_PortType.hh IPL4asp_Types.hh MGCP_CodecPort.hh MGCP_Types.hh MTP3asp_PortType.hh MTP3asp_Types.hh Osmocom_CTRL_Types.hh Osmocom_Types.hh RSL_Types.hh SDP_Types.hh Socket_API_Definitions.hh TCCConversion_Functions.hh TCCInterface_Functions.hh + +# C/C++ Source & header files of Test Ports, external functions and +# other modules: +USER_SOURCES = IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SDP_EncDec.cc MGCP_CodecPort_CtrlFunctDef.cc SDP_parse_.tab.c lex.SDP_parse_.c +USER_HEADERS = IPL4asp_PT.hh SDP_parse_.tab.h + +# Shared object files of this project: +SHARED_OBJECTS = GSUP_Test.so GSM_Types.so GSUP_Types.so General_Types.so IPA_CodecPort.so IPA_CodecPort_CtrlFunct.so IPA_Emulation.so IPA_Types.so IPL4asp_Functions.so IPL4asp_PortType.so IPL4asp_Types.so MGCP_CodecPort.so MGCP_Types.so MTP3asp_PortType.so MTP3asp_Types.so Osmocom_CTRL_Types.so Osmocom_Types.so RSL_Types.so SDP_Types.so Socket_API_Definitions.so TCCConversion_Functions.so TCCInterface_Functions.so IPA_CodecPort_CtrlFunctDef.so IPL4asp_PT.so IPL4asp_discovery.so TCCConversion.so TCCInterface.so SDP_EncDec.so MGCP_CodecPort_CtrlFunctDef.so SDP_parse_.tab.so lex.SDP_parse_.so + +# Object files of this project that are needed for the executable test suite: +OBJECTS = $(GENERATED_OBJECTS) $(USER_OBJECTS) + +GENERATED_OBJECTS = GSUP_Test.o GSM_Types.o GSUP_Types.o General_Types.o IPA_CodecPort.o IPA_CodecPort_CtrlFunct.o IPA_Emulation.o IPA_Types.o IPL4asp_Functions.o IPL4asp_PortType.o IPL4asp_Types.o MGCP_CodecPort.o MGCP_Types.o MTP3asp_PortType.o MTP3asp_Types.o Osmocom_CTRL_Types.o Osmocom_Types.o RSL_Types.o SDP_Types.o Socket_API_Definitions.o TCCConversion_Functions.o TCCInterface_Functions.o + +USER_OBJECTS = IPA_CodecPort_CtrlFunctDef.o IPL4asp_PT.o IPL4asp_discovery.o TCCConversion.o TCCInterface.o SDP_EncDec.o MGCP_CodecPort_CtrlFunctDef.o SDP_parse_.tab.o lex.SDP_parse_.o + +# Other files of the project (Makefile, configuration files, etc.) +# that will be added to the archived source files: +OTHER_FILES = Makefile + +# The name of the executable test suite: +EXECUTABLE = GSUP_Test + + + +LIBRARY = lib$(EXECUTABLE).so + +TARGET = $(EXECUTABLE) + +# +# Do not modify these unless you know what you are doing... +# Platform specific additional libraries: +# +SOLARIS_LIBS = -lsocket -lnsl -lxml2 +SOLARIS8_LIBS = -lsocket -lnsl -lxml2 +LINUX_LIBS = -lxml2 +FREEBSD_LIBS = -lxml2 +WIN32_LIBS = -lxml2 + +# +# Rules for building the executable... +# + +all: $(TARGET) ; + +shared_objects: $(SHARED_OBJECTS) ; + +executable: $(EXECUTABLE) ; + +library: $(LIBRARY) ; + +objects: $(OBJECTS) compile; + +$(EXECUTABLE): $(SHARED_OBJECTS) + if $(CXX) $(LDFLAGS) -o $@ -Wl,--no-as-needed $(SHARED_OBJECTS) \ + -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \ + -L$(OPENSSL_DIR)/lib -lcrypto \ + -L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \ + then : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi + +$(LIBRARY): $(OBJECTS) + $(CXX) -shared -o $@ $(OBJECTS) + +.cc.o .c.o: + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< + +%.so: %.o + $(CXX) -shared -o $@ $< + +$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile + @if [ ! -f $@ ]; then rm -f compile; $(MAKE) compile; fi + +check: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/ttcn3_compiler -s $(COMPILER_FLAGS) \ + $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) + +port: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/ttcn3_compiler -t $(COMPILER_FLAGS) \ + $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) + +compile: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/ttcn3_compiler $(COMPILER_FLAGS) \ + $(TTCN3_MODULES) $(ASN1_MODULES) - $? + touch $@ + +clean: + -rm -f $(EXECUTABLE) $(LIBRARY) $(OBJECTS) $(GENERATED_HEADERS) \ + $(GENERATED_SOURCES) $(SHARED_OBJECTS) compile \ + tags *.log + +dep: $(GENERATED_SOURCES) $(USER_SOURCES) ; + makedepend $(CPPFLAGS) -DMAKEDEPEND_RUN $(GENERATED_SOURCES) $(USER_SOURCES) + +archive: + mkdir -p $(ARCHIVE_DIR) + tar -cvhf - $(TTCN3_MODULES) $(ASN1_MODULES) \ + $(USER_HEADERS) $(USER_SOURCES) $(OTHER_FILES) \ + | gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-`date '+%y%m%d-%H%M'`.tgz + +diag: + $(TTCN3_DIR)/bin/ttcn3_compiler -v 2>&1 + $(TTCN3_DIR)/bin/mctr_cli -v 2>&1 + $(CXX) -v 2>&1 + @echo TTCN3_DIR=$(TTCN3_DIR) + @echo OPENSSL_DIR=$(OPENSSL_DIR) + @echo XMLDIR=$(XMLDIR) + @echo PLATFORM=$(PLATFORM) + +# +# Add your rules here if necessary... +# + diff --git a/hlr/gen_links.sh b/hlr/gen_links.sh new file mode 100755 index 00000000..6d838826 --- /dev/null +++ b/hlr/gen_links.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +BASEDIR=../deps + +gen_links() { + DIR=$1 + FILES=$* + for f in $FILES; do + echo "Linking $f" + ln -sf $DIR/$f $f + done +} + +DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src +FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCConversion.hh +TCCInterface.cc TCCInterface_ip.h" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src +FILES="Socket_API_Definitions.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.IPL4asp/src +FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttcn IPL4asp_Types.ttcn IPL4asp_discovery.cc IPL4asp_protocol_L234.hh" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.ProtocolModules.SDP/src +FILES="SDP_EncDec.cc SDP_Types.ttcn SDP_parse_.tab.c SDP_parse_.tab.h SDP_parse_parser.h SDP_parser.l +SDP_parser.y lex.SDP_parse_.c" +gen_links $DIR $FILES + +DIR=../MTP3asp_CNL113337/src +FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" +gen_links $DIR $FILES + +DIR=../library +FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn RSL_Types.ttcn MGCP_Types.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc Osmocom_CTRL_Types.ttcn GSUP_Types.ttcn" +gen_links $DIR $FILES diff --git a/hlr/regen_makefile.sh b/hlr/regen_makefile.sh new file mode 100755 index 00000000..37991a60 --- /dev/null +++ b/hlr/regen_makefile.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +MAIN="GSUP_Test.ttcn" + +FILES="*.ttcn IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SDP_EncDec.cc MGCP_CodecPort_CtrlFunctDef.cc *.c" + +../regen-makefile.sh $MAIN $FILES diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn new file mode 100644 index 00000000..b994d1f4 --- /dev/null +++ b/library/GSUP_Types.ttcn @@ -0,0 +1,197 @@ +module GSUP_Types { + +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)" } diff --git a/library/IPA_Emulation.ttcn b/library/IPA_Emulation.ttcn index ddedb39d..9bad69fe 100644 --- a/library/IPA_Emulation.ttcn +++ b/library/IPA_Emulation.ttcn @@ -17,6 +17,7 @@ import from MTP3asp_PortType all; import from RSL_Types all; import from MGCP_Types all; +import from GSUP_Types all; import from Osmocom_CTRL_Types all; @@ -99,6 +100,12 @@ type port IPA_CTRL_PT message { inout CtrlMessage, ASP_IPA_Event; } with { extension "internal" } +/* Client port for CTRL inside IPA */ +type port IPA_GSUP_PT message { + inout GSUP_PDU, ASP_IPA_Event; +} with { extension "internal" } + + type component IPA_Emulation_CT { /* down-facing port to IPA codec port */ port IPA_CODEC_PT IPA_PORT; @@ -110,6 +117,9 @@ type component IPA_Emulation_CT { port IPA_RSL_PT IPA_RSL_PORT; /* up-facing port for CTRL */ port IPA_CTRL_PT IPA_CTRL_PORT; + /* up-facing port for GSUP */ + port IPA_GSUP_PT IPA_GSUP_PORT; + /* up-facing port for other streams */ port IPA_SP_PT IPA_SP_PORT; @@ -193,6 +203,9 @@ private function f_send_IPA_EVT(template ASP_IPA_Event evt) runs on IPA_Emulatio if (IPA_CTRL_PORT.checkstate("Connected")) { IPA_CTRL_PORT.send(evt); } + if (IPA_GSUP_PORT.checkstate("Connected")) { + IPA_GSUP_PORT.send(evt); + } /* FIXME: to other ports */ } @@ -348,6 +361,10 @@ private function f_ctrl_to_user(octetstring msg) runs on IPA_Emulation_CT { IPA_CTRL_PORT.send(dec_CtrlMessage(msg_ch)); } +private function f_gsup_to_user(octetstring msg) runs on IPA_Emulation_CT { + IPA_GSUP_PORT.send(dec_GSUP_PDU(msg)); +} + private function f_mgcp_to_ud(octetstring payload) runs on IPA_Emulation_CT return ASP_IPA_Unitdata { if (mp_ipa_mgcp_uses_osmo_ext) { return valueof(t_ASP_IPA_UD(IPAC_PROTO_MGCP_OLD, payload)); @@ -365,6 +382,7 @@ private function ScanEvents() runs on IPA_Emulation_CT { var MgcpCommand mgcp_cmd; var MgcpResponse mgcp_rsp; var CtrlMessage ctrl_msg; + var GSUP_PDU gsup_msg; var octetstring payload; var ASP_RSL_Unitdata rsl; @@ -399,6 +417,8 @@ private function ScanEvents() runs on IPA_Emulation_CT { f_mgcp_to_user(ipa_rx.msg); } case (IPAC_PROTO_EXT_CTRL) { f_ctrl_to_user(ipa_rx.msg); + } case (IPAC_PROTO_EXT_GSUP) { + f_gsup_to_user(ipa_rx.msg); } case else { IPA_SP_PORT.send(f_to_asp(ipa_rx)); } @@ -451,6 +471,12 @@ private function ScanEvents() runs on IPA_Emulation_CT { IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud)); } + [] IPA_GSUP_PORT.receive(GSUP_PDU:?) -> value gsup_msg { + payload := enc_GSUP_PDU(gsup_msg); + ipa_ud := valueof(t_ASP_IPA_UD(IPAC_PROTO_OSMO, payload, IPAC_PROTO_EXT_GSUP)); + IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud)); + } + /* Received RSL -> down into IPA */ [] IPA_RSL_PORT.receive(ASP_RSL_Unitdata:?) -> value rsl { IPA_PORT.send(f_from_rsl(g_ipa_conn_id, rsl)); diff --git a/selftest/gen_links.sh b/selftest/gen_links.sh index 0dd6ea0c..5f53e449 100755 --- a/selftest/gen_links.sh +++ b/selftest/gen_links.sh @@ -52,5 +52,5 @@ SDP_parser.y lex.SDP_parse_.c" gen_links $DIR $FILES DIR=../library -FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn BSSAP_CodecPort.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn" +FILES="General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcn L3_Templates.ttcn BSSMAP_Templates.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn BSSAP_CodecPort.ttcn Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn GSUP_Types.ttcn" gen_links $DIR $FILES -- cgit v1.2.3