diff --git a/.gitmodules b/.gitmodules index f269600cb52434900d03db5d95a5e1290d36275c..68eb61fa584cb0c72f48d6a947b7a5643b66765d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,7 @@ path = ttcn/LibIms url = https://forge.etsi.org/rep/LIBS/LibIms.git branch = TTF006 +[submodule "titan-test-system-framework"] + path = titan-test-system-framework + url = https://labs.etsi.org/rep/cti-tools/titan-test-system-framework.git + branch = devel diff --git a/LICENSE b/LICENSE index 2df8cd5739a1fe4d30ffbd6173ee851da799218a..c7a6ba06afc8440ff3742ee50286ada519c15dec 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2022 ETSI +Copyright 2019 ETSI Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..451a6c31e5c48f41758472c530ae4eb392f23762 --- /dev/null +++ b/Makefile @@ -0,0 +1,120 @@ +-include config.mk + +ifeq (,$(ATS)) + $(error ATS shall be defined) +endif + +ifeq (,$(TOPDIR)) + TOPDIR := . +endif + +ifeq (,$(TTCN3_DIR)) + $(error TTCN3_DIR shall be defined in config.mk) +endif +first: all + +define IncludeModule +undefine sources +undefine modules +undefine includes +include $(1)/module.mk +$$(foreach S, $$(sources), $$(eval all_sources += $(1)/$$(S))) +$$(foreach I, $$(includes), $$(eval all_includes += $(1)/$$(I))) +$$(foreach M, $$(modules), $$(eval $$(call IncludeModule, $$(if $$(filter /%, $$(M)), $$(M), $(1)/$$(M))))) +endef + +all_includes := $(TTCN3_DIR)/include $(TTCN3_DIR)/src /usr/include/libxml2 +defines += TITAN_RUNTIME_2 _NO_SOFTLINKS_ $(ATS) AS_USE_SSL +libs += $(TTCN3_DIR)/lib/libttcn3-rt2-parallel.a -lstdc++fs + +ifeq (Windows_NT,$(OS)) +# Silence linker warnings. +LDFLAGS += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc +defines += WIN32 +libs += $(patsubst %, -L%/lib, $(OPENSSL_DIR)) +all_includes += $(addsuffix /include, $(OPENSSL_DIR)) +libs += $(WPCAP_DLL_PATH) +else +defines += LINUX +libs += -lpcap -lrt -lpthread +endif + +libs += -lssl -lcrypto -lxml2 -L$(OSIP_LIB) -losipparser2 + +$(eval $(call IncludeModule, $(TOPDIR)/ttcn/$(ATS))) + +outdir := $(TOPDIR)/build/$(ATS) +bindir := $(TOPDIR)/bin + +sources := $(sort $(all_sources)) +includes := $(outdir) $(outdir)/.. $(all_includes) $(NPCAP_INCLUDE) $(OSIP_INCLUDE) + +ifeq (Windows_NT,$(OS)) + EXE=.exe +endif + +ttcn_sources := $(filter %.ttcn , $(sources)) +ttcn3_sources := $(filter %.ttcn3, $(sources)) +xsd_sources := $(filter %.xsd, $(sources)) + +tt_sources := $(ttcn_sources) $(ttcn3_sources) $(xsd_sources) +cc_sources := $(filter %.cc, $(sources)) + +gen_ttcn_sources := $(addprefix $(outdir)/, $(notdir $(patsubst %.ttcn, %.cc, $(ttcn_sources)))) +gen_ttcn_headers := $(addprefix $(outdir)/, $(notdir $(patsubst %.ttcn, %.hh, $(ttcn_sources)))) +gen_ttcn3_sources := $(addprefix $(outdir)/, $(notdir $(patsubst %.ttcn3, %.cc, $(ttcn3_sources)))) +gen_ttcn3_headers := $(addprefix $(outdir)/, $(notdir $(patsubst %.ttcn3, %.hh, $(ttcn3_sources)))) +gen_xsd_sources := $(addprefix $(outdir)/, $(notdir $(patsubst %.xsd, %.cc, $(xsd_sources)))) +gen_xsd_headers := $(addprefix $(outdir)/, $(notdir $(patsubst %.xsd, %.hh, $(xsd_sources)))) + +gen_sources := $(gen_ttcn_sources) $(gen_ttcn3_sources) $(gen_xsd_sources) +gen_headers := $(gen_ttcn_headers) $(gen_ttcn3_headers) $(gen_xsd_headers) + +gen_objects := $(patsubst %.cc, %.o, $(gen_sources)) +cc_objects := $(patsubst %.cc, $(outdir)/%.o, $(cc_sources)) + +.PHONY: all FORCE echo + +all: $(bindir) $(outdir) $(bindir)/$(ATS)$(EXE) + +echo_sources: + @echo -e "$(addsuffix \n,$(all_sources))" + +echo: echo_sources + @echo -e "sources:\n $(addsuffix \n, $(sources))" + @echo -e "gen_sources:\n $(addsuffix \n, $(gen_sources))" + @echo -e "gen_objects:\n $(addsuffix \n, $(gen_objects))" + @echo -e "cc_objects:\n $(addsuffix \n, $(cc_objects))" + @echo -e "includes:\n $(addsuffix \n, $(includes))" + @echo -e "defines: $(addsuffix \n, $(defines))" + +clean: + rm -f $(outdir)/$(ATS)$(EXE) $(gen_objects) $(gen_sources) $(gen_headers) $(cc_objects) $(outdir)/.generate + +regen: force_regen $(outdir)/.generate +force_regen: + rm -f $(outdir)/.generate + +$(outdir) $(bindir): + mkdir -p $@ + +$(bindir)/$(ATS)$(EXE): $(gen_objects) $(cc_objects) + g++ -g -O0 -std=c++17 -o $@ $(LDFLAGS) $(gen_objects) $(cc_objects) $(libs) + +$(gen_objects) :%.o :%.cc + g++ -g -O0 -std=c++17 -c $(addprefix -D, $(defines)) $(addprefix -I, $(includes)) -o $@ $< + +$(cc_objects) : $(outdir)/%.o : %.cc + mkdir -p $(dir $@) + g++ -g -O0 -std=c++17 -c $(addprefix -D, $(defines)) $(addprefix -I, $(includes)) -o $@ $< + +$(gen_sources): $(outdir)/.generate + +$(outdir)/.generate: Makefile $(tt_sources) + $(TTCN3_DIR)/bin/compiler $(TTCN3_COMPILER_OPTIONS) -o $(outdir) $(tt_sources) + touch $@ + +$(foreach S, $(ttcn_sources), $(eval $(outdir)/$(notdir $(patsubst %.ttcn, %.cc, $(S))): $(S))) +$(foreach S, $(ttcn3_sources), $(eval $(outdir)/$(notdir $(patsubst %.ttcn3, %.cc, $(S))): $(S))) +$(foreach S, $(xsd_sources), $(eval $(outdir)/$(notdir $(patsubst %.xsd, %.cc, $(S))): $(S))) + diff --git a/README.md b/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..aad3949abfd8b173da6714135c1f48cf898b58c8 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,334 @@ +# Voice and Video over LTE/Emergency VoLTE Interoperability Tests + +## Introduction +This repositories contains the test specifications and test adapter code +for interoprability tests to ETSI TS 1037 950-2 (Core Network and Interoperability Testing (INT); Network Interoperability Test Description for emergency services over VoLTE; (3GPP™ Release 15); Part 2: Test Descriptions). + +## Contact information +Email at cti_support at etsi dot org + +## License +The content of this repository and the files contained are released under the BSD-3-Clause License. +See the attached LICENSE file or visit +https://forge.etsi.org/legal-matters + +## Standard links +- ETSI TS 103 795-1: "Core Network and Interoperability Testing (INT); Network Interoperability Test Description for emergency services over VoLTE; (3GPP™ Release 15); Part 1: Test Purposes (TP)" +- ETSI TS 124 229: "Digital cellular telecommunications system (Phase 2+) (GSM); Universal Mobile Telecommunications System (UMTS); LTE; 5G; IP multimedia call control protocol based on Session Initiation Protocol (SIP) and Session Description Protocol (SDP); Stage 3 (3GPP TS 24.229 Release 15)" +- ETSI TS 129 165: "Digital cellular telecommunications system (Phase 2+) (GSM); Universal Mobile Telecommunications System (UMTS); LTE; 5G; Inter-IMS Network to Network Interface (NNI) (3GPP TS 29.165 Release 15)" +- ETSI TS 129 228: "Digital cellular telecommunications system (Phase 2+) (GSM); Universal Mobile Telecommunications System (UMTS); LTE; IP Multimedia (IM) Subsystem Cx and Dx Interfaces; Signalling flows and message contents (3GPP TS 29.228 Release 15)". +- ETSI TS 129 229: "Digital cellular telecommunications system (Phase 2+) (GSM); Universal Mobile Telecommunications System (UMTS); LTE; Cx and Dx interfaces based on the Diameter protocol; Protocol details (3GPP TS 29.229 Release 15)" + +## RFC links +- + +NOTE All draft can be found in the 'IETF XML Registry', accessible [here](https://www.iana.org/assignments/xml-registry/xml-registry.xhtml) + +# Installation + +The ETSI Emergency VoLTE Interoperability Tests project builds and tests regularly on the following platforms: + + - Linux (Ubuntu) + +Note: The [OpenSSL](https://www.openssl.org) version > 1.1.x is also required. + +## How to do it? + +They are two different methods: +- Using [Vagrant](https://www.vagrantup.com/) +- Using [Docker](https://www.docker.com/) + +How to choose one of these methods is depending of your host system. + +NOTE: In all case, if you want to setup an continuous integration process (e.g. Jenkins), Docker is the best choice. + + +### The host system is Windows +The both methods require a virtual machine. You can use either VirtualBox or WMware. +In this case, the easiest way is to use Vagrant. + + +### The host system is Linux +Vagrant requires a virtual machine. You can use either VirtualBox or WMware. +Docker does not need a virtual machine, so it is the more efficant way. + + +## Using TITAN compiler on a Docker image + +In this configuration, TITAN compiler is located on a Docker image and the sources and the outputs are located on the host. + +Pre-requisites on your host machine: +- Install Docker + +Procedure on the host machine: +- Open a Terminal +- Clone the ETSI Emergency VoLTE Interoperability Test System +- From the ETSI Emergency VoLTE Interoperability Test System root directory, build the Docker image executing the following commands: + +```sh +$ cd ./virtualization/docker +$ docker build --no-cache --tag alpine-emergency-iop -f Dockerfile --force-rm . +$ docker images +``` + +To build the Emergency VoLTE Interoperability Test Suite, execute the following command: + +```sh +$ ./docker-run.sh build +``` + +Possble other options are 'clean' to remove all the build outputs or 'rebuild' to force a build of the Test Suite after a 'clean'. + +To retrieve the list of the available test cases, execute the following command: + +```sh +$ ./docker-run.sh list +``` + +Before to execute the Emergency VoLTE Interoperability Test Suite, prepare, edit and update the configuration file: + +```sh +$ ln -sf ../../etc/AtsXxx/AtsXxx_yyy.cf_ ../../etc/AtsXxx/AtsXxx.cfg +$ vi ../../etc/AtsXxx/AtsXxx.cfg # To update it +``` + +To execute the Emergency VoLTE Interoperability Test Suite, execute the following command: + +```sh +$ ./docker-run.sh run +``` + +Notes: +- The Emergency VoLTE Interoperability Test System is listening on port 443 +- Updating the file etc/AtsXxx/AtsXxx.cfg is about (e.g. etc/AtsBCF/AtsBCF.cfg): +. Selecting the test(s) to be executed +. Updating value of PICs and PIXITs +. Updating HTTP port setting + +## Using development Docker image + +In this configuration, the TITAN compiler, the sources and the outputs are located on the Docker image. + +Pre-requisites on your host machine: +- Install Docker + +Procedure for a Windows host machine: +- On your host machine, open a the Docker Quickstart Terminal +- On your host machine, clone the ETSI EEmergency Communications project. NOTE that only Docker folder and .jenkins.sh script file are required +- From the ETSI Emergency VoLTE Interoperability Tests project root directory, execute the following commands: + +```sh +$ ./.jenkins.sh +... +``` + +NOTE The creation and the installations will take some time to achieve +- Start the container + +```sh +$ ./docker/run-container.sh +... +``` + +- Switch to the next clause (Usage) + + +## Using Vagrant + +Pre-requisites on your host machine: +- Install [Virtualbox](https://www.virtualbox.org/manual/ch01.html) +- Install [Vagrant](https://www.vagrantup.com/intro/getting-started/) +- Install Vagrant plugin vagrant-vbguest +- Credentials to access [ETSI forge](https://forge.etsi.org/gitlab/users/sign_in) + - Set the environment variable USERNAME to your ETSI EOL account user name + - Set the environment variable PASSWORD to your ETSI EOL account password + +Procedure: +- On your host machine, open a command line session (PuTTY, DOS window...) +- From the ETSI Emergency VoLTE Interoperability Tests project, clone the Vagrant folder +- In the file Vagrantfile, modify the tag config.vm.provision replacing & strings by your ETSI credentials +- In the Vagrant folder, execute the following commands: + +```sh +$ vagrant up --provider virtualbox --provision +... +``` + +NOTE The creation and the installations will take some time to achieve +- Stop vagrant virtual machine + +```sh +$ vagrant halt +... +``` + +- Update the file 'Vagrantfile' to match with your networks configuration +- Re-start the vagrant virtual machine and log to to the machine + +```sh +$ vagrant up +... +$ vagrant ssh +``` + +- Switch to the next clause (Usage) + +NOTE The user password is vagrant. + + +## From scratch + +Pre-requisites: +- Install Virtualbox + +Procedure: +- Install a new Linux Virtual machine (Mint, Debian...) +- Update your system with the latest version of kernel and security packages +- Install the following packages (According to the Linux chosen, the package naming can be different) + autoconf + bison + build-essential + cmake + curl + dos2unix + doxygen + emacs + expect + flex + g++:latest + gcc:latest + graphviz + gdb + git-core + gnutls-bin + libglib2.0-dev + libpcap-dev + libgcrypt-dev + libncurses5-dev + libssl-dev + libtool-bin + libtool + libwireshark-dev + libxml2-dev + lsof + ntp + pkg-config + qt5-default + qtmultimedia5-dev + libqt5svg5-dev + subversion + sudo + sshpass + tcpdump + texlive-font-utils + tshark + valgrind + vim + vsftpd + xutils-dev + tree + tzdata + unzip + wget + xsltproc +- In your home directory, create the following folders: + - $HOME/frameworks, + - $HOME/dev + - $HOME/lib + +- In $HOME/frameworks, build the following package: + - Eclipse IDE for C/C++ Developers, according the procedure specified [here](https://www.eclipse.org/cdt/) + - TITAN, according the procedure specified [here](https://github.com/eclipse/titan.core) + - Import the TITAN plugin into your Eclipse IDE, according the procedure specified [here](https://github.com/eclipse/titan.core) + +- Install LibOSIP framework +```sh +$ cd ${HOME}/frameworks +$ git clone https://git.savannah.gnu.org/git/osip.git ./osip +$ cd osip +$ ./autogen.sh +$ ./configure --prefix=/home/etsi +$ make && make install +``` + +- Clone the ETSI Emergency VoLTE Interoperability Tests project into $HOME/dev folder + +```sh +$ git clone --recurse-submodules --branch devel https://forge.etsi.org/rep/int/vxlte/emergency-iop.git +``` + +- Apply patches +```sh +$ cd /home/etsi/dev/emergency-iop/ +$ ./install.sh +``` + +- Update your default environment with the content of the script $HOME/dev/emergency-iop/scripts/devenv.bash.ubuntu + +- Switch to the next clause (Usage) + + +# Generate certificates for TLS and Emergency VoLTE Interoperability security support + +This clause describes how generate certificates desrived from Let's encrypt certificate. These certificate will be used for TS mutual authentication. +NOTE: +- Certficates shall be renewed every 3 months +- The port 80 shall be vailable for standalone validation + +Pre-requisites: +- You need to install python and [certbot](https://manpages.ubuntu.com/manpages/impish/en/man1/certbot.1.html). + +To generate certifcates, execute the following command: + +```sh +$ export REQUESTS_CA_BUNDLE=$(dirname `python -c "import certifi; print(certifi.where())"`) +$ mkdir -p $HOME/var/ssl +$ sudo certbot certonly --debug --emergency-iop-tls-cert --config-dir $HOME/var/ssl --work-dir $HOME/var/ssl --logs-dir $HOME/var/ssl --standalone --agree-tos --email -d -w $HOME/var/ssl/ +``` + +NOTE: For testing certificate generation and renewal, use the certbot's --dry-run option. + + +# Usage + +This clause describes how to compile and execute an Abstract Test Suite. +The procedures below illustrate how to run the CAM test suite. The same procedures will apply for any other ETSI Emergency Communications test suite. + + +Pre-requisites: +- Your machine is installed following one of the installation method describes in the previous clause +- Your are logged as 'etsi' or 'vagrant' user + +Procedure in TITAN command line: +- Open several SSH session (PuTTY...) +- Change to the directory ~/dev/emergency-iop/ +- Build the test suite you want to exectue (e.g. LIS test suite) + +```sh +$ cd ~/dev/emergency-iop/ +$ export ATS=AtsImsIot +$ make +... +``` + +- Edit the file ../etc/AtsImsIot/AtsImsIot.cfg +- Update the following fields: + - system.httpPort.params + - system.SIPP.params + - system.DIAMETER.params + +- To run the test suitem, execute the following command: + +```sh +$ cd ~/dev/emergency-iop/scripts +$ ./run-all.bash +... +``` + +- The log files are located in ../logs/AtsImsIot folder. You can edit them using any editor or using the Eclipse TITAN log plugins + + +# How to Report a Bug + +The ETSI Emergency VoLTE Interoperability Tests project is under constant development, so it is possible that you will +encounter a bug while using it. Please report bugs at cti_support at etsi dot org. diff --git a/ccsrc/EncDec/LibDiameter/LibDiameter_EncDec.cc b/ccsrc/EncDec/LibDiameter/LibDiameter_EncDec.cc new file mode 100644 index 0000000000000000000000000000000000000000..5002bf319b458677eecc1c504030e3508b79cbfd --- /dev/null +++ b/ccsrc/EncDec/LibDiameter/LibDiameter_EncDec.cc @@ -0,0 +1,901 @@ + +#include "LibDiameter_EncdecDeclarations.hh" + +#include "loggers.hh" + +#include "diameter_uar_codec.hh" + +namespace LibDiameter__EncdecDeclarations { + + BITSTRING fx__enc__CER__MSG(const LibDiameter__TypesAndValues::CER__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__CER__MSG(BITSTRING&, LibDiameter__TypesAndValues::CER__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__CEA__MSG(const LibDiameter__TypesAndValues::CEA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__CEA__MSG(BITSTRING&, LibDiameter__TypesAndValues::CEA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__RAR__MSG(const LibDiameter__TypesAndValues::RAR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__RAR__MSG(BITSTRING&, LibDiameter__TypesAndValues::RAR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__RAA__MSG(const LibDiameter__TypesAndValues::RAA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__RAA__MSG(BITSTRING&, LibDiameter__TypesAndValues::RAA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__ACR__MSG(const LibDiameter__TypesAndValues::ACR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__ACR__MSG(BITSTRING&, LibDiameter__TypesAndValues::ACR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__ACA__MSG(const LibDiameter__TypesAndValues::ACA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__ACA__MSG(BITSTRING&, LibDiameter__TypesAndValues::ACA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__ASR__MSG(const LibDiameter__TypesAndValues::ASR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__ASR__MSG(BITSTRING&, LibDiameter__TypesAndValues::ASR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__ASA__MSG(const LibDiameter__TypesAndValues::ASA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__ASA__MSG(BITSTRING&, LibDiameter__TypesAndValues::ASA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__STR__MSG(const LibDiameter__TypesAndValues::STR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__STR__MSG(BITSTRING&, LibDiameter__TypesAndValues::STR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__STA__MSG(const LibDiameter__TypesAndValues::STA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__STA__MSG(BITSTRING&, LibDiameter__TypesAndValues::STA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__DWR__MSG(const LibDiameter__TypesAndValues::DWR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__DWR__MSG(BITSTRING&, LibDiameter__TypesAndValues::DWR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__DWA__MSG(const LibDiameter__TypesAndValues::DWA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__DWA__MSG(BITSTRING&, LibDiameter__TypesAndValues::DWA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__DPR__MSG(const LibDiameter__TypesAndValues::DPR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__DPR__MSG(BITSTRING&, LibDiameter__TypesAndValues::DPR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__DPA__MSG(const LibDiameter__TypesAndValues::DPA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__DPA__MSG(BITSTRING&, LibDiameter__TypesAndValues::DPA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__UAR__MSG(const LibDiameter__TypesAndValues::UAR__MSG& p) { + loggers::get_instance().log_msg(">>> fx__enc__UAR__MSG: ", p); + + float duration; + std::string tag("fx__enc__UAR__MSG"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + diameter_uar_codec codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__UAR__MSG: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__UAR__MSG(BITSTRING& pdu, LibDiameter__TypesAndValues::UAR__MSG& p) { + + OCTETSTRING os = bit2oct(pdu); + diameter_uar_codec codec; + codec.decode(os, p); + + return INTEGER(0); + } + + BITSTRING fx__enc__UAA__MSG(const LibDiameter__TypesAndValues::UAA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__UAR__MSG: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__UAR__MSG"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__UAA__MSG(BITSTRING&, LibDiameter__TypesAndValues::UAA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__SAR__MSG(const LibDiameter__TypesAndValues::SAR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__SAR__MSG(BITSTRING&, LibDiameter__TypesAndValues::SAR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__SAA__MSG(const LibDiameter__TypesAndValues::SAA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__SAA__MSG(BITSTRING&, LibDiameter__TypesAndValues::SAA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__LIR__MSG(const LibDiameter__TypesAndValues::LIR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__LIR__MSG(BITSTRING&, LibDiameter__TypesAndValues::LIR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__LIA__MSG(const LibDiameter__TypesAndValues::LIA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__LIA__MSG(BITSTRING&, LibDiameter__TypesAndValues::LIA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__MAR__MSG(const LibDiameter__TypesAndValues::MAR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__MAR__MSG(BITSTRING&, LibDiameter__TypesAndValues::MAR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__MAA__MSG(const LibDiameter__TypesAndValues::MAA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__MAA__MSG(BITSTRING&, LibDiameter__TypesAndValues::MAA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__RTR__MSG(const LibDiameter__TypesAndValues::RTR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__RTR__MSG(BITSTRING&, LibDiameter__TypesAndValues::RTR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__RTA__MSG(const LibDiameter__TypesAndValues::RTA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__RTA__MSG(BITSTRING&, LibDiameter__TypesAndValues::RTA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PPR__MSG(const LibDiameter__TypesAndValues::PPR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PPR__MSG(BITSTRING&, LibDiameter__TypesAndValues::PPR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PPA__MSG(const LibDiameter__TypesAndValues::PPA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PPA__MSG(BITSTRING&, LibDiameter__TypesAndValues::PPA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__UDR__MSG(const LibDiameter__TypesAndValues::UDR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__UDR__MSG(BITSTRING&, LibDiameter__TypesAndValues::UDR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__UDA__MSG(const LibDiameter__TypesAndValues::UDA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__UDA__MSG(BITSTRING&, LibDiameter__TypesAndValues::UDA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PUR__MSG(const LibDiameter__TypesAndValues::PUR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PUR__MSG(BITSTRING&, LibDiameter__TypesAndValues::PUR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PUA__MSG(const LibDiameter__TypesAndValues::PUA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PUA__MSG(BITSTRING&, LibDiameter__TypesAndValues::PUA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__SNR__MSG(const LibDiameter__TypesAndValues::SNR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__SNR__MSG(BITSTRING&, LibDiameter__TypesAndValues::SNR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__SNA__MSG(const LibDiameter__TypesAndValues::SNA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__SNA__MSG(BITSTRING&, LibDiameter__TypesAndValues::SNA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PNR__MSG(const LibDiameter__TypesAndValues::PNR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PNR__MSG(BITSTRING&, LibDiameter__TypesAndValues::PNR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PNA__MSG(const LibDiameter__TypesAndValues::PNA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PNA__MSG(BITSTRING&, LibDiameter__TypesAndValues::PNA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__CCR__MSG(const LibDiameter__TypesAndValues::CCR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__CCR__MSG(BITSTRING&, LibDiameter__TypesAndValues::CCR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__CCA__MSG(const LibDiameter__TypesAndValues::CCA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__CCA__MSG(BITSTRING&, LibDiameter__TypesAndValues::CCA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__AAR__MSG(const LibDiameter__TypesAndValues::AAR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__AAR__MSG(BITSTRING&, LibDiameter__TypesAndValues::AAR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__AAA__MSG(const LibDiameter__TypesAndValues::AAA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__AAA__MSG(BITSTRING&, LibDiameter__TypesAndValues::AAA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__ULR__MSG(const LibDiameter__TypesAndValues::ULR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__ULR__MSG(BITSTRING&, LibDiameter__TypesAndValues::ULR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__ULA__MSG(const LibDiameter__TypesAndValues::ULA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__ULA__MSG(BITSTRING&, LibDiameter__TypesAndValues::ULA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__AIR__MSG(const LibDiameter__TypesAndValues::AIR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__AIR__MSG(BITSTRING&, LibDiameter__TypesAndValues::AIR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__AIA__MSG(const LibDiameter__TypesAndValues::AIA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__AIA__MSG(BITSTRING&, LibDiameter__TypesAndValues::AIA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__CLR__MSG(const LibDiameter__TypesAndValues::CLR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__CLR__MSG(BITSTRING&, LibDiameter__TypesAndValues::CLR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__CLA__MSG(const LibDiameter__TypesAndValues::CLA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__CLA__MSG(BITSTRING&, LibDiameter__TypesAndValues::CLA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__IDR__MSG(const LibDiameter__TypesAndValues::IDR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__IDR__MSG(BITSTRING&, LibDiameter__TypesAndValues::IDR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__IDA__MSG(const LibDiameter__TypesAndValues::IDA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__IDA__MSG(BITSTRING&, LibDiameter__TypesAndValues::IDA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__DSR__MSG(const LibDiameter__TypesAndValues::DSR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__DSR__MSG(BITSTRING&, LibDiameter__TypesAndValues::DSR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__DSA__MSG(const LibDiameter__TypesAndValues::DSA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__DSA__MSG(BITSTRING&, LibDiameter__TypesAndValues::DSA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__RSR__MSG(const LibDiameter__TypesAndValues::RSR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__RSR__MSG(BITSTRING&, LibDiameter__TypesAndValues::RSR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__RSA__MSG(const LibDiameter__TypesAndValues::RSA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__RSA__MSG(BITSTRING&, LibDiameter__TypesAndValues::RSA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__NOR__MSG(const LibDiameter__TypesAndValues::NOR__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__NOR__MSG(BITSTRING&, LibDiameter__TypesAndValues::NOR__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__NOA__MSG(const LibDiameter__TypesAndValues::NOA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__NOA__MSG(BITSTRING&, LibDiameter__TypesAndValues::NOA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PUER__MSG(const LibDiameter__TypesAndValues::PUER__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PUER__MSG(BITSTRING&, LibDiameter__TypesAndValues::PUER__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__PUEA__MSG(const LibDiameter__TypesAndValues::PUEA__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__PUEA__MSG(BITSTRING&, LibDiameter__TypesAndValues::PUEA__MSG& p) { return INTEGER(0); } + + BITSTRING fx__enc__UNKNOWN__MSG(const LibDiameter__TypesAndValues::UNKNOWN__MSG& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__Request: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__UNKNOWN__MSG(BITSTRING&, LibDiameter__TypesAndValues::UNKNOWN__MSG& p) { return INTEGER(0); } + +} // End of namespace LibDiameter__EncdecDeclarations diff --git a/ccsrc/EncDec/LibDiameter/module.mk b/ccsrc/EncDec/LibDiameter/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..5f362ce7c0eb3b80b1afcaf71eec306df910404a --- /dev/null +++ b/ccsrc/EncDec/LibDiameter/module.mk @@ -0,0 +1,2 @@ +sources := \ + LibDiameter_EncDec.cc diff --git a/ccsrc/EncDec/LibEmtel/LibNg112_EncDec.cc b/ccsrc/EncDec/LibEmtel/LibNg112_EncDec.cc new file mode 100644 index 0000000000000000000000000000000000000000..b13692a172270bb06e2aa90ffb8ca117ea1aa71d --- /dev/null +++ b/ccsrc/EncDec/LibEmtel/LibNg112_EncDec.cc @@ -0,0 +1,130 @@ +#include "LibNg112_EncdecDeclarations.hh" + +#include "json_codec.hh" + +#include "loggers.hh" + +namespace LibNg112__EncdecDeclarations { // TODO File to be removed + +/* BITSTRING enc__DequeueRegistrationRequest(const LibNg112__DequeueRegistration::DequeueRegistrationRequest& p) { + loggers::get_instance().log_msg(">>> enc__DequeueRegistrationRequest: ", (const Base_Type&)p); + + OCTETSTRING os; + json_codec codec; + codec.encode(p, os); + + return oct2bit(os); + } + + INTEGER dec__DequeueRegistrationRequest(BITSTRING& pdu, LibNg112__DequeueRegistration::DequeueRegistrationRequest& p) { + loggers::get_instance().log_msg(">>> dec__DequeueRegistrationRequest: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + json_codec codec; + codec.decode(os, p); + + return 0; + } + + BITSTRING enc__DequeueRegistrationResponse(const LibNg112__DequeueRegistration::DequeueRegistrationResponse& p) { + loggers::get_instance().log_msg(">>> enc__DequeueRegistrationResponse: ", (const Base_Type&)p); + + OCTETSTRING os; + json_codec codec; + codec.encode(p, os); + + return oct2bit(os); + } + + INTEGER dec__DequeueRegistrationResponse(BITSTRING& pdu, LibNg112__DequeueRegistration::DequeueRegistrationResponse& p) { + loggers::get_instance().log_msg(">>> dec__DequeueRegistrationResponse: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + json_codec codec; + codec.decode(os, p); + + return 0; + } + + BITSTRING enc__ServiceStatePayload(const LibNg112__SubscriptionPayloads::ServiceStatePayload& p) { + loggers::get_instance().log_msg(">>> enc__ServiceStatePayload: ", (const Base_Type&)p); + + OCTETSTRING os; + json_codec codec; + codec.encode(p, os); + + return oct2bit(os); + } + + INTEGER dec__ServiceStatePayload(BITSTRING& pdu, LibNg112__SubscriptionPayloads::ServiceStatePayload& p) { + loggers::get_instance().log_msg(">>> dec__ServiceStatePayload: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + json_codec codec; + codec.decode(os, p); + + return 0; + } + + BITSTRING enc__ElementStatePayload(const LibNg112__SubscriptionPayloads::ElementStatePayload& p) { + loggers::get_instance().log_msg(">>> enc__ElementStatePayload: ", (const Base_Type&)p); + + OCTETSTRING os; + json_codec codec; + codec.encode(p, os); + + return oct2bit(os); + } + + INTEGER dec__ElementStatePayload(BITSTRING& pdu, LibNg112__SubscriptionPayloads::ElementStatePayload& p) { + loggers::get_instance().log_msg(">>> dec__ElementStatePayload: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + json_codec codec; + codec.decode(os, p); + + return 0; + } + + BITSTRING enc__SecurityPosturePayload(const LibNg112__SubscriptionPayloads::SecurityPosturePayload& p) { + loggers::get_instance().log_msg(">>> enc__SecurityPosturePayload: ", (const Base_Type&)p); + + OCTETSTRING os; + json_codec codec; + codec.encode(p, os); + + return oct2bit(os); + } + + INTEGER dec__SecurityPosturePayload(BITSTRING& pdu, LibNg112__SubscriptionPayloads::SecurityPosturePayload& p) { + loggers::get_instance().log_msg(">>> dec__QueueStdec__SecurityPosturePayloadtePayload: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + json_codec codec; + codec.decode(os, p); + + return 0; + } + + BITSTRING enc__QueueStatePayload(const LibNg112__SubscriptionPayloads::QueueStatePayload& p) { + loggers::get_instance().log_msg(">>> enc__QueueStatePayload: ", (const Base_Type&)p); + + OCTETSTRING os; + json_codec codec; + codec.encode(p, os); + + return oct2bit(os); + } + + INTEGER dec__QueueStatePayload(BITSTRING& pdu, LibNg112__SubscriptionPayloads::QueueStatePayload& p) { + loggers::get_instance().log_msg(">>> dec__QueueStatePayload: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + json_codec codec; + codec.decode(os, p); + + return 0; + } +*/ +} // End of namespace LibNg112__EncdecDeclarations + diff --git a/ccsrc/EncDec/LibEmtel/module.mk b/ccsrc/EncDec/LibEmtel/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..43f2b71da14e30dd5787c7c62c3ec752d93fe363 --- /dev/null +++ b/ccsrc/EncDec/LibEmtel/module.mk @@ -0,0 +1 @@ +sources := LibNg112_EncDec.cc diff --git a/ccsrc/EncDec/LibMsrp/LibMsrp_EncDec.cc b/ccsrc/EncDec/LibMsrp/LibMsrp_EncDec.cc new file mode 100644 index 0000000000000000000000000000000000000000..9786ab576e1a90b523246a89ee416c1320b5983f --- /dev/null +++ b/ccsrc/EncDec/LibMsrp/LibMsrp_EncDec.cc @@ -0,0 +1,24 @@ + +#include "LibMsrp_EncDecDeclarations.hh" + +#include "loggers.hh" + +namespace LibMsrp__EncDecDeclarations { + + BITSTRING fx__enc__MsrpURI(const LibMsrp__TypesAndValues::MsrpURI& p) { + loggers::get_instance().log_msg(">>> BITSTRING fx__enc__MsrpURI: ", p); + + float duration; + std::string tag(" BITSTRING fx__enc__MsrpURI"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + // TODO + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__MsrpURI(BITSTRING&, LibMsrp__TypesAndValues::MsrpURI& p) { return INTEGER(0); } + +} // End of module LibMsrp__EncDecDeclarations \ No newline at end of file diff --git a/ccsrc/EncDec/LibMsrp/module.mk b/ccsrc/EncDec/LibMsrp/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..52b99146a8c68753ac06d93428acde77e2373942 --- /dev/null +++ b/ccsrc/EncDec/LibMsrp/module.mk @@ -0,0 +1,2 @@ +sources := \ + LibMsrp_EncDec.cc diff --git a/ccsrc/EncDec/LibSip/LibSip_Encdec.cc b/ccsrc/EncDec/LibSip/LibSip_Encdec.cc new file mode 100644 index 0000000000000000000000000000000000000000..add0174651c9c2875983a50eaef8a6fc7a730cbe --- /dev/null +++ b/ccsrc/EncDec/LibSip/LibSip_Encdec.cc @@ -0,0 +1,372 @@ + +#include "LibSip_EncdecDeclarations.hh" +#include "LibSip_XMLTypes.hh" + +#include "sip_codec_register_request.hh" +#include "sip_codec_invite_request.hh" +#include "sip_codec_options_request.hh" +#include "sip_codec_bye_request.hh" +#include "sip_codec_ack_request.hh" +#include "sip_codec_subscribe_request.hh" +#include "sip_codec_notify_request.hh" +#include "sip_codec_info_request.hh" +#include "sip_codec_message_request.hh" +#include "sip_codec_message_body.hh" +#include "sip_codec_response.hh" + +#include "loggers.hh" + +namespace LibSip__EncdecDeclarations { + + BITSTRING fx__enc__Request(const LibSip__SIPTypesAndValues::Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__Request: ", p); + + float duration; + std::string tag("fx__enc__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__Request -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__REGISTER__Request(const LibSip__SIPTypesAndValues::REGISTER__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__REGISTER__Request: ", p); + + float duration; + std::string tag("fx__enc__REGISTER__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_register_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__REGISTER__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__INVITE__Request(const LibSip__SIPTypesAndValues::INVITE__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__INVITE__Request: ", p); + + float duration; + std::string tag("fx__enc__INVITE__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_invite_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__INVITE__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__OPTIONS__Request(const LibSip__SIPTypesAndValues::OPTIONS__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__OPTIONS__Request: ", p); + + float duration; + std::string tag("fx__enc__OPTIONS__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_options_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__OPTIONS__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__BYE__Request(const LibSip__SIPTypesAndValues::BYE__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__BYE__Request: ", p); + + float duration; + std::string tag("fx__enc__BYE__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_bye_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__BYE__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__ACK__Request(const LibSip__SIPTypesAndValues::ACK__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__ACK__Request: ", p); + + float duration; + std::string tag("fx__enc__ACK__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_ack_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__ACK__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__CANCEL__Request(const LibSip__SIPTypesAndValues::CANCEL__Request& p) { return BITSTRING(); } + BITSTRING fx__enc__PRACK__Request(const LibSip__SIPTypesAndValues::PRACK__Request& p) { return BITSTRING(); } + BITSTRING fx__enc__NOTIFY__Request(const LibSip__SIPTypesAndValues::NOTIFY__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__NOTIFY__Request: ", p); + + float duration; + std::string tag("fx__enc__NOTIFY__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_notify_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__NOTIFY__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__SUBSCRIBE__Request(const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__SUBSCRIBE__Request: ", p); + + float duration; + std::string tag("fx__enc__SUBSCRIBE__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_subscribe_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__SUBSCRIBE__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__MESSAGE__Request(const LibSip__SIPTypesAndValues::MESSAGE__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__MESSAGE__Request: ", p); + + float duration; + std::string tag("fx__enc__MESSAGE__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_message_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__MESSAGE__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__PUBLISH__Request(const LibSip__SIPTypesAndValues::PUBLISH__Request& p) { return BITSTRING(); } + BITSTRING fx__enc__UPDATE__Request(const LibSip__SIPTypesAndValues::UPDATE__Request& p) { return BITSTRING(); } + BITSTRING fx__enc__REFER__Request(const LibSip__SIPTypesAndValues::REFER__Request& p) { return BITSTRING(); } + BITSTRING fx__enc__INFO__Request(const LibSip__SIPTypesAndValues::INFO__Request& p) { + loggers::get_instance().log_msg(">>> fx__enc__INFO__Request: ", p); + + float duration; + std::string tag("fx__enc__INFO__Request"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_info_request codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__INFO__Request: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + + BITSTRING fx__enc__Response(const LibSip__SIPTypesAndValues::Response& p) { + loggers::get_instance().log_msg(">>> fx__enc__Response: ", p); + + float duration; + std::string tag("fx__enc__Response"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_response codec; + if (codec.encode(p, os) == -1) { + loggers::get_instance().warning("fx__enc__Response: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + BITSTRING fx__enc__Raw(const CHARSTRING& p) { return BITSTRING(); } + BITSTRING fx__enc__SMS(const LibSip__SimpleMsgSummaryTypes::SimpleMsgSummary& pdu) { return BITSTRING(); } + + BITSTRING fx__enc__MessageBody(const LibSip__MessageBodyTypes::MessageBody& pdu) { + loggers::get_instance().log_msg(">>> fx__enc__MessageBody: ", pdu); + + float duration; + std::string tag("fx__enc__MessageBody"); + loggers::get_instance().set_start_time(tag); + + OCTETSTRING os; + sip_codec_message_body codec; + if (codec.encode(pdu, os) == -1) { + loggers::get_instance().warning("fx__enc__MessageBody: -1 result code was returned"); + return int2bit(0, 1); + } + loggers::get_instance().set_stop_time(tag, duration); + + return oct2bit(os); + } + + INTEGER fx__dec__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__REGISTER__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::REGISTER__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__REGISTER__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_register_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__INVITE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::INVITE__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__INVITE__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_invite_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__OPTIONS__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::OPTIONS__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__OPTIONS__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_options_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__BYE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::BYE__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__BYE__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_bye_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__ACK__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::ACK__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__ACK__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_ack_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__CANCEL__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::CANCEL__Request& p) { return INTEGER(0); } + INTEGER fx__dec__PRACK__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::PRACK__Request& p) { return INTEGER(0); } + INTEGER fx__dec__NOTIFY__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::NOTIFY__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__NOTIFY__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_notify_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__SUBSCRIBE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::SUBSCRIBE__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__SUBSCRIBE__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_subscribe_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__MESSAGE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::MESSAGE__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__MESSAGE__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_message_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__PUBLISH__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::PUBLISH__Request& p) { return INTEGER(0); } + INTEGER fx__dec__UPDATE__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::UPDATE__Request& p) { return INTEGER(0); } + INTEGER fx__dec__REFER__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::REFER__Request& p) { return INTEGER(0); } + INTEGER fx__dec__INFO__Request(BITSTRING& pdu, LibSip__SIPTypesAndValues::INFO__Request& p) { + loggers::get_instance().log_msg(">>> fx__dec__INFO__Request: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_info_request codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__Response(BITSTRING& pdu, LibSip__SIPTypesAndValues::Response& p) { + loggers::get_instance().log_msg(">>> fx__dec__Response: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_response codec; + codec.decode(os, p); + + return 0; + } + + INTEGER fx__dec__SMS(BITSTRING& pdu, LibSip__SimpleMsgSummaryTypes::SimpleMsgSummary& p) { return INTEGER(0); } + + INTEGER fx__dec__MessageBody(BITSTRING& pdu, LibSip__MessageBodyTypes::MessageBody& p) { + loggers::get_instance().log_msg(">>> fx__dec__MessageBody: ", pdu); + + OCTETSTRING os = bit2oct(pdu); + sip_codec_message_body codec; + codec.decode(os, p); + + return 0; + } +} // End of namespace LibSip__EncdecDeclarations diff --git a/ccsrc/EncDec/LibSip/LibSip_SMSFunctions_Encdec.cc b/ccsrc/EncDec/LibSip/LibSip_SMSFunctions_Encdec.cc new file mode 100644 index 0000000000000000000000000000000000000000..65e0af8cc95a391b028b21fe17c22ce0087fe2d6 --- /dev/null +++ b/ccsrc/EncDec/LibSip/LibSip_SMSFunctions_Encdec.cc @@ -0,0 +1,9 @@ +#include "LibSip_SMSFunctions.hh" + +#include "loggers.hh" + +namespace LibSip__SMSFunctions { + + HEXSTRING fx__GetSC__TimeStamp(const INTEGER& p__TimeZone) { return int2hex(0, 14); }; + +} // End of namespace LibSip__SMSFunctions diff --git a/ccsrc/EncDec/LibSip/LibSip_Steps_Encdec.cc b/ccsrc/EncDec/LibSip/LibSip_Steps_Encdec.cc new file mode 100644 index 0000000000000000000000000000000000000000..35a297030547f04b8b6018af78340957a0351077 --- /dev/null +++ b/ccsrc/EncDec/LibSip/LibSip_Steps_Encdec.cc @@ -0,0 +1,109 @@ +#include +#include +#include + +#include + +#include "LibSip_Steps.hh" + +#include "loggers.hh" + +#include "converter.hh" + +namespace LibSip__Steps { + + int calculate_md5(const std::string& p_data, std::string& p_md5) + { + loggers::get_instance().log(">>> calculate_md5: %s", p_data.c_str()); + + MD5_CTX md5_context; + ::MD5_Init(&md5_context); + + loggers::get_instance().log("calculate_md5: length=%d", p_data.length()); + ::MD5_Update(&md5_context, p_data.c_str(), p_data.length()); // TODO Add support of block size > 512 + + const size_t digestlen = 16; + unsigned char digest[digestlen]; + ::MD5_Final(digest, &md5_context); + p_md5 = converter::get_instance().bytes_to_hexa(std::vector(digest, digest + digestlen)); + + loggers::get_instance().log("<<< calculate_md5: %s", p_md5.c_str()); + return 0; + } + + CHARSTRING fx__rndStr() { + static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + static int length = 10; + char s[length] = { 0 }; + for (int i = 0; i < length - 1; ++i) { + s[i] = alphanum[rand() % (sizeof(alphanum) - 1)]; + } // End of 'for' statement + return CHARSTRING(s); + }; + + CHARSTRING fx__putInLowercase(const CHARSTRING& p__string) { + std::string s(static_cast(p__string)); + std::transform(s.begin(), s.end(), s.begin(), ::tolower); + return CHARSTRING(s.c_str()); + }; + + CHARSTRING fx__getIpAddr(const CHARSTRING& p__host__name) { return CHARSTRING(""); }; + + CHARSTRING fx__calculateDigestResponse(const CHARSTRING& p__nonce, const CHARSTRING& p__cnonce, const CHARSTRING& p__user, const CHARSTRING& p__realm, const CHARSTRING& p__passwd, const CHARSTRING& p__alg, const CHARSTRING& p__nonceCount, const CHARSTRING& p__method, const CHARSTRING& p__qop, const CHARSTRING& p__URI, const CHARSTRING& p__HEntity) { + loggers::get_instance().log(">>> fx__calculateDigestResponse"); + + // Buid a1=USERNAME:REALM:PASSWORD + std::string a1(static_cast(p__user)); + a1 += ":"; + a1 += static_cast(p__realm); + a1 += ":"; + a1 += static_cast(p__passwd); + if (a1.find("\"") != std::string::npos) { + a1 = std::regex_replace(a1, std::regex("\""), ""); + } + loggers::get_instance().log("fx__calculateDigestResponse: a1='%s'", a1.c_str()); + std::string md5_a1; + calculate_md5(a1, md5_a1); + + // Buid a2=METHOD:DIGESTURI + std::string a2(static_cast(p__method)); + a2 += ":"; + a2 += static_cast(p__URI); + if (a2.find("\"") != std::string::npos) { + a2 = std::regex_replace(a2, std::regex("\""), ""); // TODO Move to converter + } + loggers::get_instance().log("fx__calculateDigestResponse: a2='%s'", a2.c_str()); + std::string md5_a2; + calculate_md5(a2, md5_a2); + + // Buid resp=HA1:NONCE:HA2 + std::string resp(md5_a1); + resp += ":"; + resp += static_cast(p__nonce); + resp += ":"; + resp += md5_a2; + loggers::get_instance().log("fx__calculateDigestResponse: resp='%s'", resp.c_str()); + std::string md5_resp; + calculate_md5(resp, md5_resp); + + // Convert into Base64 + std::vector u = converter::get_instance().string_to_bytes(md5_resp); + md5_resp = converter::get_instance().bytes_to_string(converter::get_instance().buffer_to_base64(u)); + + loggers::get_instance().log("<<< fx__calculateDigestResponse: '%s'", md5_resp.c_str()); + return CHARSTRING(md5_resp.c_str()); + }; + + CHARSTRING fx__encodeBase64(const CHARSTRING& p__value) { + std::vector s(static_cast(p__value), static_cast(p__value) + p__value.lengthof()); + std::vector o = converter::get_instance().buffer_to_base64(s); + return CHARSTRING(o.size(), (const char*)o.data()); + }; + + CHARSTRING fx__decodeBase64(const CHARSTRING& p__value) { + std::vector s(static_cast(p__value), static_cast(p__value) + p__value.lengthof()); + std::vector o = converter::get_instance().base64_to_buffer(s); + return CHARSTRING(o.size(), (const char*)o.data()); + }; + +} // End of namespace LibSip__Steps diff --git a/ccsrc/EncDec/LibSip/LibSip_Templates_Encdec.cc b/ccsrc/EncDec/LibSip/LibSip_Templates_Encdec.cc new file mode 100644 index 0000000000000000000000000000000000000000..2c68f22cdfaecf05680cf3ebfc960365d5daa729 --- /dev/null +++ b/ccsrc/EncDec/LibSip/LibSip_Templates_Encdec.cc @@ -0,0 +1,9 @@ +#include "LibSip_Templates.hh" + +#include "loggers.hh" + +namespace LibSip__Templates { + + INTEGER fx__calculateXMLBodyLen(const LibSip__XMLTypes::XmlBody& p__mb) { return INTEGER(0); }; + +} // End of namespace LibSip__Templates diff --git a/ccsrc/EncDec/LibSip/module.mk b/ccsrc/EncDec/LibSip/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..86e171030bc6242e576f593006e3c11ab9792dc2 --- /dev/null +++ b/ccsrc/EncDec/LibSip/module.mk @@ -0,0 +1,5 @@ +sources := \ + LibSip_Encdec.cc \ + LibSip_SMSFunctions_Encdec.cc \ + LibSip_Steps_Encdec.cc \ + LibSip_Templates_Encdec.cc diff --git a/ccsrc/Ports/Data/DataPort.cc b/ccsrc/Ports/Data/DataPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..9a26e574626c28095212fa2bae9feeaafdea1eb3 --- /dev/null +++ b/ccsrc/Ports/Data/DataPort.cc @@ -0,0 +1,73 @@ +#include "DataPort.hh" +#include "loggers.hh" + +namespace AtsImsIot__TestSystem { + + DataPort::DataPort(const char *par_port_name): DataPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("DataPort::outgoing_send") { + // Nothing to do + } // End of constructor + + DataPort::~DataPort() { + loggers::get_instance().log(">>> DataPort::~DataPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void DataPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("DataPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void DataPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void DataPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void DataPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void DataPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void DataPort::Handle_Timeout(double time_since_last_call) {}*/ + + void DataPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> DataPort::user_map: %s", system_port); + } // End of user_map method + + void DataPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> DataPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void DataPort::user_start() + { + loggers::get_instance().log(">>> DataPort::user_start"); + + } // End of user_start method + + void DataPort::user_stop() + { + loggers::get_instance().log(">>> DataPort::user_stop"); + + } // End of user_stop method + +} + diff --git a/ccsrc/Ports/Data/DataPort.hh b/ccsrc/Ports/Data/DataPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..c9809b1c769863d218e5c1a36334070d36a27983 --- /dev/null +++ b/ccsrc/Ports/Data/DataPort.hh @@ -0,0 +1,45 @@ +#pragma once + +#include "AtsImsIot_TestSystem.hh" + +#include "layer.hh" +#include "params.hh" + +namespace AtsImsIot__TestSystem { + + class DataPort : public DataPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + DataPort(const char *par_port_name); + ~DataPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibSip__SIPTypesAndValues::Request& p_ind, const params& p_params) {}; + void receiveMsg (const LibSip__SIPTypesAndValues::Response& p_ind, const params& p_params) {}; + void receiveMsg (const LibMsrp__TypesAndValues::SEND__request& p_ind, const params& p_params) {}; + void receiveMsg (const LibMsrp__TypesAndValues::RECEIVE__response& p_ind, const params& p_params) {}; + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + }; // End of class DataPort + +} + diff --git a/ccsrc/Ports/Data/module.mk b/ccsrc/Ports/Data/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..b6ee7999e241806b19cd28233c0233bf0d5f6e27 --- /dev/null +++ b/ccsrc/Ports/Data/module.mk @@ -0,0 +1,3 @@ +sources := DataPort.cc +includes := . + diff --git a/ccsrc/Ports/ImsMonitorDiameterPort/ImsMonitorDiameterPort.cc b/ccsrc/Ports/ImsMonitorDiameterPort/ImsMonitorDiameterPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..50c6f354a5a13475dc2835b91842bd7a9beee7f3 --- /dev/null +++ b/ccsrc/Ports/ImsMonitorDiameterPort/ImsMonitorDiameterPort.cc @@ -0,0 +1,102 @@ +#include "ImsMonitorDiameterPort.hh" +#include "diameter_layer_factory.hh" +#include "loggers.hh" + +namespace AtsImsIot__TestSystem { + + ImsMonitorDiameterPort::ImsMonitorDiameterPort(const char *par_port_name): ImsMonitorDiameterPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("ImsMonitorDiameterPort::outgoing_send") { + // Nothing to do + } // End of constructor + + ImsMonitorDiameterPort::~ImsMonitorDiameterPort() { + loggers::get_instance().log(">>> ImsMonitorDiameterPort::~ImsMonitorDiameterPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void ImsMonitorDiameterPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("ImsMonitorDiameterPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void ImsMonitorDiameterPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void ImsMonitorDiameterPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void ImsMonitorDiameterPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void ImsMonitorDiameterPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void ImsMonitorDiameterPort::Handle_Timeout(double time_since_last_call) {}*/ + + void ImsMonitorDiameterPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> ImsMonitorDiameterPort::user_map: %s", system_port); + // Build layer stack + /*params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("ImsMonitorDiameterPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("ImsMonitorDiameterPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else {*/ + loggers::get_instance().error("ImsMonitorDiameterPort::user_map: No layers defined in configuration file"); + /*}*/ + } // End of user_map method + + void ImsMonitorDiameterPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> ImsMonitorDiameterPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void ImsMonitorDiameterPort::user_start() + { + loggers::get_instance().log(">>> ImsMonitorDiameterPort::user_start"); + + } // End of user_start method + + void ImsMonitorDiameterPort::user_stop() + { + loggers::get_instance().log(">>> ImsMonitorDiameterPort::user_stop"); + + } // End of user_stop method + + void ImsMonitorDiameterPort::receiveMsg (const LibDiameter__TypesAndValues::DIAMETER__MSG& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> ImsMonitorDiameterPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + + } // End of method receiveMsg + +} + diff --git a/ccsrc/Ports/ImsMonitorDiameterPort/ImsMonitorDiameterPort.hh b/ccsrc/Ports/ImsMonitorDiameterPort/ImsMonitorDiameterPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..78759ee35a42d1c5350f8c82ee5253a9892a497e --- /dev/null +++ b/ccsrc/Ports/ImsMonitorDiameterPort/ImsMonitorDiameterPort.hh @@ -0,0 +1,41 @@ +#pragma once + +#include "AtsImsIot_TestSystem.hh" +#include "LibDiameter_TypesAndValues.hh" + +#include "layer.hh" +#include "params.hh" + +namespace AtsImsIot__TestSystem { + + class ImsMonitorDiameterPort : public ImsMonitorDiameterPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + ImsMonitorDiameterPort(const char *par_port_name); + ~ImsMonitorDiameterPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibDiameter__TypesAndValues::DIAMETER__MSG& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + }; // End of class ImsMonitorDiameterPort + +} + diff --git a/ccsrc/Ports/ImsMonitorDiameterPort/module.mk b/ccsrc/Ports/ImsMonitorDiameterPort/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..c189618dce3dfc60855e7ee6e269bc9c25235fb0 --- /dev/null +++ b/ccsrc/Ports/ImsMonitorDiameterPort/module.mk @@ -0,0 +1,3 @@ +sources := ImsMonitorDiameterPort.cc +includes := . + diff --git a/ccsrc/Ports/ImsMonitorSipPort/ImsMonitorSipPort.cc b/ccsrc/Ports/ImsMonitorSipPort/ImsMonitorSipPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..7776a1ef2451f4fbbbcb1a1cdcfc8348a6760597 --- /dev/null +++ b/ccsrc/Ports/ImsMonitorSipPort/ImsMonitorSipPort.cc @@ -0,0 +1,134 @@ +#include "ImsMonitorSipPort.hh" +#include "sip_layer_factory.hh" +#include "loggers.hh" + +namespace AtsImsIot__TestSystem { + + ImsMonitorSipPort::ImsMonitorSipPort(const char *par_port_name): ImsMonitorSipPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("ImsMonitorSipPort::outgoing_send") { + // Nothing to do + } // End of constructor + + ImsMonitorSipPort::~ImsMonitorSipPort() { + loggers::get_instance().log(">>> ImsMonitorSipPort::~ImsMonitorSipPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void ImsMonitorSipPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("ImsMonitorSipPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void ImsMonitorSipPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void ImsMonitorSipPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void ImsMonitorSipPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void ImsMonitorSipPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void ImsMonitorSipPort::Handle_Timeout(double time_since_last_call) {}*/ + + void ImsMonitorSipPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> ImsMonitorSipPort::user_map: %s", system_port); + // Build layer stack + /*params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("ImsMonitorSipPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("ImsMonitorSipPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else {*/ + loggers::get_instance().error("ImsMonitorSipPort::user_map: No layers defined in configuration file"); + /*}*/ + } // End of user_map method + + void ImsMonitorSipPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> ImsMonitorSipPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void ImsMonitorSipPort::user_start() + { + loggers::get_instance().log(">>> ImsMonitorSipPort::user_start"); + + } // End of user_start method + + void ImsMonitorSipPort::user_stop() + { + loggers::get_instance().log(">>> ImsMonitorSipPort::user_stop"); + + } // End of user_stop method + + void ImsMonitorSipPort::receiveMsg (const LibSip__SIPTypesAndValues::Request& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> ImsMonitorSipPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + } // End of method receiveMsg + + void ImsMonitorSipPort::receiveMsg (const LibSip__SIPTypesAndValues::Response& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> ImsMonitorSipPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + } // End of method receiveMsg + + void ImsMonitorSipPort::receiveMsg (const LibMsrp__TypesAndValues::SEND__request& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> ImsMonitorSipPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + } // End of method receiveMsg + + void ImsMonitorSipPort::receiveMsg (const LibMsrp__TypesAndValues::RECEIVE__response& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> ImsMonitorSipPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + } // End of method receiveMsg + +} + diff --git a/ccsrc/Ports/ImsMonitorSipPort/ImsMonitorSipPort.hh b/ccsrc/Ports/ImsMonitorSipPort/ImsMonitorSipPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..93f6d574344ca7ddb40486147414c05b0a5a767f --- /dev/null +++ b/ccsrc/Ports/ImsMonitorSipPort/ImsMonitorSipPort.hh @@ -0,0 +1,50 @@ +#pragma once + +#include "AtsImsIot_TestSystem.hh" +#include "LibSip_Interface.hh" +#include "LibMsrp_TypesAndValues.hh" + +#include "layer.hh" +#include "params.hh" + +namespace LibSip__SIPTypesAndValues { + class REGISTER__Request; +} + +namespace AtsImsIot__TestSystem { + + class ImsMonitorSipPort : public ImsMonitorSipPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + ImsMonitorSipPort(const char *par_port_name); + ~ImsMonitorSipPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibSip__SIPTypesAndValues::Request& p_ind, const params& p_params); + void receiveMsg (const LibSip__SIPTypesAndValues::Response& p_ind, const params& p_params); + void receiveMsg (const LibMsrp__TypesAndValues::SEND__request& p_ind, const params& p_params); + void receiveMsg (const LibMsrp__TypesAndValues::RECEIVE__response& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + }; // End of class ImsMonitorSipPort + +} + diff --git a/ccsrc/Ports/ImsMonitorSipPort/module.mk b/ccsrc/Ports/ImsMonitorSipPort/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..e65eb1e35331f3c34bc9aca925c3fcc4e2966b0c --- /dev/null +++ b/ccsrc/Ports/ImsMonitorSipPort/module.mk @@ -0,0 +1,3 @@ +sources := ImsMonitorSipPort.cc +includes := . + diff --git a/ccsrc/Ports/LibDiameter/DiameterPort.cc b/ccsrc/Ports/LibDiameter/DiameterPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..7900fb417ada69a3a1f89c04ffdf3af971b1af81 --- /dev/null +++ b/ccsrc/Ports/LibDiameter/DiameterPort.cc @@ -0,0 +1,113 @@ +#include "DiameterPort.hh" +#include "diameter_layer_factory.hh" +#include "loggers.hh" + +namespace LibDiameter__Interface { + + DiameterPort::DiameterPort(const char *par_port_name): DiameterPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("DiameterPort::outgoing_send") { + // Nothing to do + } // End of constructor + + DiameterPort::~DiameterPort() { + loggers::get_instance().log(">>> DiameterPort::~DiameterPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void DiameterPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("DiameterPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void DiameterPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void DiameterPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void DiameterPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void DiameterPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void DiameterPort::Handle_Timeout(double time_since_last_call) {}*/ + + void DiameterPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> DiameterPort::user_map: %s", system_port); + // Build layer stack + params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("DiameterPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("DiameterPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else { + loggers::get_instance().error("DiameterPort::user_map: No layers defined in configuration file"); + } + } // End of user_map method + + void DiameterPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> DiameterPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void DiameterPort::user_start() + { + loggers::get_instance().log(">>> DiameterPort::user_start"); + + } // End of user_start method + + void DiameterPort::user_stop() + { + loggers::get_instance().log(">>> DiameterPort::user_stop"); + + } // End of user_stop method + + void DiameterPort::receiveMsg (const LibDiameter__TypesAndValues::DIAMETER__MSG& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> DiameterPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + + } // End of method receiveMsg + + void DiameterPort::outgoing_send(const LibDiameter__TypesAndValues::DIAMETER__MSG& send_par) + { + loggers::get_instance().log_msg(">>> DiameterPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } // End of outgoing_send + +} + diff --git a/ccsrc/Ports/LibDiameter/DiameterPort.hh b/ccsrc/Ports/LibDiameter/DiameterPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..523b9d949c9fb58176af727ffb040f4572822fd8 --- /dev/null +++ b/ccsrc/Ports/LibDiameter/DiameterPort.hh @@ -0,0 +1,43 @@ +#pragma once + +#include "LibDiameter_Interface.hh" + +#include "layer.hh" +#include "params.hh" + +namespace LibDiameter__Interface { + + class DiameterPort : public DiameterPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + DiameterPort(const char *par_port_name); + ~DiameterPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibDiameter__TypesAndValues::DIAMETER__MSG& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + virtual void outgoing_send(const LibDiameter__TypesAndValues::DIAMETER__MSG& send_par); + }; // End of class DiameterPort + +} + diff --git a/ccsrc/Ports/LibDiameter/LowerLayerPPort.cc b/ccsrc/Ports/LibDiameter/LowerLayerPPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..8978f6daa70e8467c4395598d7ef88881a72b850 --- /dev/null +++ b/ccsrc/Ports/LibDiameter/LowerLayerPPort.cc @@ -0,0 +1,113 @@ +#include "LowerLayerPPort.hh" +#include "lower_layer_pport_layer_factory.hh" +#include "loggers.hh" + +namespace LibDiameter__Interface { + + LowerLayerPPort::LowerLayerPPort(const char *par_port_name): LowerLayerPPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("LowerLayerPPort::outgoing_send") { + // Nothing to do + } // End of constructor + + LowerLayerPPort::~LowerLayerPPort() { + loggers::get_instance().log(">>> LowerLayerPPort::~LowerLayerPPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void LowerLayerPPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("LowerLayerPPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void LowerLayerPPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void LowerLayerPPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void LowerLayerPPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void LowerLayerPPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void LowerLayerPPort::Handle_Timeout(double time_since_last_call) {}*/ + + void LowerLayerPPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> LowerLayerPPort::user_map: %s", system_port); + // Build layer stack + params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("LowerLayerPPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("LowerLayerPPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else { + loggers::get_instance().error("LowerLayerPPort::user_map: No layers defined in configuration file"); + } + } // End of user_map method + + void LowerLayerPPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> LowerLayerPPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void LowerLayerPPort::user_start() + { + loggers::get_instance().log(">>> LowerLayerPPort::user_start"); + + } // End of user_start method + + void LowerLayerPPort::user_stop() + { + loggers::get_instance().log(">>> LowerLayerPPort::user_stop"); + + } // End of user_stop method + + void LowerLayerPPort::receiveMsg (const LibDiameter__TypesAndValues::Lower__Layer__Primitive& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> LowerLayerPPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + + } // End of method receiveMsg + + void LowerLayerPPort::outgoing_send(const LibDiameter__TypesAndValues::Lower__Layer__Primitive& send_par) + { + loggers::get_instance().log_msg(">>> LowerLayerPPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } // End of outgoing_send + +} + diff --git a/ccsrc/Ports/LibDiameter/LowerLayerPPort.hh b/ccsrc/Ports/LibDiameter/LowerLayerPPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..4f517f515a21e96b654a8cc6583243e2517960c2 --- /dev/null +++ b/ccsrc/Ports/LibDiameter/LowerLayerPPort.hh @@ -0,0 +1,43 @@ +#pragma once + +#include "LibDiameter_Interface.hh" + +#include "layer.hh" +#include "params.hh" + +namespace LibDiameter__Interface { + + class LowerLayerPPort : public LowerLayerPPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + LowerLayerPPort(const char *par_port_name); + ~LowerLayerPPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibDiameter__TypesAndValues::Lower__Layer__Primitive& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + virtual void outgoing_send(const LibDiameter__TypesAndValues::Lower__Layer__Primitive& send_par); + }; // End of class LowerLayerPPort + +} + diff --git a/ccsrc/Ports/LibDiameter/module.mk b/ccsrc/Ports/LibDiameter/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..3d9debd99e219570ebc2a99aa5f4509cd807aaa0 --- /dev/null +++ b/ccsrc/Ports/LibDiameter/module.mk @@ -0,0 +1,3 @@ +sources := DiameterPort.cc LowerLayerPPort.cc +includes := . + diff --git a/ccsrc/Ports/LibHttp/HttpPort.cc b/ccsrc/Ports/LibHttp/HttpPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..30b524f94c26e02a0743a3d86b26df57425e565a --- /dev/null +++ b/ccsrc/Ports/LibHttp/HttpPort.cc @@ -0,0 +1,117 @@ +#include "HttpPort.hh" +#include "http_layer_factory.hh" +#include "http_layer.hh" +#include "http_codec_emtel.hh" +#include "loggers.hh" + +#include "LibHttp_TypesAndValues.hh" + +namespace LibHttp__TestSystem { + + HttpPort::HttpPort(const char *par_port_name): HttpPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("HttpPort::outgoing_send") { + // Nothing to do + } // End of constructor + + HttpPort::~HttpPort() { + loggers::get_instance().log(">>> HttpPort::~HttpPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void HttpPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("HttpPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void HttpPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void HttpPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void HttpPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void HttpPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void HttpPort::Handle_Timeout(double time_since_last_call) {}*/ + + void HttpPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> HttpPort::user_map: %s", system_port); + // Build layer stack + params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("HttpPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("HttpPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + if (!static_cast(_layer)->set_codec(new http_codec_emtel())) { + loggers::get_instance().error("HttpPort::user_map: Null codec"); + } + static_cast(_layer)->add_upper_port(this); + } else { + loggers::get_instance().error("HttpPort::user_map: No layers defined in configuration file"); + } + } // End of user_map method + + void HttpPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> HttpPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void HttpPort::user_start() + { + loggers::get_instance().log(">>> HttpPort::user_start"); + + } // End of user_start method + + void HttpPort::user_stop() + { + loggers::get_instance().log(">>> HttpPort::user_stop"); + + } // End of user_stop method + + void HttpPort::outgoing_send(const LibHttp__TypesAndValues::HttpMessage& send_par) + { + loggers::get_instance().log_msg(">>> HttpPort::outgoing_send: payload=", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void HttpPort::receiveMsg (const LibHttp__TypesAndValues::HttpMessage& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> HttpPort::receive_msg: ", p_ind); + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + } + +} // End of namespace LibHttp__TestSystem + diff --git a/ccsrc/Ports/LibHttp/HttpPort.hh b/ccsrc/Ports/LibHttp/HttpPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..7d8b1af81630f28bced659562603e38caa50e05e --- /dev/null +++ b/ccsrc/Ports/LibHttp/HttpPort.hh @@ -0,0 +1,46 @@ +#pragma once + +#include "LibHttp_TestSystem.hh" + +#include "layer.hh" +#include "params.hh" + +namespace LibHttp__TypesAndValues { + class HttpMessage; +} + +namespace LibHttp__TestSystem { + + class HttpPort : public HttpPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + HttpPort(const char *par_port_name); + ~HttpPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + void receiveMsg (const LibHttp__TypesAndValues::HttpMessage& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + void outgoing_send(const LibHttp__TypesAndValues::HttpMessage& send_par); + }; // End of class HttpPort + +} // End of namespace LibHttp__TestSystem + diff --git a/ccsrc/Ports/LibHttp/module.mk b/ccsrc/Ports/LibHttp/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..0fba8bd2e9442497d91fa111d95c889d4d57e139 --- /dev/null +++ b/ccsrc/Ports/LibHttp/module.mk @@ -0,0 +1,3 @@ +sources := HttpPort.cc +includes := . + diff --git a/ccsrc/Ports/LibIot/AdapterConfigPort.cc b/ccsrc/Ports/LibIot/AdapterConfigPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..f9f2f7bd5eccd3683f1ab6df50094d7828f07b4c --- /dev/null +++ b/ccsrc/Ports/LibIot/AdapterConfigPort.cc @@ -0,0 +1,128 @@ +#include + +#include "loggers.hh" +#include "registration.hh" + +#include "AdapterConfigPort.hh" + +//============================================================================= +namespace LibIot__TestInterface { + + AdapterConfigPort::AdapterConfigPort(const char *par_port_name) : AdapterConfigPort_BASE(par_port_name), _params() { + loggers::get_instance().log("AdapterConfigPort::AdapterConfigPort"); + } + + AdapterConfigPort::~AdapterConfigPort() {} + + void AdapterConfigPort::set_parameter(const char *parameter_name, const char *parameter_value) { + loggers::get_instance().log("AdapterConfigPort::set_parameter: %s=%s", parameter_name, parameter_value); + } + + /*void AdapterConfigPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void AdapterConfigPort::Handle_Fd_Event_Error(int /*fd*/) {} + + void AdapterConfigPort::Handle_Fd_Event_Writable(int /*fd*/) {} + + void AdapterConfigPort::Handle_Fd_Event_Readable(int /*fd*/) {} + + /*void AdapterConfigPort::Handle_Timeout(double time_since_last_call) {}*/ + + void AdapterConfigPort::user_map(const char *system_port) { loggers::get_instance().log(">>> AdapterConfigPort::user_map: %s", system_port); } + + void AdapterConfigPort::user_unmap(const char *system_port) { loggers::get_instance().log(">>> AdapterConfigPort::user_unmap: %s", system_port); } + + void AdapterConfigPort::user_start() {} + + void AdapterConfigPort::user_stop() {} + + void AdapterConfigPort::outgoing_send(const LibIot__TypesAndValues::GeneralConfigurationReq& send_par) { + loggers::get_instance().log_msg(">>> AdapterConfigPort::outgoing_send: ", send_par); + + // Register this object for AdapterConfigPort +/* geonetworking_layer *p = registration::get_instance().get_item(std::string("GN")); + if (p != NULL) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Got GN layer %p", p); + LibIot__TypesAndValues::AcGnResponse response; + response.failure() = LibIot__TypesAndValues::AcGnResponseFailure(BOOLEAN(false)); + if (send_par.ischosen(LibIot__TypesAndValues::AcGnPrimitive::ALT_startBeaconing)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Start beaconing"); + p->start_beaconing(send_par.startBeaconing().beaconPacket()); + // No response + return; + } else if (send_par.ischosen(LibIot__TypesAndValues::AcGnPrimitive::ALT_stopBeaconing)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Stop beaconing"); + p->stop_beaconing(); + // No response + return; + } else if (send_par.ischosen(LibIot__TypesAndValues::AcGnPrimitive::ALT_getLongPosVector)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Get LongPosVector"); + const LibIot__TypesAndValues::LongPosVector *lpv = p->get_lpv(send_par.getLongPosVector().gnAddress()); + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Return value: %p", lpv); + if (lpv == nullptr) { + response.failure() = LibIot__TypesAndValues::AcGnResponseFailure(BOOLEAN(true)); + } else { + response.getLongPosVector() = *lpv; + } + } else if (send_par.ischosen(LibIot__TypesAndValues::AcGnPrimitive::ALT_startPassBeaconing)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Start pass beaconing"); + p->start_pass_beaconing(send_par.startPassBeaconing().beaconHeader()); + // No response + return; + } else if (send_par.ischosen(LibIot__TypesAndValues::AcGnPrimitive::ALT_stopPassBeaconing)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Stop pass beaconing"); + p->stop_pass_beaconing(); + // No response + return; + } else { + response.failure() = LibIot__TypesAndValues::AcGnResponseFailure(BOOLEAN(true)); + } + // Send response + loggers::get_instance().log_msg("AdapterConfigPort::outgoing_send: Send response: ", response); + incoming_message(response); + } else {*/ + loggers::get_instance().error("AdapterConfigPort::outgoing_send: %s not registered", "geoNetworkingPort"); + /*}*/ + } + + void AdapterConfigPort::outgoing_send(const LibIot__TypesAndValues::SetFilterReq& send_par) { + loggers::get_instance().log_msg(">>> AdapterConfigPort::outgoing_send: ", send_par); + } + + void AdapterConfigPort::outgoing_send(const LibIot__TypesAndValues::StartTrafficCaptureReq& send_par) { + loggers::get_instance().log_msg(">>> AdapterConfigPort::outgoing_send: ", send_par); + } + + void AdapterConfigPort::outgoing_send(const LibIot__TypesAndValues::StopTrafficCaptureReq& send_par) { + loggers::get_instance().log_msg(">>> AdapterConfigPort::outgoing_send: ", send_par); + + // Register this object for AdapterConfigPort + /*geonetworking_layer *p = registration::get_instance().get_item(std::string("GN")); + if (p != NULL) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Got GN layer %p", p); + LibItsCommon__TypesAndValues::AdapterControlResults response; + response.acSecResponse() = BOOLEAN(true); + if (send_par.ischosen(LibItsCommon__TypesAndValues::AcSecPrimitive::ALT_acEnableSecurity)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Enable secured mode"); + std::string str(static_cast(send_par.acEnableSecurity().certificateId())); + if (p->enable_secured_mode(str, send_par.acEnableSecurity().enforceSecurity()) == -1) { + response.acSecResponse() = BOOLEAN(false); + } + } else if (send_par.ischosen(LibItsCommon__TypesAndValues::AcSecPrimitive::ALT_acDisableSecurity)) { + loggers::get_instance().log("AdapterConfigPort::outgoing_send: Disable secured mode"); + if (p->disable_secured_mode() == -1) { + response.acSecResponse() = BOOLEAN(false); + } + } else { + response.acSecResponse() = BOOLEAN(false); + } + // Send response + loggers::get_instance().log_msg("AdapterConfigPort::outgoing_send: Send response: ", response); + incoming_message(response); + } else {*/ + loggers::get_instance().error("AdapterConfigPort::outgoing_send: %s not registered", "geoNetworkingPort"); + /*}*/ + } + +} // namespace LibIot__TestInterface diff --git a/ccsrc/Ports/LibIot/AdapterConfigPort.hh b/ccsrc/Ports/LibIot/AdapterConfigPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..2143db5d58f568205583d3fcffcf16c5bd7467db --- /dev/null +++ b/ccsrc/Ports/LibIot/AdapterConfigPort.hh @@ -0,0 +1,42 @@ +#pragma once + +#include "LibIot_TestInterface.hh" + +#include "params.hh" + +namespace LibIot__TestInterface { + + class AdapterConfigPort : public AdapterConfigPort_BASE { + params _params; + + public: + AdapterConfigPort(const char *par_port_name = NULL); + ~AdapterConfigPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + void outgoing_send(const LibIot__TypesAndValues::GeneralConfigurationReq &send_par); + + void outgoing_send(const LibIot__TypesAndValues::SetFilterReq &send_par); + + void outgoing_send(const LibIot__TypesAndValues::StartTrafficCaptureReq &send_par); + + void outgoing_send(const LibIot__TypesAndValues::StopTrafficCaptureReq &send_par); + }; + +} // namespace LibIot__TestInterface + diff --git a/ccsrc/Ports/LibIot/EquipmentAccessPort.cc b/ccsrc/Ports/LibIot/EquipmentAccessPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..78e945b24eb183481f4cf461af282a95fc535528 --- /dev/null +++ b/ccsrc/Ports/LibIot/EquipmentAccessPort.cc @@ -0,0 +1,113 @@ +#include "EquipmentAccessPort.hh" +#include "upper_tester_layer_factory.hh" +#include "loggers.hh" + +namespace LibIot__TestInterface { + + EquipmentAccessPort::EquipmentAccessPort(const char *par_port_name): EquipmentAccessPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("EquipmentAccessPort::outgoing_send") { + // Nothing to do + } // End of constructor + + EquipmentAccessPort::~EquipmentAccessPort() { + loggers::get_instance().log(">>> EquipmentAccessPort::~EquipmentAccessPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void EquipmentAccessPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("EquipmentAccessPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void EquipmentAccessPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void EquipmentAccessPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void EquipmentAccessPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void EquipmentAccessPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void EquipmentAccessPort::Handle_Timeout(double time_since_last_call) {}*/ + + void EquipmentAccessPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> EquipmentAccessPort::user_map: %s", system_port); + // Build layer stack + params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("EquipmentAccessPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("EquipmentAccessPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else { + loggers::get_instance().error("EquipmentAccessPort::user_map: No layers defined in configuration file"); + } + } // End of user_map method + + void EquipmentAccessPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> EquipmentAccessPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void EquipmentAccessPort::user_start() + { + loggers::get_instance().log(">>> EquipmentAccessPort::user_start"); + + } // End of user_start method + + void EquipmentAccessPort::user_stop() + { + loggers::get_instance().log(">>> EquipmentAccessPort::user_stop"); + + } // End of user_stop method + + void EquipmentAccessPort::receiveMsg (const LibUpperTester::EquipmentOperationRsp& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> EquipmentAccessPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + + } // End of method receiveMsg + + void EquipmentAccessPort::outgoing_send(const LibUpperTester::EquipmentOperationReq& send_par) + { + loggers::get_instance().log_msg(">>> EquipmentAccessPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } // End of outgoing_send + +} + diff --git a/ccsrc/Ports/LibIot/EquipmentAccessPort.hh b/ccsrc/Ports/LibIot/EquipmentAccessPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..297ae4faae4151ffffaf7e1e14f214af4221d5e6 --- /dev/null +++ b/ccsrc/Ports/LibIot/EquipmentAccessPort.hh @@ -0,0 +1,43 @@ +#pragma once + +#include "LibIot_TestInterface.hh" + +#include "layer.hh" +#include "params.hh" + +namespace LibIot__TestInterface { + + class EquipmentAccessPort : public EquipmentAccessPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + EquipmentAccessPort(const char *par_port_name); + ~EquipmentAccessPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibUpperTester::EquipmentOperationRsp& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + virtual void outgoing_send(const LibUpperTester::EquipmentOperationReq& send_par); + }; // End of class EquipmentAccessPort + +} + diff --git a/ccsrc/Ports/LibIot/module.mk b/ccsrc/Ports/LibIot/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..8c24c4b66a3baa366dea75935e683d25be937014 --- /dev/null +++ b/ccsrc/Ports/LibIot/module.mk @@ -0,0 +1,3 @@ +sources := EquipmentAccessPort.cc AdapterConfigPort.cc +includes := . + diff --git a/ccsrc/Ports/LibSip/OperatorPort.hh b/ccsrc/Ports/LibSip/OperatorPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..a44d31675dfb7db40db280178d9149691301865c --- /dev/null +++ b/ccsrc/Ports/LibSip/OperatorPort.hh @@ -0,0 +1,31 @@ + + +#pragma once + +#include "LibSip_Interface.hh" + +namespace LibSip__Interface { + + class OperatorPort : public OperatorPort_BASE { + public: + OperatorPort(const char *par_port_name): OperatorPort_BASE(par_port_name) { }; + ~OperatorPort() { }; + + protected: + virtual void outgoing_call(const s__SIP__conversation_call& call_par) { }; + virtual void outgoing_call(const s__SIP__ringing_call& call_par) { }; + virtual void outgoing_call(const s__SIP__announcementA_call& call_par) { }; + virtual void outgoing_call(const s__SIP__announcementB_call& call_par) { }; + virtual void outgoing_call(const s__SIP__announcement_call& call_par) { }; + virtual void outgoing_call(const s__SIP__voiceMessage_call& call_par) { }; + virtual void outgoing_call(const s__SIP__mediastopped_call& call_par) { }; + virtual void outgoing_reply(const s__SIP__conversation_reply& reply_par) { }; + virtual void outgoing_reply(const s__SIP__ringing_reply& reply_par) { }; + virtual void outgoing_reply(const s__SIP__announcementA_reply& reply_par) { }; + virtual void outgoing_reply(const s__SIP__announcementB_reply& reply_par) { }; + virtual void outgoing_reply(const s__SIP__announcement_reply& reply_par) { }; + virtual void outgoing_reply(const s__SIP__voiceMessage_reply& reply_par) { }; + virtual void outgoing_reply(const s__SIP__mediastopped_reply& reply_par) { }; + }; // End of class OperatorPort + +} diff --git a/ccsrc/Ports/LibSip/SipPort.cc b/ccsrc/Ports/LibSip/SipPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..cb54e167f57405bc51491b2bbbe4718ef96f800e --- /dev/null +++ b/ccsrc/Ports/LibSip/SipPort.cc @@ -0,0 +1,246 @@ +#include "SipPort.hh" +#include "sip_layer_factory.hh" +#include "loggers.hh" + +namespace LibSip__Interface { + + SipPort::SipPort(const char *par_port_name): SipPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("SipPort::outgoing_send") { + // Nothing to do + } // End of constructor + + SipPort::~SipPort() { + loggers::get_instance().log(">>> SipPort::~SipPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void SipPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("SipPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void SipPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void SipPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void SipPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void SipPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void SipPort::Handle_Timeout(double time_since_last_call) {}*/ + + void SipPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> SipPort::user_map: %s", system_port); + // Build layer stack + params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("SipPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("SipPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else { + loggers::get_instance().error("SipPort::user_map: No layers defined in configuration file"); + } + } // End of user_map method + + void SipPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> SipPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void SipPort::user_start() + { + loggers::get_instance().log(">>> SipPort::user_start"); + + } // End of user_start method + + void SipPort::user_stop() + { + loggers::get_instance().log(">>> SipPort::user_stop"); + + } // End of user_stop method + + void SipPort::receiveMsg (const LibSip__SIPTypesAndValues::Request& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> SipPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::REGISTER__E) { + incoming_message(LibSip__SIPTypesAndValues::REGISTER__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::INVITE__E) { + incoming_message(LibSip__SIPTypesAndValues::INVITE__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::SUBSCRIBE__E) { + incoming_message(LibSip__SIPTypesAndValues::SUBSCRIBE__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::NOTIFY__E) { + incoming_message(LibSip__SIPTypesAndValues::NOTIFY__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::BYE__E) { + incoming_message(LibSip__SIPTypesAndValues::BYE__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::INFO__E) { + incoming_message(LibSip__SIPTypesAndValues::INFO__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::OPTIONS__E) { + incoming_message(LibSip__SIPTypesAndValues::OPTIONS__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::MESSAGE__E) { + incoming_message(LibSip__SIPTypesAndValues::MESSAGE__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::CANCEL__E) { + incoming_message(LibSip__SIPTypesAndValues::CANCEL__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else if (p_ind.requestLine().method() == LibSip__SIPTypesAndValues::Method::ACK__E) { + incoming_message(LibSip__SIPTypesAndValues::ACK__Request(p_ind.requestLine(), p_ind.msgHeader(), p_ind.messageBody(), p_ind.payload())); + } else { + incoming_message(p_ind); + } + } // End of method receiveMsg + + void SipPort::receiveMsg (const LibSip__SIPTypesAndValues::Response& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> SipPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + } // End of method receiveMsg + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::INVITE__Request& send_par, const Address4SIP *destination_address) + { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } // End of outgoing_send + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::ACK__Request& send_par, const Address4SIP *destination_address) + { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } // End of outgoing_send + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::REGISTER__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::MESSAGE__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::OPTIONS__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::BYE__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::CANCEL__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::NOTIFY__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::INFO__Request& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + + void SipPort::outgoing_send(const LibSip__SIPTypesAndValues::Response& send_par, const Address4SIP *destination_address) { + loggers::get_instance().log_msg(">>> SipPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } + +} + diff --git a/ccsrc/Ports/LibSip/SipPort.hh b/ccsrc/Ports/LibSip/SipPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..fc2edfaf56e68bf3598a5d14468a270c210a1bd3 --- /dev/null +++ b/ccsrc/Ports/LibSip/SipPort.hh @@ -0,0 +1,64 @@ +#pragma once + +#include "LibSip_Interface.hh" + +#include "layer.hh" +#include "params.hh" + +namespace LibSip__SIPTypesAndValues { + class REGISTER__Request; +} + +namespace LibSip__Interface { + + class SipPort : public SipPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + SipPort(const char *par_port_name); + ~SipPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const LibSip__SIPTypesAndValues::Request& p_ind, const params& p_params); + void receiveMsg (const LibSip__SIPTypesAndValues::Response& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + virtual void outgoing_send(const LibSip__SIPTypesAndValues::Request& send_par, const Address4SIP *destination_address) { }; + void outgoing_send(const LibSip__SIPTypesAndValues::REGISTER__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::INVITE__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::OPTIONS__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::BYE__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::CANCEL__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::ACK__Request& send_par, const Address4SIP *destination_address); + virtual void outgoing_send(const LibSip__SIPTypesAndValues::PRACK__Request& send_par, const Address4SIP *destination_address) { }; + void outgoing_send(const LibSip__SIPTypesAndValues::NOTIFY__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& send_par, const Address4SIP *destination_address); + virtual void outgoing_send(const LibSip__SIPTypesAndValues::PUBLISH__Request& send_par, const Address4SIP *destination_address) { }; + virtual void outgoing_send(const LibSip__SIPTypesAndValues::UPDATE__Request& send_par, const Address4SIP *destination_address) { }; + virtual void outgoing_send(const LibSip__SIPTypesAndValues::REFER__Request& send_par, const Address4SIP *destination_address) { }; + void outgoing_send(const LibSip__SIPTypesAndValues::MESSAGE__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::INFO__Request& send_par, const Address4SIP *destination_address); + void outgoing_send(const LibSip__SIPTypesAndValues::Response& send_par, const Address4SIP *destination_address); + virtual void outgoing_send(const CHARSTRING& send_par, const Address4SIP *destination_address) { }; + }; // End of class SipPort + +} + diff --git a/ccsrc/Ports/LibSip/module.mk b/ccsrc/Ports/LibSip/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..7c599702e1dfe14d409117e77e97eed48f9d306f --- /dev/null +++ b/ccsrc/Ports/LibSip/module.mk @@ -0,0 +1,3 @@ +sources := SipPort.cc +includes := . + diff --git a/ccsrc/Ports/Naptr/NaptrPort.cc b/ccsrc/Ports/Naptr/NaptrPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..ee3b9bf069c86e4a648981099b41a5f654e09e4b --- /dev/null +++ b/ccsrc/Ports/Naptr/NaptrPort.cc @@ -0,0 +1,113 @@ +#include "NaptrPort.hh" +#include "naptrPort_layer_factory.hh" +#include "loggers.hh" + +namespace AtsImsIot__TestSystem { + + NaptrPort::NaptrPort(const char *par_port_name): NaptrPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("NaptrPort::outgoing_send") { + // Nothing to do + } // End of constructor + + NaptrPort::~NaptrPort() { + loggers::get_instance().log(">>> NaptrPort::~NaptrPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void NaptrPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("NaptrPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void NaptrPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void NaptrPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void NaptrPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void NaptrPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void NaptrPort::Handle_Timeout(double time_since_last_call) {}*/ + + void NaptrPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> NaptrPort::user_map: %s", system_port); + // Build layer stack + params::iterator it = _cfg_params.find(std::string("params")); + if (it != _cfg_params.end()) { + loggers::get_instance().log("NaptrPort::user_map: %s", it->second.c_str()); + // Setup parameters + params::convert(_layer_params, it->second); // TODO This _layer_params seems to be useless + // Create layer + _layer = layer_stack_builder::get_instance()->create_layer_stack(it->second.c_str()); + if (static_cast(_layer) == nullptr) { + loggers::get_instance().error("NaptrPort::user_map: Invalid stack configuration: %s", it->second.c_str()); + } + static_cast(_layer)->add_upper_port(this); + + } else { + loggers::get_instance().error("NaptrPort::user_map: No layers defined in configuration file"); + } + } // End of user_map method + + void NaptrPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> NaptrPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void NaptrPort::user_start() + { + loggers::get_instance().log(">>> NaptrPort::user_start"); + + } // End of user_start method + + void NaptrPort::user_stop() + { + loggers::get_instance().log(">>> NaptrPort::user_stop"); + + } // End of user_stop method + + void NaptrPort::receiveMsg (const AtsImsIot__TypesAndValues::NAPTRmessage& p_ind, const params& p_params) { + loggers::get_instance().log_msg(">>> NaptrPort::receive_msg: ", p_ind); + + // Sanity check + if (!p_ind.is_bound()) { + return; + } + + incoming_message(p_ind); + + } // End of method receiveMsg + + void NaptrPort::outgoing_send(const AtsImsIot__TypesAndValues::NAPTRmessage& send_par) + { + loggers::get_instance().log_msg(">>> NaptrPort::outgoing_send: ", send_par); + + float duration; + loggers::get_instance().set_start_time(_time_key); + params params; + static_cast(_layer)->sendMsg(send_par, params); + loggers::get_instance().set_stop_time(_time_key, duration); + } // End of outgoing_send + +} + diff --git a/ccsrc/Ports/Naptr/NaptrPort.hh b/ccsrc/Ports/Naptr/NaptrPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..b573737dbab12e0d8f0e0ca593b773091657321e --- /dev/null +++ b/ccsrc/Ports/Naptr/NaptrPort.hh @@ -0,0 +1,43 @@ +#pragma once + +#include "AtsImsIot_TestSystem.hh" + +#include "layer.hh" +#include "params.hh" + +namespace AtsImsIot__TestSystem { + + class NaptrPort : public NaptrPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + NaptrPort(const char *par_port_name); + ~NaptrPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const AtsImsIot__TypesAndValues::NAPTRmessage& p_ind, const params& p_params); + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + virtual void outgoing_send(const AtsImsIot__TypesAndValues::NAPTRmessage& send_par); + }; // End of class NaptrPort + +} + diff --git a/ccsrc/Ports/Naptr/module.mk b/ccsrc/Ports/Naptr/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..aeb30dec26ac874b86cbb85363cd1f52017d1ed7 --- /dev/null +++ b/ccsrc/Ports/Naptr/module.mk @@ -0,0 +1,3 @@ +sources := NaptrPort.cc +includes := . + diff --git a/ccsrc/Ports/Sgi/SgiPort.cc b/ccsrc/Ports/Sgi/SgiPort.cc new file mode 100644 index 0000000000000000000000000000000000000000..8d766fd3eacb76da305daadf118057513866d368 --- /dev/null +++ b/ccsrc/Ports/Sgi/SgiPort.cc @@ -0,0 +1,73 @@ +#include "SgiPort.hh" +#include "loggers.hh" + +namespace AtsImsIot__TestSystem { + + SgiPort::SgiPort(const char *par_port_name): SgiPort_BASE(par_port_name), _cfg_params(), _layer_params(), _layer(nullptr), _time_key("SgiPort::outgoing_send") { + // Nothing to do + } // End of constructor + + SgiPort::~SgiPort() { + loggers::get_instance().log(">>> SgiPort::~SgiPort"); + + if (_layer != nullptr) { + delete _layer; + } + } // End of destructor + + void SgiPort::set_parameter(const char * parameter_name, const char * parameter_value) + { + loggers::get_instance().log("SgiPort::set_parameter: %s=%s", parameter_name, parameter_value); + _cfg_params.insert(std::pair(std::string(parameter_name), std::string(parameter_value))); + } + + /*void SgiPort::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + + void SgiPort::Handle_Fd_Event_Error(int /*fd*/) + { + + } + + void SgiPort::Handle_Fd_Event_Writable(int /*fd*/) + { + + } + + void SgiPort::Handle_Fd_Event_Readable(int /*fd*/) + { + + } + + /*void SgiPort::Handle_Timeout(double time_since_last_call) {}*/ + + void SgiPort::user_map(const char * system_port) + { + loggers::get_instance().log(">>> SgiPort::user_map: %s", system_port); + } // End of user_map method + + void SgiPort::user_unmap(const char * system_port) + { + loggers::get_instance().log(">>> SgiPort::user_unmap: %s", system_port); + + // Reset layers + if (_layer != nullptr) { + delete _layer; + _layer = nullptr; + } + } // End of user_unmap method + + void SgiPort::user_start() + { + loggers::get_instance().log(">>> SgiPort::user_start"); + + } // End of user_start method + + void SgiPort::user_stop() + { + loggers::get_instance().log(">>> SgiPort::user_stop"); + + } // End of user_stop method + +} + diff --git a/ccsrc/Ports/Sgi/SgiPort.hh b/ccsrc/Ports/Sgi/SgiPort.hh new file mode 100644 index 0000000000000000000000000000000000000000..740373911762eaef7bcc3b9d512a80b38fa9bca8 --- /dev/null +++ b/ccsrc/Ports/Sgi/SgiPort.hh @@ -0,0 +1,42 @@ +#pragma once + +#include "AtsImsIot_TestSystem.hh" + +#include "layer.hh" +#include "params.hh" + +namespace AtsImsIot__TestSystem { + + class SgiPort : public SgiPort_BASE { + params _cfg_params; + params _layer_params; + layer* _layer; + std::string _time_key; + public: + SgiPort(const char *par_port_name); + ~SgiPort(); + + void set_parameter(const char *parameter_name, const char *parameter_value); + + void receiveMsg (const CHARSTRING& p_ind, const params& p_params) {}; + + private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ + + protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + protected: + }; // End of class SgiPort + +} + diff --git a/ccsrc/Ports/Sgi/module.mk b/ccsrc/Ports/Sgi/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..58a9d0b52c3c4002914bdb6a9a2aac00a1cdcc15 --- /dev/null +++ b/ccsrc/Ports/Sgi/module.mk @@ -0,0 +1,3 @@ +sources := SgiPort.cc +includes := . + diff --git a/ccsrc/Protocols/Diameter/avp.cc b/ccsrc/Protocols/Diameter/avp.cc new file mode 100644 index 0000000000000000000000000000000000000000..ad6ce3c9479130da51bebd2c9902fb88b1aac9c3 --- /dev/null +++ b/ccsrc/Protocols/Diameter/avp.cc @@ -0,0 +1,87 @@ +#include + +#include "avp.hh" + +#include "loggers.hh" +#include "converter.hh" + +avp::avp(const int p_code, const unsigned char p_vendor_specific, const unsigned char p_mandatory, const unsigned char p_protected_, const int p_length, const int p_vendor_id, const int p_encoded_length, const std::vector p_payload) : _code(p_code), _vendor_specific(p_vendor_specific), _mandatory(p_mandatory), _protected_(p_protected_), _length(p_length), _vendor_id(p_vendor_id), _encoded_length(p_encoded_length), _payload(p_payload), _avp_header(LibDiameter__Types__Base__AVPs::AVP__Header(p_code, LibDiameter__Types__Base__AVPs::AVP__Flags( int2bit(p_vendor_specific, 1), int2bit(p_mandatory, 1), int2bit(p_protected_, 1), int2bit(0, 5)), p_length, (p_vendor_specific == 0) ? OPTIONAL(OPTIONAL_OMIT) : OPTIONAL(p_vendor_id))), _enc_avp() { + loggers::get_instance().log_msg("avp::avp (1): _avp_header:", _avp_header); + loggers::get_instance().log_to_hexa("avp::avp (1): _payload:", _payload.data(), _payload.size()); +} // End of ctor + +avp::avp(const int p_code, const unsigned char p_vendor_specific, const unsigned char p_mandatory, const unsigned char p_protected_, const int p_length, const int p_vendor_id, const int p_encoded_length, const std::vector p_payload, const OCTETSTRING& p_enc_avp) : _code(p_code), _vendor_specific(p_vendor_specific), _mandatory(p_mandatory), _protected_(p_protected_), _length(p_length), _vendor_id(p_vendor_id), _encoded_length(p_encoded_length), _payload(p_payload), _avp_header(LibDiameter__Types__Base__AVPs::AVP__Header(p_code, LibDiameter__Types__Base__AVPs::AVP__Flags( int2bit(p_vendor_specific, 1), int2bit(p_mandatory, 1), int2bit(p_protected_, 1), int2bit(0, 5)), p_length, (p_vendor_specific == 0) ? OPTIONAL(OPTIONAL_OMIT) : OPTIONAL(p_vendor_id))), _enc_avp(p_enc_avp) { + loggers::get_instance().log_msg("avp::avp (2): _avp_header:", _avp_header); + loggers::get_instance().log_to_hexa("avp::avp (2): _payload:", _payload.data(), _payload.size()); + loggers::get_instance().log_msg("avp::avp (2): _enc_avp:", _enc_avp); +} // End of ctor + +int avp::get_code() const { + return _code; +} + +int avp::decode_session_id(LibDiameter__Types__Base__AVPs::Session__Id__AVP& p_avp) const { + loggers::get_instance().log(">>> avp::decode_session_id: '%d'", _code); + loggers::get_instance().log_to_hexa("avp::decode_session_id: _payload:", _payload.data(), _payload.size()); + + p_avp = LibDiameter__Types__Base__AVPs::Session__Id__AVP(LibDiameter__Types__Base__AVPs::AVP__Header(_avp_header), CHARSTRING(converter::get_instance().bytes_to_string(_payload).c_str())); + loggers::get_instance().log_msg("avp::decode_session_id: p_avp:", p_avp); + + return 0; +} + +int avp::decode_auth_session_state(LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp) const { + loggers::get_instance().log(">>> avp::decode_auth_session_state: '%d'", _code); + loggers::get_instance().log_to_hexa("avp::decode_auth_session_state: _payload:", _payload.data(), _payload.size()); + + // Sanity checks + if (_payload.size() != 4) { + loggers::get_instance().warning("avp::decode_auth_session_state: Wrong payload length: '%d'", _payload.size()); + return -1; + } + p_avp = LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP(LibDiameter__Types__Base__AVPs::AVP__Header(_avp_header), LibDiameter__Types__Base__AVPs::Auth__Session__State__Type(_payload[0] << 24 || _payload[1] << 16 || _payload[2] << 8 || _payload[3])); + loggers::get_instance().log_msg("avp::decode_auth_session_state: p_avp:", p_avp); + + return 0; +} + +int avp::decode_origin_host(LibDiameter__Types__Base__AVPs::Origin__Host__AVP& p_avp) const { + loggers::get_instance().log(">>> avp::decode_origin_host: '%d'", _code); + loggers::get_instance().log_to_hexa("avp::decode_origin_host: _payload:", _payload.data(), _payload.size()); + + p_avp = LibDiameter__Types__Base__AVPs::Origin__Host__AVP(LibDiameter__Types__Base__AVPs::AVP__Header(_avp_header), CHARSTRING(converter::get_instance().bytes_to_string(_payload).c_str())); + loggers::get_instance().log_msg("avp::decode_origin_host: p_avp:", p_avp); + + return 0; +} + +int avp::decode_origin_realm(LibDiameter__Types__Base__AVPs::Origin__Realm__AVP& p_avp) const { + loggers::get_instance().log(">>> avp::decode_origin_realm: '%d'", _code); + loggers::get_instance().log_to_hexa("avp::decode_origin_realm: _payload:", _payload.data(), _payload.size()); + + p_avp = LibDiameter__Types__Base__AVPs::Origin__Realm__AVP(LibDiameter__Types__Base__AVPs::AVP__Header(_avp_header), CHARSTRING(converter::get_instance().bytes_to_string(_payload).c_str())); + loggers::get_instance().log_msg("avp::decode_origin_realm: p_avp:", p_avp); + + return 0; +} + +int avp::decode_destination_host(LibDiameter__Types__Base__AVPs::Destination__Host__AVP& p_avp) const { + loggers::get_instance().log(">>> avp::decode_destination_host: '%d'", _code); + loggers::get_instance().log_to_hexa("avp::decode_destination_host: _payload:", _payload.data(), _payload.size()); + + p_avp = LibDiameter__Types__Base__AVPs::Destination__Host__AVP(LibDiameter__Types__Base__AVPs::AVP__Header(_avp_header), CHARSTRING(converter::get_instance().bytes_to_string(_payload).c_str())); + loggers::get_instance().log_msg("avp::decode_destination_host: p_avp:", p_avp); + + return 0; +} + +int avp::decode_destination_realm(LibDiameter__Types__Base__AVPs::Destination__Realm__AVP& p_avp) const { + loggers::get_instance().log(">>> avp::decode_destination_realm: '%d'", _code); + loggers::get_instance().log_to_hexa("avp::decode_destination_realm: _payload:", _payload.data(), _payload.size()); + + p_avp = LibDiameter__Types__Base__AVPs::Destination__Realm__AVP(LibDiameter__Types__Base__AVPs::AVP__Header(_avp_header), CHARSTRING(converter::get_instance().bytes_to_string(_payload).c_str())); + loggers::get_instance().log_msg("avp::decode_destination_realm: p_avp:", p_avp); + + return 0; +} + diff --git a/ccsrc/Protocols/Diameter/avp.hh b/ccsrc/Protocols/Diameter/avp.hh new file mode 100644 index 0000000000000000000000000000000000000000..dec2c6af4e6ca80c9f0bb5db82cb7093be441774 --- /dev/null +++ b/ccsrc/Protocols/Diameter/avp.hh @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + + +#include "LibDiameter_TypesAndValues.hh" + +class avp { + const int _code; + const unsigned char _vendor_specific; + const unsigned char _mandatory; + const unsigned char _protected_; + const int _length; + const int _vendor_id; + const int _encoded_length; + const std::vector _payload; + const OCTETSTRING _enc_avp; + const LibDiameter__Types__Base__AVPs::AVP__Header _avp_header; +public: + avp(const int p_code, const unsigned char p_vendor_specific, const unsigned char p_mandatory, const unsigned char p_protected_, const int p_length, const int p_vendor_id, const int p_encoded_length, const std::vector p_payload); + avp(const int p_code, const unsigned char p_vendor_specific, const unsigned char p_mandatory, const unsigned char p_protected_, const int p_length, const int p_vendor_id, const int p_encoded_length, const std::vector p_payload, const OCTETSTRING& p_enc_avp); + virtual ~avp() {}; + + int get_code() const; + + int encode_auth_session_state(const LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp, std::unique_ptr& p_encoded_avp); + + int decode_session_id(LibDiameter__Types__Base__AVPs::Session__Id__AVP& p_avp) const; + int decode_auth_session_state(LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp) const; + int decode_origin_host(LibDiameter__Types__Base__AVPs::Origin__Host__AVP& p_avp) const; + int decode_origin_realm(LibDiameter__Types__Base__AVPs::Origin__Realm__AVP& p_avp) const; + int decode_destination_host(LibDiameter__Types__Base__AVPs::Destination__Host__AVP& p_avp) const; + int decode_destination_realm(LibDiameter__Types__Base__AVPs::Destination__Realm__AVP& p_avp) const; + +}; // End of class avp \ No newline at end of file diff --git a/ccsrc/Protocols/Diameter/diameter_codec.cc b/ccsrc/Protocols/Diameter/diameter_codec.cc new file mode 100644 index 0000000000000000000000000000000000000000..4c2ee29fc5e3e163e0e8ffad58751928f90c1903 --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_codec.cc @@ -0,0 +1,583 @@ +#include + +#include "LibDiameter_TypesAndValues.hh" + +#include "diameter_codec.hh" + +#include "loggers.hh" +#include "converter.hh" + +template class OPTIONAL; +class TTCN_Buffer; +class TTCN_EncDec; + +diameter_codec::~diameter_codec() { + loggers::get_instance().log(">>> diameter_codec::~diameter_codec"); + if (_avps.size() != 0) { + _avps.clear(); + } +} + +int diameter_codec::encode_header(const LibDiameter__TypesAndValues::DiameterHeader& p_header, TTCN_Buffer& p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_codec::encode_header: ", (const Base_Type &)p_header); + + p_encoding_buffer.put_c(p_header.version()); + + p_encoding_buffer.put_c(static_cast((p_header.msglen() >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.msglen() >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.msglen()) & 0xFF)); + + unsigned char cmdflags = 0x00; + BITSTRING bit_set = int2bit(1, 1); + if (p_header.cmdflags().r__bit() == bit_set) { + cmdflags |= 0x80; + } + if (p_header.cmdflags().p__bit() == bit_set) { + cmdflags |= 0x40; + } + if (p_header.cmdflags().e__bit() == bit_set) { + cmdflags |= 0x20; + } + if (p_header.cmdflags().t__bit() == bit_set) { + cmdflags |= 0x10; + } + p_encoding_buffer.put_c(cmdflags); + + int cmdcode = _command_codes[p_header.cmdcode()]; + p_encoding_buffer.put_c(static_cast((cmdcode >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((cmdcode >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(cmdcode & 0xFF)); + + p_encoding_buffer.put_c(static_cast((p_header.applid() >> 24) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.applid() >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.applid() >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(p_header.applid() & 0xFF)); + + p_encoding_buffer.put_c(static_cast((p_header.hopid() >> 24) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.hopid() >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.hopid() >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(p_header.hopid() & 0xFF)); + + p_encoding_buffer.put_c(static_cast((p_header.endid() >> 24) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.endid() >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((p_header.endid() >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(p_header.endid() & 0xFF)); + + _avps.clear(); // unique_ptr class manages deletion of resources + + loggers::get_instance().log_msg("<<< diameter_codec::encode_header: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} // End of method encode_header + +int diameter_codec::encode_session_id(const LibDiameter__Types__Base__AVPs::Session__Id__AVP& p_avp, TTCN_Buffer& p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_codec::encode_session_id: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + + // TODO Group + + // Encode AVP header + int padding = 0; + if (encode_avp_header(p_avp.aVP__Header(), &padding, p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_codec::encode_session_id: Failed to encode AVP header"); + return -1; + } + + const OCTETSTRING& os = unichar2oct(p_avp.aVP__Data()); + p_encoding_buffer.put_string(os); + + _avps.insert( + std::make_pair >( + p_avp.aVP__Header().aVP__Code(), + std::unique_ptr( + new avp( + p_avp.aVP__Header().aVP__Code(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().m__bit()[0].get_bit()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().p__bit()[0].get_bit()) ? 0x01 : 0x00, + p_avp.aVP__Header().aVP__len(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? static_cast(static_cast(*p_avp.aVP__Header().aVP__vid().get_opt_value())) : 0, + p_avp.aVP__Header().aVP__len(), + std::vector(static_cast(os), static_cast(os) + os.lengthof()), + static_cast(OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())) + )))); + + if (padding != 0) { + OCTETSTRING os = int2oct(0, padding); + p_encoding_buffer.put_string(os); + } + + loggers::get_instance().log_msg("<<< diameter_codec::encode_session_id: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} + +int diameter_codec::encode_origin_host(const LibDiameter__Types__Base__AVPs::Origin__Host__AVP& p_avp, TTCN_Buffer& p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_codec::encode_origin_host: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + + // TODO Group + + // Encode AVP header + int padding = 0; + if (encode_avp_header(p_avp.aVP__Header(), &padding, p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_codec::encode_origin_host: Failed to encode AVP header"); + return -1; + } + + const OCTETSTRING& os = char2oct(p_avp.aVP__Data()); + p_encoding_buffer.put_string(os); + + _avps.insert( + std::make_pair >( + p_avp.aVP__Header().aVP__Code(), + std::unique_ptr( + new avp( + p_avp.aVP__Header().aVP__Code(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().m__bit()[0].get_bit()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().p__bit()[0].get_bit()) ? 0x01 : 0x00, + p_avp.aVP__Header().aVP__len(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? static_cast(static_cast(*p_avp.aVP__Header().aVP__vid().get_opt_value())) : 0, + p_avp.aVP__Header().aVP__len(), + std::vector(static_cast(os), static_cast(os) + os.lengthof()), + static_cast(OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())) + )))); + + if (padding != 0) { + OCTETSTRING os = int2oct(0, padding); + p_encoding_buffer.put_string(os); + } + + loggers::get_instance().log_msg("<<< diameter_codec::encode_origin_host: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} + +int diameter_codec::encode_origin_realm(const LibDiameter__Types__Base__AVPs::Origin__Realm__AVP& p_avp, TTCN_Buffer& p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_codec::encode_origin_realm: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + + // TODO Group + + // Encode AVP header + int padding = 0; + if (encode_avp_header(p_avp.aVP__Header(), &padding, p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_codec::encode_origin_realm: Failed to encode AVP header"); + return -1; + } + + const OCTETSTRING& os = char2oct(p_avp.aVP__Data()); + p_encoding_buffer.put_string(os); + + _avps.insert( + std::make_pair >( + p_avp.aVP__Header().aVP__Code(), + std::unique_ptr( + new avp( + p_avp.aVP__Header().aVP__Code(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().m__bit()[0].get_bit()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().p__bit()[0].get_bit()) ? 0x01 : 0x00, + p_avp.aVP__Header().aVP__len(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? static_cast(static_cast(*p_avp.aVP__Header().aVP__vid().get_opt_value())) : 0, + p_avp.aVP__Header().aVP__len(), + std::vector(static_cast(os), static_cast(os) + os.lengthof()), + static_cast(OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())) + )))); + + if (padding != 0) { + OCTETSTRING os = int2oct(0, padding); + p_encoding_buffer.put_string(os); + } + + loggers::get_instance().log_msg("<<< diameter_codec::encode_origin_realm: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} + +int diameter_codec::encode_auth_session_state(const LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp, TTCN_Buffer& p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_codec::encode_auth_session_state: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + + // TODO Group + + // Encode AVP header + int padding = 0; + if (encode_avp_header(p_avp.aVP__Header(), &padding, p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_codec::encode_auth_session_state: Failed to encode AVP header"); + return -1; + } + + int conv = p_avp.aVP__Data().as_int(); + std::vector v; + unsigned char c = static_cast((conv >> 24) & 0xFF); + v.push_back(c); + p_encoding_buffer.put_c(c); + c = static_cast((conv >> 16) & 0xFF); + p_encoding_buffer.put_c(c); + v.push_back(c); + c = static_cast((conv >> 8) & 0xFF); + p_encoding_buffer.put_c(c); + v.push_back(c); + c = static_cast(conv & 0xFF); + p_encoding_buffer.put_c(c); + v.push_back(c); + + _avps.insert( + std::make_pair >( + p_avp.aVP__Header().aVP__Code(), + std::unique_ptr( + new avp( + p_avp.aVP__Header().aVP__Code(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().m__bit()[0].get_bit()) ? 0x01 : 0x00, + (p_avp.aVP__Header().aVP__flags().p__bit()[0].get_bit()) ? 0x01 : 0x00, + p_avp.aVP__Header().aVP__len(), + (p_avp.aVP__Header().aVP__vid().is_present()) ? static_cast(static_cast(*p_avp.aVP__Header().aVP__vid().get_opt_value())) : 0, + p_avp.aVP__Header().aVP__len(), + v, + static_cast(OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())) + )))); + + if (padding != 0) { + OCTETSTRING os = int2oct(0, padding); + p_encoding_buffer.put_string(os); + } + + loggers::get_instance().log_msg("<<< diameter_codec::encode_auth_session_state: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} + +int diameter_codec::encode_avp_header(const LibDiameter__Types__Base__AVPs::AVP__Header& p_header, int* p_padding, TTCN_Buffer& p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_codec::encode_avp_header: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + + int total_length = 4 + 4 + p_header.aVP__len(); + loggers::get_instance().log("diameter_codec::encode_avp_header: total_length: '%d'", total_length); + + if (p_header.aVP__vid().is_present()) { + total_length += 4; + } + int send_length = total_length; + if ((total_length % 4) != 0) { + total_length = (total_length / 4 + 1) * 4; + *p_padding = total_length - send_length; + } + loggers::get_instance().log("diameter_codec::encode_avp_header: send_length: '%d'", send_length); + loggers::get_instance().log("diameter_codec::encode_avp_header: total_length after padding: '%d'", total_length); + loggers::get_instance().log("diameter_codec::encode_avp_header: *p_padding: '%d'", *p_padding); + + int conv = p_header.aVP__Code(); + p_encoding_buffer.put_c(static_cast((conv >> 24) & 0xFF)); + p_encoding_buffer.put_c(static_cast((conv >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((conv >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(conv & 0xFF)); + + unsigned char flags = 0x00; + if (p_header.aVP__vid().is_present()) { + flags |= 0x80; + } + if (p_header.aVP__flags().m__bit()[0].get_bit()) { + flags |= 0x40; + + } + if (p_header.aVP__flags().p__bit()[0].get_bit()) { + flags |= 0x20; + + } + p_encoding_buffer.put_c(flags); + + conv = send_length; + p_encoding_buffer.put_c(static_cast((send_length >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((send_length >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(send_length & 0xFF)); + + if (p_header.aVP__vid().is_present()) { + conv = static_cast(*p_header.aVP__vid().get_opt_value()); + p_encoding_buffer.put_c(static_cast((conv >> 24) & 0xFF)); + p_encoding_buffer.put_c(static_cast((conv >> 16) & 0xFF)); + p_encoding_buffer.put_c(static_cast((conv >> 8) & 0xFF)); + p_encoding_buffer.put_c(static_cast(conv & 0xFF)); + } + + loggers::get_instance().log_msg("<<< diameter_codec::encode_auth_session_state: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} + +int diameter_codec::decode_header(TTCN_Buffer& p_decoding_buffer, LibDiameter__TypesAndValues::DiameterHeader& p_header, const params& p_params) { + loggers::get_instance().log(">>> diameter_codec::decode_header: '%p'", _start); + + // Sanity check + if (p_decoding_buffer.get_len() < 20) { // DiameterHeader size + loggers::get_instance().warning("diameter_codec::decode: Wrong packet length for daimeter message"); + return -1; + } + + _start = static_cast(p_decoding_buffer.get_data()); + _avps.clear(); // unique_ptr class manages deletion of resources + + p_header.version() = static_cast(*_start++ & 0xFF); + p_header.msglen() = static_cast(static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + // Resize the docoding buffer + if ((int)p_header.msglen() > p_decoding_buffer.get_len()) { + loggers::get_instance().warning("diameter_codec::decode: Resize docoding buffer: '%d' to '%d'", p_header.msglen(), p_decoding_buffer.get_len()); + p_header.msglen() = p_decoding_buffer.get_len(); + } + _end = static_cast(p_decoding_buffer.get_data()) + p_header.msglen(); + loggers::get_instance().log("diameter_codec::decode: _end: '%p' - offset: '%d'", _end, static_cast(_end - _start)); + loggers::get_instance().log_to_hexa("diameter_codec::decode: diameter message:", _start, static_cast(_end - _start)); + + p_header.cmdflags().r__bit() = int2bit(static_cast(static_cast(*_start & 0x80) != 0), 1); + p_header.cmdflags().p__bit() = int2bit(static_cast(static_cast(*_start & 0x40) != 0), 1); + p_header.cmdflags().e__bit() = int2bit(static_cast(static_cast(*_start & 0x20) != 0), 1); + p_header.cmdflags().t__bit() = int2bit(static_cast(static_cast(*_start & 0x10) != 0), 1); + p_header.cmdflags().reserved__bits() = int2bit(static_cast(*_start++ & 0x0F), 4); + + params::const_iterator it = p_params.find(std::string("Request")); + boolean is_request = true; + if (it != p_params.cend()) { + is_request = it->second.compare("1") == 0; + } + p_header.cmdcode() = LibDiameter__TypesAndValues::Command__Code::str_to_enum( + command_code_2_enumerated( + static_cast(static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)), + static_cast(is_request) + ).c_str() + ); + + p_header.applid() = static_cast(static_cast(*_start++ & 0xFF) << 24 | static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + + p_header.hopid() = static_cast(static_cast(*_start++ & 0xFF) << 24 | static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + + p_header.endid() = static_cast(static_cast(*_start++ & 0xFF) << 24 | static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + + loggers::get_instance().log_msg("diameter_codec::decode_header: p_header=", p_header); + + return 0; +} // End of method decode_header + +int diameter_codec::decode_avps(TTCN_Buffer& p_decoding_buffer, const LibDiameter__TypesAndValues::DiameterHeader& p_header, const params& p_params) { + loggers::get_instance().log(">>> diameter_codec::decode_avps: '%p'", _start); + + while (_start < _end) { + avp* avp_ptr = nullptr; + if (decode_avp(p_decoding_buffer, p_header, p_params, &avp_ptr) == -1) { + loggers::get_instance().log("diameter_codec::decode_avps: Failed to decode AVP: current position: '%p' - offset:'%d' - value:'0x%02x'", _start, reinterpret_cast(_end) - reinterpret_cast(_start), static_cast(*_start)); + return -1; + } + _avps.insert(std::make_pair >(avp_ptr->get_code(), std::unique_ptr(avp_ptr))); + } // End of 'while' statemement + loggers::get_instance().log(">>> diameter_codec::decode_avps: No more AVP to decode: '%p' / '%p'", _start, _end); + + return 0; +} // End of method decode_avps + +int diameter_codec::decode_avp(TTCN_Buffer& p_decoding_buffer, const LibDiameter__TypesAndValues::DiameterHeader& p_header, const params& p_params, avp** avp_ptr) { + loggers::get_instance().log(">>> diameter_codec::decode_avp: '%p'", _start); + + // Sanity checks + if (static_cast((_end - _start)) < 8) { + loggers::get_instance().warning("diameter_codec::decode_avp: Not enought bytes for AVP decoding"); + return -1; + } + + int code = static_cast(static_cast(*_start++ & 0xFF) << 24 | static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + loggers::get_instance().log("diameter_codec::decode_avp: code:'%d'", code); + unsigned char vendor_specific = static_cast(static_cast(*_start & 0x80) != 0); + loggers::get_instance().log("diameter_codec::decode_avp: vendor_specific:'0x%x'", vendor_specific); + unsigned char mandatory = static_cast(static_cast(*_start & 0x40) != 0); + loggers::get_instance().log("diameter_codec::decode_avp: mandatory:'0x%x'", mandatory); + unsigned char protected_ = static_cast(static_cast(*_start++ & 0x20) != 0); + loggers::get_instance().log("diameter_codec::decode_avp: protected_:'0x%x'", protected_); + int length = static_cast(static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + loggers::get_instance().log("diameter_codec::decode_avp: length:'%d'", length); + + int vendor_id = 0; + int payload_length = length; + if (vendor_specific) { + vendor_id = static_cast(static_cast(*_start++ & 0xFF) << 24 | static_cast(*_start++ & 0xFF) << 16 | static_cast(*_start++ & 0xFF) << 8 | static_cast(*_start++ & 0xFF)); + payload_length -= 12; + } else { + payload_length -= 8; + } + loggers::get_instance().log("diameter_codec::decode_avp: payload_length:'%d'", payload_length); + std::vector payload(_start, _start + payload_length); + + // if (length > static_cast(_end - _start)) { + // loggers::get_instance().warning("diameter_codec::decode_avp: Resize docoding buffer: '%d' to '%d'", length, static_cast(_end - _start)); + // length = static_cast(_end - _start); + // } + + int encoded_length = length; + if ((encoded_length % 4) !=0) { + encoded_length = (encoded_length / 4 + 1) * 4; + } + loggers::get_instance().log("diameter_codec::decode_avp: encoded_length:'%d'", encoded_length); + + loggers::get_instance().log("diameter_codec::decode_avp: encoded_length:'%d'", encoded_length - length); + loggers::get_instance().log("diameter_codec::decode_avp: payload_length + (encoded_length - length):'%d'", payload_length + (encoded_length - length)); + _start = _start + payload_length + (encoded_length - length); + loggers::get_instance().log("diameter_codec::decode_avp: new _start:'%p'", _start); + + *avp_ptr = new avp(code, vendor_specific, mandatory, protected_, length, vendor_id, encoded_length, payload); + + return 0; +} + +const std::unique_ptr& diameter_codec::get_avp(const int p_code) { + loggers::get_instance().log(">>> diameter_codec::get_avp: '%d'", p_code); + + if ((_it = _avps.find(p_code)) == _avps.cend()) { + loggers::get_instance().log("diameter_codec::get_avp: Failed to retrieve AVP '%d'", p_code); + return _nullptr; + } + + loggers::get_instance().log("diameter_codec::get_avp: got AVP '%d'", _it->second->get_code()); + return _it->second; +} + +std::string diameter_codec::command_code_2_enumerated(const int p_code, const boolean p_request_flag) { + + std::string code_enum; + if(p_request_flag) { + switch(p_code){ + case Code_CE: code_enum.assign("CER_E"); break; + case Code_RA: code_enum.assign("RAR_E"); break; + case Code_AC: code_enum.assign("ACR_E"); break; + case Code_AS: code_enum.assign("ASR_E"); break; + case Code_ST: code_enum.assign("STR_E"); break; + case Code_DW: code_enum.assign("DWR_E"); break; + case Code_DP: code_enum.assign("DPR_E"); break; + //CxDx + case Code_UA: code_enum.assign("UAR_E"); break; + case Code_SA: code_enum.assign("SAR_E"); break; + case Code_LI: code_enum.assign("LIR_E"); break; + case Code_MA: code_enum.assign("MAR_E"); break; + case Code_RT: code_enum.assign("RTR_E"); break; + case Code_PP: code_enum.assign("PPR_E"); break; + + /* Codes on Sh/Dh interface */ + case Code_UD: code_enum.assign("UDR_E"); break;// UDR User-Data-Request AS->HSS UDR (306) + case Code_PU: code_enum.assign("PUR_E"); break;// PUR Profile-Update-Request AS->HSS PUR (307) + case Code_SN: code_enum.assign("SNR_E"); break;// SNR Subscribe-Notifications-Request AS->HSS SNR (308) + case Code_PN: code_enum.assign("PNR_E"); break;// PNR Profile-Notification-Request HSS->AS + + //Rx + case Code_AA: code_enum.assign("AAR_E"); break; + //4006 + case Code_CC: code_enum.assign("CCR_E"); break; + + //s6a + case Code_UL: code_enum.assign("ULR_E"); break; // Update-Location-Request ULR (316)- Ref: TS 129 272 7.2.3-4 + case Code_CL: code_enum.assign("CLR_E"); break; // Cancel-Location-Request CLR (317)- Ref: TS 129 272 7.2.7-8 + case Code_AI: code_enum.assign("AIR_E"); break; // Authentication-Information-Request AIR (318)- Ref: TS 129 272 7.2.5-6 + case Code_ID: code_enum.assign("IDR_E"); break; // Insert-Subscriber-Data-Request IDR (319)- Ref: TS 129 272 7.2.9-10 + case Code_DS: code_enum.assign("DSR_E"); break; // Delete-Subscriber-Data-Request DSR (320)- Ref: TS 129 272 7.2.11-12 + case Code_PUE: code_enum.assign("PUER_E"); break; // Purge-UE-Request PUR (321)- Ref: TS 129 272 7.2.13-14 + case Code_RS: code_enum.assign("RSR_E"); break; // Reset-Request DSR (322)- Ref: TS 129 272 7.2.15-16 + case Code_NO: code_enum.assign("NOR_E"); break; // Notify-Request NOR (323)- Ref: TS 129 272 7.2.17-18 + } + } else { + switch(p_code) { + case Code_CE: code_enum.assign("CEA_E"); break; + case Code_RA: code_enum.assign("RAA_E"); break; + case Code_AC: code_enum.assign("ACA_E"); break; + case Code_AS: code_enum.assign("ASA_E"); break; + case Code_ST: code_enum.assign("STA_E"); break; + case Code_DW: code_enum.assign("DWA_E"); break; + case Code_DP: code_enum.assign("DPA_E"); break; + //CxDx + case Code_UA: code_enum.assign("UAA_E"); break; + case Code_SA: code_enum.assign("SAA_E"); break; + case Code_LI: code_enum.assign("LIA_E"); break; + case Code_MA: code_enum.assign("MAA_E"); break; + case Code_RT: code_enum.assign("RTA_E"); break; + case Code_PP: code_enum.assign("PPA_E"); break; + + /* Codes on Sh/Dh interface */ + case Code_UD: code_enum.assign("UDA_E"); break;// UDR User-Data-Request AS->HSS UDR (306) + case Code_PU: code_enum.assign("PUA_E"); break;// PUR Profile-Update-Request AS->HSS PUR (307) + case Code_SN: code_enum.assign("SNA_E"); break;// SNR Subscribe-Notifications-Request AS->HSS SNR (308) + case Code_PN: code_enum.assign("PNA_E"); break;// PNR Profile-Notification-Request HSS->AS + //Rx + case Code_AA: code_enum.assign("AAA_E"); break; + //4006 + case Code_CC: code_enum.assign("CCA_E"); break; + + //S6a + case Code_UL: code_enum.assign("ULA_E"); break; // Update-Location-Request ULR (316)- Ref: TS 129 272 7.2.3-4 + case Code_CL: code_enum.assign("CLA_E"); break; // Cancel-Location-Request CLR (317)- Ref: TS 129 272 7.2.7-8 + case Code_AI: code_enum.assign("AIA_E"); break; // Authentication-Information-Request AIR (318)- Ref: TS 129 272 7.2.5-6 + case Code_ID: code_enum.assign("IDA_E"); break; // Insert-Subscriber-Data-Request IDR (319)- Ref: TS 129 272 7.2.9-10 + case Code_DS: code_enum.assign("DSA_E"); break; // Delete-Subscriber-Data-Request DSR (320)- Ref: TS 129 272 7.2.11-12 + case Code_PUE: code_enum.assign("PUEA_E"); break; // Purge-UE-Request PUR (321)- Ref: TS 129 272 7.2.13-14 + case Code_RS: code_enum.assign("RSA_E"); break; // Reset-Request DSR (322)- Ref: TS 129 272 7.2.15-16 + case Code_NO: code_enum.assign("NOA_E"); break; // Notify-Request NOR (323)- Ref: TS 129 272 7.2.17-1 + } + } + return code_enum; +} // End of method command_code_2_enumerated + +const int diameter_codec::_command_codes[] = { + /* Ref: RFC3588 p.3.1 */ + + diameter_codec::Code_CE, // Capabilities-Exchange-Request CER (257) + diameter_codec::Code_CE, // Capabilities-Exchange-Answer CEA (257) + diameter_codec::Code_RA, // Re-Auth-Request RAR (258) + diameter_codec::Code_RA, // Re-Auth-Answer RAA (258) + /**/ + diameter_codec::Code_AC, // Accounting-Request ACR(271) + diameter_codec::Code_AC, // Accounting-Answer ACA (271) + /**/ + diameter_codec::Code_AS, // Abort-Session-Request ASR (274) + diameter_codec::Code_AS, // Abort-Sesion-Answer ASA (274) + diameter_codec::Code_ST, // Session-Termination-Request STR (275) + diameter_codec::Code_ST, // Session-Termination-Answer STA (275) +/**/ + diameter_codec::Code_DW, // Device-Watchdog-Request DWR (280) + diameter_codec::Code_DW, // Device-Watchdog-Answer DWA (280) + diameter_codec::Code_DP, // Disconnect-Peer-Request DPR (282) + diameter_codec::Code_DP, // Disconnect-Peer-Answer DPA (282) + +/* Codes on Cx */ + diameter_codec::Code_UA, // User-Authorization-Request UAR 300 + diameter_codec::Code_UA, // User-Authorization-Answer UAA 300 + diameter_codec::Code_SA, // Server-Assignment-Request SAR 301 + diameter_codec::Code_SA, // Server-Assignment-Answer SAA 301 + diameter_codec::Code_LI, // Location-Info-Request LIR 302 + diameter_codec::Code_LI, // Location-Info-Answer LIA 302 + diameter_codec::Code_MA, // Multimedia-Auth-Request MAR 303 + diameter_codec::Code_MA, // Multimedia-Auth-Answer MAA 303 + diameter_codec::Code_RT, // Registration-Termination-Request RTR 304 + diameter_codec::Code_RT, // Registration-Termination-Answer RTA 304 + diameter_codec::Code_PP, // Push-Profile-Request PPR 305 + diameter_codec::Code_PP, // Push-Profile-Answer PPA 305 + +/* Codes on Sh/Dh interface */ + diameter_codec::Code_UD, // UDR User-Data-Request AS->HSS 306 + diameter_codec::Code_UD, // UDA User-Data-Answer HSS->AS 306 + diameter_codec::Code_PU, // PUR Profile-Update-Request AS->HSS 307 + diameter_codec::Code_PU, // PUA Profile-Update-Answer HSS->AS 307 + diameter_codec::Code_SN, // SNR Subscribe-Notifications-Request AS->HSS 308 + diameter_codec::Code_SN, // SNA Subscribe-Notifications-Answer HSS->AS 308 + diameter_codec::Code_PN, // PNR Profile-Notification-Request HSS->AS 309 + diameter_codec::Code_PN, // PNA Profile-Notification-Answer AS->HSS 309 + +/* Codes on Rx interface */ + diameter_codec::Code_AA, // AAR Auth-Accounting-Request 265 + diameter_codec::Code_AA, // AAA Auth-Accounting-Request 265 + +/*RFC4006*/ + diameter_codec::Code_CC, // CCR Credit-Control-Request 272 + diameter_codec::Code_CC, // CCA Credit-Control-Answer 272 + + /* Codes on S6a interface - TS 129 272 */ + diameter_codec::Code_UL, // Update-Location-Request ULR (316)- Ref: TS 129 272 7.2.3 + diameter_codec::Code_UL, // Update-Location-Answer ULA (316)- Ref: TS 129 272 7.2.4 + diameter_codec::Code_CL, // Cancel-Location-Request CLR (317)- Ref: TS 129 272 7.2.7 + diameter_codec::Code_CL, // Cancel-Location-Answer CLA (317)- Ref: TS 129 272 7.2.8 + diameter_codec::Code_AI, // Authentication-Information-Request AIR (318)- Ref: TS 129 272 7.2.5 + diameter_codec::Code_AI, // Authentication-Information-Answer AIA (318)- Ref: TS 129 272 7.2.6 + diameter_codec::Code_ID, // Insert-Subscriber-Data-Request IDR (319)- Ref: TS 129 272 7.2.9 + diameter_codec::Code_ID, // Insert-Subscriber-Data-Answer IDA (319)- Ref: TS 129 272 7.2.10 + diameter_codec::Code_DS, // Delete-Subscriber-Data-Request DSR (320)- Ref: TS 129 272 7.2.11 + diameter_codec::Code_DS, // Delete-Subscriber-Data-Answer DSA (320)- Ref: TS 129 272 7.2.12 + diameter_codec::Code_PUE, // Purge-UE-Request PUR (321)- Ref: TS 129 272 7.2.13 + diameter_codec::Code_PUE, // Purge-UE-Answer PUA (321)- Ref: TS 129 272 7.2.14 + diameter_codec::Code_RS, // Reset-Request DSR (322)- Ref: TS 129 272 7.2.15 + diameter_codec::Code_RS, // Reset-Answer DSA (322)- Ref: TS 129 272 7.2.16 + diameter_codec::Code_NO, // Notify-Request NOR (323)- Ref: TS 129 272 7.2.17 + diameter_codec::Code_NO // Notify-Answer NOA (323)- Ref: TS 129 272 7.2.18 +}; diff --git a/ccsrc/Protocols/Diameter/diameter_codec.hh b/ccsrc/Protocols/Diameter/diameter_codec.hh new file mode 100644 index 0000000000000000000000000000000000000000..89326bdb39e92d0eaa1ca531ca4cb567c9371b3a --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_codec.hh @@ -0,0 +1,534 @@ +#pragma once + +#include +#include + +#include "codec_gen.hh" +#include "params.hh" + +#include "avp.hh" + +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibDiameter__TypesAndValues { + class DiameterHeader; //! Forward declaration of TITAN class +} + +class diameter_codec { + std::map > _avps; + std::map >::const_iterator _it; + std::unique_ptr _nullptr; + const unsigned char* _start; + const unsigned char* _end; + +public: + explicit diameter_codec() : _avps(), _it(), _nullptr(nullptr), _start(nullptr) { }; + virtual ~diameter_codec(); + + int encode_header(const LibDiameter__TypesAndValues::DiameterHeader& p_header, TTCN_Buffer& p_encoding_buffer); + int encode_session_id(const LibDiameter__Types__Base__AVPs::Session__Id__AVP& p_avp, TTCN_Buffer& p_encoding_buffer); + int encode_auth_session_state(const LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp, TTCN_Buffer& p_encoding_buffer); + int encode_origin_host(const LibDiameter__Types__Base__AVPs::Origin__Host__AVP& p_avp, TTCN_Buffer& p_encoding_buffer); + int encode_origin_realm(const LibDiameter__Types__Base__AVPs::Origin__Realm__AVP& p_avp, TTCN_Buffer& p_encoding_buffer); + + int decode_header(TTCN_Buffer& p_decoding_buffer, LibDiameter__TypesAndValues::DiameterHeader& p_header, const params& p_params); + int decode_avps(TTCN_Buffer& p_decoding_buffer, const LibDiameter__TypesAndValues::DiameterHeader& p_header, const params& p_params); + + const std::unique_ptr& get_avp(const int p_code); + +public: + int encode_avp_header(const LibDiameter__Types__Base__AVPs::AVP__Header& p_header, int* p_padding, TTCN_Buffer& p_encoding_buffer); + + int decode_avp(TTCN_Buffer& p_decoding_buffer, const LibDiameter__TypesAndValues::DiameterHeader& p_header, const params& p_params, avp** avp_ptr); + + std::string command_code_2_enumerated(const int p_code, const boolean p_request_flag); + + /** Command code of Request/Answer */ + static const int Code_CE=257;// Capabilities-Exchange + static const int Code_RA=258;// Re-Auth + static const int Code_AC=271;// Accounting + static const int Code_AS=274;// Abort-Session + static const int Code_ST=275;// Session-Termination + static const int Code_DW=280;// Device-Watchdog + static const int Code_DP=282;// Disconnect-Peer + + /* Codes on Cx */ + static const int Code_UA=300;// User-Authorization + static const int Code_SA=301;// Server-Assignment-Request SAR (284 in RFC4740 or 301 in TS 129 229) + static const int Code_LI=302;// Location-Info-Request LIR (285 in RFC4740 or 302 in TS 129 229) + static const int Code_MA=303;// Multimedia-Auth-Request MAR (286 in RFC4740 or 303 in TS 129 229) + static const int Code_RT=304;// Registration-Termination-Request RTR (287 in RFC4740 or 304 in TS 129 229) + static const int Code_PP=305;// Push-Profile-Request PPR (288 in RFC4740 or 305 in TS 129 229) + + /* Codes on Sh/Dh interface */ + static const int Code_UD=306;// UDR User-Data-Request AS->HSS UDR (306) + static const int Code_PU=307;// PUR Profile-Update-Request AS->HSS PUR (307) + static const int Code_SN=308;// SNR Subscribe-Notifications-Request AS->($1) ($2) (308) + static const int Code_PN=309;// PNR Profile-Notification-Request HSS->AS PNR (309) + + /* Codes on Rx interface */ + static const int Code_AA=265;// Auth-Accounting + + /* Codes on Gx interface - RFC4006 and TS 129 212 */ + static const int Code_CC=272;// Credit-Control + + /* Codes on S6a interface - TS 129 272 */ + static const int Code_UL=316; // Update-Location-Request ULR (316)- Ref: TS 129 272 7.2.3-4 + static const int Code_CL=317; // Cancel-Location-Request CLR (317)- Ref: TS 129 272 7.2.7-8 + static const int Code_AI=318; // Authentication-Information-Request AIR (318)- Ref: TS 129 272 7.2.5-6 + static const int Code_ID=319; // Insert-Subscriber-Data-Request IDR (319)- Ref: TS 129 272 7.2.9-10 + static const int Code_DS=320; // Delete-Subscriber-Data-Request DSR (320)- Ref: TS 129 272 7.2.11-12 + static const int Code_PUE=321; // Purge-UE-Request PUR (321)- Ref: TS 129 272 7.2.13-14 + static const int Code_RS=322; // Reset-Request DSR (322)- Ref: TS 129 272 7.2.15-16 + static const int Code_NO=323; // Notify-Request NOR (323)- Ref: TS 129 272 7.2.17-18 + + + /*RFC3588 AVP codes*/ + const int AVP_Accounting_Realtime_Required_AVP = 483; //Ref: RFC3588 9.8.7. Accounting-Realtime-Required AVP + const int AVP_Accounting_Record_Number_AVP = 485; //Ref: RFC3588 9.8.3. Accounting-Record-Number AVP + const int AVP_Accounting_Record_Type_AVP = 480; //Ref: RFC3588 9.8.1. Accounting-Record-Type AVP + const int AVP_Accounting_Sub_Session_Id_AVP = 287; //Ref: RFC3588 9.8.6. Accounting-Sub-Session-Id AVP + const int AVP_Acct_Application_Id_AVP = 259; //Ref: RFC3588 6.9. Acct-Application-Id AVP + const int AVP_Acct_Interim_Interval_AVP = 85; //Ref: RFC3588 9.8.2. Acct-Interim-Interval + const int AVP_Acct_Multi_Session_Id_AVP = 50; //Ref: RFC3588 9.8.5. Acct-Multi-Session-Id AVP + const int AVP_Acct_Session_Id_AVP = 44; //Ref: RFC3588 9.8.4. Acct-Session-Id AVP + const int AVP_Auth_Application_Id_AVP = 258; //Ref: RFC3588 6.8. Auth-Application-Id AVP + const int AVP_Class_AVP = 25; //Ref: RFC3588 8.20. Class AVP + const int AVP_Destination_Host_AVP = 293; //Ref: RFC3588 6.5. Destination-Host AVP + const int AVP_Destination_Realm_AVP = 283; //Ref: RFC3588 6.6. Destination-Realm AVP + const int AVP_Disconnect_Cause_AVP = 273; //Ref: RFC3588 5.4.3. Disconnect-Cause AVP + const int AVP_Error_Message_AVP = 281; //Ref: RFC3588 7.3. Error-Message AVP + const int AVP_Error_Reporting_Host_AVP = 294; //Ref: RFC3588 7.4. Error-Reporting-Host AVP + const int AVP_Event_Timestamp_AVP = 55; //Ref: RFC3588 8.21. Event-Timestamp AVP + const int AVP_Failed_AVP = 279; //Ref: RFC3588 7.5. Failed-AVP AVP + const int AVP_Firmware_Revision_AVP = 267; //Ref: RFC3588 5.3.4. Firmware-Revision AVP + const int AVP_Host_IP_Address_AVP = 257; //Ref: RFC3588 5.3.5. Host-IP-Address AVP + const int AVP_Inband_Security_Id_AVP = 299; //Ref: RFC3588 6.10. Inband-Security-Id AVP + const int AVP_Origin_Host_AVP = 264; //Ref: RFC3588 6.3. Origin-Host AVP + const int AVP_Origin_Realm_AVP = 296; //Ref: RFC3588 6.4. Origin-Realm AVP + const int AVP_Origin_State_Id_AVP = 278; //Ref: RFC3588 8.16. Origin-State-Id AVP + const int AVP_Product_Name_AVP = 269; //Ref: RFC3588 5.3.7. Product-Name AVP + const int AVP_Proxy_Host_AVP = 280; //Ref: RFC3588 6.7.3. Proxy-Host AVP + const int AVP_Proxy_Info_AVP = 284; //Ref: RFC3588 6.7.2. Proxy-Info AVP + const int AVP_Proxy_State_AVP = 33; //Ref: RFC3588 6.7.4. Proxy-State AVP + const int AVP_Re_Auth_Request_Type_AVP = 285; //Ref: RFC3588 8.12. Re-Auth-Request-Type AVP + const int AVP_Redirect_Host_AVP = 292; //Ref: RFC3588 6.12. Redirect-Host AVP + const int AVP_redirect_Max_Cache_Time_AVP = 262; //Ref: RFC3588 redirect_Max_Cache_Time_AVP is not defined. + const int AVP_Redirect_Host_Usage_AVP = 261; //Ref: RFC3588 6.13. Redirect-Host-Usage AVP + const int AVP_Result_Code_AVP = 268; //Ref: RFC3588 7.1. Result-Code AVP + const int AVP_Route_Record_AVP = 282; //Ref: RFC3588 6.7.1. Route-Record AVP + const int AVP_Session_Id_AVP = 263; //Ref: RFC3588 8.8. Session-Id AVP + const int AVP_Supported_Vendor_Id_AVP = 265; //Ref; RFC3588 5.3.6. Supported-Vendor-Id AVP + const int AVP_Termination_Cause_AVP = 295; //Ref: RFC3588 8.15. Termination-Cause AVP + const int AVP_User_Name_AVP = 1; //Ref: RFC3588 8.14. User-Name AVP + const int AVP_Vendor_Id_AVP = 266; //Ref: RFC3588 5.3.3. Vendor-Id AVP + const int AVP_Vendor_Specific_Appl_Id_AVP = 260; //Ref: RFC3588 6.11. Vendor-Specific-Application-Id AVP + /*end RFC3588 AVP codes*/ + + //RFC4740 AVP codes{ +// const int AVP_Auth_Grace_Period_AVP = 276; //Ref: RFC3588 8.10. Auth-Grace-Period AVP + const int AVP_Auth_Session_State_AVP = 277; //Ref: RFC3588 8.11. Auth-Session-State AVP +// const int AVP_Authorization_Lifetime_AVP = 291; //Ref: RFC3588 8.9. Authorization-Lifetime AVP +// const int AVP_Redirect_Max_Cache_Time_AVP = 262; //Ref: RFC3588 6.14. Redirect-Max-Cache-Time AVP +// const int AVP_SIP_Accounting_Information_AVP = 368; //Ref: RFC4740 9.1. SIP-Accounting-Information AVP +// const int AVP_SIP_Accounting_Server_URI_AVP = 369; //Ref: RFC4740 9.1.1. SIP-Accounting-Server-URI AVP +// const int AVP_SIP_AOR_AVP = 122; //Ref: RFC4740 9.8. SIP-AOR AVP + const int AVP_SIP_Auth_Data_Item_RFC_AVP = 376; //Ref: RFC4740 9.5. SIP-Auth-Data-Item AVP + const int AVP_SIP_Item_Number_AVP = 378; + const int AVP_SIP_Authenticate_RFC_AVP = 379; //Ref: RFC4740 9.5.3. SIP-Authenticate AVP +// const int AVP_SIP_Authentication_Info_AVP = 381; //Ref: RFC4740 9.5.5. SIP-Authentication-Info AVP + const int AVP_SIP_Authentication_Scheme_RFC_AVP = 377; //Ref: RFC4740 9.5.1. SIP-Authentication-Scheme AVP + const int AVP_SIP_Authorization_RFC_AVP = 380; //Ref: RFC4740 9.5.4. SIP-Authorization AVP +// const int AVP_SIP_Credit_Control_Server_URI_AVP = 370; //Ref: RFC4740 9.1.2. SIP-Credit-Control-Server-URI AVP +// const int AVP_SIP_Deregistration_Reason_AVP = 383; //Ref: RFC4740 9.5.5. SIP-Authentication-Info AVP +// const int AVP_SIP_Item_Number_AVP = 378; //Ref: RFC4740 9.5.2 SIP-Item-Number AVP +// const int AVP_SIP_MandatoryCapability_AVP = 373; //Ref: RFC4740 9.3.1. SIP-Mandatory-Capability AVP + const int AVP_SIP_Method_AVP = 393; //Ref: RFC4740 9.14. SIP-Method AVP + const int AVP_SIP_Number_Auth_Items_RFC_AVP = 382; //Ref: RFC4740 9.6. SIP-Number-Auth-Items AVP +// const int AVP_SIP_OptionalCapability_AVP = 374; //Ref: RFC4740 9.3.2. SIP-Optional-Capability AVP +// const int AVP_SIP_Reason_Code_AVP = 384; //Ref: RFC4740 9.7.1. SIP-Reason-Code AVP +// const int AVP_SIP_Reason_Info_AVP = 385; //Ref: RFC4740 9.7.2. SIP-Reason-Info AVP +// const int AVP_SIP_Server_Assignment_Type_AVP = 375; //Ref: RFC4740 9.4. SIP-Server-Assignment-Type AVP +// const int AVP_SIP_Server_Capabilities_AVP = 372; //Ref: RFC4740 9.3. SIP-Server-Capabilities AVP +// const int AVP_SIP_Server_URI_AVP = 371; //Ref: RFC4740 9.2 SIP-Server-URI AVP +// const int AVP_SIP_Supported_User_Data_Type_AVP = 388; //Ref: RFC4740 9.12.1. SIP-User-Data-Type AVP +// const int AVP_SIP_User_Authorization_Type_AVP = 387; //Ref: RFC4740 9.10. SIP-User-Authorization-Type AVP +// const int AVP_SIP_User_Data_Already_Available_AVP = 392; //Ref: RFC4740 9.13. SIP-User-Data-Already-Available AVP +// const int AVP_SIP_User_Data_AVP = 389; //Ref: RFC4740 9.12. SIP-User-Data AVP +// const int AVP_SIP_User_Data_Contents_AVP = 391; //Ref: RFC4740 9.12.2. SIP-User-Data-Contents AVP +// const int AVP_SIP_User_Data_Type_AVP = 390; //Ref: RFC4740 9.12.1. SIP-User-Data-Type AVP +// const int AVP_SIP_Visited_Network_Id_AVP = 386; //Ref: RFC4740 9.9. SIP-Visited-Network-Id AVP + //end of RFC4740 AVP codes + + const int AVP_Digest_Realm_AVP = 104; + const int AVP_Digest_Nonce_AVP = 105; + const int AVP_Digest_Domain_AVP = 119; + const int AVP_Digest_Opaque_AVP = 116; + const int AVP_Digest_Stale_AVP = 120; + const int AVP_Digest_Algorithm_AVP = 111; + const int AVP_Digest_QoP_AVP = 110; + const int AVP_Digest_HA1_AVP = 121; + const int AVP_Digest_Auth_Param_AVP = 117; + const int AVP_Digest_Username_AVP = 115; + const int AVP_Digest_URI_AVP = 109; + const int AVP_Digest_Response_AVP = 103; + const int AVP_Digest_CNonce_AVP = 113; + const int AVP_Digest_Nonce_Count_AVP = 114; + const int AVP_Digest_Method_AVP = 108; + const int AVP_Digest_Entity_Body_Hash_AVP = 112; + const int AVP_Digest_Nextnonce_AVP = 107; + const int AVP_Digest_Response_Auth_AVP = 106; + + + //RFC4005 AVP codes + const int AVP_Called_Station_Id_AVP = 30; + const int AVP_Framed_IP_Address_AVP = 8; + const int AVP_Framed_IPv6_Prefix_AVP = 97; + const int AVP_Framed_Interface_Id_AVP = 96; + //end of RFC4005 AVP codes + + //RFC4006 AVP codes +// const int AVP_Rating_Group_AVP = 433; //Ref: RFC4006 8.29. Rating-Group AVP +const int AVP_Tariff_Time_Change_AVP = 451; //Ref: RFC4006 8.20. Tariff-Time-Change AVP +// const int AVP_CC_Correlation_Id_AVP = 411; //Ref: RFC4006 8.1. CC-Correlation-Id AVP +const int AVP_CC_Input_Octets_AVP = 412; //Ref: RFC4006 8.24. CC-Input-Octets AVP +const int AVP_CC_Money_AVP = 413; //Ref: RFC4006 8.22. CC-Money AVP +const int AVP_CC_Output_Octets_AVP = 414; //Ref: RFC4006 8.25. CC-Output-Octets AVP + const int AVP_CC_Request_Number_AVP = 415; //Ref: RFC4006 8.2. CC-Request-Number AVP + const int AVP_CC_Request_Type_AVP = 416; //Ref: RFC4006 8.3. CC-Request-Type AVP +const int AVP_CC_Service_Specific_Units_AVP = 417; //Ref: RFC4006 8.26. CC-Service-Specific-Units AVP +const int AVP_CC_Session_Failover_AVP = 418; //Ref: RFC4006 8.4. CC-Session-Failover AVP +// const int AVP_vendIdCC_Sub_Session_Id_AVP = 419; //Ref: RFC4006 8.5. CC-Sub-Session-Id AVP +const int AVP_CC_Time_AVP = 420; //Ref: RFC4006 8.21. CC-Time AVP +const int AVP_CC_Total_Octets_AVP = 421; //Ref: RFC4006 8.23. CC-Total-Octets AVP +const int AVP_CC_Unit_Type_AVP = 454; //Ref: RFC4006 8.32. CC-Unit-Type AVP +// const int AVP_vendIdCheck_Balance_Result_AVP = 422; //Ref: RFC4006 8.6. Check-Balance-Result AVP 12.8. Check-Balance-Result AVP +const int AVP_Cost_Information_AVP = 423; //Ref: RFC4006 8.7. Cost-Information AVP +const int AVP_Cost_Unit_AVP = 424; //Ref: RFC4006 8.12. Cost-Unit AVP +const int AVP_Credit_Control_Failure_Handling_AVP = 427; //Ref: RFC4006 8.14. Credit-Control-Failure-Handling AVP +const int AVP_Currency_Code_AVP = 425; //Ref: RFC4006 8.11. Currency-Code AVP +const int AVP_Direct_Debiting_Failure_Handling_AVP = 428; //Ref: RFC4006 8.15. Direct-Debiting-Failure-Handling AVP +const int AVP_Exponent_AVP = 429; //Ref: RFC4006 8.9. Exponent AVP +const int AVP_Filter_Id_AVP = 11; //Ref: RFC4005 6.7. Filter-Id AVP +const int AVP_Final_Unit_Action_AVP = 449; //Ref: RFC4006 8.35. Final-Unit-Action AVP +const int AVP_Final_Unit_Indication_AVP = 430; //Ref: RFC4006 8.34. Final-Unit-Indication AVP +const int AVP_G_S_U_Pool_Identifier_AVP = 453; //Ref: RFC4006 8.31. G-S-U-Pool-Identifier AVP +const int AVP_G_S_U_Pool_Reference_AVP = 457; //Ref: RFC4006 8.30. G-S-U-Pool-Reference AVP +const int AVP_Granted_Service_Unit_AVP = 431; //Ref: RFC4006 8.17. Granted-Service-Unit AVP +// const int AVP_vendIdMultiple_Services_Credit_Control_AVP = 456; //Ref: RFC4006 8.16. Multiple-Services-Credit-Control AVP +const int AVP_Multiple_Services_Indicator_AVP = 455; //Ref: RFC4006 8.40. Multiple-Services-Indicator AVP + const int AVP_Redirect_Address_Type_AVP = 433; //Ref: RFC4006 8.38. Redirect-Address-Type AVP + const int AVP_Redirect_Server_Address_AVP = 435; //Ref: RFC4006 8.39. Redirect-Server-Address AVP + const int AVP_Redirect_Server_AVP = 434; //Ref: RFC4006 8.37. Redirect-Server AVP +// const int AVP_vendIdRequested_Action_AVP = 436; //Ref: RFC4006 8.41. Requested-Action AVP +const int AVP_Requested_Service_Unit_AVP = 437; //Ref: RFC4006 8.18. Requested-Service-Unit AVP +const int AVP_Restriction_Filter_Rule_AVP = 438; //Ref: RFC4006 8.36. Restriction-Filter-Rule AVP + const int AVP_Service_Context_Id_AVP = 461; //Ref: RFC4006 8.42. Service-Context-Id AVP + const int AVP_Service_Identifier_AVP = 439; //Ref: RFC4006 8.28. Service-Identifier AVP + const int AVP_Requested_Action_AVP = 436; + // const int AVP_vendIdService_Parameter_Info_AVP = 440; //Ref: RFC4006 8.43. Service-Parameter-Info AVP +// const int AVP_vendIdService_Parameter_Type_AVP = 441; //Ref: RFC4006 8.44. Service-Parameter-Type AVP +// const int AVP_vendIdService_Parameter_Value_AVP = 442; //Ref: RFC4006 8.45. Service-Parameter-Value AVP + const int AVP_Subscription_Id_AVP = 443; //Ref: RFC4006 8.46. Subscription-Id AVP + const int AVP_Subscription_Id_Data_AVP = 444; //Ref: RFC4006 + const int AVP_Subscription_Id_Type_AVP = 450; //Ref: RFC4006 8.47. Subscription-Id-Type AVP + const int AVP_Tariff_Change_Usage_AVP = 452;//Ref: RFC4006 8.27. Tariff-Change-Usage AVP + const int AVP_Rating_Group_AVP = 433; +const int AVP_Unit_Value_AVP = 445; //Ref: RFC4006 8.8. Unit-Value AVP +const int AVP_Used_Service_Unit_AVP = 446; //Ref: RFC4006 8.19. Used-Service-Unit AVP +// const int AVP_vendIdUser_Equipment_Info_AVP = 458; //Ref: RFC4006 8.49. User-Equipment-Info AVP +// const int AVP_vendIdUser_Equipment_Info_Type_AVP = 459; //Ref: RFC4006 8.50. User-Equipment-Info-Type AVP +// const int AVP_vendIdUser_Equipment_Info_Value_AVP = 460; //Ref: RFC4006 8.51. User-Equipment-Info-Value AVP +const int AVP_Validity_Time_AVP = 448; //Ref: RFC4006 8.33. Validity-Time AVP +const int AVP_Value_Digits_AVP = 447; //Ref: RFC4006 8.10. Value-Digits AVP + /*end of RFC4006 AVP codes*/ + + //TS129_229 AVP codes +// const int AVP_vendIdCharging_Information_AVP = 61; //Ref: ETSI TS 129 229 Charging_Information_AVP +// const int AVP_vendIdPrimary_Event_Charging_Function_Name_AVP = 619; //Ref: ETSI TS 129 229 Primary_Event_Charging_Function_Name_AVP +// const int AVP_vendIdSecondary_Event_Charging_Function_Name_AVP = 620; //Ref: ETSI TS 129 229 Secondary_Event_Charging_Function_Name_AVP +// const int AVP_vendIdPrimary_Charging_Collection_Function_Name_AVP = 621; //Ref: ETSI TS 129 229 Primary_Charging_Collection_Function_Name_AVP +// const int AVP_vendIdSecondary_Charging_Collection_Function_Name_AVP = 622; //Ref: ETSI TS 129 229 Secondary_Charging_Collection_Function_Name_AVP + const int AVP_Charging_Rule_Remove_AVP = 1002; + const int AVP_Charging_Rule_Install_AVP = 1001; + const int AVP_Charging_Rule_Report_AVP = 1018; + const int AVP_Routing_Rule_Install_AVP = 1081; + const int AVP_Routing_Rule_Remove_AVP = 1075; + const int AVP_QoS_Information_AVP = 1016; + const int AVP_Default_EPS_Bearer_QoS_AVP = 1049; + const int AVP_Server_Capabilities_AVP = 603; //Ref: ETSI TS 129 229 Server_Capabilities_AVP +// const int AVP_vendIdMandatory_Capability_AVP = 604; //Ref: ETSI TS 129 229 Mandatory_Capability_AVP +// const int AVP_vendIdOptional_Capability_AVP = 605; //Ref: ETSI TS 129 229 Optional_Capability_AVP + const int AVP_IP_CAN_Type_AVP = 1027; + const int AVP_RAT_Type_AVP = 1032; //Ref: ETSI TS 129 212 RAT_Type_AVP + const int AVP_Event_Trigger_AVP = 1006; + const int AVP_Session_Release_Cause_AVP = 1045; + const int AVP_Charging_Rule_Name_AVP = 1005; + const int AVP_AN_GW_Address_AVP = 1050; + + const int AVP_Experimental_Result_AVP = 297; + const int AVP_Experimental_Result_Code_AVP = 298; + const int AVP_User_Data_AVP = 606; + + /*end of TS129_229 AVP codes*/ + + //tS129_329 + const int AVP_Public_Identity_AVP = 601; + const int AVP_Server_Name_AVP = 602; + const int AVP_Feature_List_ID_AVP = 629; // Ref: 3GPP TS 29.229, clause 6.3.30 + const int AVP_Feature_List_AVP = 630; // Ref: 3GPP TS 29.229, clause 6.3.31 + const int AVP_Supported_Features_AVP = 628; // Ref: 3GPP TS 29.329 6.3.11 Supported-Features AVP (See 3GPP TS 29.229, clause 6.3.29) + /*End TS129_329*/ + + //Sh AVP codes + + ////const int AVP_Public_Identity_AVP = 601; + const int AVP_User_Identity_AVP = 700; + const int AVP_MSISDN_AVP= 701; + const int AVP_User_Data_Sh_AVP= 702; + const int AVP_Data_Reference_AVP = 703; + const int AVP_Service_Indication_AVP = 704; + const int AVP_Subs_Req_Type_AVP =705; + const int AVP_Requested_Domain_AVP = 706; + const int AVP_Current_Location_AVP = 707; + const int AVP_Identity_Set_AVP = 708; + const int AVP_Expiry_Time_AVP= 709; + const int AVP_Send_Data_Indication_AVP = 710; + const int AVP_Repository_Data_ID_AVP = 715; + const int AVP_Sequence_Number_AVP = 716; + ////const int AVP_Server_Name_AVP = 602; + ////const int AVP_Supported_Features_AVP = 628; + ////const int AVP_Feature_List_ID_AVP = 629; + ////const int AVP_Feature_List_AVP = 630; + const int AVP_Wildcarded_PSI_AVP = 634; + const int AVP_Wildcarded_IMPU_AVP = 636; + const int AVP_DSAI_Tag_AVP = 711; + ////const int AVP_Experimental_Result_Code_AVP = 298; + ////const int AVP_Experimental_Result_AVP = 297; + ////const int AVP_User_Data_AVP = 606; + //TS129_214 AVP codes + const int AVP_Media_Component_Description_AVP = 517; + const int AVP_Media_Component_Nr_AVP = 518; + const int AVP_Media_Sub_Component_AVP = 519; + const int AVP_AF_Application_Identifier_AVP = 504; + const int AVP_Media_Type_AVP = 520; + const int AVP_AF_Signalling_Protocol_AVP = 529; + const int AVP_Reservation_Priority_AVP = 458; + const int AVP_RS_Bandwidth_AVP = 522; + const int AVP_RR_Bandwidth_AVP = 521; + const int AVP_Codec_Data_AVP = 524; + const int AVP_Flow_Description_AVP = 507; + const int AVP_Flow_Number_AVP = 509; + const int AVP_Flow_Status_AVP = 511; + const int AVP_Flow_Usage_AVP = 512; + const int AVP_Specific_Action_AVP = 513; + const int AVP_Service_Info_Status_AVP = 527; + const int AVP_Rx_Request_Type_AVP = 533; + + //TS129_215 AVP codes + const int AVP_QoS_Rule_Name_AVP = 1054; + const int AVP_Rule_Failure_Code_AVP = 1031; + const int AVP_PDN_Connection_ID_AVP = 1065; + const int AVP_QoS_Rule_Report_AVP = 1055; + const int AVP_QoS_Rule_Install_AVP = 1051; + const int AVP_Multiple_BBERF_Action_AVP = 2204; + const int AVP_Session_Linking_Indicator_AVP = 1064; + const int AVP_Subses_Decision_Info_AVP = 2200; + const int AVP_Subses_Enforcement_Info_AVP = 2201; + const int AVP_Subsession_Id_AVP = 2202; + const int AVP_Subsession_Operation_AVP = 2203; + //End TS129_215 AVP codes + + //TS129_272 AVP codes + const int AVP_ULR_Flags_AVP = 1405; //ref: 7.3.7 ETSI TS 129 272 + const int AVP_ULA_Flags_AVP = 1406; //ref: 7.3.8 + const int AVP_Visited_PLMN_Id_AVP = 1407; //ref: 7.3.9 + const int AVP_UE_SRVCC_Capability_AVP = 1615; //ref: 7.3.130 + const int AVP_SGSN_Number_AVP = 1489; //ref: 7.3.102 + const int AVP_Homogeneous_Support_AVP = 1493; //ref: 7.3.107 + + const int AVP_Context_Identifier_AVP = 1423; //ref: 7.3.27 + const int AVP_Service_Selection_AVP = 493; //ref: 7.3.36 + const int AVP_MIP_Home_Agent_Address_AVP = 334; //ref: 7.3.42 - IETF RFC 4004 7.4 + const int AVP_MIP_Home_Agent_Host_AVP = 348; //ref: 7.3.43 - IETF RFC 4004 7.11 + const int AVP_MIP6_Home_Link_Prefix_AVP = 125; //ref:IETF RFC 5447 4.2.4 + const int AVP_MIP6_Agent_Info_AVP = 486; //ref: 7.3.45 + const int AVP_Visited_Network_Identifier_AVP = 600; //ref: 7.3.105 - TS 129 229 6.3.1 + const int AVP_SIP_Authentication_Context_AVP = 611; + const int AVP_UAR_Flags_AVP = 637; + const int AVP_User_Authorization_Type_AVP = 623; + const int AVP_Server_Assignment_Type_AVP = 614; + const int AVP_User_Data_Already_Available_AVP = 624; + const int AVP_SIP_Digest_Authenticate_AVP = 635; + const int AVP_SCSCF_Restoration_Info_AVP = 639; + const int AVP_Restoration_Info_AVP = 649; + const int AVP_Path_AVP = 640; + const int AVP_Contact_AVP = 641; + const int AVP_Subscription_Info_AVP = 642; + const int AVP_Originating_Request_AVP = 652; + const int AVP_Deregistration_Reason_AVP = 615; + const int AVP_Reason_Code_AVP = 616; + const int AVP_Reason_Info_AVP = 617; + const int AVP_Specific_APN_Info_AVP = 1472; //ref: 7.3.82 + const int AVP_Active_APN_AVP = 1612; //ref: 7.3.127 + const int AVP_Error_Diagnostic_AVP = 1614; //ref: 7.3.128; + const int AVP_Subscriber_Status_AVP = 1424; + const int AVP_Operator_Determined_Barring_AVP = 1425; + const int AVP_HPLMN_ODB_AVP = 1418; + const int AVP_Access_Restriction_Data_AVP = 1426; + const int AVP_APN_OI_Replacement_AVP = 1427; + const int AVP_Max_Requested_Bandwidth_UL_AVP = 516; + const int AVP_Max_Requested_Bandwidth_DL_AVP = 515; + const int AVP_APN_Aggregate_Max_Bitrate_UL_AVP = 1041; + const int AVP_APN_Aggregate_Max_Bitrate_DL_AVP = 1040; + const int AVP_AMBR_AVP = 1435; + + const int AVP_All_APN_Conf_Included_Id_AVP = 1428; + const int AVP_APN_Configuration_Profile_AVP = 1429; + const int AVP_PDN_Type_AVP = 1456; + const int AVP_QoS_Class_Identifier_AVP=1028; + const int AVP_Priority_Level_AVP = 1046; + const int AVP_Pre_emption_Capability_AVP = 1047; + const int AVP_Pre_emption_Vulnerability_AVP = 1048; + + const int AVP_Allocation_Retention_Priority_AVP =1034; + const int AVP_EPS_Subscribed_QoS_Profile_AVP = 1431; + const int AVP_APN_Configuration_AVP = 1430; + const int AVP_GMLC_Address_AVP = 2405; //ref: 7.3.109 - TS 129 173 6.4.7 + //.... + const int AVP_Complete_DL_Included_Indicator_AVP = 1468; + const int AVP_QoS_Subscribed_AVP = 1404; + const int AVP_PDP_Type_AVP = 1470; + const int AVP_PDP_Context_AVP = 1469; + const int AVP_GPRS_Subscription_Data_AVP = 1467; + const int AVP_Subscription_Data_AVP = 1400; //ref: 7.3.2 + const int AVP_Immediate_Response_Preferred_AVP = 1412; //ref: 7.3.16 + const int AVP_Re_synchronization_Info_AVP = 1411; //ref: 7.3.15 + const int AVP_Req_EUTRAN_Auth_Info_AVP = 1408; //ref: 7.3.11 + const int AVP_Req_UTRAN_GERAN_Auth_Info_AVP = 1409; //ref: 7.3.12 + + const int AVP_Item_Number_AVP = 1419; + const int AVP_RAND_AVP = 1447; + const int AVP_XRES_AVP = 1448; + const int AVP_AUTN_AVP = 1449; + const int AVP_KASME_AVP = 1450; + const int AVP_E_UTRAN_Vector_AVP = 1414; + const int AVP_SIP_Authentication_Scheme_3GPP_AVP = 608; + const int AVP_SIP_Authenticate_3GPP_AVP = 609; + const int AVP_SIP_Authorization_3GPP_AVP = 610; + const int AVP_SIP_Number_Auth_Items_3GPP_AVP = 607; + const int AVP_SIP_Auth_Data_Item_3GPP_AVP = 612;//ETSI TS 129 229 V10.5.0 (2013-04) Clause 6.3.13 SIP-Auth-Data-Item AVP + const int AVP_Identity_with_Emergency_Registration_AVP = 651; + const int AVP_Confidentiality_Key_AVP = 625; + const int AVP_Integrity_Key_AVP = 626; + const int AVP_Line_Identifier_AVP = 500; + const int AVP_UTRAN_Vector_AVP = 1415; + const int AVP_SRES_AVP = 1454; + const int AVP_Kc_AVP = 1453; + const int AVP_GERAN_Vector_AVP = 1416; + const int AVP_Authentication_Info_AVP = 1413; + + const int AVP_Cancellation_Type_AVP = 1420; + const int AVP_CLR_Flags_AVP = 1638; //ref: 7.3.152 + const int AVP_IDR_Flags_AVP = 1490; //ref: 7.3.103 + const int AVP_DSR_Flags_AVP = 1421; //ref: 7.3.25 + const int AVP_DSA_Flags_AVP = 1422; //ref: 7.3.26 + const int AVP_PUER_Flags_AVP= 1635; //ref: 7.3.149 + const int AVP_PUEA_Flags_AVP= 1442; //ref: 7.3.48 + const int AVP_IDA_Flags_AVP = 1441; //ref: 7.3.47 + const int AVP_NOR_Flags_AVP = 1443; //ref: 7.3.49 + const int AVP_IMS_Voice_PS_Sessions_Support_AVP = 1492; + const int AVP_Last_UE_Activity_Time_AVP = 1494; + const int AVP_EPS_User_State_AVP = 1495; + const int AVP_EPS_Location_Information_AVP = 1496; + //end TS129_272 AVP codes + + + //TS132_299 AVP codes + const int AVP_Charging_Information_AVP = 618; + const int AVP_Primary_Event_Charging_Function_Name_AVP = 619; + const int AVP_Secondary_Event_Charging_Function_Name_AVP = 620; + const int AVP_Primary_Charging_Collection_Function_Name_AVP = 621; + const int AVP_Secondary_Charging_Collection_Function_Name_AVP = 622; +// const int AVP_User_CSG_Information_AVP = 2319; //Ref: ETSI TS 132 299 User_CSG_Information_AVP +// const int AVP_CSG_Id_AVP = 1437; //Ref: ETSI TS 132 299 CSG_Id_AVP +// const int AVP_CSG_Access_Mode_AVP = 2317; //Ref: ETSI TS 132 299 CSG_Access_Mode_AVP +// const int AVP_CSG_Membership_Indication_AVP = 2318; //Ref: ETSI TS 132 299 CSG_Membership_Indication_AVP + const int AVP_Service_Information_AVP = 873; //Ref: ETSI TS 132 299 Service_Information_AVP + const int AVP_PS_Information_AVP = 874; //Ref: ETSI TS 132 299 PS_Information_AVP + const int AVP_WLAN_Information_AVP = 875; //Ref: ETSI TS 132 299 WLAN_Information_AVP + const int AVP_IMS_Information_AVP = 876; //Ref: ETSI TS 132 299 IMS_Information_AVP +// const int AVP_MMS_Information_AVP = 877; //Ref: ETSI TS 132 299 MMS_Information_AVP +// const int AVP_LCS_Information_AVP = 878; //Ref: ETSI TS 132 299 LCS_Information_AVP +// const int AVP_PoC_Information_AVP = 879; //Ref: ETSI TS 132 299 PoC_Information_AVP +// const int AVP_MBMS_Information_AVP = 880; //Ref: ETSI TS 132 299 MBMS_Information_AVP + const int AVP_Service_Generic_Information_AVP = 1256; //Ref: ETSI TS 132 299 Service_Generic_Information_AVP + const int AVP_Event_Type_AVP = 825; //Ref: ETSI TS 132 299 Event_Type_AVP + const int AVP_Event_AVP = 823; //Ref: ETSI TS 132 299 Event_AVP + const int AVP_Expires_AVP = 888; //Ref: ETSI TS 132 299 Expires_AVP + const int AVP_Role_Of_Node_AVP = 829; //Ref: ETSI TS 132 299 Role_Of_Node_AVP + const int AVP_Node_Functionality_AVP = 862; //Ref: ETSI TS 132 299 Node_Functionality_AVP + const int AVP_User_Session_ID_AVP = 830; //Ref: ETSI TS 132 299 User_Session_ID_AVP + const int AVP_Calling_Party_Address_AVP = 831; //Ref: ETSI TS 132 299 Calling_Party_Address_AVP + const int AVP_Called_Party_Address_AVP = 832; //Ref: ETSI TS 132 299 Called_Party_Address_AVP + const int AVP_Called_Asserted_Identity_AVP = 1250; //Ref: ETSI TS 132 299 Called_Asserted_Identity_AVP + const int AVP_Alternate_Charged_Party_Address_AVP = 1280;//Ref: ETSI TS 132 299 Alternate_Charged_Party_Address_AVP + const int AVP_Requested_Party_Address_AVP = 1251; //Ref: ETSI TS 132 299 Requested_Party_Address_AVP + const int AVP_Associated_URI_AVP = 856; //Ref: ETSI TS 132 299 Associated_URI_AVP + const int AVP_Time_Stamps_AVP = 833; //Ref: ETSI TS 132 299 Time_Stamps_AVP + const int AVP_SIP_Request_Timestamp_AVP = 834; //Ref: ETSI TS 132 299 SIP_Request_Timestamp_AVP + const int AVP_SIP_Response_Timestamp_AVP = 835; //Ref: ETSI TS 132 299 SIP_Response_Timestamp_AVP + const int AVP_Application_Server_Information_AVP = 850;//Ref: ETSI TS 132 299 Application_Server_Information_AVP + const int AVP_Application_Server_AVP = 836; //Ref: ETSI TS 132 299 Application_Server_AVP + const int AVP_Application_Provided_Called_Party_Address_AVP = 837; //Ref: ETSI TS 132 299 Application_Provided_Called_Party_Address_AVP + const int AVP_Inter_Operator_Identifier_AVP = 838; //Ref: ETSI TS 132 299 Inter_Operator_Identifier_AVP + const int AVP_Originating_IOI_AVP = 839; //Ref: ETSI TS 132 299 Originating_IOI_AVP + const int AVP_Terminating_IOI_AVP = 840; //Ref: ETSI TS 132 299 Terminating_IOI_AVP + const int AVP_IMS_Charging_Identifier_AVP = 841; //Ref: ETSI TS 132 299 IMS_Charging_Identifier_AVP + const int AVP_SDP_Session_Description_AVP = 842; //Ref: ETSI TS 132 299 SDP_Session_Description_AVP + const int AVP_SDP_Media_Component_AVP = 844; //Ref: ETSI TS 132 299 SDP_Media_Name_AVP +// const int AVP_SDP_Media_Name_AVP = 844; //Ref: ETSI TS 132 299 SDP_Media_Name_AVP +// const int AVP_SDP_Media_Description_AVP = 845; //Ref: ETSI TS 132 299 SDP_Media_Description_AVP +// const int AVP_Media_Initiator_Flag_AVP = 882; //Ref: ETSI TS 132 299 Media_Initiator_Flag_AVP +// const int AVP_Media_Initiator_Party_AVP = 1288; //Ref: ETSI TS 132 299 Media_Initiator_Party_AVP +// const int AVP_Authorized_QoS_AVP = 849; //Ref: ETSI TS 132 299 Authorized_QoS_AVP + const int AVP_Served_Party_IP_Address_AVP = 848; //Ref: ETSI TS 132 299 Served_Party_IP_Address_AVP + const int AVP_Trunk_Group_ID_AVP = 851; //Ref: ETSI TS 132 299 Trunk_Group_ID_AVP + const int AVP_Incoming_Trunk_Group_ID_AVP = 852; //Ref: ETSI TS 132 299 Incoming_Trunk_Group_ID_AVP + const int AVP_Outgoing_Trunk_Group_ID_AVP = 853; //Ref: ETSI TS 132 299 Outgoing_Trunk_Group_ID_AVP + + const int AVP_Delivery_Status_AVP =2104; + const int AVP_Application_Session_ID_AVP=2103; + const int AVP_Application_Service_Type_AVP=2102; + const int AVP_Application_Server_ID_AVP=2101; + + const int AVP_Reporting_Reason_AVP=872; + const int AVP_Time_Quota_Threshold_AVP=868; + const int AVP_Volume_Quota_Threshold_AVP=869; + const int AVP_Unit_Quota_Threshold_AVP=1226; + const int AVP_Quota_Holding_Time_AVP=871; + const int AVP_Quota_Consumption_Time_AVP=881; + const int AVP_Time_Quota_Type_AVP=1271; + const int AVP_Base_Time_Interval_AVP=1265; + const int AVP_Time_Quota_Mechanism_AVP=1270; + const int AVP_Envelope_Start_Time_AVP=1269; + const int AVP_Envelope_End_Time_AVP=1267; + const int AVP_Envelope_AVP=1266; + const int AVP_Envelope_Reporting_AVP=1268; + const int AVP_Trigger_AVP=1264; + const int AVP_Trigger_Type_AVP=870; + const int AVP_Refund_Information_AVP=2022; + const int AVP_Multiple_Services_Credit_Control_AVP = 456; + + const int AVP_Offline_Charging_AVP = 1278; + const int AVP_Low_Balance_Indication_AVP=2020; + const int AVP_Remaining_Balance_AVP = 2021; + //end of TS132_299 AVP codes + +private: + //NOTE: The order of constants in the following array is very important. + //It must exactly match order specified in TTCN-3 module. + static const int _command_codes[]; + +}; // End of class diameter_codec diff --git a/ccsrc/Protocols/Diameter/diameter_layer.cc b/ccsrc/Protocols/Diameter/diameter_layer.cc new file mode 100644 index 0000000000000000000000000000000000000000..da022b2b69ef65323947ef413a1f1b084f8b1849 --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_layer.cc @@ -0,0 +1,39 @@ +#include "LibDiameter_Interface.hh" +#include "LibDiameter_TypesAndValues.hh" + +#include "diameter_layer_factory.hh" + +#include "loggers.hh" + +#include "converter.hh" + +diameter_layer::diameter_layer(const std::string & p_type, const std::string & p_param) : t_layer(p_type), _params() { + loggers::get_instance().log(">>> diameter_layer::diameter_layer: %s, %s", to_string().c_str(), p_param.c_str()); + // Setup parameters + params::convert(_params, p_param); +} + +void diameter_layer::sendMsg(const LibDiameter__TypesAndValues::DIAMETER__MSG& p_diameter_message, params& p_param) { + loggers::get_instance().log_msg(">>> diameter_layer::sendMsg: ", p_diameter_message); + + // Encode DiameterMessage + OCTETSTRING data; + // _codec_register.encode(p_diameter_message, data); + // send_data(data, _params); +} + +void diameter_layer::send_data(OCTETSTRING& data, params& p_params) { + loggers::get_instance().log_msg(">>> diameter_layer::send_data: ", data); + + send_to_all_layers(data, p_params); +} + +void diameter_layer::receive_data(OCTETSTRING& data, params& p_params) +{ + loggers::get_instance().log_msg(">>> diameter_layer::receive_data: ", data); + + // Decode Diameter message +} + +diameter_layer_factory diameter_layer_factory::_f; + diff --git a/ccsrc/Protocols/Diameter/diameter_layer.hh b/ccsrc/Protocols/Diameter/diameter_layer.hh new file mode 100644 index 0000000000000000000000000000000000000000..a6409c614fe2a0aa96b33b63dd213fb3a437a62b --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_layer.hh @@ -0,0 +1,73 @@ +/*! + * \file diameter_layer.hh + * \brief Header file for ITS HTTP protocol layer. + * \author ETSI STF549 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include + +#include "t_layer.hh" + +namespace LibDiameter__Interface { + class DiameterPort; //! Forward declaration of TITAN class +} + +namespace LibDiameter__TypesAndValues { + class DIAMETER__MSG; //! Forward declaration of TITAN class +} + +class OCTETSTRING; //! Forward declaration of TITAN class + +/*! + * \class diameter_layer + * \brief This class provides a factory class to create an diameter_layer class instance + */ +class diameter_layer : public t_layer { + params _params; + +public: //! \publicsection + /*! + * \brief Specialised constructor + * Create a new instance of the diameter_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + diameter_layer() : t_layer(), _params() {}; + /*! + * \brief Specialised constructor + * Create a new instance of the diameter_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + diameter_layer(const std::string& p_type, const std::string& p_param); + /*! + * \brief Default destructor + */ + virtual ~diameter_layer() { }; + + void sendMsg(const LibDiameter__TypesAndValues::DIAMETER__MSG& p_diameter_message, params& p_param); + + /*! + * \virtual + * \fn void send_data(OCTETSTRING& data, params& p_params); + * \brief Send bytes formated data to the lower layers + * \param[in] p_data The data to be sent + * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters + */ + virtual void send_data(OCTETSTRING& data, params& p_params); + /*! + * \virtual + * \fn void receive_data(OCTETSTRING& data, params& p_params); + * \brief Receive bytes formated data from the lower layers + * \param[in] p_data The bytes formated data received + * \param[in] p_params Some lower layers parameters values when data was received + */ + virtual void receive_data(OCTETSTRING& data, params& info); +}; // End of class diameter_layer + diff --git a/ccsrc/Protocols/Diameter/diameter_layer_factory.hh b/ccsrc/Protocols/Diameter/diameter_layer_factory.hh new file mode 100644 index 0000000000000000000000000000000000000000..f43182f3236b8d3902ebf4cf012621b3eec391f5 --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_layer_factory.hh @@ -0,0 +1,45 @@ +/*! + * \file diameter_layer_factory.hh + * \brief Header file for Diameter protocol layer factory. + * \author ETSI TTF T010 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include "layer_stack_builder.hh" + +#include "diameter_layer.hh" + +/*! + * \class diameter_layer_factory + * \brief This class provides a factory class to create an diameter_layer class instance + */ +class diameter_layer_factory : public layer_factory { + static diameter_layer_factory _f; //! Reference to the unique instance of this class +public: //! \publicsection + /*! + * \brief Default constructor + * Create a new instance of the udp_layer_factory class + * \remark The HTTP layer identifier is HTTP + */ + diameter_layer_factory() { + // Register factory + layer_stack_builder::register_layer_factory("DIAMETER", this); + }; + /*! + * \fn layer* create_layer(const std::string & type, const std::string & param); + * \brief Create the layers stack based on the provided layers stack description + * \param[in] p_type The provided layers stack description + * \param[in] p_params Optional parameters + * \return 0 on success, -1 otherwise + * \inline + */ + inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param){ + return new diameter_layer(p_type, p_param); + }; +}; // End of class diameter_layer_factory + diff --git a/ccsrc/Protocols/Diameter/diameter_uar_codec.cc b/ccsrc/Protocols/Diameter/diameter_uar_codec.cc new file mode 100644 index 0000000000000000000000000000000000000000..4c7f93e1128ee0334aa741976f3c6bd1a805795f --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_uar_codec.cc @@ -0,0 +1,208 @@ +#include + +#include "avp.hh" + +#include "diameter_uar_codec.hh" + +#include "loggers.hh" +#include "converter.hh" + +template class OPTIONAL; +class TTCN_EncDec; + +int diameter_uar_codec::encode(const LibDiameter__TypesAndValues::UAR__MSG& p_uar_msg, OCTETSTRING& p_data) { + loggers::get_instance().log_msg(">>> diameter_uar_codec::encode", (const Base_Type &)p_uar_msg); + + TTCN_EncDec::clear_error(); + TTCN_Buffer encoding_buffer; + + if (_codec.encode_header(p_uar_msg.header(), encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_uar_codec::encode: Failed to encode UAR header"); + return -1; + } + + if (encode_avps(p_uar_msg, encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_uar_codec::encode: Failed to encode UAR AVPs"); + return -1; + } + + p_data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()); + // Update length at offset #1 on 3 bytes + + return 0; +} + +int diameter_uar_codec::encode_avps(const LibDiameter__TypesAndValues::UAR__MSG& p_uar_msg, TTCN_Buffer p_encoding_buffer) { + loggers::get_instance().log_msg(">>> diameter_uar_codec::encode_avps: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + + // SessionId + if (_codec.encode_session_id(p_uar_msg.session__Id(), p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_uar_codec::encode_avps: Failed to encode session__Id__AVP"); + return -1; + } + + // Mandatory AVPs + if (_codec.encode_origin_host(p_uar_msg.uAR__Body().origin__Host(), p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_uar_codec::encode_avps: Failed to encode Origin__Host__AVP"); + return -1; + } + if (_codec.encode_origin_realm(p_uar_msg.uAR__Body().origin__Realm(), p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_uar_codec::encode_avps: Failed to encode Origin__Realm__AVP"); + return -1; + } + + + + // Optional AVPs + if (_codec.encode_auth_session_state(p_uar_msg.uAR__Body().auth__Session__State(), p_encoding_buffer) == -1) { + loggers::get_instance().warning("diameter_uar_codec::encode_avps: AVP is missing"); + return -1; + } + // TODO Continue + + loggers::get_instance().log_msg("<<< diameter_uar_codec::encode_avps: ", OCTETSTRING(p_encoding_buffer.get_len(), p_encoding_buffer.get_data())); + return 0; +} + +int diameter_uar_codec::decode(const OCTETSTRING& p_data, LibDiameter__TypesAndValues::UAR__MSG& p_uar_msg, params* p_params) { + loggers::get_instance().log_msg(">>> diameter_uar_codec::decode: ", (const Base_Type &)p_data); + + TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_DEFAULT); + TTCN_EncDec::clear_error(); + TTCN_Buffer decoding_buffer(p_data); + + params _params; + _params.insert(std::make_pair("Request", "1")); + + if (_codec.decode_header(decoding_buffer, p_uar_msg.header(), static_cast(_params)) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Failed to decode UAR message header"); + return -1; + } + + if (_codec.decode_avps(decoding_buffer, p_uar_msg.header(), static_cast(_params)) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Failed to decode UAR AVPs"); + return -1; + } + + // Mandatory AVPs + if (decode_auth_session_state(p_uar_msg.uAR__Body().auth__Session__State()) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Missing Auth__Session__State__AVP"); + return -1; + } + if (decode_origin_host(p_uar_msg.uAR__Body().origin__Host()) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Missing Origin__Host__AVP"); + return -1; + } + if (decode_origin_realm(p_uar_msg.uAR__Body().origin__Realm()) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Missing Origin__Realm__AVP"); + return -1; + } + if (decode_destination_realm(p_uar_msg.uAR__Body().destination__Realm()) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Missing Destination__Realm__AVP"); + return -1; + } + if (decode_session_id(p_uar_msg.session__Id()) == -1) { + loggers::get_instance().warning("diameter_uar_codec::decode: Missing Destination__Realm__AVP"); + return -1; + } + + // Optinal AVPs + if (decode_destination_host(p_uar_msg.uAR__Body().destination__Host()) == -1) { + p_uar_msg.uAR__Body().destination__Host().set_to_omit(); + } + + p_uar_msg.uAR__Body().vendor__Specific__Application__Id().set_to_omit(); + p_uar_msg.uAR__Body().auth__Application__Id().set_to_omit(); + p_uar_msg.uAR__Body().sIP__AOR().set_to_omit(); + p_uar_msg.uAR__Body().user__Name().set_to_omit(); + p_uar_msg.uAR__Body().sIP__Visited__Network__Id().set_to_omit(); + p_uar_msg.uAR__Body().sIP__User__Authorization__Type().set_to_omit(); + p_uar_msg.uAR__Body().supported__Features().set_to_omit(); + p_uar_msg.uAR__Body().public__Identity().set_to_omit(); + p_uar_msg.uAR__Body().visited__Network__Identifier().set_to_omit(); + p_uar_msg.uAR__Body().user__Authorization__Type().set_to_omit(); + p_uar_msg.uAR__Body().uAR__Flags().set_to_omit(); + p_uar_msg.uAR__Body().proxy__Info().set_to_omit(); + p_uar_msg.uAR__Body().route__Record().set_to_omit(); + p_uar_msg.uAR__Body().aVP__Type().set_to_omit(); + + return 0; +} + +int diameter_uar_codec::decode_session_id(LibDiameter__Types__Base__AVPs::Session__Id__AVP& p_avp) { + loggers::get_instance().log("diameter_uar_codec::decode_session_id: looking for '%d", _codec.AVP_Session_Id_AVP); + const std::unique_ptr& avp_ptr = _codec.get_avp(_codec.AVP_Session_Id_AVP); + if (avp_ptr.get() == nullptr) { + loggers::get_instance().warning("diameter_uar_codec::decode_session_id: AVP is missing"); + return -1; + } + avp_ptr->decode_session_id(p_avp); + loggers::get_instance().log_msg("diameter_uar_codec::decode_session_id: ", p_avp); + + return 0; +} + +int diameter_uar_codec::decode_auth_session_state(LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp) { + loggers::get_instance().log("diameter_uar_codec::decode_auth_session_state: looking for '%d", _codec.AVP_Auth_Session_State_AVP); + const std::unique_ptr& avp_ptr = _codec.get_avp(_codec.AVP_Auth_Session_State_AVP); + if (avp_ptr.get() == nullptr) { + loggers::get_instance().warning("diameter_uar_codec::decode_auth_session_state: AVP is missing"); + return -1; + } + avp_ptr->decode_auth_session_state(p_avp); + loggers::get_instance().log_msg("diameter_uar_codec::decode_auth_session_state: ", p_avp); + + return 0; +} + +int diameter_uar_codec::decode_origin_host(LibDiameter__Types__Base__AVPs::Origin__Host__AVP& p_avp) { + loggers::get_instance().log("diameter_uar_codec::decode_origin_host: looking for '%d", _codec.AVP_Origin_Host_AVP); + const std::unique_ptr& avp_ptr = _codec.get_avp(_codec.AVP_Origin_Host_AVP); + if (avp_ptr.get() == nullptr) { + loggers::get_instance().warning("diameter_uar_codec::decode_origin_host: AVP is missing"); + return -1; + } + avp_ptr->decode_origin_host(p_avp); + loggers::get_instance().log_msg("diameter_uar_codec::decode_origin_host: ", p_avp); + + return 0; +} + +int diameter_uar_codec::decode_destination_host(LibDiameter__Types__Base__AVPs::Destination__Host__AVP& p_avp) { + loggers::get_instance().log("diameter_uar_codec::decode_destination_host: looking for '%d", _codec.AVP_Destination_Host_AVP); + const std::unique_ptr& avp_ptr = _codec.get_avp(_codec.AVP_Destination_Host_AVP); + if (avp_ptr.get() == nullptr) { + loggers::get_instance().warning("diameter_uar_codec::decode_destination_host: AVP is missing"); + return -1; + } + avp_ptr->decode_destination_host(p_avp); + loggers::get_instance().log_msg("diameter_uar_codec::decode_destination_host: ", p_avp); + + return 0; +} + +int diameter_uar_codec::decode_origin_realm(LibDiameter__Types__Base__AVPs::Origin__Realm__AVP& p_avp) { + loggers::get_instance().log("diameter_uar_codec::decode_origin_realm: looking for '%d", _codec.AVP_Origin_Realm_AVP); + const std::unique_ptr& avp_ptr = _codec.get_avp(_codec.AVP_Origin_Realm_AVP); + if (avp_ptr.get() == nullptr) { + loggers::get_instance().warning("diameter_uar_codec::decode_origin_realm: AVP is missing"); + return -1; + } + avp_ptr->decode_origin_realm(p_avp); + loggers::get_instance().log_msg("diameter_uar_codec::decode_origin_realm: ", p_avp); + + return 0; +} + +int diameter_uar_codec::decode_destination_realm(LibDiameter__Types__Base__AVPs::Destination__Realm__AVP& p_avp) { + loggers::get_instance().log("diameter_uar_codec::decode_destination_realm: looking for '%d", _codec.AVP_Destination_Realm_AVP); + const std::unique_ptr& avp_ptr = _codec.get_avp(_codec.AVP_Destination_Realm_AVP); + if (avp_ptr.get() == nullptr) { + loggers::get_instance().warning("diameter_uar_codec::decode_destination_realm: AVP is missing"); + return -1; + } + avp_ptr->decode_destination_realm(p_avp); + loggers::get_instance().log_msg("diameter_uar_codec::decode_destination_realm: ", p_avp); + + return 0; +} diff --git a/ccsrc/Protocols/Diameter/diameter_uar_codec.hh b/ccsrc/Protocols/Diameter/diameter_uar_codec.hh new file mode 100644 index 0000000000000000000000000000000000000000..910b13d099ad038e13e81df48b720f867f7ab293 --- /dev/null +++ b/ccsrc/Protocols/Diameter/diameter_uar_codec.hh @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include "codec_gen.hh" +#include "params.hh" + +#include "avp.hh" +#include "diameter_codec.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibDiameter__TypesAndValues { + class UAR__MSG; //! Forward declaration of TITAN class +} + +class diameter_uar_codec: public codec_gen < + LibDiameter__TypesAndValues::UAR__MSG, + LibDiameter__TypesAndValues::UAR__MSG> +{ + std::vector avps; + diameter_codec _codec; + +public: + diameter_uar_codec() : codec_gen(), avps(), _codec() { }; + virtual ~diameter_uar_codec() { }; + + virtual int encode (const LibDiameter__TypesAndValues::UAR__MSG& p_uar_msg, OCTETSTRING& p_data); + virtual int decode (const OCTETSTRING& p_data, LibDiameter__TypesAndValues::UAR__MSG& p_uar_msg, params* p_params = NULL); + +private: + int encode_avps(const LibDiameter__TypesAndValues::UAR__MSG& p_uar_msg, TTCN_Buffer p_encoding_buffer); + + int decode_session_id(LibDiameter__Types__Base__AVPs::Session__Id__AVP& p_avp); + int decode_auth_session_state(LibDiameter__Types__Base__AVPs::Auth__Session__State__AVP& p_avp); + int decode_origin_host(LibDiameter__Types__Base__AVPs::Origin__Host__AVP& p_avp); + int decode_destination_host(LibDiameter__Types__Base__AVPs::Destination__Host__AVP& p_avp); + int decode_origin_realm(LibDiameter__Types__Base__AVPs::Origin__Realm__AVP& p_avp); + int decode_destination_realm(LibDiameter__Types__Base__AVPs::Destination__Realm__AVP& p_avp); + +}; // End of class diameter_uar_codec diff --git a/ccsrc/Protocols/Diameter/module.mk b/ccsrc/Protocols/Diameter/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..e3ad396cbedbf445af7f239ec5c7de866c785c4f --- /dev/null +++ b/ccsrc/Protocols/Diameter/module.mk @@ -0,0 +1,7 @@ +sources := \ + diameter_layer.cc \ + diameter_codec.cc \ + diameter_uar_codec.cc \ + avp.cc + +includes := . diff --git a/ccsrc/Protocols/Http/http_codec_emtel.cc b/ccsrc/Protocols/Http/http_codec_emtel.cc new file mode 100644 index 0000000000000000000000000000000000000000..31b69f4eaaf450ec4b4e8bde53c951399d0df3aa --- /dev/null +++ b/ccsrc/Protocols/Http/http_codec_emtel.cc @@ -0,0 +1,111 @@ +#include "http_codec_emtel.hh" + +#include "loggers.hh" + +bool http_codec_emtel::encode_body_xml(const LibHttp__XmlMessageBodyTypes::XmlBody &p_xml_body, OCTETSTRING &p_encoding_buffer, const std::string &p_content_type) { + loggers::get_instance().log(">>> http_codec_emtel::encode_body_xml"); + + std::map > >::const_iterator it; + bool processed = false; + loggers::get_instance().log("http_codec_emtel::encode_body_xml: Content-Type:'%s'", p_content_type.c_str()); + if (p_content_type.find("held") != std::string::npos) { + it = _codecs.find("held"); // TODO Use params + if (it != _codecs.cend()) { + loggers::get_instance().log("http_codec_emtel::encode_body_xml: Call 'held_codec'"); + _codecs["held"]->encode((Record_Type&)p_xml_body, p_encoding_buffer); // TODO Use params + processed = true; + } + } else if (p_content_type.find("lost") != std::string::npos) { + it = _codecs.find("lost"); // TODO Use params + if (it != _codecs.cend()) { + loggers::get_instance().log("http_codec_emtel::encode_body_xml: Call 'lost_codec'"); + _codecs["lost"]->encode((Record_Type&)p_xml_body, p_encoding_buffer); // TODO Use params + processed = true; + } + } // TODO Add new HTTP message codec_gen here + if (!processed) { + loggers::get_instance().warning("http_codec_emtel::encode_body_xml: Unsupported HTTP codec_gen, use raw field as default"); + p_encoding_buffer = OCTETSTRING(0, nullptr); + } + + return true; +} + +bool http_codec_emtel::decode_body_xml(const OCTETSTRING &p_data, LibHttp__XmlMessageBodyTypes::XmlBody &p_xml_body, const std::string &p_content_type, params* p_params) { + loggers::get_instance().log(">>> http_codec_emtel::decode_body_xml"); + + if ( + ((*p_params)["decode_str"].find("=\"urn:ietf:params:xml:ns:geopriv:held\"") != std::string::npos) || + ((*p_params)["decode_str"].find("=\"urn:ietf:params:xml:ns:pidf\"") != std::string::npos) + ) { + loggers::get_instance().log("http_codec_emtel::decode_body_xml: Find 'urn:ietf:params:xml:ns:geopriv:held'"); + if (_codecs["held"].get() != nullptr) { + loggers::get_instance().log("http_codec_emtel::decode_body_xml: Call 'held_codec'"); + if (_codecs["held"]->decode(p_data, (Record_Type&)p_xml_body, p_params) == -1) { + loggers::get_instance().warning("http_codec_emtel::decode_body_xml: Failed to decode HELD message"); + p_xml_body.raw() = CHARSTRING(p_data.lengthof(), (char*)static_cast(p_data)); + } else { + loggers::get_instance().log_msg("http_codec_emtel::decode_body_xml: Decoded message:", p_xml_body); + } + } else { + loggers::get_instance().warning("http_codec_emtel::decode_body_xml: No codec_gen for HELD"); + p_xml_body.raw() = CHARSTRING(p_data.lengthof(), (char*)static_cast(p_data)); + } + } else if ((*p_params)["decode_str"].find("=\"urn:ietf:params:xml:ns:lost1\"") != std::string::npos) { + loggers::get_instance().log("http_codec_emtel::decode_body_xml: Find 'urn:ietf:params:xml:ns:lost1'"); + if (_codecs["lost"].get() != nullptr) { + loggers::get_instance().log("http_codec_emtel::decode_body_xml: Call 'lost_codec'"); + if (_codecs["lost"]->decode(p_data, (Record_Type&)p_xml_body, p_params) == -1) { + loggers::get_instance().warning("http_codec_emtel::decode_body_xml: Failed to decode LOST message"); + p_xml_body.raw() = CHARSTRING(p_data.lengthof(), (char*)static_cast(p_data)); + } else { + loggers::get_instance().log_msg("http_codec_emtel::decode_body_xml: Decoded message:", p_xml_body); + } + } else { + loggers::get_instance().warning("http_codec_emtel::decode_body_xml: No codec_gen for LOST"); + p_xml_body.raw() = CHARSTRING(p_data.lengthof(), (char*)static_cast(p_data)); + } + } else { + loggers::get_instance().warning("http_codec_emtel::decode_body_xml: No XML codec_gen found"); + p_xml_body.raw() = CHARSTRING(p_data.lengthof(), (char*)static_cast(p_data)); + } + + return true; +} + +bool http_codec_emtel::encode_body_json(const LibHttp__JsonMessageBodyTypes::JsonBody &p_json_body, OCTETSTRING &p_encoding_buffer, const std::string &p_content_type) { + loggers::get_instance().log(">>> http_codec_emtel::encode_body_json"); + + std::map > >::const_iterator it; + bool processed = false; + loggers::get_instance().log("http_codec_emtel::encode_body_json: Content-Type:'%s'", p_content_type.c_str()); + if (p_content_type.find("json") != std::string::npos) { + it = _codecs.find("json"); // TODO Use params + if (it != _codecs.cend()) { + loggers::get_instance().log("http_codec_emtel::encode_body_json: Call 'json_codec'"); + _codecs["json"]->encode((Record_Type&)p_json_body, p_encoding_buffer); // TODO Use params + processed = true; + } + } // TODO Add new HTTP message codec_gen here + if (!processed) { + loggers::get_instance().warning("http_codec_emtel::encode_body_json: Unsupported HTTP codec_gen, use raw field as default"); + p_encoding_buffer = OCTETSTRING(0, nullptr); + } + + return true; +} +bool http_codec_emtel::decode_body_json(const OCTETSTRING &p_data, LibHttp__JsonMessageBodyTypes::JsonBody &p_json_body, const std::string &p_content_type, params* p_params) { + loggers::get_instance().log(">>> http_codec_emtel::decode_body_json"); + + if (_codecs["json"].get() != nullptr) { + loggers::get_instance().log("http_codec_emtel::decode_body_json: Call 'json_codec'"); + if (_codecs["json"]->decode(p_data, (Record_Type&)p_json_body, p_params) == -1) { + loggers::get_instance().warning("http_codec_emtel::decode_body_json: Failed to decode JSON message"); + p_json_body.raw() = CHARSTRING(p_data.lengthof(), (char*)static_cast(p_data)); + } else { + loggers::get_instance().log_msg("http_codec_emtel::decode_body_json: Decoded message:", p_json_body); + } + } + + return true; +} \ No newline at end of file diff --git a/ccsrc/Protocols/Http/http_codec_emtel.hh b/ccsrc/Protocols/Http/http_codec_emtel.hh new file mode 100644 index 0000000000000000000000000000000000000000..9e4f30b06114e8b638080c87bebb5d7cf25ae4de --- /dev/null +++ b/ccsrc/Protocols/Http/http_codec_emtel.hh @@ -0,0 +1,18 @@ +#pragma once + +#include "http_codec.hh" + +#include "LibHttp_MessageBodyTypes.hh" + +class http_codec_emtel : public http_codec { + +public: + explicit http_codec_emtel() : http_codec(){}; + virtual ~http_codec_emtel(){}; + +protected: //! \protectedsection + bool encode_body_xml(const LibHttp__XmlMessageBodyTypes::XmlBody &p_xml_body, OCTETSTRING &p_encoding_buffer, const std::string &p_content_type); + bool decode_body_xml(const OCTETSTRING &p_data, LibHttp__XmlMessageBodyTypes::XmlBody &p_xml_body, const std::string &p_content_type, params* p_params); + bool encode_body_json(const LibHttp__JsonMessageBodyTypes::JsonBody &p_json_body, OCTETSTRING &p_encoding_buffer, const std::string &p_content_type); + bool decode_body_json(const OCTETSTRING &p_data, LibHttp__JsonMessageBodyTypes::JsonBody &p_json_body, const std::string &p_content_type, params* p_params); +}; // End of class http_codec_emtel diff --git a/ccsrc/Protocols/Http/module.mk b/ccsrc/Protocols/Http/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..0acfc845c6ae5adc69f69cec3422903195e4bcb2 --- /dev/null +++ b/ccsrc/Protocols/Http/module.mk @@ -0,0 +1,3 @@ +sources := http_codec_emtel.cc +includes := . + diff --git a/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer.cc b/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer.cc new file mode 100644 index 0000000000000000000000000000000000000000..ab5bfa062796236519df459ba774a1b95dbfbc7a --- /dev/null +++ b/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer.cc @@ -0,0 +1,39 @@ +#include "LibDiameter_Interface.hh" +#include "LibDiameter_TypesAndValues.hh" + +#include "lower_layer_pport_layer_factory.hh" + +#include "loggers.hh" + +#include "converter.hh" + +lower_layer_pport_layer::lower_layer_pport_layer(const std::string & p_type, const std::string & p_param) : t_layer(p_type), _params() { + loggers::get_instance().log(">>> lower_layer_pport_layer::lower_layer_pport_layer: %s, %s", to_string().c_str(), p_param.c_str()); + // Setup parameters + params::convert(_params, p_param); +} + +void lower_layer_pport_layer::sendMsg(const LibDiameter__TypesAndValues::Lower__Layer__Primitive& p_diameter_message, params& p_param) { + loggers::get_instance().log_msg(">>> lower_layer_pport_layer::sendMsg: ", p_diameter_message); + + // Encode DiameterMessage + OCTETSTRING data; + // _codec_register.encode(p_diameter_message, data); + // send_data(data, _params); +} + +void lower_layer_pport_layer::send_data(OCTETSTRING& data, params& p_params) { + loggers::get_instance().log_msg(">>> lower_layer_pport_layer::send_data: ", data); + + send_to_all_layers(data, p_params); +} + +void lower_layer_pport_layer::receive_data(OCTETSTRING& data, params& p_params) +{ + loggers::get_instance().log_msg(">>> lower_layer_pport_layer::receive_data: ", data); + + // Decode Diameter message +} + +lower_layer_pport_layer_factory lower_layer_pport_layer_factory::_f; + diff --git a/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer.hh b/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer.hh new file mode 100644 index 0000000000000000000000000000000000000000..17c73b1b42035d71804eeda0d91a064bf495c6a2 --- /dev/null +++ b/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer.hh @@ -0,0 +1,73 @@ +/*! + * \file lower_layer_pport_layer.hh + * \brief Header file for ITS HTTP protocol layer. + * \author ETSI STF549 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include + +#include "t_layer.hh" + +namespace LibDiameter__Interface { + class LowerLayerPPort; //! Forward declaration of TITAN class +} + +namespace LibDiameter__TypesAndValues { + class Lower__Layer__Primitive; //! Forward declaration of TITAN class +} + +class OCTETSTRING; //! Forward declaration of TITAN class + +/*! + * \class lower_layer_pport_layer + * \brief This class provides a factory class to create an lower_layer_pport_layer class instance + */ +class lower_layer_pport_layer : public t_layer { + params _params; + +public: //! \publicsection + /*! + * \brief Specialised constructor + * Create a new instance of the lower_layer_pport_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + lower_layer_pport_layer() : t_layer(), _params() {}; + /*! + * \brief Specialised constructor + * Create a new instance of the lower_layer_pport_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + lower_layer_pport_layer(const std::string& p_type, const std::string& p_param); + /*! + * \brief Default destructor + */ + virtual ~lower_layer_pport_layer() { }; + + void sendMsg(const LibDiameter__TypesAndValues::Lower__Layer__Primitive& p_diameter_message, params& p_param); + + /*! + * \virtual + * \fn void send_data(OCTETSTRING& data, params& p_params); + * \brief Send bytes formated data to the lower layers + * \param[in] p_data The data to be sent + * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters + */ + virtual void send_data(OCTETSTRING& data, params& p_params); + /*! + * \virtual + * \fn void receive_data(OCTETSTRING& data, params& p_params); + * \brief Receive bytes formated data from the lower layers + * \param[in] p_data The bytes formated data received + * \param[in] p_params Some lower layers parameters values when data was received + */ + virtual void receive_data(OCTETSTRING& data, params& info); +}; // End of class lower_layer_pport_layer + diff --git a/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer_factory.hh b/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer_factory.hh new file mode 100644 index 0000000000000000000000000000000000000000..af84b8a6c91e0ec0e910d0fbfcbb5cd11ff22a3f --- /dev/null +++ b/ccsrc/Protocols/LowerLayerPPort/lower_layer_pport_layer_factory.hh @@ -0,0 +1,45 @@ +/*! + * \file lower_layer_pport_layer_factory.hh + * \brief Header file for Diameter protocol layer factory. + * \author ETSI TTF T010 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include "layer_stack_builder.hh" + +#include "lower_layer_pport_layer.hh" + +/*! + * \class lower_layer_pport_layer_factory + * \brief This class provides a factory class to create an lower_layer_pport_layer class instance + */ +class lower_layer_pport_layer_factory : public layer_factory { + static lower_layer_pport_layer_factory _f; //! Reference to the unique instance of this class +public: //! \publicsection + /*! + * \brief Default constructor + * Create a new instance of the udp_layer_factory class + * \remark The HTTP layer identifier is HTTP + */ + lower_layer_pport_layer_factory() { + // Register factory + layer_stack_builder::register_layer_factory("LLPP", this); + }; + /*! + * \fn layer* create_layer(const std::string & type, const std::string & param); + * \brief Create the layers stack based on the provided layers stack description + * \param[in] p_type The provided layers stack description + * \param[in] p_params Optional parameters + * \return 0 on success, -1 otherwise + * \inline + */ + inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param){ + return new lower_layer_pport_layer(p_type, p_param); + }; +}; // End of class lower_layer_pport_layer_factory + diff --git a/ccsrc/Protocols/LowerLayerPPort/module.mk b/ccsrc/Protocols/LowerLayerPPort/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..c6a6e47524d7590e774dc0e82e44f2c71ee13e20 --- /dev/null +++ b/ccsrc/Protocols/LowerLayerPPort/module.mk @@ -0,0 +1,5 @@ +sources := \ + lower_layer_pport_layer.cc \ + + +includes := . diff --git a/ccsrc/Protocols/Naptr/module.mk b/ccsrc/Protocols/Naptr/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..04484d225a111152867904e03913ec0e3f78e52f --- /dev/null +++ b/ccsrc/Protocols/Naptr/module.mk @@ -0,0 +1,5 @@ +sources := \ + naptr_layer.cc \ + + +includes := . diff --git a/ccsrc/Protocols/Naptr/naptrPort_layer_factory.hh b/ccsrc/Protocols/Naptr/naptrPort_layer_factory.hh new file mode 100644 index 0000000000000000000000000000000000000000..e8b460c2ba96d3ba3b1be26c6a52a31d83bdd76a --- /dev/null +++ b/ccsrc/Protocols/Naptr/naptrPort_layer_factory.hh @@ -0,0 +1,45 @@ +/*! + * \file naptrPort_layer_factory.hh + * \brief Header file for Diameter protocol layer factory. + * \author ETSI TTF T010 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include "layer_stack_builder.hh" + +#include "naptr_layer.hh" + +/*! + * \class naptrPort_layer_factory + * \brief This class provides a factory class to create an naptr_layer class instance + */ +class naptrPort_layer_factory : public layer_factory { + static naptrPort_layer_factory _f; //! Reference to the unique instance of this class +public: //! \publicsection + /*! + * \brief Default constructor + * Create a new instance of the udp_layer_factory class + * \remark The HTTP layer identifier is HTTP + */ + naptrPort_layer_factory() { + // Register factory + layer_stack_builder::register_layer_factory("NAPTR", this); + }; + /*! + * \fn layer* create_layer(const std::string & type, const std::string & param); + * \brief Create the layers stack based on the provided layers stack description + * \param[in] p_type The provided layers stack description + * \param[in] p_params Optional parameters + * \return 0 on success, -1 otherwise + * \inline + */ + inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param){ + return new naptr_layer(p_type, p_param); + }; +}; // End of class naptrPort_layer_factory + diff --git a/ccsrc/Protocols/Naptr/naptr_layer.cc b/ccsrc/Protocols/Naptr/naptr_layer.cc new file mode 100644 index 0000000000000000000000000000000000000000..8e9bf1e2f01c42d5887e76f1caa0d34e75597eed --- /dev/null +++ b/ccsrc/Protocols/Naptr/naptr_layer.cc @@ -0,0 +1,38 @@ +#include "AtsImsIot_TypesAndValues.hh" + +#include "naptrPort_layer_factory.hh" + +#include "loggers.hh" + +#include "converter.hh" + +naptr_layer::naptr_layer(const std::string & p_type, const std::string & p_param) : t_layer(p_type), _params() { + loggers::get_instance().log(">>> naptr_layer::naptr_layer: %s, %s", to_string().c_str(), p_param.c_str()); + // Setup parameters + params::convert(_params, p_param); +} + +void naptr_layer::sendMsg(const AtsImsIot__TypesAndValues::NAPTRmessage& p_diameter_message, params& p_param) { + loggers::get_instance().log_msg(">>> naptr_layer::sendMsg: ", p_diameter_message); + + // Encode DiameterMessage + OCTETSTRING data; + // _codec_register.encode(p_diameter_message, data); + // send_data(data, _params); +} + +void naptr_layer::send_data(OCTETSTRING& data, params& p_params) { + loggers::get_instance().log_msg(">>> naptr_layer::send_data: ", data); + + send_to_all_layers(data, p_params); +} + +void naptr_layer::receive_data(OCTETSTRING& data, params& p_params) +{ + loggers::get_instance().log_msg(">>> naptr_layer::receive_data: ", data); + + // Decode Diameter message +} + +naptrPort_layer_factory naptrPort_layer_factory::_f; + diff --git a/ccsrc/Protocols/Naptr/naptr_layer.hh b/ccsrc/Protocols/Naptr/naptr_layer.hh new file mode 100644 index 0000000000000000000000000000000000000000..964753ca15db325bfec31e3cd889021f145ecd6a --- /dev/null +++ b/ccsrc/Protocols/Naptr/naptr_layer.hh @@ -0,0 +1,73 @@ +/*! + * \file naptr_layer.hh + * \brief Header file for ITS HTTP protocol layer. + * \author ETSI STF549 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include + +#include "t_layer.hh" + +namespace AtsImsIot__TestSystem { + class NaptrPort; //! Forward declaration of TITAN class +} + +namespace AtsImsIot__TypesAndValues { + class NAPTRmessage; //! Forward declaration of TITAN class +} + +class OCTETSTRING; //! Forward declaration of TITAN class + +/*! + * \class naptr_layer + * \brief This class provides a factory class to create an naptr_layer class instance + */ +class naptr_layer : public t_layer { + params _params; + +public: //! \publicsection + /*! + * \brief Specialised constructor + * Create a new instance of the naptr_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + naptr_layer() : t_layer(), _params() {}; + /*! + * \brief Specialised constructor + * Create a new instance of the naptr_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + naptr_layer(const std::string& p_type, const std::string& p_param); + /*! + * \brief Default destructor + */ + virtual ~naptr_layer() { }; + + void sendMsg(const AtsImsIot__TypesAndValues::NAPTRmessage& p_diameter_message, params& p_param); + + /*! + * \virtual + * \fn void send_data(OCTETSTRING& data, params& p_params); + * \brief Send bytes formated data to the lower layers + * \param[in] p_data The data to be sent + * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters + */ + virtual void send_data(OCTETSTRING& data, params& p_params); + /*! + * \virtual + * \fn void receive_data(OCTETSTRING& data, params& p_params); + * \brief Receive bytes formated data from the lower layers + * \param[in] p_data The bytes formated data received + * \param[in] p_params Some lower layers parameters values when data was received + */ + virtual void receive_data(OCTETSTRING& data, params& info); +}; // End of class naptr_layer + diff --git a/ccsrc/Protocols/Sip/module.mk b/ccsrc/Protocols/Sip/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..84c4b97a4c8a58740f5308c8c557b58543521073 --- /dev/null +++ b/ccsrc/Protocols/Sip/module.mk @@ -0,0 +1,17 @@ +sources := \ + sip_codec_ack_request.cc \ + sip_codec_headers.cc \ + sip_codec_message_body.cc \ + sip_codec_options_request.cc \ + sip_codec_request.cc \ + sip_codec_subscribe_request.cc \ + sip_codec_bye_request.cc \ + sip_codec_invite_request.cc \ + sip_codec_message_request.cc \ + sip_codec_register_request.cc \ + sip_codec_cancel_request.cc \ + sip_codec_notify_request.cc \ + sip_codec_info_request.cc \ + sip_codec_response.cc \ + sip_layer.cc +includes := . diff --git a/ccsrc/Protocols/Sip/sip_codec_ack_request.cc b/ccsrc/Protocols/Sip/sip_codec_ack_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..8cdc94394ddf6e3ba8433e3e736736681b9aaa9b --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_ack_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_ack_request.hh" +#include "loggers.hh" + +int sip_codec_ack_request::encode (const LibSip__SIPTypesAndValues::ACK__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_ack_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_ack_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_ack_request::encode: data=", data); + return 0; +} + +int sip_codec_ack_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::ACK__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_ack_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_ack_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_ack_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::ACK__E) { + loggers::get_instance().warning("sip_codec_ack_request::decode: Wrong SIP Method, expected ACK"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_ack_request.hh b/ccsrc/Protocols/Sip/sip_codec_ack_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..801f6de9855befb6a43006f62a64e71c2c99c3b9 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_ack_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class ACK__Request; +} + +class sip_codec_ack_request: public codec_gen < +LibSip__SIPTypesAndValues::ACK__Request, +LibSip__SIPTypesAndValues::ACK__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_ack_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_ack_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::ACK__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::ACK__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_ack_request diff --git a/ccsrc/Protocols/Sip/sip_codec_bye_request.cc b/ccsrc/Protocols/Sip/sip_codec_bye_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..816d9aa895b84944509a865fe11fa63dd0f3aef3 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_bye_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_bye_request.hh" +#include "loggers.hh" + +int sip_codec_bye_request::encode (const LibSip__SIPTypesAndValues::BYE__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_bye_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_bye_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_bye_request::encode: data=", data); + return 0; +} + +int sip_codec_bye_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::BYE__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_bye_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_bye_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_bye_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::BYE__E) { + loggers::get_instance().warning("sip_codec_bye_request::decode: Wrong SIP Method, expected BYE"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_bye_request.hh b/ccsrc/Protocols/Sip/sip_codec_bye_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..e597172ea99e9bbde9c90e6346230216ee24e2af --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_bye_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class BYE__Request; +} + +class sip_codec_bye_request: public codec_gen < +LibSip__SIPTypesAndValues::BYE__Request, +LibSip__SIPTypesAndValues::BYE__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_bye_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_bye_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::BYE__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::BYE__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_bye_request diff --git a/ccsrc/Protocols/Sip/sip_codec_cancel_request.cc b/ccsrc/Protocols/Sip/sip_codec_cancel_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..3a6000222eaee265c2a5f0f08bd84f3cf7c672c8 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_cancel_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_cancel_request.hh" +#include "loggers.hh" + +int sip_codec_cancel_request::encode (const LibSip__SIPTypesAndValues::CANCEL__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_cancel_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_cancel_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_cancel_request::encode: data=", data); + return 0; +} + +int sip_codec_cancel_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::CANCEL__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_cancel_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_cancel_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_cancel_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::CANCEL__E) { + loggers::get_instance().warning("sip_codec_cancel_request::decode: Wrong SIP Method, expected CANCEL"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_cancel_request.hh b/ccsrc/Protocols/Sip/sip_codec_cancel_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..22527bc76ad4008f97f965f5de58257957bc7609 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_cancel_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class CANCEL__Request; +} + +class sip_codec_cancel_request: public codec_gen < +LibSip__SIPTypesAndValues::CANCEL__Request, +LibSip__SIPTypesAndValues::CANCEL__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_cancel_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_cancel_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::CANCEL__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::CANCEL__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_cancel_request diff --git a/ccsrc/Protocols/Sip/sip_codec_headers.cc b/ccsrc/Protocols/Sip/sip_codec_headers.cc new file mode 100644 index 0000000000000000000000000000000000000000..4b991167b217ab1d1eab597978acbfd435e5e171 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_headers.cc @@ -0,0 +1,3305 @@ +#include + +#include "LibSip_SIPTypesAndValues.hh" +#include "LibSip_Common.hh" + +#include "sip_codec_headers.hh" +#include "loggers.hh" + +#include "converter.hh" + +#ifdef WIN32 +#undef osip_malloc +#undef osip_free +#define osip_malloc(S) malloc(S) +#define osip_free(P) { if (P!=NULL) { free(P);} } +#endif + +int sip_codec_headers::encode_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message) +{ + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_headers: ", p_msg_header); + + // Encode mandatory fields + // From + osip_from_t* from_header = nullptr; + if (encode_from_header(p_msg_header.fromField(), &from_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode From header"); + return -1; + } + char* hvalue; + ::osip_from_to_str(from_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: From:%s", hvalue); + if (::osip_message_set_from(p_sip_message, hvalue) != OSIP_SUCCESS) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to set From header in sip_message"); + return -1; + } + + ::osip_from_free(from_header); + osip_free(hvalue); + + // To + osip_to_t* to_header = nullptr; + if (encode_to_header(p_msg_header.toField(), &to_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode To header"); + return -1; + } + int r = ::osip_to_to_str(to_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: To:'%s'- result:%d", hvalue, r); + if (::osip_message_set_to(p_sip_message, hvalue) != OSIP_SUCCESS) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to set To header in sip_message"); + return -1; + } + ::osip_to_free(to_header); + osip_free(hvalue); + + // Via + osip_via_t* via_header = nullptr; + if (encode_via_header(p_msg_header.via(), &via_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Via header"); + return -1; + } + ::osip_via_to_str(via_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: Via:%s", hvalue); + std::string str(hvalue); + std::size_t idx = str.find(" ("); // FIXME Horrible work-around for osip_via_to_str issue (' ()' added sometimes + if (idx != std::string::npos) { + str = str.substr(0, idx); + } + loggers::get_instance().log("sip_codec_headers::encode_headers: Via (final):%s", str.c_str()); + if (::osip_message_set_via(p_sip_message, str.c_str()) != OSIP_SUCCESS) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to set Via header in sip_message"); + return -1; + } + ::osip_via_free(via_header); + osip_free(hvalue); + + // Encode Optional fields + loggers::get_instance().log("sip_codec_headers::encode_headers: Encode Optional fields"); + + // Accept + if (p_msg_header.accept().is_present()) { + if (encode_accept_header(p_msg_header.accept(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Accept header"); + return -1; + } + } + + // AcceptContact + if (p_msg_header.acceptContact().is_present()) { + if (encode_accept_contact_header(p_msg_header.acceptContact(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode AcceptContact header"); + return -1; + } + } + + // Allow + if (p_msg_header.allow().is_present()) { + if (encode_allow_header(p_msg_header.allow(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Allow header"); + return -1; + } + } + + // Authorization + if (p_msg_header.authorization().is_present()) { + osip_authorization_t* authorization_header = nullptr; + if (encode_authorization_header(p_msg_header.authorization(), &authorization_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Authorization header"); + return -1; + } + int result = ::osip_authorization_to_str(authorization_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: Authorization: %s - %d", hvalue, result); + result = ::osip_message_set_authorization(p_sip_message, hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: SIP Authorization: %p - %d", p_sip_message->authorizations, result); + ::osip_authorization_free(authorization_header); + osip_free(hvalue); + } + + // CallInfo + if (p_msg_header.callInfo().is_present()) { + if (encode_call_info_header(p_msg_header.callInfo(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode CallInfo header"); + return -1; + } + } + + // CallId + if (p_msg_header.callId().is_present()) { + osip_call_id_t* call_id_header; + if (encode_call_id_header(p_msg_header.callId(), &call_id_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Call_Id header"); + return -1; + } + ::osip_call_id_to_str(call_id_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: Call_Id:%s", hvalue); + int result = ::osip_message_set_call_id(p_sip_message, hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: SIP Call_Id: %p - %d", p_sip_message->call_id, result); + ::osip_call_id_free(call_id_header); + osip_free(hvalue); + } + + // Contact + if (p_msg_header.contact().is_present()) { + osip_contact_t* contact_header; + if (encode_contact_header(p_msg_header.contact(), &contact_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Contact header"); + return -1; + } + ::osip_contact_to_str(contact_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: Contact: %s", hvalue); + int result = ::osip_message_set_contact(p_sip_message, hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: SIP Contact: %p - %d", p_sip_message->contacts, result); + ::osip_contact_free(contact_header); + osip_free(hvalue); + } + + // ContentLength + osip_content_length_t* content_length_header = nullptr; + if (encode_content_length_header(p_msg_header.contentLength(), &content_length_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode ContentLength header"); + return -1; + } + ::osip_content_length_to_str(content_length_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: ContentLength:%s", hvalue); + ::osip_message_set_content_length(p_sip_message, hvalue); + ::osip_content_length_free(content_length_header); + osip_free(hvalue); + + // ContentType + if (p_msg_header.contentType().is_present()) { + osip_content_type_t* content_type_header = nullptr; + if (encode_content_type_header(p_msg_header.contentType(), &content_type_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode ContentType header"); + return -1; + } + ::osip_content_type_to_str(content_type_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: ContentType:%s", hvalue); + ::osip_message_set_content_type(p_sip_message, hvalue); + ::osip_content_type_free(content_type_header); + osip_free(hvalue); + } + + // CSeq + osip_cseq_t* cseq_header = nullptr; + if (encode_c_seq_header(p_msg_header.cSeq(), &cseq_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode CSeq header"); + return -1; + } + ::osip_cseq_to_str(cseq_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: Cseq:%s", hvalue); + ::osip_message_set_cseq(p_sip_message, hvalue); + ::osip_cseq_free(cseq_header); + osip_free(hvalue); + + // Event + if (p_msg_header.event().is_present()) { + if (encode_event_header(p_msg_header.event(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Event header"); + return -1; + } + } + + // Expires + if (p_msg_header.expires().is_present()) { + if (encode_expires_header(p_msg_header.expires(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Expires header"); + return -1; + } + } + + // Geolocation + if (p_msg_header.geolocation().is_present()) { + if (encode_geolocation_header(p_msg_header.geolocation(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Geolocation header"); + return -1; + } + } + + // GeolocationRouting + if (p_msg_header.geolocationRouting().is_present()) { + if (encode_geolocation_routing_header(p_msg_header.geolocationRouting(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode GeolocationRouting header"); + return -1; + } + } + + // MaxForwards + if (p_msg_header.maxForwards().is_present()) { + if (encode_max_forwards_header(p_msg_header.maxForwards(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode MaxForwards header"); + return -1; + } + } + + // MinSE + if (p_msg_header.minSE().is_present()) { + if (encode_min_se_header(p_msg_header.minSE(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode MinSE header"); + return -1; + } + } + + // PAccessNetworkInfo + if (p_msg_header.pAccessNetworkInfo().is_present()) { + if (encode_p_access_network_info_header(p_msg_header.pAccessNetworkInfo(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode PAccessNetworkInfo header"); + return -1; + } + } + + // Privacy + if (p_msg_header.privacy().is_present()) { + if (encode_privacy_header(p_msg_header.privacy(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Privacy header"); + return -1; + } + } + + // Route + if (p_msg_header.route().is_present()) { + if (encode_route_header(p_msg_header.route(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Route header"); + return -1; + } + } + + // RecordRoute + if (p_msg_header.recordRoute().is_present()) { + if (encode_record_route_header(p_msg_header.recordRoute(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode RecordRoute header"); + return -1; + } + } + + // RSeq + if (p_msg_header.rSeq().is_present()) { + if (encode_r_seq_header(p_msg_header.rSeq(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode RSeq header"); + return -1; + } + } + + // Supported + if (p_msg_header.supported().is_present()) { + if (encode_supported_header(p_msg_header.supported(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode Supported header"); + return -1; + } + } + + if (p_msg_header.userAgent().is_present()) { + if (encode_user_agent_header(p_msg_header.userAgent(), &p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode UserAgent header"); + return -1; + } + } + + // WwwAuthenticate + if (p_msg_header.wwwAuthenticate().is_present()) { + osip_www_authenticate_t* www_authenticate_header = nullptr; + if (encode_www_authenticate_header(p_msg_header.wwwAuthenticate(), &www_authenticate_header) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to encode WwwAuthenticate header"); + return -1; + } + //std::string s("Digest realm=\"testrealm@host.com\", nonce=\"dcd98b7102dd2f0e8b11d0f600bfb0c093\", opaque=\"5ccc069c403ebaf9f0171e9517f40e41\""); + ::osip_www_authenticate_to_str(www_authenticate_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_headers: WwwAuthenticate:%s", hvalue); + if (::osip_message_set_www_authenticate(p_sip_message, hvalue) != OSIP_SUCCESS) { + loggers::get_instance().warning("sip_codec_headers::encode_headers: Failed to set WwwAuthenticate header in sip_message"); + return -1; + } + //int result = ::osip_message_set_www_authenticate(p_sip_message, s.c_str());//hvalue); + //loggers::get_instance().log("sip_codec_headers::encode_headers: osip_message_set_www_authenticate return code:%d", result); + osip_free(hvalue); + } + + // TODO continue + const osip_list_t* p = &(p_sip_message->headers); + unsigned int pos = 0; + unsigned int size = ::osip_list_size(p); + loggers::get_instance().log("Unknown headers count: %d\n", size); + while (pos < size) { + const osip_header_t* header = (const osip_header_t*)osip_list_get(p, pos++); + loggers::get_instance().log("sip_codec_headers::encode_headers: %p: hname='%s' : hvalue='%s'\n", header, header->hname, header->hvalue); + } // End of 'while' statement + + loggers::get_instance().log("<<< sip_codec_headers::encode_headers"); + return 0; +} // End of method encode_headers + +void sip_codec_headers::decode_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MessageHeader& p_headers) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_headers"); + + LibSip__SIPTypesAndValues::MessageHeader headers; + // Decode mandatory fields + // From + loggers::get_instance().log("sip_codec_headers::decode_headers: From"); + LibSip__SIPTypesAndValues::From from_header; + decode_from_header(::osip_message_get_from(p_sip_message), from_header); + if (from_header.is_value()) { + p_headers.fromField() = from_header; + } else { + p_headers.fromField().set_to_omit(); + } + // To + loggers::get_instance().log("sip_codec_headers::decode_headers: To"); + LibSip__SIPTypesAndValues::To to_header; + decode_to_header(::osip_message_get_to(p_sip_message), to_header); + if (to_header.is_value()) { + p_headers.toField() = to_header; + } else { + p_headers.toField().set_to_omit(); + } + // Via + loggers::get_instance().log("sip_codec_headers::decode_headers: Via"); + LibSip__SIPTypesAndValues::Via via_header; + decode_via_header(p_sip_message, via_header); + if (via_header.is_value()) { + p_headers.via() = via_header; + } else { + p_headers.via().set_to_omit(); + } + + // Decode Optional fields + LibSip__SIPTypesAndValues::Accept accept_header; + decode_accept_header(p_sip_message, accept_header); + if (accept_header.is_value()) { + p_headers.accept() = accept_header; + } else { + p_headers.accept().set_to_omit(); + } + + LibSip__SIPTypesAndValues::AcceptContact accept_contact_header; + decode_accept_contact_header(p_sip_message, accept_contact_header); + if (accept_contact_header.is_value()) { + p_headers.acceptContact() = accept_contact_header; + } else { + p_headers.acceptContact().set_to_omit(); + } + + LibSip__SIPTypesAndValues::AcceptEncoding accept_encoding_header; + decode_accept_encoding_header(p_sip_message, accept_encoding_header); + if (accept_encoding_header.is_value()) { + p_headers.acceptEncoding() = accept_encoding_header; + } else { + p_headers.acceptEncoding().set_to_omit(); + } + + LibSip__SIPTypesAndValues::AcceptLanguage accept_language_header; + decode_accept_language_header(p_sip_message, accept_language_header); + if (accept_language_header.is_value()) { + p_headers.acceptLanguage() = accept_language_header; + } else { + p_headers.acceptLanguage().set_to_omit(); + } + + LibSip__SIPTypesAndValues::AlertInfo alert_info_header; + decode_alert_info_header(p_sip_message, alert_info_header); + if (alert_info_header.is_value()) { + p_headers.alertInfo() = alert_info_header; + } else { + p_headers.alertInfo().set_to_omit(); + } + + LibSip__SIPTypesAndValues::Allow allow_header; + decode_allow_header(p_sip_message, allow_header); + if (allow_header.is_value()) { + p_headers.allow() = allow_header; + } else { + p_headers.allow().set_to_omit(); + } + + LibSip__SIPTypesAndValues::AllowEvents allow_events_header; + decode_allow_events_header(p_sip_message, allow_events_header); + if (allow_events_header.is_value()) { + p_headers.allowEvents() = allow_events_header; + } else { + p_headers.allowEvents().set_to_omit(); + } + + LibSip__SIPTypesAndValues::Authorization authorization_header; + decode_authorization_header(p_sip_message, authorization_header); + if (authorization_header.is_value()) { + p_headers.authorization() = authorization_header; + } else { + p_headers.authorization().set_to_omit(); + } + + p_headers.authenticationInfo().set_to_omit(); + + LibSip__SIPTypesAndValues::CallId call_id_header; + decode_call_id_header(p_sip_message, call_id_header); + if (call_id_header.is_value()) { + p_headers.callId() = call_id_header; + } else { + p_headers.callId().set_to_omit(); + } + + LibSip__SIPTypesAndValues::CallInfo call_info_header; + decode_call_info_header(p_sip_message, call_info_header); + if (call_info_header.is_value()) { + p_headers.callInfo() = call_info_header; + } else { + p_headers.callInfo().set_to_omit(); + } + + LibSip__SIPTypesAndValues::Contact contact_header; + decode_contact_header(p_sip_message, contact_header); + if (contact_header.is_value()) { + p_headers.contact() = contact_header; + } else { + p_headers.contact().set_to_omit(); + } + + p_headers.contentDisposition().set_to_omit(); + p_headers.contentEncoding().set_to_omit(); + p_headers.contentLanguage().set_to_omit(); + + LibSip__SIPTypesAndValues::ContentLength content_length_header; + decode_content_length_header(p_sip_message, content_length_header); + if (content_length_header.is_value()) { + p_headers.contentLength() = content_length_header; + } else { + p_headers.contentLength().set_to_omit(); + } + + LibSip__SIPTypesAndValues::ContentType content_type_header; + decode_content_type_header(p_sip_message, content_type_header); + if (content_type_header.is_value()) { + p_headers.contentType() = content_type_header; + } else { + p_headers.contentType().set_to_omit(); + } + + LibSip__SIPTypesAndValues::CSeq c_seq_header; + decode_c_seq_header(p_sip_message, c_seq_header); + if (c_seq_header.is_value()) { + p_headers.cSeq() = c_seq_header; + } else { + p_headers.cSeq().set_to_omit(); + } + + p_headers.date().set_to_omit(); + p_headers.errorInfo().set_to_omit(); + p_headers.event().set_to_omit(); + p_headers.expires().set_to_omit(); + p_headers.featureCaps().set_to_omit(); + + LibSip__SIPTypesAndValues::Geolocation geolocation_header; + decode_geolocation_header(p_sip_message, geolocation_header); + if (geolocation_header.is_value()) { + p_headers.geolocation() = geolocation_header; + } else { + p_headers.geolocation().set_to_omit(); + } + + LibSip__SIPTypesAndValues::GeolocationRouting geolocation_routing_header; + decode_geolocation_routing_header(p_sip_message, geolocation_routing_header); + if (geolocation_routing_header.is_value()) { + p_headers.geolocationRouting() = geolocation_routing_header; + } else { + p_headers.geolocationRouting().set_to_omit(); + } + + p_headers.historyInfo().set_to_omit(); + p_headers.infoPackage().set_to_omit(); + p_headers.inReplyTo().set_to_omit(); + + LibSip__SIPTypesAndValues::Event event_header; + decode_event_header(p_sip_message, event_header); + if (event_header.is_value()) { + p_headers.event() = event_header; + } else { + p_headers.event().set_to_omit(); + } + + LibSip__SIPTypesAndValues::Expires expires_header; + decode_expires_header(p_sip_message, expires_header); + if (expires_header.is_value()) { + p_headers.expires() = expires_header; + } else { + p_headers.expires().set_to_omit(); + } + + LibSip__SIPTypesAndValues::MaxForwards max_forwards_header; + decode_max_forwards_header(p_sip_message, max_forwards_header); + if (max_forwards_header.is_value()) { + p_headers.maxForwards() = max_forwards_header; + } else { + p_headers.maxForwards().set_to_omit(); + } + + p_headers.mimeVersion().set_to_omit(); + p_headers.minExpires().set_to_omit(); + + LibSip__SIPTypesAndValues::MinSE min_se_header; + decode_min_se_header(p_sip_message, min_se_header); + if (min_se_header.is_value()) { + p_headers.minSE() = min_se_header; + } else { + p_headers.minSE().set_to_omit(); + } + + p_headers.organization().set_to_omit(); + + LibSip__SIPTypesAndValues::PAccessNetworkInfo p_access_network_info_header; + decode_p_access_network_info_header(p_sip_message, p_access_network_info_header); + if (p_access_network_info_header.is_value()) { + p_headers.pAccessNetworkInfo() = p_access_network_info_header; + } else { + p_headers.pAccessNetworkInfo().set_to_omit(); + } + + p_headers.pAssertedID().set_to_omit(); + p_headers.pAssertedService().set_to_omit(); + p_headers.pAssociatedURI().set_to_omit(); + p_headers.path().set_to_omit(); + p_headers.pCalledPartyID().set_to_omit(); + p_headers.pChargingFunctionAddresses().set_to_omit(); + p_headers.pChargingVector().set_to_omit(); + p_headers.pEarlyMedia().set_to_omit(); + p_headers.pMediaAuthorization().set_to_omit(); + p_headers.pPreferredID().set_to_omit(); + p_headers.pPreferredService().set_to_omit(); + p_headers.priority().set_to_omit(); + + LibSip__SIPTypesAndValues::Privacy privacy_header; + decode_privacy_header(p_sip_message, privacy_header); + if (privacy_header.is_value()) { + p_headers.privacy() = privacy_header; + } else { + p_headers.privacy().set_to_omit(); + } + + p_headers.proxyAuthenticate().set_to_omit(); + p_headers.proxyAuthorization().set_to_omit(); + p_headers.proxyRequire().set_to_omit(); + p_headers.pVisitedNetworkID().set_to_omit(); + p_headers.rAck().set_to_omit(); + p_headers.reason().set_to_omit(); + p_headers.recvInfo().set_to_omit(); + p_headers.requestDisposition().set_to_omit(); + p_headers.referredBy().set_to_omit(); + p_headers.referTo().set_to_omit(); + p_headers.referSub().set_to_omit(); + p_headers.replaces().set_to_omit(); + p_headers.replyTo().set_to_omit(); + p_headers.require().set_to_omit(); + + LibSip__SIPTypesAndValues::RSeq r_seq_header; + decode_r_seq_header(p_sip_message, r_seq_header); + if (r_seq_header.is_value()) { + p_headers.rSeq() = r_seq_header; + } else { + p_headers.rSeq().set_to_omit(); + } + p_headers.retryAfter().set_to_omit(); + + LibSip__SIPTypesAndValues::Route route_header; + decode_route_header(p_sip_message, route_header); + if (route_header.is_value()) { + p_headers.route() = route_header; + } else { + p_headers.route().set_to_omit(); + } + + LibSip__SIPTypesAndValues::RecordRoute record_route_header; + decode_record_route_header(p_sip_message, record_route_header); + if (record_route_header.is_value()) { + p_headers.recordRoute() = record_route_header; + } else { + p_headers.recordRoute().set_to_omit(); + } + + p_headers.securityClient().set_to_omit(); + p_headers.securityServer().set_to_omit(); + p_headers.securityVerify().set_to_omit(); + p_headers.server().set_to_omit(); + p_headers.serviceRoute().set_to_omit(); + + LibSip__SIPTypesAndValues::SessionExpires session_expires; + decode_session_expires_header(p_sip_message, session_expires); + if (session_expires.is_value()) { + p_headers.sessionExpires() = session_expires; + } else { + p_headers.sessionExpires().set_to_omit(); + } + + p_headers.sessionId().set_to_omit(); + p_headers.sipETag().set_to_omit(); + p_headers.sipIfMatch().set_to_omit(); + p_headers.subject().set_to_omit(); + p_headers.subscriptionState().set_to_omit(); + + LibSip__SIPTypesAndValues::Supported supported_header; + decode_supported_header(p_sip_message, supported_header); + if (supported_header.is_value()) { + p_headers.supported() = supported_header; + } else { + p_headers.supported().set_to_omit(); + } + + p_headers.timestamp__().set_to_omit(); + p_headers.unsupported().set_to_omit(); + p_headers.userToUser().set_to_omit(); + + LibSip__SIPTypesAndValues::UserAgent user_agent_header; + decode_user_agent_header(p_sip_message, user_agent_header); + if (user_agent_header.is_value()) { + p_headers.userAgent() = user_agent_header; + } else { + p_headers.userAgent().set_to_omit(); + } + p_headers.warning().set_to_omit(); + + LibSip__SIPTypesAndValues::WwwAuthenticate www_authenticate_header; + osip_www_authenticate_t* www_authenticate = nullptr; + ::osip_message_get_www_authenticate(p_sip_message, 0, &www_authenticate); + decode_www_authenticate_header(www_authenticate, www_authenticate_header); + if (www_authenticate_header.is_value()) { + p_headers.wwwAuthenticate() = www_authenticate_header; + } else { + p_headers.wwwAuthenticate().set_to_omit(); + } + + p_headers.resourcePriority().set_to_omit(); + p_headers.answerMode().set_to_omit(); + p_headers.privAnswerMode().set_to_omit(); + p_headers.targetDialog().set_to_omit(); + p_headers.pAnswerState().set_to_omit(); + p_headers.undefinedHeader__List().set_to_omit(); + + // List unprocessed headers + const osip_list_t* p = &(p_sip_message->headers); + unsigned int pos = 0; + unsigned int size = ::osip_list_size(p); + loggers::get_instance().log("Unknown headers count: %d\n", size); + while (pos < size) { + const osip_header_t* header = (const osip_header_t*)osip_list_get(p, pos++); + loggers::get_instance().log("sip_codec_headers::decode_headers: %p: hname='%s' : hvalue='%s'\n", header, header->hname, header->hvalue); + } // End of 'while' statement + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_headers: ", p_headers); +} // End of method decode_headers + +int sip_codec_headers::encode_sip_url(const LibSip__SIPTypesAndValues::SipUrl& p_sip_uri, osip_uri_t** p_uri) +{ // TODO To be renamed into encode_uri + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_sip_uri: ", p_sip_uri); + + std::string host; + std::string port; + osip_uri_t *uri = nullptr; + ::osip_uri_init(&uri); + const LibSip__SIPTypesAndValues::UriComponents& components = p_sip_uri.components(); + if (components.ischosen(LibSip__SIPTypesAndValues::UriComponents::ALT_sip)) { + ::osip_uri_set_scheme(uri, (char*)static_cast(p_sip_uri.scheme())); + const LibSip__SIPTypesAndValues::SipUriComponents& s = p_sip_uri.components().sip(); + if (s.userInfo().is_present()) { + const LibSip__SIPTypesAndValues::UserInfo& u = static_cast(s.userInfo()); + ::osip_uri_set_username(uri, (char*)static_cast(static_cast(u.userOrTelephoneSubscriber()))); + if (u.password().is_present()) { + const CHARSTRING& c = static_cast(u.password()); + ::osip_uri_set_password(uri, (char*)static_cast(c)); + } + } + encode_host_port(s.hostPort(), host, port); + if (!host.empty()) { + ::osip_uri_set_host(uri, (char*)host.c_str()); + } + if (!port.empty()) { + ::osip_uri_set_port(uri, (char*)port.c_str()); + } + } else if (components.ischosen(LibSip__SIPTypesAndValues::UriComponents::ALT_tel)) { + const LibSip__SIPTypesAndValues::TelUriComponents& t = p_sip_uri.components().tel(); + loggers::get_instance().error("sip_codec_headers::encode_sip_uri: Unsupported LibSip__SIPTypesAndValues::UriComponents::ALT_tel"); + } else if (components.ischosen(LibSip__SIPTypesAndValues::UriComponents::ALT_urn)) { + const LibSip__SIPTypesAndValues::UrnUriComponents& u = p_sip_uri.components().urn(); + loggers::get_instance().log("sip_codec_headers::encode_sip_uri: Decode Urn"); + std::string str(static_cast(p_sip_uri.scheme())); + str += ":"; + str += static_cast(u.namespaceId()); + str += ":"; + str += static_cast(u.namespaceSpecificString()); + ::osip_uri_parse(uri, str.c_str()); + } else if (components.ischosen(LibSip__SIPTypesAndValues::UriComponents::ALT_other)) { + std::string str(static_cast(p_sip_uri.scheme())); + str += ":"; + str += static_cast(p_sip_uri.components().other()); + ::osip_uri_parse(uri, str.c_str()); + } // else, noting to do + + if (uri != nullptr) { + ::osip_uri_clone(uri, p_uri); + } else { + *p_uri = nullptr; + } + + char* buffer = nullptr; + std::size_t length = 0; + int result = ::osip_uri_to_str(*p_uri, &buffer); + if (result != 0) { + loggers::get_instance().warning("sip_codec_headers::encode_sip_uri: Failed to encode data structures"); + } else { + loggers::get_instance().log("sip_codec_headers::encode_sip_uri: URI:%s", buffer); + } + + return 0; +} // End of method encode_sip_url + +void sip_codec_headers::encode_host_port(const LibSip__SIPTypesAndValues::HostPort& p_host_port, std::string& p_host, std::string& p_port) +{ + loggers::get_instance().log(">>> sip_codec_headers::encode_host_port"); + + if (p_host_port.host().is_present()) { + p_host.assign(static_cast(static_cast(p_host_port.host()))); + } else { + p_host.clear(); + } + loggers::get_instance().log("sip_codec_headers::encode_host_port: host:'%s'", p_host.c_str()); + if (p_host_port.portField().is_present()) { + p_port.assign(std::to_string(static_cast(static_cast(p_host_port.portField())))); + } else { + p_port.clear(); + } + loggers::get_instance().log("sip_codec_headers::encode_port_port: port:'%s'", p_port.c_str()); +} // End of method encode_host_port + +int sip_codec_headers::encode_accept_header(const LibSip__SIPTypesAndValues::Accept& p_accept, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_accept_header"); + + if (!p_accept.acceptArgs().is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::AcceptBody__List& al = static_cast(*p_accept.acceptArgs().get_opt_value()); + if (al.lengthof() == 0) { + return 0; + } + std::string accepts; + for (int i = 0; i < al.lengthof(); i++) { + const LibSip__SIPTypesAndValues::AcceptBody& b = al[i]; + loggers::get_instance().log_msg("sip_codec_headers::encode_accept_header: b: ", b); + osip_accept_t *accept; + accept_init(&accept); + // Split it using '/' as separator + std::vector output = converter::get_instance().split(static_cast(b.mediaRange()), "/"); + accept->type = ::strdup(output[0].c_str()); + if (output.size() > 1) { + accept->subtype = ::strdup(output[1].c_str()); + } + if (b.acceptParam().is_present()) { + encode_semi_colon_params(static_cast(b.acceptParam()), &(accept->gen_params)); + } + char *buff; + ::osip_accept_to_str(accept, &buff); + accepts += (const char*)buff; + accepts += ","; + osip_free(buff); + ::osip_accept_free(accept); + loggers::get_instance().log("sip_codec_headers::encode_accept_header: accepts: %s", accepts.c_str()); + } // End of 'for' statement + accepts.resize(accepts.length() - 1); // Remove the last ',' + ::osip_message_set_accept(*p_sip_message, ::strdup(accepts.c_str())); + + return 0; +} // End of method encode_accept_header + +int sip_codec_headers::encode_accept_contact_header(const LibSip__SIPTypesAndValues::AcceptContact& p_accept_contact, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_accept_contact_header"); + + const LibSip__SIPTypesAndValues::AcRcValue__List& al = p_accept_contact.acValues(); + if (al.lengthof() == 0) { + return 0; + } + + std::string accepts; + for (int i = 0; i < al.lengthof(); i++) { + const LibSip__SIPTypesAndValues::AcRcValue& a = al[i]; + loggers::get_instance().log_msg("sip_codec_headers::encode_accept_contact_header: a: ", a); + accepts += static_cast(a.wildcard()); + if (a.acRcParams().is_present()) { + const LibSip__Common::SemicolonParam__List& l = static_cast(*a.acRcParams().get_opt_value()); + for (int j = 0; j < l.lengthof(); j++) { + accepts += ";"; + const LibSip__Common::GenericParam& p = l[j]; + accepts += static_cast(p.id()); + if (p.paramValue().is_present()) { + const LibSip__Common::GenValue& g = static_cast(*p.paramValue().get_opt_value());; + accepts += "="; + if (g.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + accepts += static_cast(g.tokenOrHost()); + } else { + accepts += static_cast(g.quotedString()); + } + } + } // End of 'for' statement + } + accepts += ","; + loggers::get_instance().log("sip_codec_headers::encode_accept_header: accepts: %s", accepts.c_str()); + } // End of 'for' statement + accepts.resize(accepts.length() - 1); // Remove the last ',' + ::osip_message_set_header(*p_sip_message, (const char *)"Accept-Contact", ::strdup(accepts.c_str())); + + loggers::get_instance().log("<<< sip_codec_headers::encode_accept_contact_header"); + return 0; +} // End of method encode_accept_contact_header + +int sip_codec_headers::encode_allow_header(const OPTIONAL& p_allow, osip_message_t** p_sip_message) +{ + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_allow_header", p_allow); + + const LibSip__SIPTypesAndValues::Allow& allow = static_cast(*p_allow.get_opt_value()); + + if (!allow.methods().is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::Method__List& m = static_cast(*allow.methods().get_opt_value()); + if (m.lengthof() == 0) { + return 0; + } + + std::string str(static_cast(m[0])); + if (m.lengthof() > 1) { + int i = 1; + do { + str += ","; + str += static_cast(m[i++]); + } while (i < m.lengthof()); + } + ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Allow", str.c_str()); + + loggers::get_instance().log("<<< sip_codec_headers::encode_allow_header"); + return 0; +} // End of method encode_allow_header + +int sip_codec_headers::encode_authorization_header(const LibSip__SIPTypesAndValues::Authorization& p_authorization, osip_authorization_t** p_authorization_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::encode_authorization_header"); + + ::osip_authorization_init(p_authorization_header); + + const LibSip__SIPTypesAndValues::CredentialsList& l = p_authorization.body(); + int i = 0; + do { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: Processing item #%d", i); + const LibSip__SIPTypesAndValues::Credentials& c = l[i++]; + if (c.ischosen(LibSip__SIPTypesAndValues::Credentials::ALT_digestResponse)) { + bool processed = true; + const LibSip__Common::CommaParam__List& p = c.digestResponse(); + if (p.lengthof() > 0) { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: Processing param ", p); + int j = 0; + do { + const LibSip__Common::GenericParam& g = p[j++]; + std::string str(static_cast(g.id())); + if (str.compare("realm") == 0) { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: realm found"); + if (g.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: GenValue: ", v); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: tokenOrHost: ", v.tokenOrHost()); + ::osip_authorization_set_realm(*p_authorization_header, (char*)::strdup(static_cast(v.tokenOrHost()))); + } else { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: quotedString: ", v.quotedString()); + ::osip_authorization_set_realm(*p_authorization_header, (char*)::strdup(static_cast(v.quotedString()))); + } + } else { + loggers::get_instance().error("sip_codec_headers::encode_authorization_header: Not implemented(4)"); + } + } else if (str.compare("username") == 0) { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: username found"); + if (g.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: GenValue: ", v); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: tokenOrHost: ", v.tokenOrHost()); + ::osip_authorization_set_username(*p_authorization_header, (char*)::strdup(static_cast(v.tokenOrHost()))); + } else { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: quotedString: ", v.quotedString()); + ::osip_authorization_set_username(*p_authorization_header, (char*)::strdup(static_cast(v.quotedString()))); + } + } else { + loggers::get_instance().error("sip_codec_headers::encode_authorization_header: Not implemented(6)"); + } + } else if (str.compare("uri") == 0) { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: uri found"); + if (g.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: GenValue: ", v); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: tokenOrHost: ", v.tokenOrHost()); + ::osip_authorization_set_uri(*p_authorization_header, (char*)::strdup(static_cast(v.tokenOrHost()))); + } else { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: quotedString: ", v.quotedString()); + ::osip_authorization_set_uri(*p_authorization_header, (char*)::strdup(static_cast(v.quotedString()))); + } + } else { + loggers::get_instance().error("sip_codec_headers::encode_authorization_header: Not implemented(7)"); + } + } else if (str.compare("nonce") == 0) { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: nonce found"); + if (g.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: GenValue: ", v); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: tokenOrHost: ", v.tokenOrHost()); + ::osip_authorization_set_nonce(*p_authorization_header, (char*)::strdup(static_cast(v.tokenOrHost()))); + } else { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: quotedString: ", v.quotedString()); + ::osip_authorization_set_nonce(*p_authorization_header, (char*)::strdup(static_cast(v.quotedString()))); + } + } else { + loggers::get_instance().error("sip_codec_headers::encode_authorization_header: Not implemented(10)"); + } + } else if (str.compare("response") == 0) { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: response found"); + if (g.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: GenValue: ", v); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: tokenOrHost: ", v.tokenOrHost()); + ::osip_authorization_set_response(*p_authorization_header, (char*)::strdup(static_cast(v.tokenOrHost()))); + } else { + loggers::get_instance().log_msg("sip_codec_headers::encode_authorization_header: quotedString: ", v.quotedString()); + ::osip_authorization_set_response(*p_authorization_header, (char*)::strdup(static_cast(v.quotedString()))); + } + } else { + loggers::get_instance().error("sip_codec_headers::encode_authorization_header: Not implemented(12)"); + } + } else { + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: Set processed to false for %s", str.c_str()); + processed = false; + } + } while (j < p.lengthof()); + } + loggers::get_instance().log("sip_codec_headers::encode_authorization_header: processed: %x", processed); + if (processed) { + ::osip_authorization_set_auth_type(*p_authorization_header, (char*)::strdup("Digest")); + } + } else { + const LibSip__SIPTypesAndValues::OtherAuth& o = c.otherResponse(); + loggers::get_instance().error("sip_codec_headers::encode_authorization_header: Not implemented"); + } + } while (i < l.lengthof()); + + return 0; +} // End of method encode_authorization_header + +int sip_codec_headers::encode_call_id_header(const LibSip__SIPTypesAndValues::CallId& p_call_id, osip_call_id_t** p_call_id_header) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_call_id_header", p_call_id.callid()); + + ::osip_call_id_init(p_call_id_header); + ::osip_call_id_parse(*p_call_id_header, static_cast(p_call_id.callid())); + + loggers::get_instance().log("<<< sip_codec_headers::encode_call_id_header"); + return 0; +} // End of method encode_call_id_header + +int sip_codec_headers::encode_call_info_header(const OPTIONAL& p_call_info, osip_message_t** p_sip_message) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_call_info_header", p_call_info); + + const LibSip__SIPTypesAndValues::CallInfo& call_info = static_cast(*p_call_info.get_opt_value()); + + if (!call_info.callInfoBody().is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::CallInfoBody__List& c = static_cast(*call_info.callInfoBody().get_opt_value()); + if (c.lengthof() == 0) { + return 0; + } + + int pos = 0; + std::string value; + do { + const LibSip__SIPTypesAndValues::CallInfoBody& call_info_body = c[pos++]; + loggers::get_instance().log_msg("sip_codec_headers::encode_call_info_header: Processing ", call_info_body); + osip_call_info_t *header; + ::osip_call_info_init(&header); + ::osip_call_info_set_uri(header, (char*)static_cast(call_info_body.url())); + if (call_info_body.infoParams().is_present()) { + encode_semi_colon_params(static_cast(call_info_body.infoParams()), &(header)->gen_params); + } + char *buffer; + ::osip_call_info_to_str(header, &buffer); + value += buffer; + osip_free(buffer); + osip_free(header); + loggers::get_instance().log("sip_codec_headers::encode_call_info_header: value=%s", value.c_str()); + } while (pos < c.lengthof()); + ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"callInfo", value.c_str()); + loggers::get_instance().log("<<< sip_codec_headers::encode_call_info_header"); + return 0; +} // End of method encode_call_info_header + +int sip_codec_headers::encode_contact_header(const LibSip__SIPTypesAndValues::Contact& p_contact, osip_contact_t** p_contact_header) { + loggers::get_instance().log(">>> sip_codec_headers::encode_contact_header"); + + ::osip_contact_init(p_contact_header); + const LibSip__SIPTypesAndValues::ContactBody& body = p_contact.contactBody(); + if (body.ischosen(LibSip__SIPTypesAndValues::ContactBody::ALT_wildcard)) { + const CHARSTRING& wildcard = body.wildcard(); + loggers::get_instance().warning("sip_codec_headers::encode_contact_header: wildcard not implemented yet"); + *p_contact_header = nullptr; + return -1; + } else if (body.ischosen(LibSip__SIPTypesAndValues::ContactBody::ALT_contactAddresses)) { + const LibSip__SIPTypesAndValues::ContactAddress__List& l = body.contactAddresses(); + // Encode AddressField + for (int i = 0; i < l.size_of(); i++) { + osip_uri_t* uri = nullptr; + const LibSip__SIPTypesAndValues::ContactAddress c = l[i]; + if (c.addressField().ischosen(LibSip__SIPTypesAndValues::Addr__Union::ALT_nameAddr)) { + const LibSip__SIPTypesAndValues::NameAddr& addr = c.addressField().nameAddr(); + if (encode_sip_url(addr.addrSpec(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_contact_header: Failed to encode SipUrl"); + ::osip_contact_free(*p_contact_header); + *p_contact_header = nullptr; + return -1; + } + ::osip_contact_set_url(*p_contact_header, uri); + if (addr.displayName().is_present()) { + const LibSip__SIPTypesAndValues::DisplayName& n = static_cast(addr.displayName()); + if (n.ischosen(LibSip__SIPTypesAndValues::DisplayName::ALT_token)) { + ::osip_contact_set_displayname(*p_contact_header, (char*)::strdup(static_cast(static_cast(n.token())))); + } else if (n.ischosen(LibSip__SIPTypesAndValues::DisplayName::ALT_quotedString)) { + ::osip_contact_set_displayname(*p_contact_header, (char*)::strdup(static_cast(static_cast(n.quotedString())))); + } else { + loggers::get_instance().warning("sip_codec_headers::encode_contact_header: Failed to encode DisplayName"); + ::osip_contact_free(*p_contact_header); + *p_contact_header = nullptr; + return -1; + } + } + } else if (c.addressField().ischosen(LibSip__SIPTypesAndValues::Addr__Union::ALT_addrSpecUnion)) { + if (encode_sip_url(c.addressField().addrSpecUnion(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_contact_header: Failed to encode SipUrl"); + ::osip_contact_free(*p_contact_header); + *p_contact_header = nullptr; + return -1; + } + ::osip_contact_set_url(*p_contact_header, uri); + } else { + loggers::get_instance().warning("sip_codec_headers::encode_contact_header: Failed to encode Addr__Union"); + ::osip_contact_free(*p_contact_header); + *p_contact_header = nullptr; + return -1; + } + // Encode contactParams + if (c.contactParams().is_present()) { + encode_semi_colon_params(static_cast(c.contactParams()), &(*p_contact_header)->gen_params); + } + + } // End of 'for' statement + } else { + return -1; + } + + loggers::get_instance().log("<<< sip_codec_headers::encode_contact_header"); + return 0; +} // End of method encode_contact_header + +int sip_codec_headers::encode_content_length_header(const LibSip__SIPTypesAndValues::ContentLength& p_content_length, osip_content_length_t** p_content_length_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::encode_content_length_header"); + + ::osip_content_length_init(p_content_length_header); + (*p_content_length_header)->value = (char*)::strdup(std::to_string(static_cast(p_content_length.len())).c_str()); + + loggers::get_instance().log("<<< sip_codec_headers::encode_content_length_header"); + return 0; +} // End of method encode_content_length_header + +int sip_codec_headers::encode_content_type_header(const LibSip__SIPTypesAndValues::ContentType& p_content_type, osip_content_type_t** p_content_type_header) +{ + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_content_type_header: ", p_content_type); + + ::osip_content_type_init(p_content_type_header); + + // Split type/subtype using '/' as separator + std::vector output = converter::get_instance().split(static_cast(p_content_type.mTypeSubtype()), "/"); + (*p_content_type_header)->type = ::strdup(output[0].c_str()); + if (output.size() > 1) { + (*p_content_type_header)->subtype = ::strdup(output[1].c_str()); + } + + if (p_content_type.mParams().is_present()) { + encode_semi_colon_params(static_cast(p_content_type.mParams()), &((*p_content_type_header)->gen_params)); + } + + loggers::get_instance().log("<<< sip_codec_headers::encode_content_type_header"); + return 0; +} // End of method encode_content_type_header + +int sip_codec_headers::encode_c_seq_header(const LibSip__SIPTypesAndValues::CSeq& p_c_seq, osip_cseq_t** p_c_seq_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::encode_c_seq_header"); + + ::osip_cseq_init(p_c_seq_header); + ::osip_cseq_set_number(*p_c_seq_header, (char*)::strdup(std::to_string(static_cast(p_c_seq.seqNumber())).c_str())); + ::osip_cseq_set_method(*p_c_seq_header, (char*)::strdup(static_cast(p_c_seq.method()))); + + return 0; +} // End of method encode_c_seq_header + +int sip_codec_headers::encode_event_header(const OPTIONAL& p_event, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_event_header"); + + if (!p_event.is_present()) { + return 0; + } + const LibSip__SIPTypesAndValues::Event& event = static_cast(*p_event.get_opt_value()); + + // eventType + std::string value(static_cast(event.eventType())); + loggers::get_instance().log("sip_codec_headers::encode_event_header: eventType: %s", value.c_str()); + + // eventParam + const OPTIONAL& event_param = event.eventParams(); // TODO Create a method to fill an std::string with SemicolonParam__List + if (event_param.is_present()) { + const LibSip__Common::SemicolonParam__List& l = static_cast(*event_param.get_opt_value()); + int i = 0; + do { + value += ";"; + const LibSip__Common::GenericParam& g = l[i]; + value += static_cast(g.id()); + if (g.paramValue().is_present()) { + value += "="; + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + value += static_cast(v.tokenOrHost()); + } else { + value += static_cast(v.quotedString()); + } + } + i += 1; + } while (i < l.lengthof()); + } + loggers::get_instance().log("sip_codec_headers::encode_event_header: %s", value.c_str()); + ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Event", value.c_str()); + + return 0; +} + +int sip_codec_headers::encode_expires_header(const OPTIONAL& p_expires, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_expires_header"); + + if (!p_expires.is_present()) { + return 0; + } + const LibSip__SIPTypesAndValues::Expires& expires = static_cast(*p_expires.get_opt_value()); + + // deltaSec + std::string value(static_cast(expires.deltaSec())); + + loggers::get_instance().log("sip_codec_headers::encode_expires_header: %s", value.c_str()); + ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Expires", value.c_str()); + + return 0; +} + +int sip_codec_headers::encode_from_header(const LibSip__SIPTypesAndValues::From& p_from, osip_from_t** p_from_header) { + loggers::get_instance().log(">>> sip_codec_headers::encode_from_header"); + + ::osip_from_init(p_from_header); + // Endode addressField + osip_uri_t* uri = nullptr; + const LibSip__SIPTypesAndValues::Addr__Union& a = p_from.addressField(); + if (a.ischosen(LibSip__SIPTypesAndValues::Addr__Union::ALT_nameAddr)) { + const LibSip__SIPTypesAndValues::NameAddr& addr = a.nameAddr(); + if (encode_sip_url(addr.addrSpec(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_from_header: Failed to encode SipUrl"); + ::osip_from_free(*p_from_header); + *p_from_header = nullptr; + return -1; + } + ::osip_from_set_url(*p_from_header, uri); + if (addr.displayName().is_present()) { + const LibSip__SIPTypesAndValues::DisplayName& n = static_cast(addr.displayName()); + if (n.ischosen(LibSip__SIPTypesAndValues::DisplayName::ALT_token)) { + ::osip_from_set_displayname(*p_from_header, (char*)::strdup(static_cast(static_cast(n.token())))); + } else if (n.ischosen(LibSip__SIPTypesAndValues::DisplayName::ALT_quotedString)) { + ::osip_from_set_displayname(*p_from_header, (char*)::strdup(static_cast(static_cast(n.quotedString())))); + } else { + loggers::get_instance().warning("sip_codec_headers::encode_from_header: Failed to encode DisplayName"); + ::osip_from_free(*p_from_header); + *p_from_header = nullptr; + return -1; + } + } + } else if (a.ischosen(LibSip__SIPTypesAndValues::Addr__Union::ALT_addrSpecUnion)) { + if (encode_sip_url(a.addrSpecUnion(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_from_header: Failed to encode SipUrl"); + ::osip_from_free(*p_from_header); + *p_from_header = nullptr; + return -1; + } + ::osip_from_set_url(*p_from_header, uri); + } else { + loggers::get_instance().warning("sip_codec_headers::encode_from_header: Failed to encode Addr__Union"); + ::osip_from_free(*p_from_header); + *p_from_header = nullptr; + return -1; + } + // Encode fromParams + if (p_from.fromParams().is_present()) { + encode_semi_colon_params(static_cast(p_from.fromParams()), &(*p_from_header)->gen_params); + } + + return 0; +} // End of method encode_from_header + +int sip_codec_headers::encode_geolocation_header(const OPTIONAL& p_geolocation, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_geolocation_header"); + + if (!p_geolocation.is_present()) { + return 0; + } + const LibSip__SIPTypesAndValues::Geolocation& geolocation = static_cast(*p_geolocation.get_opt_value()); + + // addrSpec + const LibSip__SIPTypesAndValues::SipUrl& addr = geolocation.addrSpec(); + osip_uri_t* uri = nullptr; + if (encode_sip_url(addr, &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_geolocation_header: Failed to encode SipUrl"); + return -1; + } + char *buff = nullptr; + if (::osip_uri_to_str(uri, &buff) != 0) { + loggers::get_instance().warning("sip_codec_headers::encode_geolocation_header: Failed to convert SipUrl"); + return -1; + } + std::string value(buff); + osip_free(buff); + loggers::get_instance().log("sip_codec_headers::encode_geolocation_header: addrSpec: %s", value.c_str()); + // geolocParam + const OPTIONAL& geoloc_param = geolocation.geolocParam(); // TODO Create a method to fill an std::string with SemicolonParam__List + if (geoloc_param.is_present()) { + const LibSip__Common::SemicolonParam__List& l = static_cast(*geoloc_param.get_opt_value()); + int i = 0; + do { + value += ";"; + const LibSip__Common::GenericParam& g = l[i]; + value += static_cast(g.id()); + if (g.paramValue().is_present()) { + value += "="; + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + value += static_cast(v.tokenOrHost()); + } else { + value += static_cast(v.quotedString()); + } + } + i += 1; + } while (i < l.lengthof()); + } + loggers::get_instance().log("sip_codec_headers::encode_geolocation_header: %s", value.c_str()); + ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Geolocation", value.c_str()); + + return 0; +} + +int sip_codec_headers::encode_geolocation_routing_header(const OPTIONAL& p_geolocation_routing, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_geolocation_routing_header"); + + if (!p_geolocation_routing.is_present()) { + return 0; + } + const LibSip__SIPTypesAndValues::GeolocationRouting& geolocation_routing = static_cast(*p_geolocation_routing.get_opt_value()); + std::string value; + if (geolocation_routing.state() == LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__YES__E) { + value = "yes"; + } else if (geolocation_routing.state() == LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__NO__E) { + value = "no"; + } else { + value = "other"; + } + loggers::get_instance().log("sip_codec_headers::encode_geolocation_routing_header: state: %s", value.c_str()); + // genericValue + const OPTIONAL& generic_value = geolocation_routing.genericValue(); + if (generic_value.is_present()) { + const LibSip__Common::GenericParam& g = static_cast(*geolocation_routing.genericValue().get_opt_value()); + value += ";"; + value += static_cast(g.id()); + if (g.paramValue().is_present()) { + value += "="; + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + value += static_cast(v.tokenOrHost()); + } else { + value += static_cast(v.quotedString()); + } + } + } + + loggers::get_instance().log("sip_codec_headers::encode_geolocation_routing_header: %s", value.c_str()); + ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Geolocation-Routing", value.c_str()); + + return 0; +} + +int sip_codec_headers::encode_max_forwards_header(const OPTIONAL& p_max_forwards, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_max_forwards_header"); + + if (!p_max_forwards.is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::MaxForwards& max_forwards = static_cast(*p_max_forwards.get_opt_value()); + osip_message_set_max_forwards(*p_sip_message, std::to_string(static_cast(max_forwards.forwards())).c_str()); + + return 0; +} + +int sip_codec_headers::encode_min_se_header(const OPTIONAL& p_min_se, osip_message_t** p_sip_message) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_min_se_header", p_min_se); + + const LibSip__SIPTypesAndValues::MinSE& min_se = static_cast(*p_min_se.get_opt_value()); + // deltaSec + std::string value(static_cast(min_se.deltaSec())); + // seParam + const OPTIONAL& se_param = min_se.minSeParam(); // TODO Create a method to fill an std::string with SemicolonParam__List + if (se_param.is_present()) { + const LibSip__Common::SemicolonParam__List& l = static_cast(*se_param.get_opt_value()); + int i = 0; + do { + value += ";"; + const LibSip__Common::GenericParam& g = l[i]; + value += static_cast(g.id()); + if (g.paramValue().is_present()) { + value += "="; + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + value += static_cast(v.tokenOrHost()); + } else { + value += static_cast(v.quotedString()); + } + } + i += 1; + } while (i < l.lengthof()); + } + ::osip_message_set_header((osip_message_t *)*p_sip_message,(const char *)"Min-SE", value.c_str()); + + return 0; +} + +int sip_codec_headers::encode_p_access_network_info_header(const OPTIONAL& p_p_access_network_info_header, osip_message_t** p_sip_message) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_p_access_network_info_header", p_p_access_network_info_header); + + const LibSip__SIPTypesAndValues::PAccessNetworkInfo& p_access_network_info_header = static_cast(*p_p_access_network_info_header.get_opt_value()); + // accessType + std::string value(static_cast(p_access_network_info_header.accessType())); + // Generic parameters + const OPTIONAL& p_access_network_info_param = p_access_network_info_header.genericParams(); // TODO Create a method to fill an std::string with SemicolonParam__List + if (p_access_network_info_param.is_present()) { + const LibSip__Common::SemicolonParam__List& l = static_cast(*p_access_network_info_param.get_opt_value()); + int i = 0; + do { + value += ";"; + const LibSip__Common::GenericParam& g = l[i]; + value += static_cast(g.id()); + if (g.paramValue().is_present()) { + value += "="; + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + value += static_cast(v.tokenOrHost()); + } else { + value += static_cast(v.quotedString()); + } + } + i += 1; + } while (i < l.lengthof()); + } + ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"P-Access-Network-Info", value.c_str()); + + return 0; +} // End of method encode_p_access_network_info_header + +int sip_codec_headers::encode_p_associated_uri_header(const OPTIONAL& p_p_associated_uri_header, osip_message_t** p_sip_message) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_p_associated_uri_header", p_p_associated_uri_header); + + if (!p_p_associated_uri_header.is_present()) { + return 0; + } + const LibSip__SIPTypesAndValues::PAssociatedURI& p_associated_uri_header = static_cast(*p_p_associated_uri_header.get_opt_value()); + + const LibSip__SIPTypesAndValues::NameAddrParam__List& l = p_associated_uri_header.nameAddrList(); + std::string value; + for (int i = 0; i < l.lengthof(); i++) { + osip_uri_t* uri = nullptr; + if (encode_sip_url(l[i].nameAddr().addrSpec(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_p_associated_uri_header: Failed to encode SipUrl"); + return -1; + } + char *buff = nullptr; + if (::osip_uri_to_str(uri, &buff) != 0) { + loggers::get_instance().warning("sip_codec_headers::encode_p_associated_uri_header: Failed to convert SipUrl"); + return -1; + } + value += buff; + osip_free(buff); + if (l[i].genericParams().is_present()) { + // TODO To be implemented + loggers::get_instance().warning("sip_codec_headers::encode_p_associated_uri_header: To be implemented"); + } + value += ","; + } // End of 'for' statement + ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"P-Associated-URI", value.c_str()); + return 0; +} + +int sip_codec_headers::encode_privacy_header(const OPTIONAL& p_privacy_header, osip_message_t** p_sip_message) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_privacy_header", p_privacy_header); + + const LibSip__SIPTypesAndValues::Privacy& privacy_header = static_cast(*p_privacy_header.get_opt_value()); + + const LibSip__SIPTypesAndValues::PrivacyValue__List& m = privacy_header.privValueList(); + if (m.lengthof() == 0) { + return 0; + } + + std::string str(static_cast(m[0])); + if (m.lengthof() > 1) { + int i = 1; + do { + str += ","; + str += static_cast(m[i++]); + } while (i < m.lengthof()); + } + ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"Privacy", str.c_str()); + + loggers::get_instance().log("<<< sip_codec_headers::encode_privacy_header"); + return 0; +} // End of method encode_privacy_header + +int sip_codec_headers::encode_route_header(const OPTIONAL& p_route_header, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_route_header", p_route_header); + + osip_route_t* route_header; + ::osip_route_init(&route_header); + const LibSip__SIPTypesAndValues::Route& r = static_cast(*p_route_header.get_opt_value()); + const LibSip__SIPTypesAndValues::RouteBody__List& l = r.routeBody(); + for (int i = 0; i < l.lengthof(); i++) { + const LibSip__SIPTypesAndValues::NameAddr& addr = l[i].nameAddr(); + osip_uri_t* uri = nullptr; + if (encode_sip_url(addr.addrSpec(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_route_header: Failed to encode SipUrl"); + ::osip_route_free(route_header); + return -1; + } + ::osip_route_set_url(route_header, uri); + // Encode rrParam + if (l[i].rrParam().is_present()) { + encode_semi_colon_params(static_cast(l[i].rrParam()), &(route_header)->gen_params); + } + } // End of 'for' statement + + char* hvalue; + int result = ::osip_route_to_str(route_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_route_header: '%s'- result:%d", hvalue, result); + if (::osip_message_set_route(*p_sip_message, hvalue) != OSIP_SUCCESS) { + loggers::get_instance().warning("sip_codec_headers::encode_route_header: Failed to set Route header in sip_message"); + return -1; + } + ::osip_route_free(route_header); + osip_free(hvalue); + + return 0; +} + +int sip_codec_headers::encode_record_route_header(const OPTIONAL& p_record_route_header, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_record_route_header", p_record_route_header); + + osip_record_route_t* record_route_header; + ::osip_record_route_init(&record_route_header); + const LibSip__SIPTypesAndValues::RecordRoute& r = static_cast(*p_record_route_header.get_opt_value()); + const LibSip__SIPTypesAndValues::RouteBody__List& l = r.routeBody(); + for (int i = 0; i < l.lengthof(); i++) { + const LibSip__SIPTypesAndValues::NameAddr& addr = l[i].nameAddr(); + osip_uri_t* uri = nullptr; + if (encode_sip_url(addr.addrSpec(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_record_route_header: Failed to encode SipUrl"); + ::osip_record_route_free(record_route_header); + return -1; + } + ::osip_record_route_set_url(record_route_header, uri); + // Encode rrParam + if (l[i].rrParam().is_present()) { + encode_semi_colon_params(static_cast(l[i].rrParam()), &(record_route_header)->gen_params); + } + } // End of 'for' statement + + char* hvalue; + int result = ::osip_record_route_to_str(record_route_header, &hvalue); + loggers::get_instance().log("sip_codec_headers::encode_record_route_header: '%s'- result:%d", hvalue, result); + if (::osip_message_set_record_route(*p_sip_message, hvalue) != OSIP_SUCCESS) { + loggers::get_instance().warning("sip_codec_headers::encode_record_route_header: Failed to set RecordRoute header in sip_message"); + return -1; + } + ::osip_record_route_free(record_route_header); + osip_free(hvalue); + + return 0; +} + +int sip_codec_headers::encode_r_seq_header(const OPTIONAL& p_r_seq, osip_message_t** p_sip_message) +{ + loggers::get_instance().log(">>> sip_codec_headers::encode_r_seq_header", p_r_seq); + + const LibSip__SIPTypesAndValues::RSeq& r_seq = static_cast(*p_r_seq.get_opt_value()); + ::osip_message_set_header((osip_message_t *)*p_sip_message, (const char *)"RSeq", static_cast(std::to_string(r_seq.responseNum()).c_str())); + + return 0; +} // End of method encode_r_seq_header + +int sip_codec_headers::encode_session_expires_header(const OPTIONAL& p_session_expires, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_session_expires_header"); + + if (!p_session_expires.is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::SessionExpires& session_expires = static_cast(*p_session_expires.get_opt_value()); + // deltaSec + std::string value(static_cast(session_expires.deltaSec())); + // seParam + const OPTIONAL& se_param = session_expires.seParam(); // TODO Create a method to fill an std::string with SemicolonParam__List + if (se_param.is_present()) { + const LibSip__Common::SemicolonParam__List& l = static_cast(*se_param.get_opt_value()); + int i = 0; + do { + value += ";"; + const LibSip__Common::GenericParam& g = l[i]; + value += static_cast(g.id()); + if (g.paramValue().is_present()) { + value += "="; + const LibSip__Common::GenValue& v = static_cast(*g.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + value += static_cast(v.tokenOrHost()); + } else { + value += static_cast(v.quotedString()); + } + } + } while (i < l.lengthof()); + } + osip_message_set_expires(*p_sip_message, value.c_str()); + + return 0; +} + +int sip_codec_headers::encode_supported_header(const OPTIONAL& p_supported, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_supported_header"); + + if (!p_supported.is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::Supported& supported = static_cast(*p_supported.get_opt_value()); + const OPTIONAL& tags = supported.optionsTags(); + if (!tags.is_present()) { + return 0; + } + if (encode_option_tag_list(static_cast(*tags.get_opt_value()), "Supported", p_sip_message) == -1) { + return -1; + } + + return 0; +} + +int sip_codec_headers::encode_user_agent_header(const OPTIONAL& p_user_agent, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_user_agent_header"); + + if (!p_user_agent.is_present()) { + return 0; + } + + const LibSip__SIPTypesAndValues::UserAgent& user_agent = static_cast(*p_user_agent.get_opt_value()); + const LibSip__SIPTypesAndValues::ServerVal__List& s = user_agent.userAgentBody(); + if (encode_server_val_list(s, "User-Agent", p_sip_message) == -1) { + return -1; + } + + return 0; +} + +int sip_codec_headers::encode_to_header(const LibSip__SIPTypesAndValues::To& p_to, osip_to_t** p_to_header) { + loggers::get_instance().log(">>> sip_codec_headers::encode_to_header"); + + ::osip_to_init(p_to_header); + const LibSip__SIPTypesAndValues::Addr__Union& a = p_to.addressField(); + if (a.ischosen(LibSip__SIPTypesAndValues::Addr__Union::ALT_nameAddr)) { + const LibSip__SIPTypesAndValues::NameAddr& addr = a.nameAddr(); + osip_uri_t *uri; + if (encode_sip_url(addr.addrSpec(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_to_header: Failed to encode SipUrl"); + ::osip_to_free(*p_to_header); + *p_to_header = nullptr; + return -1; + } + ::osip_to_set_url(*p_to_header, uri); + //::osip_uri_free(uri); + if (addr.displayName().is_present()) { + const LibSip__SIPTypesAndValues::DisplayName& n = static_cast(addr.displayName()); + if (n.ischosen(LibSip__SIPTypesAndValues::DisplayName::ALT_token)) { + ::osip_to_set_displayname(*p_to_header, (char*)::strdup(static_cast(static_cast(n.token())))); + } else if (n.ischosen(LibSip__SIPTypesAndValues::DisplayName::ALT_quotedString)) { + ::osip_to_set_displayname(*p_to_header, (char*)::strdup(static_cast(static_cast(n.quotedString())))); + } else { + loggers::get_instance().warning("sip_codec_headers::encode_to_header: Failed to encode DisplayName"); + ::osip_to_free(*p_to_header); + *p_to_header = nullptr; + return -1; + } + } + } else if (a.ischosen(LibSip__SIPTypesAndValues::Addr__Union::ALT_addrSpecUnion)) { + osip_uri_t *uri; + if (encode_sip_url(a.addrSpecUnion(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_headers::encode_to_header: Failed to encode SipUrl"); + ::osip_to_free(*p_to_header); + *p_to_header = nullptr; + return -1; + } + ::osip_to_set_url(*p_to_header, uri); + } else { + loggers::get_instance().warning("sip_codec_headers::encode_to_header: Failed to encode Addr__Union"); + ::osip_to_free(*p_to_header); + *p_to_header = nullptr; + return -1; + } + if (p_to.toParams().is_present()) { + encode_semi_colon_params(static_cast(p_to.toParams()), &(*p_to_header)->gen_params); + } + + return 0; +} // End of method encode_to_header + +int sip_codec_headers::encode_via_header(const LibSip__SIPTypesAndValues::Via& p_via, osip_via_t** p_via_header) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_via_header: ", p_via); + + ::osip_via_init(p_via_header); + const LibSip__SIPTypesAndValues::ViaBody__List& l = p_via.viaBody(); + for (int i = 0; i < l.size_of(); i++) { + const LibSip__SIPTypesAndValues::ViaBody v = l[i]; + loggers::get_instance().log_msg("sip_codec_headers::encode_via_header: Processing ", v); + + ::via_set_protocol(*p_via_header, (char*)::strdup(static_cast(v.sentProtocol().transport()))); + ::via_set_version(*p_via_header, (char*)::strdup(static_cast(v.sentProtocol().protocolVersion()))); + std::string host; + std::string port; + encode_host_port(v.sentBy(), host, port); + if (!host.empty()) { + ::via_set_host(*p_via_header, (char*)::strdup(host.c_str())); + } + if (!port.empty()) { + ::via_set_port (*p_via_header, (char*)::strdup(port.c_str())); + } + + if (v.viaParams().is_present()) { + encode_semi_colon_params(static_cast(v.viaParams()), &(*p_via_header)->via_params); + } + } // End of 'for' statement + + return 0; +} // End of method encode_via_header + +int sip_codec_headers::encode_www_authenticate_header(const LibSip__SIPTypesAndValues::WwwAuthenticate& p_www_authenticate, osip_www_authenticate_t** p_www_authenticate_header) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_www_authenticate_header: ", p_www_authenticate); + + ::osip_www_authenticate_init(p_www_authenticate_header); + const LibSip__SIPTypesAndValues::Challenge& c = p_www_authenticate.challenge(); + if (c.ischosen(LibSip__SIPTypesAndValues::Challenge::ALT_digestCln)) { + osip_www_authenticate_set_auth_type(*p_www_authenticate_header, (char*)::strdup("Digest")); + const LibSip__Common::CommaParam__List& l = c.digestCln(); + for (int i = 0; i < l.lengthof(); i++) { + const LibSip__Common::GenericParam& p = l[i]; + if (std::string(static_cast(p.id())).compare("realm") == 0) { + if (p.paramValue().is_present()) { + const LibSip__Common::GenValue& g = static_cast(*p.paramValue().get_opt_value()); + if (g.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + ::osip_www_authenticate_set_realm(*p_www_authenticate_header, (char*)::strdup(static_cast(g.tokenOrHost()))); + } else { + std::stringstream ss; + ss << std::quoted(static_cast(g.quotedString())); + ::osip_www_authenticate_set_realm(*p_www_authenticate_header, (char*)::strdup(ss.str().c_str())); + } + } + } else if (std::string(static_cast(p.id())).compare("nonce") == 0) { + if (p.paramValue().is_present()) { + const LibSip__Common::GenValue& g = static_cast(*p.paramValue().get_opt_value()); + if (g.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + ::osip_www_authenticate_set_nonce(*p_www_authenticate_header, (char*)::strdup(static_cast(g.tokenOrHost()))); + } else { + std::stringstream ss; + ss << std::quoted(static_cast(g.quotedString())); + ::osip_www_authenticate_set_nonce(*p_www_authenticate_header, (char*)::strdup(ss.str().c_str())); + } + } + } else if (std::string(static_cast(p.id())).compare("stale") == 0) { + if (p.paramValue().is_present()) { + const LibSip__Common::GenValue& g = static_cast(*p.paramValue().get_opt_value()); + if (g.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + ::osip_www_authenticate_set_stale(*p_www_authenticate_header, (char*)::strdup(static_cast(g.tokenOrHost()))); + } else { + std::stringstream ss; + ss << std::quoted(static_cast(g.quotedString())); + ::osip_www_authenticate_set_stale(*p_www_authenticate_header, (char*)::strdup(ss.str().c_str())); + } + } + } else if (std::string(static_cast(p.id())).compare("algorithm") == 0) { + if (p.paramValue().is_present()) { + const LibSip__Common::GenValue& g = static_cast(*p.paramValue().get_opt_value()); + std::stringstream ss; + if (g.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + ss << std::quoted(static_cast(g.tokenOrHost())); + } else { + ss << std::quoted(static_cast(g.quotedString())); + } + ::osip_www_authenticate_set_algorithm(*p_www_authenticate_header, (char*)::strdup(ss.str().c_str())); + } + } else if (std::string(static_cast(p.id())).compare("qop") == 0) { + if (p.paramValue().is_present()) { + const LibSip__Common::GenValue& g = static_cast(*p.paramValue().get_opt_value()); + std::stringstream ss; + if (g.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + ss << std::quoted(static_cast(g.tokenOrHost())); + } else { + ss << std::quoted(static_cast(g.quotedString())); + } + ::osip_www_authenticate_set_qop_options(*p_www_authenticate_header, (char*)::strdup(ss.str().c_str())); + } + } else { + loggers::get_instance().warning("sip_codec_headers::encode_www_authenticate_header: Unimplemented param '%s'", static_cast(p.id())); + } + } // End of 'for'statement + } else { + const LibSip__SIPTypesAndValues::OtherAuth& l = c.otherChallenge(); + loggers::get_instance().warning("sip_codec_headers::encode_www_authenticate_header: Unsupported variant"); + return -1; + } + + return 0; +} // End of method encode_www_authenticate_header + +int sip_codec_headers::encode_semi_colon_params(const LibSip__Common::SemicolonParam__List& p_list, osip_list_t* p_sip_list) { + loggers::get_instance().log_msg(">>> sip_codec_headers::encode_semi_colon_params: ", p_list); + + if (p_list.size_of() != 0) { + for (int i = 0; i < p_list.size_of(); i++) { + const LibSip__Common::GenericParam& param = static_cast(*p_list.get_at(i)); + loggers::get_instance().log_msg("sip_codec_headers::encode_semi_colon_params: param: ", param); + if (param.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*param.paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_headers::encode_semi_colon_params: v: ", v); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + loggers::get_instance().log_msg("sip_codec_headers::encode_semi_colon_params: tokenOrHost: ", v.tokenOrHost()); + ::osip_generic_param_add(p_sip_list, (char*)::strdup(static_cast(param.id())), (char*)::strdup(static_cast(v.tokenOrHost()))); + } else { + loggers::get_instance().log_msg("sip_codec_headers::encode_semi_colon_params: quotedString: ", v.quotedString()); + ::osip_generic_param_add(p_sip_list, (char*)static_cast(param.id()), (char*)static_cast(v.quotedString())); + } + } else { + ::osip_generic_param_add(p_sip_list, (char*)::strdup(static_cast(param.id())), (char*)::strdup("")); + } + } // End of 'for' statement + } else { + // Nothing to do + } + + return 0; +} + +void sip_codec_headers::decode_semi_colon_params(const osip_list_t& p_sip_list, OPTIONAL& p_list) { + loggers::get_instance().log(">>> sip_codec_headers::decode_semi_colon_params"); + + if (::osip_list_size(&p_sip_list) != 0) { + LibSip__Common::SemicolonParam__List l; + for (int i = 0; i < ::osip_list_size(&p_sip_list); i++) { + osip_generic_param_t* p = (osip_generic_param_t*)::osip_list_get(&p_sip_list, i); + loggers::get_instance().log("sip_codec_headers::decode_semi_colon_params: After cast: %p", p); + CHARSTRING name(p->gname); + if (p->gvalue == nullptr) { + l[i] = LibSip__Common::GenericParam(name, OPTIONAL(OMIT_VALUE)); + } else { + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(p->gvalue); + l[i] = LibSip__Common::GenericParam(name, g); + } + } // End of 'for' statement + p_list = OPTIONAL(l); + } else { + p_list.set_to_omit(); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_semi_colon_params: ", p_list); +} // End of method decode_semi_colon_params + +void sip_codec_headers::decode_semi_colon_params(const std::string& p_params, std::string& p_first_param, LibSip__Common::SemicolonParam__List& p_others_params) { + loggers::get_instance().log(">>> sip_codec_headers::decode_semi_colon_params: %s", p_params.c_str()); + + std::size_t idx = p_params.find(";"); + if (idx == std::string::npos) { + p_first_param = p_params; + } else { + std::vector output = converter::get_instance().split(p_params, ";"); + p_first_param = output[0]; + LibSip__Common::SemicolonParam__List l; + for (unsigned int i = 1; i < output.size(); i++) { + std::vector o = converter::get_instance().split(output[i], "="); + if (o.size() == 2) { + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(o[1].c_str()); + p_others_params[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g); + } else { + p_others_params[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), OPTIONAL(OMIT_VALUE)); + } + } // End of 'for' statement + } + loggers::get_instance().log("<<< sip_codec_headers::decode_semi_colon_params: %s", p_first_param.c_str()); + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_semi_colon_params: ", p_others_params); +} + +void sip_codec_headers::decode_semi_colon_params(const std::string& p_params, LibSip__Common::SemicolonParam__List& p_params_list) { + loggers::get_instance().log(">>> sip_codec_headers::decode_semi_colon_params: %s", p_params.c_str()); + + std::size_t idx = p_params.find(";"); + if (idx == std::string::npos) { + std::vector o = converter::get_instance().split(p_params, "="); + if (o.size() == 2) { + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(o[1].c_str()); + p_params_list[0] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g); + } else { + p_params_list[0] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), OPTIONAL(OMIT_VALUE)); + } + } else { + std::vector output = converter::get_instance().split(p_params, ";"); + LibSip__Common::SemicolonParam__List l; + for (unsigned int i = 0; i < output.size(); i++) { + std::vector o = converter::get_instance().split(output[i], "="); + if (o.size() == 2) { + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(o[1].c_str()); + p_params_list[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g); + } else { + p_params_list[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), OPTIONAL(OMIT_VALUE)); + } + } // End of 'for' statement + } + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_semi_colon_params: ", p_params_list); +} + +int sip_codec_headers::encode_ampersand_params(const LibSip__Common::AmpersandParam__List& p_list, osip_list_t** p_sip_list) { + loggers::get_instance().log(">>> sip_codec_headers::encode_ampersand_params"); + + if (p_list.size_of() != 0) { + ::osip_list_init(*p_sip_list); + for (int i = 0; i < p_list.size_of(); i++) { + const LibSip__Common::GenericParam& param = static_cast(*p_list.get_at(i)); + if (param.paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*param.paramValue().get_opt_value()); + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + ::osip_generic_param_add(*p_sip_list, (char*)static_cast(param.id()), (char*)static_cast(v.tokenOrHost())); + } else { + ::osip_generic_param_add(*p_sip_list, (char*)static_cast(param.id()), (char*)static_cast(v.quotedString())); + } + } + } // End of 'for' statement + } else { + *p_sip_list = nullptr; + } + + return 0; +} + +void sip_codec_headers::decode_ampersand_params(const osip_list_t& p_sip_list, OPTIONAL& p_list) { + loggers::get_instance().log(">>> sip_codec_headers::decode_ampersand_params"); + + if (::osip_list_size(&p_sip_list) != 0) { + LibSip__Common::AmpersandParam__List l; + for (int i = 0; i < ::osip_list_size(&p_sip_list); i++) { + osip_generic_param_t* p = (osip_generic_param_t*)::osip_list_get(&p_sip_list, i); + loggers::get_instance().log("sip_codec_headers::decode_ampersand_params: After cast: %p", p); + CHARSTRING name(p->gname); + if (p->gvalue == nullptr) { + l[i] = LibSip__Common::GenericParam(name, OPTIONAL(OMIT_VALUE)); + } else { + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(p->gvalue); + l[i] = LibSip__Common::GenericParam(name, g); + } + } // End of 'for' statement + p_list = OPTIONAL(l); + } else { + p_list.set_to_omit(); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_ampersand_params: ", p_list); +} // End of method decode_ampersand_params + +int sip_codec_headers::encode_option_tag_list(const LibSip__SIPTypesAndValues::OptionTag__List& p_options_tags, const std::string& p_field_name, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_option_tag_list"); + + if (p_options_tags.size_of() != 0) { + std::string str(static_cast(*static_cast(p_options_tags.get_at(0)))); + loggers::get_instance().log("sip_codec_headers::encode_option_tag_list: str=%s", str.c_str()); + for (int i = 1; i < p_options_tags.size_of() - 1; i++) { + str += "," + std::string(static_cast(*static_cast(p_options_tags.get_at(i)))); + } // End of 'for' statement + loggers::get_instance().log("sip_codec_headers::encode_option_tag_list: Final str=%s", str.c_str()); + ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), str.c_str()); + } else { + ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), ""); + } + return 0; +} + +void sip_codec_headers::decode_option_tag_list(const char* p_list, OPTIONAL& p_options_tags) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_option_tag_list: %s", p_list); + + if (p_list != nullptr) { + LibSip__SIPTypesAndValues::OptionTag__List l; + std::string str(p_list); + std::size_t i = str.find(","); // See RFC 3261 - Page 231 / LibSip__SIPTypesAndValues::OptionTag__List + if (i == std::string::npos) { // Only on item + l[0] = CHARSTRING(p_list); + } else { + int idx = 0; + while(i != std::string::npos) { + l[idx++] = CHARSTRING(str.substr(0, i).c_str()); + str = str.substr(i + 1); + loggers::get_instance().log("sip_codec_headers::decode_option_tag_list: New str: %s", str.c_str()); + i = str.find(","); + loggers::get_instance().log("sip_codec_headers::decode_option_tag_list: New i: %d", i); + } // End of 'while' statement + l[idx] = CHARSTRING(str.c_str()); + } + p_options_tags = OPTIONAL(l); + } else { + p_options_tags.set_to_omit(); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_option_tag_list: ", p_options_tags); +} // End of method decode_option_tag_list + +int sip_codec_headers::encode_server_val_list(const LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals, const std::string& p_field_name, osip_message_t** p_sip_message) { + loggers::get_instance().log(">>> sip_codec_headers::encode_server_val_list"); + + if (p_server_vals.size_of() != 0) { + std::string str(static_cast(*static_cast(p_server_vals.get_at(0)))); + for (int i = 1; i < p_server_vals.size_of() - 1; i++) { + str += "," + std::string(static_cast(*static_cast(p_server_vals.get_at(i)))); + } // End of 'for' statement + ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), str.c_str()); + } else { + ::osip_message_set_header((osip_message_t *)*p_sip_message, p_field_name.c_str(), ""); + } + return 0; +} + +void sip_codec_headers::decode_server_val_list(const char* p_list, LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_server_val_list: %s", p_list); + + if (p_list != nullptr) { + std::string str(p_list); + std::size_t i = str.find(","); // See RFC 3261 - Page 231 / LibSip__SIPTypesAndValues::ServerVal__List + if (i == std::string::npos) { // Only on item + p_server_vals[0] = CHARSTRING(p_list); + } else { + int idx = 0; + while(i != std::string::npos) { + p_server_vals[idx++] = CHARSTRING(str.substr(0, i).c_str()); + str = str.substr(i + 1); + loggers::get_instance().log("sip_codec_headers::decode_server_val_list: New str: %s", str.c_str()); + i = str.find(" "); + loggers::get_instance().log("sip_codec_headers::decode_server_val_list: New i: %d", i); + } // End of 'while' statement + p_server_vals[idx] = CHARSTRING(str.c_str()); + } + } else { + p_server_vals[0] = CHARSTRING(""); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_server_val_list: ", p_server_vals); +} // End of method decode_server_val_list + +void sip_codec_headers::decode_host_port(const char* p_host, const char* p_port, LibSip__SIPTypesAndValues::HostPort& p_host_port) { + loggers::get_instance().log(">>> sip_codec_headers::decode_host_port"); + + if (p_host == nullptr) { + p_host_port.host().set_to_omit(); + } else { + p_host_port.host() = OPTIONAL(CHARSTRING(p_host)); + } + OPTIONAL port; + if (p_port == nullptr) { + p_host_port.portField().set_to_omit(); + } else { + p_host_port.portField() = OPTIONAL(INTEGER(std::stoi(p_port))); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_host_port: ", p_host_port); +} // End of method decode_host_port" + +void sip_codec_headers::decode_uri(LibSip__SIPTypesAndValues::SipUrl& p_sip_url, const osip_uri_t* p_uri) { + loggers::get_instance().log(">>> sip_codec_headers::decode_uri"); + + // Scheme + LibSip__SIPTypesAndValues::UriComponents uri_components; + if (::osip_uri_get_scheme((osip_uri_t*)p_uri) != nullptr) { + p_sip_url.scheme() = CHARSTRING(::osip_uri_get_scheme((osip_uri_t*)p_uri)); + loggers::get_instance().log_msg("sip_codec_headers::decode_uri: scheme: ", p_sip_url.scheme()); + // SipUriComponents + if (strcmp(::osip_uri_get_scheme((osip_uri_t*)p_uri), "sip") == 0) { + // User Info + OPTIONAL user_info; + if (::osip_uri_get_username((osip_uri_t*)p_uri) == nullptr) { + user_info.set_to_omit(); + } else { + OPTIONAL password; + if (::osip_uri_get_password((osip_uri_t*)p_uri) == nullptr) { + password.set_to_omit(); + } else { + password = CHARSTRING(::osip_uri_get_password((osip_uri_t*)p_uri)); + } + LibSip__SIPTypesAndValues::UserInfo u(CHARSTRING(::osip_uri_get_username((osip_uri_t*)p_uri)), password); + user_info = OPTIONAL(u); + } + loggers::get_instance().log_msg("sip_codec_headers::decode_uri: user_info: ", user_info); + // HostPort + LibSip__SIPTypesAndValues::HostPort host_port; + decode_host_port(::osip_uri_get_host((osip_uri_t*)p_uri), ::osip_uri_get_port((osip_uri_t*)p_uri), host_port); + loggers::get_instance().log_msg("sip_codec_headers::decode_uri: host_port: ", host_port); + uri_components.sip() = LibSip__SIPTypesAndValues::SipUriComponents(user_info, host_port); + } else if (strcmp(::osip_uri_get_scheme((osip_uri_t*)p_uri), "tel") == 0) { + const LibSip__SIPTypesAndValues::TelUriComponents t; + uri_components.tel() = t; // TODO To be done + loggers::get_instance().error("sip_codec_headers::decode_uri: Unsupported LibSip__SIPTypesAndValues::UriComponents::ALT_tel"); + } else if (strcmp(::osip_uri_get_scheme((osip_uri_t*)p_uri), "urn") == 0) { + char *buf = nullptr; + if (::osip_uri_to_str_canonical((osip_uri_t*)p_uri, &buf) == 0) { + std::string str(buf); + loggers::get_instance().log("sip_codec_headers::decode_uri: str: %s", str.c_str()); + std::vector output = converter::get_instance().split(str, ":"); + loggers::get_instance().log("sip_codec_headers::decode_uri: split size: %d", output.size()); + LibSip__SIPTypesAndValues::UrnUriComponents urn; + urn.namespaceId() = output[1].c_str(); + std::string s(output[2]); + for (std::size_t i = 3; i < output.size(); i++) { + s += ":" + output[i]; + } + urn.namespaceSpecificString() = s.c_str(); + uri_components.urn() = urn; + osip_free(buf); // Macro + } // TODO Check what to do in this case + } else { + char *buffer = nullptr; + ::osip_uri_to_str_canonical((osip_uri_t*)p_uri, &buffer); + std::string str(buffer); + const char* p = static_cast(p_sip_url.scheme()); + size_t i = str.find(p); + if (i == std::string::npos) { + uri_components.other() = CHARSTRING(buffer); + } else { + uri_components.other() = CHARSTRING(str.substr(i + strlen(p) + 1).c_str()); + } + osip_free(buffer); // Macro + } + } else { + char *buffer = nullptr; + ::osip_uri_to_str_canonical((osip_uri_t*)p_uri, &buffer); + uri_components.other() = CHARSTRING(buffer); + osip_free(buffer); // Macro + } + p_sip_url.components() = uri_components; + // UrlParameters + OPTIONAL params; + decode_semi_colon_params(p_uri->url_params, params); + p_sip_url.urlParameters() = params; + // Headers + OPTIONAL headers; + decode_ampersand_params(p_uri->url_headers, headers); + p_sip_url.headers() = headers; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_uri: ", p_sip_url); +} // End of method decode_uri + +void sip_codec_headers::decode_accept_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Accept& p_accept_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_accept_header"); + + // Sanity checks + osip_accept_t *sip_accept = nullptr; + ::osip_message_get_accept(p_sip_message, 0, &sip_accept); + if (sip_accept == nullptr) { + return; + } + + // FieldName + p_accept_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ACCEPT_E")); + // AcceptArgs + if (::osip_list_size(&p_sip_message->accepts) == 0) { + p_accept_header.acceptArgs().set_to_omit(); + } else { + LibSip__SIPTypesAndValues::AcceptBody__List bl; + int x = 0; + for (int i = 0; i < ::osip_list_size(&p_sip_message->accepts); i++) { + const osip_accept_t* l = (const osip_accept_t*)::osip_list_get(&p_sip_message->accepts, i); + if (l != nullptr) { + loggers::get_instance().log("sip_codec_headers::decode_accept_header: %s=%s", l->type, l->subtype); // application=sdp,application/3gpp-ims+xml + std::string str(l->subtype); + std::size_t idx = str.find(","); + if (idx == std::string::npos) { + LibSip__SIPTypesAndValues::AcceptBody b; + b.mediaRange() = CHARSTRING(l->type) + CHARSTRING("/") + CHARSTRING(l->subtype); // FIXME CHARSTRING(l->type || "=" || l->subtype)??? + if (osip_list_size(&(l->gen_params)) != 0) { + // TODO + } else { + b.acceptParam().set_to_omit(); + } + bl[x++] = b; + } else { + std::vector output = converter::get_instance().split(str, ","); + LibSip__SIPTypesAndValues::AcceptBody b; + loggers::get_instance().log("sip_codec_headers::decode_accept_header: Processing %s=%s", l->type, output[0].c_str()); + b.mediaRange() = CHARSTRING(l->type) + CHARSTRING("/") + CHARSTRING(output[0].c_str()); // FIXME CHARSTRING(l->type || "=" || l->subtype)??? + if (osip_list_size(&(l->gen_params)) != 0) { + // TODO + } else { + b.acceptParam().set_to_omit(); + } + bl[x++] = b; + for (unsigned int k = 1; k < output.size(); k++) { + loggers::get_instance().log("sip_codec_headers::decode_accept_header: In loop, processing %s=%s", output[k].c_str()); + LibSip__SIPTypesAndValues::AcceptBody b; + b.mediaRange() = CHARSTRING(output[k].c_str()); // FIXME CHARSTRING(l->type || "=" || l->subtype)??? + if (osip_list_size(&(l->gen_params)) != 0) { + // TODO + } else { + b.acceptParam().set_to_omit(); + } + bl[x++] = b; + } + } + } + } // End of 'for' statement + p_accept_header.acceptArgs() = OPTIONAL(bl); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_accept_header: ", p_accept_header); +} // End of method decode_accept_header + +void sip_codec_headers::decode_accept_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptContact& p_accept_contact_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_accept_contact_header: %p", p_sip_message->contacts); + + // Sanity checks + osip_header_t *sip_accept_contact = nullptr; + ::osip_message_header_get_byname(p_sip_message, (const char *)"accept-contact", 0, &sip_accept_contact); + if (sip_accept_contact == nullptr) { + return; + } + + loggers::get_instance().log("sip_codec_headers::decode_accept_contact_header: got it: %s:%s", sip_accept_contact->hname, sip_accept_contact->hvalue); + if ((sip_accept_contact->hvalue == nullptr) || (strlen(sip_accept_contact->hvalue) == 0)) { + loggers::get_instance().warning("sip_codec_headers::decode_accept_contact_header: Failed to decode Accept-Contact header"); + return; + } + // FieldName + p_accept_contact_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ACCEPT_CONTACT_E")); + // AcRcValue list + std::string str(sip_accept_contact->hvalue); + LibSip__SIPTypesAndValues::AcRcValue__List la; + std::size_t idx = str.find(","); + if (idx == std::string::npos) { + // Split using ; as separator + std::vector output = converter::get_instance().split(str, ";"); + loggers::get_instance().log("sip_codec_headers::decode_accept_contact_header (1): Split size: %d", output.size()); + // The first parameter is the wild card + LibSip__SIPTypesAndValues::AcRcValue acRcValue; + acRcValue.wildcard() = CHARSTRING(output[0].c_str()); + if (output.size() > 1) { + // Extract the other parameters + LibSip__Common::SemicolonParam__List l; + for (unsigned int i = 1; i < output.size(); i++) { + LibSip__Common::GenericParam p; + std::vector o = converter::get_instance().split(output[i], "="); + p.id() = CHARSTRING(o[0].c_str()); + if (o.size() == 1) { // No value + p.paramValue().set_to_omit(); + } else { + loggers::get_instance().log("sip_codec_headers::decode_accept_contact_header (1): o: %s:%s", o[0].c_str(), o[1].c_str()); + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(o[1].c_str()); + p.paramValue() = OPTIONAL(g); + } + l[i - 1] = p; + } // End of 'for' statement + loggers::get_instance().log_msg("sip_codec_headers::decode_accept_contact_header: l: ", l); + acRcValue.acRcParams() = OPTIONAL(l); + } else { + acRcValue.acRcParams().set_to_omit(); + } + la[0] = acRcValue; + } else { + // Split the list of values using , as separator + std::vector lop = converter::get_instance().split(str, ","); + for (std::size_t s = 0; s < lop.size(); s++) { + str = lop[s]; + // Extract parameters separated by ; into SemiColumn__List + std::vector output = converter::get_instance().split(str, ";"); + // The first parameter is the wild card + LibSip__SIPTypesAndValues::AcRcValue acRcValue; + acRcValue.wildcard() = CHARSTRING(output[0].c_str()); + if (output.size() > 1) { + // Extract the other parameters + LibSip__Common::SemicolonParam__List l; + for (unsigned int i = 1; i < output.size(); i++) { + LibSip__Common::GenericParam p; + std::vector o = converter::get_instance().split(output[i], "="); + p.id() = CHARSTRING(o[0].c_str()); + if (o.size() == 1) { // No value + p.paramValue().set_to_omit(); + } else { + loggers::get_instance().log("sip_codec_headers::decode_accept_contact_header (2): o: %s:%s", o[0].c_str(), o[1].c_str()); + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(o[1].c_str()); + p.paramValue() = OPTIONAL(g); + } + l[i - 1] = p; + } // End of 'for' statement + loggers::get_instance().log_msg("sip_codec_headers::decode_accept_contact_header: l: ", l); + acRcValue.acRcParams() = OPTIONAL(l); + } else { + acRcValue.acRcParams().set_to_omit(); + } + la[s] = acRcValue; + } // End of 'for'statement + } + p_accept_contact_header.acValues() = la; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_accept_contact_header: ", p_accept_contact_header); +} // End of method decode_accept_contact_header + +void sip_codec_headers::decode_accept_encoding_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptEncoding& p_accept_encoding_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_accept_encoding_header: %p", p_sip_message->accept_encodings); + + // Sanity checks + osip_accept_encoding_t *sip_accept_encoding = nullptr; + ::osip_message_get_accept_encoding(p_sip_message, 0, &sip_accept_encoding); + if (sip_accept_encoding == nullptr) { + return; + } + // FieldName + p_accept_encoding_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ACCEPT_ENCODING_E")); + // ContentCoding + p_accept_encoding_header.contentCoding().set_to_omit(); + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_accept_encoding_header: ", p_accept_encoding_header); +} // End of method decode_accept_encoding_header + +void sip_codec_headers::decode_accept_language_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptLanguage& p_accept_language_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_accept_language_header: %p", p_sip_message->accept_languages); + + // Sanity checks + osip_accept_language_t *sip_accept_language = nullptr; + ::osip_message_get_accept_language(p_sip_message, 0, &sip_accept_language); + if (sip_accept_language == nullptr) { + return; + } + + // FieldName + p_accept_language_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ACCEPT_LANGUAGE_E")); + // LanguageBody + p_accept_language_header.languageBody().set_to_omit(); + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_accept_language_header: ", p_accept_language_header); +} // End of method decode_accept_language_header + +void sip_codec_headers::decode_alert_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AlertInfo& p_alert_info_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_alert_info_header: %p", p_sip_message->alert_infos); + + // Sanity checks + osip_alert_info_t *sip_alert_info = nullptr; + ::osip_message_get_alert_info(p_sip_message, 0, &sip_alert_info); + if (sip_alert_info == nullptr) { + return; + } + + // FieldName + p_alert_info_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ALERT_INFO_E")); + // AlertInfoBody + p_alert_info_header.alertInfoBody().set_to_omit(); + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_alert_info_header: ", p_alert_info_header); +} // End of method decode_alert_info_header + +void sip_codec_headers::decode_allow_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Allow& p_allow_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_allow_header: %p", p_sip_message->allows); + + // Sanity checks + osip_allow_t *sip_allow = nullptr; + ::osip_message_get_allow(p_sip_message, 0, &sip_allow); + if (sip_allow == nullptr) { + return; + } + + // FieldName + p_allow_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ALLOW_E")); + // Methods + loggers::get_instance().log("sip_codec_headers::decode_allow_header: value: %s", sip_allow->value); + if ((sip_allow->value == nullptr) || (strlen(sip_allow->value) == 0)) { + p_allow_header.methods().set_to_omit(); + } else { + LibSip__SIPTypesAndValues::Method__List m; + std::string str(sip_allow->value); + std::vector output = converter::get_instance().split(str, ","); + unsigned int i = 0; + while (i < output.size()) { + m[i] = CHARSTRING(output[i].c_str()); + i += 1; + } // End of 'while' statement + p_allow_header.methods() = OPTIONAL(m); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_allow_header: ", p_allow_header); +} // End of method decode_allow_header + +void sip_codec_headers::decode_allow_events_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AllowEvents& p_allow_events_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_allow_events_header: %p", p_sip_message->headers); + + // Sanity checks + osip_header_t *sip_allow_events = nullptr; + ::osip_message_header_get_byname(p_sip_message, (const char *)"allow_events", 0, &sip_allow_events); + if (sip_allow_events == nullptr) { + return; + } + + // FieldName + p_allow_events_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ALLOW_EVENTS_E")); + // EventTypes + LibSip__SIPTypesAndValues::EventType__List l; + // TODO To be done + l[0] = CHARSTRING("*"); + p_allow_events_header.eventTypes() = l; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_allow_events_header: ", p_allow_events_header); +} // End of method decode_allow_events_header + +void sip_codec_headers::decode_authorization_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Authorization& p_authorization_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_authorization_header"); + + // Sanity checks + osip_authorization_t *sip_authorization = nullptr; + ::osip_message_get_authorization(p_sip_message, 0, &sip_authorization); + if (sip_authorization == nullptr) { + return; + } + + // FieldName + p_authorization_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("AUTHORIZATION_E")); + // CredentialsList + LibSip__SIPTypesAndValues::CredentialsList l; + int i = 0; + do { + loggers::get_instance().log("sip_codec_headers::decode_authorization_header: Processing item #%d", i); + LibSip__SIPTypesAndValues::Credentials v; + LibSip__Common::CommaParam__List cl; + int j = 0; + if (::osip_authorization_get_digest(sip_authorization) != nullptr) { + LibSip__Common::GenValue v; + v.tokenOrHost() = CHARSTRING(::osip_authorization_get_digest(sip_authorization)); + cl[j++] = LibSip__Common::GenericParam( + CHARSTRING("digest"), + OPTIONAL(v) + ); + } + if (::osip_authorization_get_username(sip_authorization) != nullptr) { + LibSip__Common::GenValue v; + v.tokenOrHost() = CHARSTRING(::osip_authorization_get_username(sip_authorization)); + cl[j++] = LibSip__Common::GenericParam( + CHARSTRING("username"), + OPTIONAL(v) + ); + } + if (::osip_authorization_get_uri(sip_authorization) != nullptr) { + LibSip__Common::GenValue v; + v.tokenOrHost() = CHARSTRING(::osip_authorization_get_uri(sip_authorization)); + cl[j++] = LibSip__Common::GenericParam( + CHARSTRING("uri"), + OPTIONAL(v) + ); + } + if (::osip_authorization_get_realm(sip_authorization) != nullptr) { + LibSip__Common::GenValue v; + v.tokenOrHost() = CHARSTRING(::osip_authorization_get_realm(sip_authorization)); + cl[j++] = LibSip__Common::GenericParam( + CHARSTRING("realm"), + OPTIONAL(v) + ); + } + if (::osip_authorization_get_nonce(sip_authorization) != nullptr) { + loggers::get_instance().log("sip_codec_headers::decode_authorization_header: Decode nonce"); + LibSip__Common::GenValue v; + v.tokenOrHost() = CHARSTRING(::osip_authorization_get_nonce(sip_authorization)); + cl[j++] = LibSip__Common::GenericParam( + CHARSTRING("nonce"), + OPTIONAL(v) + ); + } + if (::osip_authorization_get_response(sip_authorization) != nullptr) { + loggers::get_instance().log("sip_codec_headers::decode_authorization_header: Decode response"); + LibSip__Common::GenValue v; + v.tokenOrHost() = CHARSTRING(::osip_authorization_get_response(sip_authorization)); + cl[j++] = LibSip__Common::GenericParam( + CHARSTRING("response"), + OPTIONAL(v) + ); + } + loggers::get_instance().log_msg("sip_codec_headers::decode_authorization_header: New GenValue:", cl); + v.digestResponse() = cl; + loggers::get_instance().log_msg("sip_codec_headers::decode_authorization_header: New GenValue list:", cl); + l[i++] = v; + loggers::get_instance().log_msg("sip_codec_headers::decode_authorization_header: New CredentialsList:", l); + } while(::osip_message_get_authorization(p_sip_message, i, &sip_authorization) == 0); // End of 'do-while' statement + p_authorization_header.body() = l; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_authorization_header: ", p_authorization_header); +} // End of method decode_authorization_header + +void sip_codec_headers::decode_call_id_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CallId& p_call_id_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_call_id_header: %p", p_sip_message->call_id); + + // Sanity check + if (p_sip_message->call_id == nullptr) { + return; + } + + // FieldName + p_call_id_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("CALL_ID_E")); + // CallId + char *buffer; + ::osip_call_id_to_str(p_sip_message->call_id, &buffer); + if (buffer != nullptr) { + p_call_id_header.callid() = CHARSTRING(buffer); + osip_free(buffer); + } +} // End of method decode_call_id_header + +void sip_codec_headers::decode_call_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CallInfo& p_call_info_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_call_info_header: %p", p_sip_message->call_infos); + + osip_call_info_t *call_info = nullptr; + ::osip_message_get_call_info(p_sip_message, 0, &call_info); + if (call_info == nullptr) { + return; + } + + // FieldName + p_call_info_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("CALL_INFO_E")); + // CallInfoBody_List + loggers::get_instance().log("sip_codec_headers::decode_call_info_header: value: %s", call_info->element); + if ((call_info->element == nullptr) || (strlen(call_info->element) == 0)) { + p_call_info_header.callInfoBody().set_to_omit(); + } else if (osip_list_size(&(p_sip_message->call_infos)) == 0) { + p_call_info_header.callInfoBody().set_to_omit(); + } else { + LibSip__SIPTypesAndValues::CallInfoBody__List l; + int pos = 0; + while (pos < osip_list_size(&(p_sip_message->call_infos))) { + ::osip_message_get_call_info(p_sip_message, pos, &call_info); + loggers::get_instance().log("sip_codec_headers::decode_call_info_header: call_info.element=%s", call_info->element); + OPTIONAL params; + decode_semi_colon_params(call_info->gen_params, params); + l[pos++] = LibSip__SIPTypesAndValues::CallInfoBody(call_info->element, params); + } // End of 'while' statement + p_call_info_header.callInfoBody() = OPTIONAL(l); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_call_info_header: ", p_call_info_header); +} // End of method decode_call_info_header + +void sip_codec_headers::decode_c_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CSeq& p_c_seq_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_c_seq_header"); + + // Sanity check + if (p_sip_message->cseq == nullptr) { + return; + } + + // FieldName + p_c_seq_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("CSEQ_E")); + // Sequence number + p_c_seq_header.seqNumber() = INTEGER(std::stoi(osip_cseq_get_number(p_sip_message->cseq))); + // Method + p_c_seq_header.method() = CHARSTRING(::osip_cseq_get_method(p_sip_message->cseq)); +} // End of method decode_c_seq_header + +void sip_codec_headers::decode_content_length_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentLength& p_content_length_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_content_length_header"); + + // Sanity check + if (p_sip_message->content_length == nullptr) { + return; + } + + // FieldName + p_content_length_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("CONTENT_LENGTH_E")); + // Length + char *buffer; + ::osip_content_length_to_str(p_sip_message->content_length, &buffer); + if (buffer != nullptr) { + p_content_length_header.len() = INTEGER(std::stoi(buffer)); + osip_free(buffer); + } +} // End of method decode_content_length_header + +void sip_codec_headers::decode_content_type_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentType& p_content_type_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_content_type_header"); + + // Sanity check + if (p_sip_message->content_type == nullptr) { + return; + } + + // FieldName + p_content_type_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("CONTENT_TYPE_E")); + // Type/SubType + std::string str(p_sip_message->content_type->type); + if (p_sip_message->content_type->subtype != nullptr) { + str += "/"; + str += p_sip_message->content_type->subtype; + p_content_type_header.mTypeSubtype() = CHARSTRING(str.c_str()); + } + // Parameters + OPTIONAL params; + decode_semi_colon_params(p_sip_message->content_type->gen_params, params); + p_content_type_header.mParams() = params; +} // End of method decode_content_type_header + +void sip_codec_headers::decode_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Contact& p_contact_header) { + loggers::get_instance().log("sip_codec_headers::decode_contact_header"); + + // Sanity check + if (::osip_list_size(&p_sip_message->contacts) == 0) { + return; + } + + // FieldName + p_contact_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("CONTACT_E")); + // ContactBody + LibSip__SIPTypesAndValues::ContactAddress__List c; + int i = 0; + osip_contact_t* contact = nullptr; + while (::osip_message_get_contact(p_sip_message, i, &contact) == 0) { + LibSip__SIPTypesAndValues::ContactAddress contact_addr; + LibSip__SIPTypesAndValues::SipUrl uri; + decode_uri(uri, ::osip_contact_get_url((osip_contact_t*)contact)); + LibSip__SIPTypesAndValues::Addr__Union addr; + OPTIONAL display_name; + if (::osip_contact_get_displayname((osip_contact_t*)contact) != nullptr) { + LibSip__SIPTypesAndValues::DisplayName n; + n.token() = CHARSTRING(::osip_contact_get_displayname((osip_contact_t*)contact)); + display_name = OPTIONAL(n); + LibSip__SIPTypesAndValues::NameAddr name_addr(display_name, uri); + addr.nameAddr() = name_addr; + } else { + display_name.set_to_omit(); + addr.addrSpecUnion() = uri; + } + contact_addr.addressField() = addr; + // Params + OPTIONAL params; + decode_semi_colon_params(contact->gen_params, params); + contact_addr.contactParams() = params; + + c[i++] = contact_addr; + } // End of 'while' statement + p_contact_header.contactBody().contactAddresses() = c; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_contact_header: ", p_contact_header); +} // End of method decode_contact_header + +void sip_codec_headers::decode_event_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Event& p_event_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_event_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname(p_sip_message, (const char *)"Event", 0, &dest); // TODO Create osip_message_[g|s]et_event + if (dest == nullptr) { + loggers::get_instance().warning("sip_codec_headers::decode_event_header: Not found"); + return; + } + loggers::get_instance().log("sip_codec_headers::decode_event_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue); + + // FieldName + p_event_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("EVENT_E")); + // EventType + std::string str(dest->hvalue); + size_t p1 = str.find("<"); + size_t p2 = str.find(">"); + size_t p3 = str.find(";"); + std::string u = str.substr(p1 + 1, p2 - p1 - 1); + loggers::get_instance().log("sip_codec_headers::decode_event_header: u='%s'\n", u.c_str()); + p_event_header.eventType() = CHARSTRING(u.c_str()); + // eventParam + if (p3 != std::string::npos) { + std::string p = str.substr(p3 + 1); + loggers::get_instance().log("sip_codec_headers::decode_event_header: p='%s'\n", p.c_str()); + LibSip__Common::SemicolonParam__List params; + decode_semi_colon_params(p.c_str(), params); + if (params.is_bound()) { + p_event_header.eventParams() = OPTIONAL(params); + } else { + p_event_header.eventParams().set_to_omit(); + } + } else { + p_event_header.eventParams().set_to_omit(); + } +} // End of method decode_event_header + +void sip_codec_headers::decode_expires_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Expires& p_expires_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_expires_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname(p_sip_message, (const char *)"Expires", 0, &dest); // TODO Create osip_message_[g|s]et_expires + if (dest == nullptr) { + loggers::get_instance().warning("sip_codec_headers::decode_expires_header: Not found"); + return; + } + loggers::get_instance().log("sip_codec_headers::decode_expires_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue); + + // FieldName + p_expires_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("EXPIRES_E")); + // DeltaSec + std::string str(dest->hvalue); + p_expires_header.deltaSec() = CHARSTRING(str.c_str()); +} // End of method decode_expires_header + +void sip_codec_headers::decode_from_header(const osip_from_t* p_sip_from, LibSip__SIPTypesAndValues::From& p_from_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_from_header"); + + // Sanity check + if (p_sip_from == nullptr) { + loggers::get_instance().warning("sip_codec_headers::decode_from_header: Invalid SIP message"); + return; + } + + // FieldName + p_from_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("FROM_E")); + // Addr_Union + LibSip__SIPTypesAndValues::SipUrl uri; + decode_uri(uri, ::osip_from_get_url((osip_from_t*)p_sip_from)); + LibSip__SIPTypesAndValues::Addr__Union addr; + OPTIONAL display_name; + if (::osip_from_get_displayname((osip_from_t*)p_sip_from) != nullptr) { + LibSip__SIPTypesAndValues::DisplayName n; + n.token() = CHARSTRING(::osip_from_get_displayname((osip_from_t*)p_sip_from)); + display_name = OPTIONAL(n); + LibSip__SIPTypesAndValues::NameAddr name_addr(display_name, uri); + addr.nameAddr() = name_addr; + } else { + display_name.set_to_omit(); + addr.addrSpecUnion() = uri; + } + p_from_header.addressField() = addr; + // Params + OPTIONAL params; + decode_semi_colon_params(p_sip_from->gen_params, params); + p_from_header.fromParams() = params; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_from_header: ", p_from_header); +} // End of method decode_from_header + +void sip_codec_headers::decode_geolocation_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Geolocation& p_geolocation_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_geolocation_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname(p_sip_message, (const char *)"geolocation", 0, &dest); // TODO Create osip_message_[g|s]et_geolocation + if (dest == nullptr) { + loggers::get_instance().warning("sip_codec_headers::decode_geolocation_header: Not found"); + return; + } + loggers::get_instance().log("sip_codec_headers::decode_geolocation_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue); + + // FieldName + p_geolocation_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("GEOLOCATION_E")); + // addrSpec + std::string str(dest->hvalue); + size_t p1 = str.find("<"); + size_t p2 = str.find(">"); + size_t p3 = str.find(";"); + std::string u = str.substr(p1 + 1, p2 - p1 - 1); + loggers::get_instance().log("sip_codec_headers::decode_geolocation_header: u='%s'\n", u.c_str()); + osip_uri_t *uri = nullptr; + ::osip_uri_init(&uri); + ::osip_uri_parse(uri, u.c_str()); + decode_uri(p_geolocation_header.addrSpec(), uri); + // geolocParam + if (p3 != std::string::npos) { + std::string p = str.substr(p3 + 1); + loggers::get_instance().log("sip_codec_headers::decode_geolocation_header: p='%s'\n", p.c_str()); + LibSip__Common::SemicolonParam__List params; + decode_semi_colon_params(p.c_str(), params); + if (params.is_bound()) { + p_geolocation_header.geolocParam() = OPTIONAL(params); + } else { + p_geolocation_header.geolocParam().set_to_omit(); + } + } else { + p_geolocation_header.geolocParam().set_to_omit(); + } +} // End of method decode_geolocation_header + +void sip_codec_headers::decode_geolocation_routing_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::GeolocationRouting& p_geolocation_routing_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_geolocation_routing_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname(p_sip_message, (const char *)"geolocation-routing", 0, &dest); // TODO Create osip_message_[g|s]et_geolocation_routing + if (dest == nullptr) { + loggers::get_instance().warning("sip_codec_headers::decode_geolocation_routing_header: Not found"); + return; + } + loggers::get_instance().log("sip_codec_headers::decode_geolocation_routing_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue); + + // FieldName + p_geolocation_routing_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("GEOLOCATION_ROUTING_E")); + std::string str(dest->hvalue); + size_t pos = str.find(";"); + if (pos == std::string::npos) { + if (str.compare("yes") == 0) { + p_geolocation_routing_header.state() = LibSip__SIPTypesAndValues::GeolocationRoutingState(LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__YES__E); + } else if (str.compare("no") == 0) { + p_geolocation_routing_header.state() = LibSip__SIPTypesAndValues::GeolocationRoutingState(LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__NO__E); + } else { + p_geolocation_routing_header.state() = LibSip__SIPTypesAndValues::GeolocationRoutingState(LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__OTHER__E); + } + p_geolocation_routing_header.genericValue().set_to_omit(); + } else { + std::string s = str.substr(0, pos - 1); + loggers::get_instance().log("sip_codec_headers::decode_geolocation_routing_header: s='%s'\n", s.c_str()); + if (s.compare("yes") == 0) { + p_geolocation_routing_header.state() = LibSip__SIPTypesAndValues::GeolocationRoutingState(LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__YES__E); + } else if (s.compare("no") == 0) { + p_geolocation_routing_header.state() = LibSip__SIPTypesAndValues::GeolocationRoutingState(LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__NO__E); + } else { + p_geolocation_routing_header.state() = LibSip__SIPTypesAndValues::GeolocationRoutingState(LibSip__SIPTypesAndValues::GeolocationRoutingState::GEOLOCATION__ROUTING__OTHER__E); + } + str = str.substr(pos + 1); + LibSip__Common::GenericParam p; + pos = str.find("="); + if (pos != std::string::npos) { + p.id() = CHARSTRING(str.substr(0, pos - 1).c_str()); + LibSip__Common::GenValue v; + v.quotedString() = CHARSTRING(str.substr(pos + 1).c_str()); + p.paramValue() = OPTIONAL(v); + } else { + p.id() = CHARSTRING(str.c_str()); + p.paramValue().set_to_omit(); + } + loggers::get_instance().log("sip_codec_headers::decode_geolocation_routing_header: genericValue='%s'\n", str.c_str()); + p_geolocation_routing_header.genericValue() = OPTIONAL(p); + } +} + +void sip_codec_headers::decode_max_forwards_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MaxForwards& p_max_forwards_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_max_forwards_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + osip_message_get_max_forwards(p_sip_message, 0, &dest); + if (dest == nullptr) { + return; + } + + // FieldName + p_max_forwards_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("MAX_FORWARDS_E")); + // Forwards + loggers::get_instance().log("sip_codec_headers::decode_max_forwards_header: got it: %s:%s", dest->hname, dest->hvalue); + p_max_forwards_header.forwards() = INTEGER(std::stoi(dest->hvalue)); +} // End of method decode_max_forwards_header + +void sip_codec_headers::decode_min_se_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MinSE& p_min_se_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_min_se_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname((osip_message_t*)p_sip_message, (const char *)"min-se", 0, &dest); // TODO Create osip_message_[g|s]et_min_se + if (dest == nullptr) { + return; + } + + // FieldName + p_min_se_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("MIN_SE_E")); + + std::string fisrt_parameter; + LibSip__Common::SemicolonParam__List others_params; + decode_semi_colon_params(dest->hvalue, fisrt_parameter, others_params); + p_min_se_header.deltaSec() = CHARSTRING(fisrt_parameter.c_str()); + if (others_params.is_bound()) { + p_min_se_header.minSeParam() = OPTIONAL(others_params); + } else { + p_min_se_header.minSeParam().set_to_omit(); + } +} // End of method decode_min_se_header + +void sip_codec_headers::decode_p_associated_uri_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::PAssociatedURI& p_p_associated_uri_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_p_associated_uri_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname((osip_message_t*)p_sip_message, (const char *)"p-associated-uri", 0, &dest); // TODO Create osip_message_[g|s]et_p_associated_uri + if (dest == nullptr) { + return; + } + loggers::get_instance().log("sip_codec_headers::decode_p_associated_uri_header: hname='%s' : hvalue='%s'\n", dest->hname, dest->hvalue); + + // FieldName + p_p_associated_uri_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("P_ASSOCIATED_URI_E")); + // nameAddrList + LibSip__SIPTypesAndValues::NameAddrParam__List l; + std::string str(dest->hvalue); + + std::size_t idx = str.find(","); + if (idx == std::string::npos) { + LibSip__SIPTypesAndValues::NameAddrParam n; //, + n.genericParams().set_to_omit(); // TODO To be implemented + n.nameAddr().displayName().set_to_omit(); + std::string str(dest->hvalue); + size_t p1 = str.find("<"); + size_t p2 = str.find(">"); + std::string u = str.substr(p1 + 1, p2 - p1 - 1); + loggers::get_instance().log("sip_codec_headers::decode_p_associated_uri_header: u='%s'\n", u.c_str()); + osip_uri_t *uri = nullptr; + ::osip_uri_init(&uri); + ::osip_uri_parse(uri, u.c_str()); + decode_uri(n.nameAddr().addrSpec(), uri); + l[0] = n; + } else { + std::vector output = converter::get_instance().split(str, ","); + for (unsigned int i = 0; i < output.size(); i++) { + LibSip__SIPTypesAndValues::NameAddrParam n; //, + n.genericParams().set_to_omit(); // TODO To be implemented + n.nameAddr().displayName().set_to_omit(); + size_t p1 = output[i].find("<"); + size_t p2 = output[i].find(">"); + std::string u = output[i].substr(p1 + 1, p2 - p1 - 1); + loggers::get_instance().log("sip_codec_headers::decode_p_associated_uri_header: u='%s'\n", u.c_str()); + osip_uri_t *uri = nullptr; + ::osip_uri_init(&uri); + ::osip_uri_parse(uri, u.c_str()); + decode_uri(n.nameAddr().addrSpec(), uri); + l[i++] = n; + } // End of 'for' statement + } + p_p_associated_uri_header.nameAddrList() = l; +} // End of method decode_p_associated_uri_header + +void sip_codec_headers::decode_p_access_network_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::PAccessNetworkInfo& p_p_access_network_info_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_p_access_network_info_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname((osip_message_t*)p_sip_message, (const char *)"p-access-network-info", 0, &dest); // TODO Create osip_message_[g|s]et_p_access_network_info + if (dest == nullptr) { + return; + } + + // FieldName + p_p_access_network_info_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("P_ACCESS_NETWORK_INFO_E")); + std::string fisrt_parameter; + LibSip__Common::SemicolonParam__List others_params; + decode_semi_colon_params(dest->hvalue, fisrt_parameter, others_params); + p_p_access_network_info_header.accessType() = CHARSTRING(fisrt_parameter.c_str()); + if (others_params.is_bound()) { + p_p_access_network_info_header.genericParams() = OPTIONAL(others_params); + } else { + p_p_access_network_info_header.genericParams().set_to_omit(); + } +} // End of method decode_p_access_network_info_header + +void sip_codec_headers::decode_privacy_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Privacy& p_privacy_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_privacy_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname((osip_message_t*)p_sip_message, (const char *)"privacy", 0, &dest); // TODO Create osip_message_[g|s]et_privacy + if (dest == nullptr) { + return; + } + + // FieldName + p_privacy_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("PRIVACY_E")); + // Privacy list + loggers::get_instance().log("sip_codec_headers::decode_allow_header: value: %s", dest->hvalue); + if ((dest->hvalue == nullptr) || (strlen(dest->hvalue) == 0)) { + p_privacy_header.privValueList().set_to_omit(); + } else { + LibSip__SIPTypesAndValues::PrivacyValue__List m; + std::string str(dest->hvalue); + std::vector output = converter::get_instance().split(str, ","); + unsigned int i = 0; + while (i < output.size()) { + m[i] = CHARSTRING(output[i].c_str()); + i += 1; + } // End of 'while' statement + p_privacy_header.privValueList() = OPTIONAL(m); + } + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_privacy_header: ", p_privacy_header); +} + +void sip_codec_headers::decode_route_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Route& p_route_header) { + loggers::get_instance().log("sip_codec_headers::decode_route_header"); + // Sanity check + if (::osip_list_size(&p_sip_message->routes) == 0) { + return; + } + + // FieldName + p_route_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("ROUTE_E")); + // RouteBody + LibSip__SIPTypesAndValues::RouteBody__List c; + int i = 0; + osip_route_t* route = nullptr; + while (::osip_message_get_route(p_sip_message, i, &route) == 0) { + LibSip__SIPTypesAndValues::RouteBody route_body; + // Decode uri + LibSip__SIPTypesAndValues::SipUrl uri; + decode_uri(uri, ::osip_from_get_url((osip_from_t*)route)); + // Decode display name + OPTIONAL display_name; + if (::osip_from_get_displayname((osip_route_t*)route) != nullptr) { + LibSip__SIPTypesAndValues::DisplayName n; + n.token() = CHARSTRING(::osip_from_get_displayname((osip_route_t*)route)); + display_name = OPTIONAL(n); + } else { + display_name.set_to_omit(); + } + route_body.nameAddr() = LibSip__SIPTypesAndValues::NameAddr(display_name, uri); + // Params + OPTIONAL params; + decode_semi_colon_params(route->gen_params, params); + route_body.rrParam() = params; + + c[i++] = route_body; + } // End of 'while' statement + p_route_header.routeBody() = c; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_route_header: ", p_route_header); +} // End of method decode_route_header + +void sip_codec_headers::decode_record_route_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::RecordRoute& p_record_route_header) { + loggers::get_instance().log("sip_codec_headers::decode_record_route_header"); + // Sanity check + if (::osip_list_size(&p_sip_message->record_routes) == 0) { + return; + } + + // FieldName + p_record_route_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("RECORD_ROUTE_E")); + // RecordRouteBody + LibSip__SIPTypesAndValues::RouteBody__List c; + int i = 0; + osip_record_route_t* record_route = nullptr; + while (::osip_message_get_record_route(p_sip_message, i, &record_route) == 0) { + LibSip__SIPTypesAndValues::RouteBody record_route_body; + // Decode uri + LibSip__SIPTypesAndValues::SipUrl uri; + decode_uri(uri, ::osip_from_get_url((osip_from_t*)record_route)); + // Decode display name + OPTIONAL display_name; + if (::osip_from_get_displayname((osip_record_route_t*)record_route) != nullptr) { + LibSip__SIPTypesAndValues::DisplayName n; + n.token() = CHARSTRING(::osip_from_get_displayname((osip_record_route_t*)record_route)); + display_name = OPTIONAL(n); + } else { + display_name.set_to_omit(); + } + record_route_body.nameAddr() = LibSip__SIPTypesAndValues::NameAddr(display_name, uri); + // Params + OPTIONAL params; + decode_semi_colon_params(record_route->gen_params, params); + record_route_body.rrParam() = params; + + c[i++] = record_route_body; + } // End of 'while' statement + p_record_route_header.routeBody() = c; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_record_route_header: ", p_record_route_header); +} // End of method decode_record_route_header + +void sip_codec_headers::decode_r_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::RSeq& p_r_seq_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_r_seq_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname((osip_message_t*)p_sip_message, (const char *)"rseq", 0, &dest); // TODO Create osip_message_[g|s]et_rseq + if (dest == nullptr) { + return; + } + + // FieldName + p_r_seq_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("RSEQ_E")); + p_r_seq_header.responseNum() = INTEGER(std::stoi(dest->hvalue)); +} + +void sip_codec_headers::decode_session_expires_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::SessionExpires& p_session_expires_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_session_expires_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + ::osip_message_header_get_byname((osip_message_t*)p_sip_message,(const char *)"session-expires", 0, &dest); // TODO Create osip_message_[g|s]et_session_expires + if (dest == nullptr) { + return; + } + + // FieldName + p_session_expires_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("SESSION_EXPIRES_E")); + + std::string fisrt_parameter; + LibSip__Common::SemicolonParam__List others_params; + decode_semi_colon_params(dest->hvalue, fisrt_parameter, others_params); + p_session_expires_header.deltaSec() = CHARSTRING(fisrt_parameter.c_str()); + if (others_params.is_bound()) { + p_session_expires_header.seParam() = OPTIONAL(others_params); + } else { + p_session_expires_header.seParam().set_to_omit(); + } + + // loggers::get_instance().log("sip_codec_headers::decode_session_expires_header: got it: %s:%s", dest->hname, dest->hvalue); + // std::size_t idx = str.find(";"); + // if (idx == std::string::npos) { + // p_session_expires_header.deltaSec() = dest->hvalue; + // p_session_expires_header.seParam().set_to_omit(); + // } else { + // std::vector output = converter::get_instance().split(str, ";"); + // p_session_expires_header.deltaSec() = CHARSTRING(output[0].c_str()); + // LibSip__Common::SemicolonParam__List l; + // for (unsigned int i = 1; i < output.size(); i++) { + // std::vector o = converter::get_instance().split(output[i], "="); + // LibSip__Common::GenValue g; + // g.tokenOrHost() = CHARSTRING(o[1].c_str()); + // l[i - 1] = LibSip__Common::GenericParam(CHARSTRING(o[0].c_str()), g); + // } // End of 'for' statement + // p_session_expires_header.seParam() = OPTIONAL(l); + // } +} // End of method decode_session_expires_header + +void sip_codec_headers::decode_supported_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Supported& p_supported_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_supported_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + osip_message_get_supported(p_sip_message, 0, &dest); + if (dest == nullptr) { + return; + } + + // FieldName + p_supported_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("SUPPORTED_E")); + // OptionTags + loggers::get_instance().log("sip_codec_headers::decode_supported_header: got it: %s:%s", dest->hname, dest->hvalue); + OPTIONAL& l = p_supported_header.optionsTags(); + decode_option_tag_list(dest->hvalue, l); +} // End of method decode_supported_header + +void sip_codec_headers::decode_user_agent_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::UserAgent& p_user_agent_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_user_agent_header"); + + // Sanity checks + osip_header_t *dest = nullptr; + osip_message_get_user_agent(p_sip_message, 0, &dest); + if (dest == nullptr) { + return; + } + + // FieldName + p_user_agent_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("USER_AGENT_E")); + // UserAgent body + loggers::get_instance().log("sip_codec_headers::decode_user_agent_header: got it: %s:%s", dest->hname, dest->hvalue); + LibSip__SIPTypesAndValues::ServerVal__List& l = p_user_agent_header.userAgentBody(); + decode_server_val_list(dest->hvalue, l); +} // End of method decode_user_agent_header + +void sip_codec_headers::decode_to_header(const osip_to_t* p_sip_to, LibSip__SIPTypesAndValues::To& p_to_header) +{ + loggers::get_instance().log("sip_codec_headers::decode_to_header"); + + // Sanity check + if (p_sip_to == nullptr) { + return; + } + + // FieldName + p_to_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("TO_E")); + // Addr_Union + LibSip__SIPTypesAndValues::SipUrl uri; + decode_uri(uri, ::osip_to_get_url((osip_to_t*)p_sip_to)); + LibSip__SIPTypesAndValues::Addr__Union addr; + OPTIONAL display_name; + if (::osip_to_get_displayname((osip_to_t*)p_sip_to) != nullptr) { + LibSip__SIPTypesAndValues::DisplayName n; + n.token() = CHARSTRING(::osip_to_get_displayname((osip_to_t*)p_sip_to)); + display_name = OPTIONAL(n); + LibSip__SIPTypesAndValues::NameAddr name_addr(display_name, uri); + addr.nameAddr() = name_addr; + } else { + display_name.set_to_omit(); + addr.addrSpecUnion() = uri; + } + p_to_header.addressField() = addr; + // Params + OPTIONAL params; + decode_semi_colon_params(p_sip_to->gen_params, params); + p_to_header.toParams() = params; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_to_header: ", p_to_header); +} // End of method decode_to_header + +void sip_codec_headers::decode_via_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Via& p_via_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_via_header"); + + // Sanity checks + osip_via_t *sip_via = nullptr; + ::osip_message_get_via(p_sip_message, 0, &sip_via); + if (sip_via == nullptr) { + return; + } + + // FieldName + p_via_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("VIA_E")); + // ViaBody + LibSip__SIPTypesAndValues::ViaBody__List l; + int i = 0; + do { + loggers::get_instance().log("sip_codec_headers::decode_via_header: Processing item #%d", i); + LibSip__SIPTypesAndValues::ViaBody v; + v.sentProtocol() = LibSip__SIPTypesAndValues::SentProtocol( + CHARSTRING("SIP"), + CHARSTRING(::via_get_version(sip_via)), + CHARSTRING(::via_get_protocol(sip_via)) + ); + OPTIONAL host_port; + decode_host_port(::via_get_host(sip_via), ::via_get_port(sip_via), host_port); + loggers::get_instance().log_msg("sip_codec_headers::decode_via_uri: host_port: ", host_port); + v.sentBy() = host_port; + OPTIONAL params; + decode_semi_colon_params(sip_via->via_params, params); + v.viaParams() = params; + l[i++] = v; + } while(::osip_message_get_via(p_sip_message, i, &sip_via) == 0); // End of 'while' statement + p_via_header.viaBody() = l; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_via_header: ", p_via_header); +} // End of method decode_via_header + +void sip_codec_headers::decode_www_authenticate_header(const osip_www_authenticate_t* p_www_authenticate, LibSip__SIPTypesAndValues::WwwAuthenticate& p_www_authenticate_header) +{ + loggers::get_instance().log(">>> sip_codec_headers::decode_www_authenticate_header"); + + // Sanity checks + if (p_www_authenticate == nullptr) { + loggers::get_instance().warning("sip_codec_headers::decode_www_authenticate_header: failed to decode WwwAuthenticate header"); + return; + } + + // FieldName + p_www_authenticate_header.fieldName() = LibSip__SIPTypesAndValues::FieldName(LibSip__SIPTypesAndValues::FieldName::str_to_enum("WWW_AUTHENTICATE_E")); + // ViaBody + LibSip__SIPTypesAndValues::Challenge c; + std::string auth(::osip_www_authenticate_get_auth_type((osip_www_authenticate_t*)p_www_authenticate)); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Auth: %s", auth.c_str()); + LibSip__Common::CommaParam__List l; + int i = 0; + if (auth.compare("Digest") == 0) { + l[i++] = LibSip__Common::GenericParam(CHARSTRING(auth.c_str()), OPTIONAL(OMIT_VALUE)); + auth = ::osip_www_authenticate_get_realm((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Realm: %s", auth.c_str()); + if (auth.length() != 0) { + LibSip__Common::GenValue v; + v.quotedString() = CHARSTRING(auth.c_str()); + l[i++] = LibSip__Common::GenericParam(CHARSTRING("realm"), OPTIONAL(v)); + } + auth = ::osip_www_authenticate_get_nonce((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Nonce: %s", auth.c_str()); + if (auth.length() != 0) { + LibSip__Common::GenValue v; + v.quotedString() = CHARSTRING(auth.c_str()); + l[i++] = LibSip__Common::GenericParam(CHARSTRING("nonce"), OPTIONAL(v)); + } + auth = ::osip_www_authenticate_get_algorithm((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Algorithm: %s", auth.c_str()); + if (auth.length() != 0) { + LibSip__Common::GenValue v; + v.quotedString() = CHARSTRING(auth.c_str()); + l[i++] = LibSip__Common::GenericParam(CHARSTRING("algorithm"), OPTIONAL(v)); + } + auth = ::osip_www_authenticate_get_qop_options((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Qop: %s", auth.c_str()); + if (auth.length() != 0) { + LibSip__Common::GenValue v; + v.quotedString() = CHARSTRING(auth.c_str()); + l[i++] = LibSip__Common::GenericParam(CHARSTRING("qop"), OPTIONAL(v)); + } + if (::osip_www_authenticate_get_stale((osip_www_authenticate_t*)p_www_authenticate) != NULL) { + auth = ::osip_www_authenticate_get_stale((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Stale: %s", auth.c_str()); + if (auth.length() != 0) { + LibSip__Common::GenValue v; + v.quotedString() = CHARSTRING(auth.c_str()); + l[i++] = LibSip__Common::GenericParam(CHARSTRING("stale"), OPTIONAL(v)); + } + } + loggers::get_instance().log_msg("sip_codec_headers::decode_www_authenticate_header: LibSip__Common::CommaParam__List= ", l); + if (::osip_www_authenticate_get_domain((osip_www_authenticate_t*)p_www_authenticate) != NULL) { + auth = ::osip_www_authenticate_get_domain((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Domain: %s", auth.c_str()); + } + if (::osip_www_authenticate_get_opaque((osip_www_authenticate_t*)p_www_authenticate) != NULL) { + auth = ::osip_www_authenticate_get_opaque((osip_www_authenticate_t*)p_www_authenticate); + loggers::get_instance().log("sip_codec_headers::decode_www_authenticate_header: Opaque: %s", auth.c_str()); + } + + c.digestCln() = l; + } else { + loggers::get_instance().error("sip_codec_headers::decode_www_authenticate_header: Not implemented yet"); + //c.otherChallenge() = l; + } + p_www_authenticate_header.challenge() = c; + + loggers::get_instance().log_msg("<<< sip_codec_headers::decode_www_authenticate_header: ", p_www_authenticate_header); +} // End of method decode_www_authenticate_header + diff --git a/ccsrc/Protocols/Sip/sip_codec_headers.hh b/ccsrc/Protocols/Sip/sip_codec_headers.hh new file mode 100644 index 0000000000000000000000000000000000000000..7c4d03a0c9aff0e6339d3f1f8667e654e88927a0 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_headers.hh @@ -0,0 +1,132 @@ +#pragma once + +#include "codec_gen.hh" +#include "params.hh" + +#include "osipparser2/osip_parser.h" +#include "osipparser2/sdp_message.h" + +namespace LibSip__SIPTypesAndValues { + class Authorization; + class CallId; + class CallInfo; + class ContentLength; + class ContentType; + class CSeq; + class Event; + class Expires; + class From; + class Geolocation; + class GeolocationRouting; + class HostPort; + class MessageHeader; + class PreGenRecordOf; + class PAccessNetworkInfo; + class PAssociatedURI; + class Privacy; + class Route; + class RecordRoute; + class RSeq; + class UserAgent; + class To; + class Via; +} + +namespace LibSip__Common { + class SemicolonParam__List; + class AmpersandParam__List; +} + +class sip_codec_headers +{ +public: + explicit sip_codec_headers() { }; + virtual ~sip_codec_headers() { }; + +public: + virtual int encode_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message); + virtual int encode_sip_url(const LibSip__SIPTypesAndValues::SipUrl& p_sip_uri, osip_uri_t** p_uri); + virtual int encode_accept_header(const LibSip__SIPTypesAndValues::Accept& p_accept, osip_message_t** p_sip_message); + virtual int encode_accept_contact_header(const LibSip__SIPTypesAndValues::AcceptContact& p_accept_contact, osip_message_t** p_sip_message); + virtual int encode_allow_header(const OPTIONAL& p_allow, osip_message_t** p_sip_message); + virtual int encode_authorization_header(const LibSip__SIPTypesAndValues::Authorization& p_authorization, osip_authorization_t** p_authorization_header); + virtual int encode_call_id_header(const LibSip__SIPTypesAndValues::CallId& p_call_id, osip_call_id_t** p_call_id_header); + virtual int encode_call_info_header(const OPTIONAL& p_call_info, osip_message_t** p_sip_message); + virtual int encode_contact_header(const LibSip__SIPTypesAndValues::Contact& p_contact, osip_contact_t** p_contact_header); + virtual int encode_content_length_header(const LibSip__SIPTypesAndValues::ContentLength& p_contact, osip_content_length_t** p_content_length_header); + virtual int encode_content_type_header(const LibSip__SIPTypesAndValues::ContentType& p_contact, osip_content_type_t** p_content_type_header); + virtual int encode_c_seq_header(const LibSip__SIPTypesAndValues::CSeq& p_c_seq, osip_cseq_t** p_c_seq_header); + virtual int encode_event_header(const OPTIONAL& p_event, osip_message_t** p_sip_message); + virtual int encode_expires_header(const OPTIONAL& p_expires, osip_message_t** p_sip_message); + virtual int encode_from_header(const LibSip__SIPTypesAndValues::From& p_from, osip_from_t** p_from_header); + virtual int encode_geolocation_header(const OPTIONAL& p_geolocation, osip_message_t** p_sip_message); + virtual int encode_geolocation_routing_header(const OPTIONAL& p_geolocation, osip_message_t** p_sip_message); + virtual int encode_max_forwards_header(const OPTIONAL& p_max_forwards, osip_message_t** p_sip_message); + virtual int encode_min_se_header(const OPTIONAL& p_min_se, osip_message_t** p_sip_message); + virtual int encode_p_access_network_info_header(const OPTIONAL& p_p_access_network_info_header, osip_message_t** p_sip_message); + virtual int encode_p_associated_uri_header(const OPTIONAL& p_p_associated_uri_header, osip_message_t** p_sip_message); + virtual int encode_privacy_header(const OPTIONAL& p_privacy_header, osip_message_t** p_sip_message); + virtual int encode_route_header(const OPTIONAL& p_route_header, osip_message_t** p_sip_message); + virtual int encode_record_route_header(const OPTIONAL& p_record_route_header, osip_message_t** p_sip_message); + virtual int encode_r_seq_header(const OPTIONAL& p_r_seq, osip_message_t** p_sip_message); + virtual int encode_session_expires_header(const OPTIONAL& p_session_expires, osip_message_t** p_sip_message); + virtual int encode_supported_header(const OPTIONAL& p_supported, osip_message_t** p_sip_message); + virtual int encode_to_header(const LibSip__SIPTypesAndValues::To& p_to, osip_to_t** p_to_header); + virtual int encode_user_agent_header(const OPTIONAL& p_user_agent, osip_message_t** p_sip_message); + virtual int encode_via_header(const LibSip__SIPTypesAndValues::Via& p_via, osip_via_t** p_via_header); + virtual int encode_www_authenticate_header(const LibSip__SIPTypesAndValues::WwwAuthenticate& p_www_authenticate_header, osip_www_authenticate_t** p_www_authenticate); + +public: + // TODO Replace const osip_message_t* p_sip_message by header specific type using osip_parser.h/macros such as osip_message_get_accept/osip_accept_t + virtual void decode_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MessageHeader& p_headers); + virtual void decode_uri(LibSip__SIPTypesAndValues::SipUrl& p_sip_url, const osip_uri_t* p_uri); + virtual void decode_accept_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Accept& p_accept_header); + virtual void decode_accept_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptContact& p_accept_contact_header); + virtual void decode_accept_encoding_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptEncoding& p_accept_encoding_header); + virtual void decode_accept_language_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AcceptLanguage& p_accept_language_header); + virtual void decode_alert_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AlertInfo& p_alert_info_header); + virtual void decode_allow_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Allow& p_allow_header); + virtual void decode_allow_events_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::AllowEvents& p_allow_events_header); + virtual void decode_authorization_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Authorization& p_authorization_header); + virtual void decode_call_id_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CallId& p_call_id_header); + virtual void decode_call_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CallInfo& p_call_info_header); + virtual void decode_content_length_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentLength& p_content_length_header); + virtual void decode_content_type_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::ContentType& p_content_type_header); + virtual void decode_c_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::CSeq& p_c_seq_header); + virtual void decode_contact_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Contact& p_contact_header); + virtual void decode_event_header(const osip_message_t* p_sip_event, LibSip__SIPTypesAndValues::Event& p_event_header); + virtual void decode_expires_header(const osip_message_t* p_sip_expires, LibSip__SIPTypesAndValues::Expires& p_expires_header); + virtual void decode_from_header(const osip_from_t* p_sip_from, LibSip__SIPTypesAndValues::From& p_from_header); + virtual void decode_geolocation_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Geolocation& p_geolocation_header); + virtual void decode_geolocation_routing_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::GeolocationRouting& p_geolocation_routing_header); + virtual void decode_max_forwards_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MaxForwards& p_max_forwards_header); + virtual void decode_min_se_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::MinSE& p_min_se_header); + virtual void decode_p_access_network_info_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::PAccessNetworkInfo& p_p_access_network_info_header); + virtual void decode_p_associated_uri_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::PAssociatedURI& p_p_associated_uri_header); + virtual void decode_privacy_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Privacy& p_privacy_header); + virtual void decode_route_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Route& p_route_header); + virtual void decode_record_route_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::RecordRoute& p_record_route_header); + virtual void decode_r_seq_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::RSeq& p_r_seq_header); + virtual void decode_session_expires_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::SessionExpires& p_session_expires_header); + virtual void decode_supported_header(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Supported& p_supported_header); + virtual void decode_to_header(const osip_to_t* p_sip_to, LibSip__SIPTypesAndValues::To& p_to_header); + virtual void decode_user_agent_header(const osip_message_t* p_user_agent, LibSip__SIPTypesAndValues::UserAgent& p_user_agent_header); + virtual void decode_via_header(const osip_message_t* p_sip_via_list, LibSip__SIPTypesAndValues::Via& p_via_header); + virtual void decode_www_authenticate_header(const osip_www_authenticate_t* p_www_authenticate, LibSip__SIPTypesAndValues::WwwAuthenticate& p_www_authenticate_header); + +private: + void encode_host_port(const LibSip__SIPTypesAndValues::HostPort& p_host_port, std::string& p_host, std::string& p_port); + int encode_semi_colon_params(const LibSip__Common::SemicolonParam__List& p_list, osip_list_t* p_sip_list); + int encode_ampersand_params(const LibSip__Common::AmpersandParam__List& p_list, osip_list_t** p_sip_list); + int encode_option_tag_list(const LibSip__SIPTypesAndValues::OptionTag__List& p_options_tags, const std::string& p_field_name, osip_message_t** p_sip_message); + int encode_server_val_list(const LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals, const std::string& p_field_name, osip_message_t** p_sip_message); + + void decode_host_port(const char* p_host, const char* p_port, LibSip__SIPTypesAndValues::HostPort& p_host_port); + void decode_semi_colon_params(const std::string& p_params, LibSip__Common::SemicolonParam__List& p_params_list); + void decode_semi_colon_params(const std::string& p_params, std::string& p_first_param, LibSip__Common::SemicolonParam__List& p_others_params); + void decode_semi_colon_params(const osip_list_t& p_sip_list, OPTIONAL& p_list); + void decode_ampersand_params(const osip_list_t& p_sip_list, OPTIONAL& p_list); + void decode_option_tag_list(const char* p_list, OPTIONAL& p_options_tags); + void decode_server_val_list(const char* p_list, LibSip__SIPTypesAndValues::ServerVal__List& p_server_vals); + +}; // End of class sip_codec_headers diff --git a/ccsrc/Protocols/Sip/sip_codec_info_request.cc b/ccsrc/Protocols/Sip/sip_codec_info_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..7beb70c1b096b6762ef7f09eee95f7bf0fb23bc9 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_info_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_info_request.hh" +#include "loggers.hh" + +int sip_codec_info_request::encode (const LibSip__SIPTypesAndValues::INFO__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_info_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_info_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_info_request::encode: data=", data); + return 0; +} + +int sip_codec_info_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::INFO__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_info_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_info_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_info_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::INFO__E) { + loggers::get_instance().warning("sip_codec_info_request::decode: Wrong SIP Method, expected INFO"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_info_request.hh b/ccsrc/Protocols/Sip/sip_codec_info_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..e3caf2f52a15fafb82f51bcca72475b16804ce39 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_info_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class INFO__Request; +} + +class sip_codec_info_request: public codec_gen < +LibSip__SIPTypesAndValues::INFO__Request, +LibSip__SIPTypesAndValues::INFO__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_info_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_info_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::INFO__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::INFO__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_info_request diff --git a/ccsrc/Protocols/Sip/sip_codec_invite_request.cc b/ccsrc/Protocols/Sip/sip_codec_invite_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..a9b290650530b6db70cc27b9ec96a7477132efb0 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_invite_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_invite_request.hh" +#include "loggers.hh" + +int sip_codec_invite_request::encode (const LibSip__SIPTypesAndValues::INVITE__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_invite_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_invite_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_invite_request::encode: data=", data); + return 0; +} + +int sip_codec_invite_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::INVITE__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_invite_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_invite_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_invite_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::INVITE__E) { + loggers::get_instance().warning("sip_codec_invite_request::decode: Wrong SIP Method, expected INVITE"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_invite_request.hh b/ccsrc/Protocols/Sip/sip_codec_invite_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..07f63b04c9f1e07c43653e859e128022a6d4bff8 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_invite_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class INVITE__Request; +} + +class sip_codec_invite_request: public codec_gen < +LibSip__SIPTypesAndValues::INVITE__Request, +LibSip__SIPTypesAndValues::INVITE__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_invite_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_invite_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::INVITE__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::INVITE__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_invite_request diff --git a/ccsrc/Protocols/Sip/sip_codec_message_body.cc b/ccsrc/Protocols/Sip/sip_codec_message_body.cc new file mode 100644 index 0000000000000000000000000000000000000000..5780e820cfb9996353974a07a2e0a889afc42f39 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_message_body.cc @@ -0,0 +1,929 @@ +#include "LibSip_SIPTypesAndValues.hh" +#include "LibSip_Common.hh" + +#include "sip_codec_message_body.hh" +#include "loggers.hh" + +#include "converter.hh" + +#include "urn_ietf_params_xml_ns_pidf.hh" + +#ifdef WIN32 +#undef osip_malloc +#undef osip_free +#define osip_malloc(S) malloc(S) +#define osip_free(P) { if (P!=NULL) { free(P);} } +#endif + +int sip_codec_message_body::encode (const LibSip__MessageBodyTypes::MessageBody& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_message_body::encode: ", msg); + + TRACE_INITIALIZE(TRACE_LEVEL7, NULL); + OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, ">>> sip_codec_request::encode\n")); + + if (msg.ischosen(LibSip__MessageBodyTypes::MessageBody::ALT_sdpMessageBody)) { + const LibSip__SDPTypes::SDP__Message& sdp = msg.sdpMessageBody(); + sdp_message_t* sdp_body = nullptr; + if (encode_sdp(sdp, &sdp_body) == -1) { + loggers::get_instance().warning("sip_codec_message_body::encode: Failed to encode SDP message"); + return -1; + } + char* buff = nullptr; + ::sdp_message_to_str(sdp_body, &buff); + if (buff != nullptr) { + data = char2oct(CHARSTRING(buff)); + osip_free(buff); + sdp_message_free(sdp_body); + } + } else if (msg.ischosen(LibSip__MessageBodyTypes::MessageBody::ALT_textplain)) { + data = char2oct(msg.textplain()); + } else { + loggers::get_instance().warning("sip_codec_message_body::encode: Unsupported variant"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_message_body::encode: ", data); + return 0; +} + +int sip_codec_message_body::decode (const OCTETSTRING& data, LibSip__MessageBodyTypes::MessageBody& msg, params* p_params) +{ + loggers::get_instance().log(">>> sip_codec_message_body::decode"); + + TRACE_INITIALIZE(TRACE_LEVEL7, NULL); + OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, ">>> sip_codec_request::decode\n")); + loggers::get_instance().error("sip_codec_message_body::decode: Not implemented yet"); + return -1; +} + +int sip_codec_message_body::encode_message_body(const LibSip__MessageBodyTypes::MessageBody& p_message_body, osip_message_t* p_sip_message) +{ // TODO Rename into encode_message + loggers::get_instance().log_msg(">>> sip_codec_message_body::encode_message_body: ", p_message_body); + + osip_content_length* content_length = ::osip_message_get_content_length(p_sip_message); + loggers::get_instance().log("sip_codec_message_body::encode_message_body: content_length= %s", content_length->value); + if (p_message_body.ischosen(LibSip__MessageBodyTypes::MessageBody::ALT_sdpMessageBody)) { + const LibSip__SDPTypes::SDP__Message& sdp = p_message_body.sdpMessageBody(); + sdp_message_t* sdp_body = nullptr; + if (encode_sdp(sdp, &sdp_body) == -1) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to decode SDP message"); + return -1; + } + char* buff = nullptr; + ::sdp_message_to_str(sdp_body, &buff); + if (buff != nullptr) { + ::osip_message_set_body(p_sip_message, buff, strlen(buff)); + osip_free(buff); + sdp_message_free(sdp_body); + } + } else if (p_message_body.ischosen(LibSip__MessageBodyTypes::MessageBody::ALT_textplain)) { + const CHARSTRING& text = p_message_body.textplain(); + ::osip_message_set_body(p_sip_message, static_cast(text), text.lengthof()); + } else if (p_message_body.ischosen(LibSip__MessageBodyTypes::MessageBody::ALT_mimeMessageBody)) { + ::osip_message_set_mime_version(p_sip_message, "2.0"); + const LibSip__MessageBodyTypes::MIME__Message& mime = p_message_body.mimeMessageBody(); + const LibSip__MessageBodyTypes::MimeEncapsulatedList& l = mime.mimeEncapsulatedList(); + int pos = 0; + while (pos < l.lengthof()) { + const LibSip__MessageBodyTypes::MIME__Encapsulated__Part& p = l[pos]; + loggers::get_instance().log_msg("sip_codec_message_body::encode_message_body: p: ", p); + const LibSip__MessageBodyTypes::MIME__Encapsulated__Parts& ps = p.mime__encapsulated__part(); + if (ps.ischosen(LibSip__MessageBodyTypes::MIME__Encapsulated__Parts::ALT_sdpMessageBody)) { + const LibSip__SDPTypes::SDP__Message& sdp = ps.sdpMessageBody(); + sdp_message_t* sdp_body = nullptr; + if (encode_sdp(sdp, &sdp_body) == -1) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to encode SDP message"); + return -1; + } + char* buff = nullptr; + ::sdp_message_to_str(sdp_body, &buff); + if (buff != nullptr) { + loggers::get_instance().log("sip_codec_message_body::encode_message_body: sdp encoded value: %s", buff); + loggers::get_instance().log("sip_codec_message_body::encode_message_body: body list size: %d", ::osip_list_size(&p_sip_message->bodies)); + if (::osip_message_set_body(p_sip_message, buff, strlen(buff)) != 0) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to encode SDP message"); + osip_free(buff); + sdp_message_free(sdp_body); + return -1; + } + loggers::get_instance().log("sip_codec_message_body::encode_message_body: new body list size: %d", ::osip_list_size(&p_sip_message->bodies)); + osip_free(buff); + sdp_message_free(sdp_body); + // Retrive the new created body and add content type + osip_body_t* body = nullptr; + if (::osip_message_get_body(p_sip_message, ::osip_list_size(&p_sip_message->bodies) - 1, &body) != ::osip_list_size(&p_sip_message->bodies) - 1) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to set XML body content-type"); + return -1; + } + const char* ct = static_cast(p.content__type()); + loggers::get_instance().log("sip_codec_message_body::encode_message_body: content-type: %s", ct); + if (ct != nullptr) { + ::osip_body_set_contenttype(body, ct); + } else { // Use a default value + ::osip_body_set_contenttype(body, "application/sdp"); + } + } + } else if (ps.ischosen(LibSip__MessageBodyTypes::MIME__Encapsulated__Parts::ALT_xmlBody)) { + const LibSip__XMLTypes::XmlBody& xml = ps.xmlBody(); + osip_body_t* body; + if (encode_xml(xml, &body) == -1) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to encode XML message"); + return -1; + } + loggers::get_instance().log("sip_codec_message_body::encode_message_body: xml encoded value: %s", body->body); + loggers::get_instance().log("sip_codec_message_body::encode_message_body: body list size: %d", ::osip_list_size(&p_sip_message->bodies)); + if (::osip_message_set_body(p_sip_message, body->body, body->length) != 0) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to encode XML message"); + osip_body_free(body); + return -1; + } + loggers::get_instance().log("sip_codec_message_body::encode_message_body: new body list size: %d", ::osip_list_size(&p_sip_message->bodies)); + osip_body_free(body); + // Retrive the new created body and add content type + body = nullptr; + loggers::get_instance().log("sip_codec_message_body::encode_message_body: get item #%d", ::osip_list_size(&p_sip_message->bodies) - 1); + if (::osip_message_get_body(p_sip_message, ::osip_list_size(&p_sip_message->bodies) - 1, &body) != ::osip_list_size(&p_sip_message->bodies) - 1) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Failed to set content-type"); + return -1; + } + const char* ct = static_cast(p.content__type()); + loggers::get_instance().log("sip_codec_message_body::encode_message_body: content-type: %s", ct); + if (ct != nullptr) { + ::osip_body_set_contenttype(body, ct); + } else { // Use a default value + ::osip_body_set_contenttype(body, "application/resource-lists+xml"); + } + } else if (ps.ischosen(LibSip__MessageBodyTypes::MIME__Encapsulated__Parts::ALT_msdBody)) { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Unsupported decoding of ALT_msdBody"); + } else { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Unsupported decoding of encapulated parts"); + } + pos += 1; + } // End of 'while' statement + } else { + loggers::get_instance().warning("sip_codec_message_body::encode_message_body: Unsupported variant"); + return -1; + } + + return 0; +} // End of method encode_message_body + +int sip_codec_message_body::encode_sdp(const LibSip__SDPTypes::SDP__Message& p_sdp_message, sdp_message_t** p_sdp_body) { + loggers::get_instance().log_msg(">>> sip_codec_message_body::encode_sdp: ", p_sdp_message); + + ::sdp_message_init(p_sdp_body); + + // Encode mandatory fields + // Version + INTEGER version = p_sdp_message.protocol__version(); + ::sdp_message_v_version_set(*p_sdp_body, (char*)::strdup(std::to_string(static_cast(version)).c_str())); + LibSip__SDPTypes::SDP__Origin origin = p_sdp_message.origin(); + // Origin + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: origin: ", origin); + ::sdp_message_o_origin_set( + *p_sdp_body, + (char*)::strdup(static_cast(origin.user__name())), + (char*)::strdup(static_cast(origin.session__id())), + (char*)::strdup(static_cast(origin.session__version())), + (char*)::strdup(static_cast(origin.net__type())), + (char*)::strdup(static_cast(origin.addr__type())), + (char*)::strdup(static_cast(origin.addr())) + ); + // Session name + ::sdp_message_s_name_set(*p_sdp_body, (char*)::strdup(static_cast(p_sdp_message.session__name()))); + // Time, t + ::sdp_message_s_name_set(*p_sdp_body, (char*)::strdup(static_cast(p_sdp_message.session__name()))); + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: times: ", p_sdp_message.times()); + for (int i = 0; i < p_sdp_message.times().lengthof(); i++) { + const LibSip__SDPTypes::SDP__time& time = p_sdp_message.times()[i]; + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: time: ", time); + ::sdp_message_t_time_descr_add(*p_sdp_body, (char*)::strdup(static_cast(time.time__field().start__time())), (char*)::strdup(static_cast(time.time__field().stop__time()))); + if (time.time__repeat().is_present()) { + const LibSip__SDPTypes::SDP__repeat__list& l = static_cast&>(*time.time__repeat().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: l: ", l); + for (int j = 0; j < l.lengthof(); j++) { + const LibSip__SDPTypes::SDP__repeat& r = l[j]; + // TODO r.repeat__interval(); + // TODO r.active(); + for (int k = 0; k < r.offsets().lengthof(); k++) { + const LibSip__SDPTypes::SDP__typed__time& s = r.offsets()[k]; + // TODO ::sdp_message_r_repeat_add(p_sdp_body, k, char *value); + } // End of 'for' statement + // TODO ::sdp_message_r_repeat_add(p_sdp_body, int pos_time_descr, char *value) + } // End of 'for' statement + } + } // End of 'for' statement + // Encode optional fields + // email, e + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: emails: ", p_sdp_message.emails()); + if (p_sdp_message.emails().is_present()) { + const LibSip__SDPTypes::SDP__email__list& l = static_cast(*p_sdp_message.emails().get_opt_value()); + for (int j = 0; j < l.lengthof(); j++) { + const LibSip__SDPTypes::SDP__contact& e = l[j]; + std::string str; + if (e.disp__name().is_present()) { + str = static_cast(static_cast(*e.disp__name().get_opt_value())); + str += " "; + } + str += static_cast(e.addr__or__phone()); + ::sdp_message_e_email_add(*p_sdp_body, ::strdup(str.c_str())); + } // End of 'for' statement + } + // Information, i + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: information: ", p_sdp_message.information()); + if (p_sdp_message.information().is_present()) { + ::sdp_message_i_info_set(*p_sdp_body, 0, ::strdup(static_cast(*p_sdp_message.information().get_opt_value()))); + } + // Media list, m + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: medias: ", p_sdp_message.media__list()); + if (p_sdp_message.media__list().is_present()) { + const LibSip__SDPTypes::SDP__media__desc__list& l = static_cast(*p_sdp_message.media__list().get_opt_value()); + int i = 0; + for ( ; i < l.lengthof(); i++) { + const LibSip__SDPTypes::SDP__media__desc m = l[i]; + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: media: ", m); + // Media field + if (m.media__field().ports().num__of__ports().is_present()) { + int p = static_cast(*m.media__field().ports().num__of__ports().get_opt_value()); + ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), (char*)::strdup(std::to_string(p).c_str()), (char*)::strdup(static_cast(m.media__field().transport()))); + } else { + ::sdp_message_m_media_add(*p_sdp_body, (char*)::strdup(static_cast(m.media__field().media())), (char*)::strdup(std::to_string(m.media__field().ports().port__number()).c_str()), NULL, (char*)::strdup(static_cast(m.media__field().transport()))); + } + // Format list + const LibSip__SDPTypes::SDP__fmt__list& fmts = m.media__field().fmts(); + std::string str; + for (int j = 0; j < fmts.lengthof() - 1; j++) { + str += static_cast(fmts[j]); + str += " "; + } // End of 'for' statement + str += static_cast(fmts[fmts.lengthof() - 1]); + // information + if (m.information().is_present()) { + str += " "; + str += static_cast(static_cast(*m.information().get_opt_value())); + } + if (str.length() != 0) { + ::sdp_message_m_payload_add(*p_sdp_body, i, (char*)::strdup(str.c_str())); + } + // Attribute list, a + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: attributes: ", m.attributes()); + if (m.attributes().is_present()) { + const LibSip__SDPTypes::SDP__attribute__list& al = static_cast(*m.attributes().get_opt_value()); + for (int k = 0; k < al.lengthof(); k++) { + const LibSip__SDPTypes::SDP__attribute a = al[k]; + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: attribute: ", a); + if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { + std::string str(static_cast(a.rtpmap().payload__type())); + str += " "; + str += static_cast(a.rtpmap().codec().encoding()); + str += "/"; + str += a.rtpmap().codec().clockrate(); + if (a.rtpmap().codec().parameters().is_present()) { + str += "/"; + str += static_cast(static_cast(*a.rtpmap().codec().parameters().get_opt_value())); + } + loggers::get_instance().log("sip_codec_message_body::encode_sdp: attribute: media #%d: encode rtpmap:%s", i, str.c_str()); + ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup("rtpmap"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_fmtp)) { + std::string str(static_cast(a.fmtp().format())); + str += " "; + if (a.fmtp().params().ischosen(LibSip__SDPTypes::SDP__attribute__fmtp__format__specific__params::ALT_paramList)) { + const LibSip__Common::SemicolonParam__List& sl = a.fmtp().params().paramList(); + for (int k = 0; k < sl.lengthof(); k++) { + str += static_cast(sl[k].id()); + if (sl[k].paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*sl[k].paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: attribute: fmtp: v: ", v); + str += "="; + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + str += static_cast(v.tokenOrHost()); + } else { + str += static_cast(v.quotedString()); + } + } // else, nothing to do + str += ";"; + } // End of 'for' statement + } else { + str += static_cast(a.fmtp().params().unstructured()); + } + ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup("fmtp"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_curr)) { + std::string str(static_cast(a.curr().preconditionType())); + str += " "; + str += static_cast(a.curr().statusType()); + str += " "; + str += static_cast(a.curr().direction()); + ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup("curr"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_des)) { + std::string str(static_cast(a.des().preconditionType())); + str += " "; + str += static_cast(a.des().strength()); + str += " "; + str += static_cast(a.des().statusType()); + str += " "; + str += static_cast(a.des().direction()); + ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup("des"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_maxptime)) { + ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup("maxptime"), (char*)::strdup(static_cast(a.maxptime().attr__value()))); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_sendrecv)) { + ::sdp_message_a_attribute_add(*p_sdp_body, i, (char*)::strdup("sendrecv"), nullptr); + } else { + loggers::get_instance().warning("sip_codec_message_body::encode_sdp: attribute not processed"); + } + } // End of 'for' statement + } + } // End of 'for' statement + ::sdp_message_endof_media(*p_sdp_body, i); + } + // Attribute list, a + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: attributes: ", p_sdp_message.attributes()); + if (p_sdp_message.attributes().is_present()) { + const LibSip__SDPTypes::SDP__attribute__list& l = static_cast(*p_sdp_message.attributes().get_opt_value()); + int i = 0; + for ( ; i < l.lengthof(); i++) { + const LibSip__SDPTypes::SDP__attribute a = l[i]; + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: attribute: ", a); + if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_rtpmap)) { + std::string str(static_cast(a.rtpmap().payload__type())); + str += " "; + str += static_cast(a.rtpmap().codec().encoding()); + str += " "; + str += a.rtpmap().codec().clockrate(); + if (a.rtpmap().codec().parameters().is_present()) { + str += "/"; + str += static_cast(static_cast(*a.rtpmap().codec().parameters().get_opt_value())); + } + loggers::get_instance().log("sip_codec_message_body::encode_sdp: attribute: media #%d: encode rtpmap:%s", i, str.c_str()); + ::sdp_message_a_attribute_add(*p_sdp_body, 0, (char*)::strdup("rtpmap"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_fmtp)) { + std::string str(static_cast(a.fmtp().format())); + str += " "; + if (a.fmtp().params().ischosen(LibSip__SDPTypes::SDP__attribute__fmtp__format__specific__params::ALT_paramList)) { + const LibSip__Common::SemicolonParam__List& sl = a.fmtp().params().paramList(); + for (int k = 0; k < sl.lengthof(); k++) { + str += static_cast(sl[k].id()); + if (sl[k].paramValue().is_present()) { + const LibSip__Common::GenValue& v = static_cast(*sl[k].paramValue().get_opt_value()); + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: attribute: fmtp: v: ", v); + str += "="; + if (v.ischosen(LibSip__Common::GenValue::ALT_tokenOrHost)) { + str += static_cast(v.tokenOrHost()); + } else { + str += static_cast(v.quotedString()); + } + } // else, nothing to do + str += ";"; + } // End of 'for' statement + } else { + str += static_cast(a.fmtp().params().unstructured()); + } + ::sdp_message_a_attribute_add(*p_sdp_body, 0, (char*)::strdup("fmtp"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_curr)) { + std::string str(static_cast(a.curr().preconditionType())); + str += " "; + str += static_cast(a.curr().statusType()); + str += " "; + str += static_cast(a.curr().direction()); + ::sdp_message_a_attribute_add(*p_sdp_body, 0, (char*)::strdup("curr"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_des)) { + std::string str(static_cast(a.des().preconditionType())); + str += " "; + str += static_cast(a.des().strength()); + str += " "; + str += static_cast(a.des().statusType()); + str += " "; + str += static_cast(a.des().direction()); + ::sdp_message_a_attribute_add(*p_sdp_body, 0, (char*)::strdup("des"), (char*)::strdup(str.c_str())); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_maxptime)) { + ::sdp_message_a_attribute_add(*p_sdp_body, 0, (char*)::strdup("maxptime"), (char*)::strdup(static_cast(a.maxptime().attr__value()))); + } else if (a.ischosen(LibSip__SDPTypes::SDP__attribute::ALT_sendrecv)) { + ::sdp_message_a_attribute_add(*p_sdp_body, 0, (char*)::strdup("sendrecv"), nullptr); + } else { + loggers::get_instance().warning("sip_codec_message_body::encode_sdp: attribute not processed"); + } + } // End of 'for' statement + } + // Bandwith, b + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: Bandwidth: ", p_sdp_message.bandwidth()); + if (p_sdp_message.bandwidth().is_present()) { + const LibSip__SDPTypes::SDP__bandwidth__list& l = static_cast(*p_sdp_message.bandwidth().get_opt_value()); + int i = 0; + for ( ; i < l.lengthof(); i++) { + const LibSip__SDPTypes::SDP__bandwidth b = l[i]; + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: bandwidth: ", b); + ::sdp_message_b_bandwidth_add(*p_sdp_body, i, (char*)::strdup(static_cast(b.modifier())), (char*)::strdup(std::to_string(b.bandwidth()).c_str())); + } // End of 'for' statement + } + // Connection, c + loggers::get_instance().log_msg("sip_codec_message_body::encode_sdp: Connection: ", p_sdp_message.connection()); + if (p_sdp_message.connection().is_present()) { + const LibSip__SDPTypes::SDP__connection& c = static_cast(*p_sdp_message.connection().get_opt_value()); + ::sdp_message_c_connection_add(*p_sdp_body, 0, ::strdup(static_cast(c.net__type())), ::strdup(static_cast(c.addr__type())), ::strdup(static_cast(c.conn__addr().addr())), nullptr, nullptr); + } + // TODO To be continued + + loggers::get_instance().log("<<< sip_codec_message_body::encode_sdp"); + return 0; +} + +void sip_codec_message_body::decode_message_body(const osip_message_t* p_sip_message, OPTIONAL& p_message_body) +{ // TODO Rename into decode_message + loggers::get_instance().log(">>> sip_codec_message_body::decode_message_body"); + + osip_content_length* content_length = ::osip_message_get_content_length(p_sip_message); + loggers::get_instance().log("sip_codec_message_body::decode_message_body: content_length= %s", content_length->value); + if (strcmp((const char*)content_length->value, "0") == 0) { + p_message_body.set_to_omit(); + return; + } + // TODO Align the body the content_length + + osip_content_type_t* content_type = ::osip_message_get_content_type(p_sip_message); + osip_body_t* body; + int result = ::osip_message_get_body(p_sip_message, 0, &body); + if (result != 0) { + loggers::get_instance().warning("sip_codec_message_body::decode_message_body: Failed to retrieve body"); + p_message_body.set_to_omit(); + return; + } + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body size: %d", body->length); + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body content: %s", body->body); + if (body->headers != nullptr) { + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body headers size: %d", osip_list_size(body->headers)); + } + if (body->content_type != nullptr) { + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body content-type: '%s'/'%s'/%p", body->content_type->type, body->content_type->subtype, body->content_type->gen_params.node); + } + if (::osip_list_size(body->headers) != 0) { + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Body header is present"); + // TODO Process Content-ID and other headers + } + LibSip__MessageBodyTypes::MessageBody msg_body; + if (content_type != nullptr) { + loggers::get_instance().log("sip_codec_message_body::decode_message_body: content-type.type: '%s'/'%s'/%p", content_type->type, content_type->subtype, content_type->gen_params.node); + if (std::string(content_type->type).compare("multipart") == 0) { + const osip_list_t* p = &(p_sip_message->bodies); + size_t size = osip_list_size(p); + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Multipart body size: %d\n", size); + if (size == 0) { + loggers::get_instance().warning("sip_codec_message_body::decode_message_body: Empty multipart content, fallback to textplain"); + msg_body.textplain() = CHARSTRING(body->body); + } else { + LibSip__MessageBodyTypes::MIME__Message mime; + if (content_type->gen_params.node != nullptr) { + mime.boundary() = CHARSTRING("boundary1"/*(const char*)content_type->gen_params.node->element*/); // TODO How to get the boundary name? + } else { + mime.boundary() = CHARSTRING("boundary1"); + } + loggers::get_instance().log_msg("sip_codec_message_body::decode_message_body: Boundary: ", mime.boundary()); + LibSip__MessageBodyTypes::MimeEncapsulatedList& l = mime.mimeEncapsulatedList(); + size_t pos = 0; + while (pos < size) { + const osip_header_t* header = (const osip_header_t*)osip_list_get(p, pos); + loggers::get_instance().log("sip_codec_message_body::decode_message_body: body content=%s", header->hname); + if ((*header->hname == 'v') && (*(header->hname + 1) == '=') && (*(header->hname + 2) == '0')) { // SDP + loggers::get_instance().log("sip_codec_message_body::decode_message_body: Decode SDP"); + LibSip__MessageBodyTypes::MIME__Encapsulated__Part p; + p.content__type() = CHARSTRING("application/sdp"); + p.content__disposition().set_to_omit(); + p.content__id().set_to_omit(); + LibSip__SDPTypes::SDP__Message sdp_body; + osip_body_t* body; + ::osip_body_init(&body); + body->body = ::strdup(header->hname); // TODO Check if strdup is needed + body->length = strlen(header->hname); + LibSip__MessageBodyTypes::MIME__Encapsulated__Parts& parts = p.mime__encapsulated__part(); + if (decode_sdp(body, sdp_body) == 0) { + parts.sdpMessageBody() = sdp_body; + } else { + parts.msdBody() = char2oct(CHARSTRING(header->hname)); + } + l[pos] = p; + } else if ((*header->hname == '<') && (*(header->hname + 1) == '?') && (*(header->hname + 2) == 'x')) { // body = header->hname; + body->length = strlen(header->hname); + LibSip__MessageBodyTypes::MIME__Encapsulated__Parts& parts = p.mime__encapsulated__part(); + if (decode_xml(body, xml_body) == 0) { + parts.xmlBody() = xml_body; + } else { + parts.msdBody() = char2oct(CHARSTRING(header->hname)); + } + l[pos] = p; + } else { + // TODO + loggers::get_instance().error("sip_codec_message_body::decode_message_body: Not implemented yet"); + } + pos += 1; + } // End of 'while' statement + msg_body.mimeMessageBody() = mime; + } + } else if ((std::string(content_type->type).compare("application") == 0) && (std::string(content_type->subtype).compare("sdp") == 0)) { + LibSip__SDPTypes::SDP__Message sdp_body; + if (decode_sdp(body, sdp_body) == 0) { + // Set message body + msg_body.sdpMessageBody() = sdp_body; + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_message_body: sdp_message_parse failed, fallback to textplain"); + msg_body.textplain() = CHARSTRING(body->body); + } + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_message_body: Unsuported content-type, fallback to textplain"); + msg_body.textplain() = CHARSTRING(body->body); + } + p_message_body = OPTIONAL(msg_body); + } else if ((body != nullptr) && (body->body != nullptr)) { + msg_body.textplain() = CHARSTRING(body->body); + p_message_body = OPTIONAL(msg_body); + } else { + p_message_body.set_to_omit(); + } + + loggers::get_instance().log_msg("<<< sip_codec_message_body::decode_message_body: ", p_message_body); +} // End of method decode_message_body + +int sip_codec_message_body::decode_sdp(const osip_body_t* p_body, LibSip__SDPTypes::SDP__Message& p_sdp_header) { + loggers::get_instance().log(">>> sip_codec_message_body::decode_sdp: %s", p_body->body); + + sdp_message_t* sdp = nullptr; + ::sdp_message_init(&sdp); + std::string s(p_body->body); + s += "\r\n\r\n"; + if (::sdp_message_parse(sdp, s.c_str()/*p_body->body*/) == 0) { + // Mandatroy fields + // Version, v + char *hvalue = ::sdp_message_v_version_get(sdp); + if (hvalue != nullptr) { + p_sdp_header.protocol__version() = std::stoi(hvalue); + } + // Origin, o + p_sdp_header.origin() = LibSip__SDPTypes::SDP__Origin( + ::sdp_message_o_username_get(sdp), + ::sdp_message_o_sess_version_get(sdp), + ::sdp_message_o_sess_version_get(sdp), + ::sdp_message_o_nettype_get(sdp), + ::sdp_message_o_addrtype_get(sdp), + ::sdp_message_o_addr_get(sdp) + ); + // Session name, s + if ((hvalue = ::sdp_message_s_name_get(sdp)) != nullptr) { + p_sdp_header.session__name() = CHARSTRING(hvalue); + } + // Time, t + int i = 0; + if ((hvalue = ::sdp_message_t_start_time_get(sdp, i)) != nullptr) { + LibSip__SDPTypes::SDP__time__list l; + do { + LibSip__SDPTypes::SDP__time t; + LibSip__SDPTypes::SDP__time__field tf; + tf.start__time() = CHARSTRING(hvalue); + tf.stop__time() = CHARSTRING(sdp_message_t_stop_time_get(sdp, i)); + t.time__field() = tf; + t.time__repeat().set_to_omit(); // TODO + l[i] = t; + i += 1; + } while ((hvalue = ::sdp_message_t_start_time_get(sdp, i)) != nullptr); + p_sdp_header.times() = l; + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: No start time in sdp"); + } + // Optional fields + // Emails, e + i = 0; + if ((hvalue = ::sdp_message_e_email_get(sdp, i)) != nullptr) { + LibSip__SDPTypes::SDP__email__list l; + do { + LibSip__SDPTypes::SDP__contact e; + e.addr__or__phone() = CHARSTRING(hvalue); + e.disp__name().set_to_omit(); // TODO To be refined + l[i] = e; + i += 1; + } while ((hvalue = ::sdp_message_e_email_get(sdp, i)) != nullptr); + p_sdp_header.emails() = OPTIONAL(l); + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: No emails in sdp"); + p_sdp_header.emails().set_to_omit(); + } + // Information, i + i = 0; + if ((hvalue = ::sdp_message_i_info_get(sdp, i)) != nullptr) { + p_sdp_header.information() = OPTIONAL(CHARSTRING(hvalue)); + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: No information in sdp"); + p_sdp_header.information().set_to_omit(); + } + // Media, m + i = 0; + if ((hvalue = ::sdp_message_m_media_get(sdp, i)) != nullptr) { + LibSip__SDPTypes::SDP__media__desc__list l; + do { + loggers::get_instance().log("sip_codec_message_body::decode_sdp: Media='%s'", hvalue); + // Media description + LibSip__SDPTypes::SDP__media__field f; + f.media() = CHARSTRING(hvalue); + LibSip__SDPTypes::SDP__media__port p; + hvalue = ::sdp_message_m_port_get(sdp, i); + p.port__number() = std::stoi(hvalue); + if ((hvalue = ::sdp_message_m_number_of_port_get(sdp, i)) == nullptr) { + p.num__of__ports().set_to_omit(); + } else { + p.num__of__ports() = OPTIONAL(std::stoi(hvalue)); + } + f.ports() = p; + f.transport() = CHARSTRING(::sdp_message_m_proto_get(sdp, i)); + LibSip__SDPTypes::SDP__fmt__list fl; + int j = 0; + while ((hvalue = ::sdp_message_m_payload_get(sdp, i, j)) != nullptr) { + fl[j++] = CHARSTRING(hvalue); + } // End of 'for' statement + f.fmts() = fl; + LibSip__SDPTypes::SDP__media__desc m; + m.media__field() = f; + loggers::get_instance().log_msg("sip_codec_message_body::decode_sdp: m=", m); + // TODO + // Media attributes + m.attributes().set_to_omit(); + m.bandwidth().set_to_omit(); + m.information().set_to_omit(); + m.connections().set_to_omit(); + m.key().set_to_omit(); + l[i] = m; + i += 1; + } while ((hvalue = ::sdp_message_m_media_get(sdp, i)) != nullptr); + p_sdp_header.media__list() = OPTIONAL(l); + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: No media in sdp"); + p_sdp_header.media__list().set_to_omit(); + } + // Attributes, a + i = 0; + sdp_attribute_t* a; + if ((a = ::sdp_message_attribute_get(sdp, 0, i)) != nullptr) { + LibSip__SDPTypes::SDP__attribute__list l; + int j = 0; + do { + loggers::get_instance().log("sip_codec_message_body::decode_sdp: Attributes#%d: '%s'='%s'", i, a->a_att_field, (a->a_att_value == nullptr) ? "(null)" : a->a_att_value); + // Attribute description + LibSip__SDPTypes::SDP__attribute f; + if (strcmp(a->a_att_field, "rtpmap") == 0) { + std::vector output = converter::get_instance().split(a->a_att_value, " "); + LibSip__SDPTypes::SDP__attribute__rtpmap__codec c; + std::vector o = converter::get_instance().split(output[1], "/"); + c.encoding() = CHARSTRING(o[0].c_str()); + c.clockrate() = CHARSTRING(o[1].c_str()); + if (o.size() == 3) { + c.parameters() = OPTIONAL(CHARSTRING(o[2].c_str())); + } else { + c.parameters().set_to_omit(); + } + f.rtpmap() = LibSip__SDPTypes::SDP__attribute__rtpmap(CHARSTRING(output[0].c_str()), c); + } else if (strcmp(a->a_att_field, "fmtp") == 0) { + // fmtp'='114 mode-change-capability=2;max-red=0' + std::vector o = converter::get_instance().split(a->a_att_value, " "); + LibSip__SDPTypes::SDP__attribute__fmtp fmtp; + fmtp.format() = CHARSTRING(o[0].c_str()); + LibSip__SDPTypes::SDP__attribute__fmtp__format__specific__params c; + if (o[1].find(";") != std::string::npos) { + loggers::get_instance().log("sip_codec_message_body::decode_sdp: Attributes#%d: param list='%s'", i, o[1].c_str()); + o = converter::get_instance().split(o[1], ";"); + LibSip__Common::SemicolonParam__List& sl = c.paramList(); + for (unsigned int k = 0; k < o.size(); k++) { + loggers::get_instance().log("sip_codec_headers::decode_semi_colon_params: Process param: %s", o[k].c_str()); + size_t eq_pos = o[k].find("="); + if (eq_pos == std::string::npos) { + sl[k] = LibSip__Common::GenericParam(CHARSTRING(o[k].c_str()), OPTIONAL(OMIT_VALUE)); + } else { + loggers::get_instance().log("sip_codec_headers::decode_semi_colon_params: substrs: %s - %s", o[k].substr(0, eq_pos).c_str(), o[k].substr(eq_pos + 1).c_str()); + LibSip__Common::GenValue g; + g.tokenOrHost() = CHARSTRING(o[k].substr(eq_pos + 1).c_str()); + sl[k] = LibSip__Common::GenericParam(CHARSTRING(o[k].substr(0, eq_pos).c_str()), g); + } + } // End of 'for'statement + } else { + c.unstructured() = CHARSTRING(o[1].c_str()); + } + fmtp.params() = c; + f.fmtp() = fmtp; + } else if (strcmp(a->a_att_field, "curr") == 0) { + std::vector o = converter::get_instance().split(a->a_att_value, " "); + if (o.size() == 3) { + LibSip__SDPTypes::SDP__attribute__curr c; + c.preconditionType() = CHARSTRING(o[0].c_str()); + c.statusType() = CHARSTRING(o[1].c_str()); + c.direction() = CHARSTRING(o[2].c_str()); + f.curr() = c; + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: Wrong formatted curr SDP"); + f.curr().set_to_omit(); + } + } else if (strcmp(a->a_att_field, "des") == 0) { + std::vector o = converter::get_instance().split(a->a_att_value, " "); + if (o.size() == 4) { + LibSip__SDPTypes::SDP__attribute__des c; + c.preconditionType() = CHARSTRING(o[0].c_str()); + c.strength() = CHARSTRING(o[1].c_str()); + c.statusType() = CHARSTRING(o[2].c_str()); + c.direction() = CHARSTRING(o[3].c_str()); + f.des() = c; + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: Wrong formatted des SDP"); + f.des().set_to_omit(); + } + } else if (strcmp(a->a_att_field, "sendrecv") == 0) { + f.sendrecv() = LibSip__SDPTypes::SDP__attribute__sendrecv(NULL_VALUE); + } else if (strcmp(a->a_att_field, "maxptime") == 0) { + LibSip__SDPTypes::SDP__attribute__maxptime m; + f.maxptime() = LibSip__SDPTypes::SDP__attribute__maxptime(CHARSTRING((const char*)a->a_att_value)); + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: Unprocessed attributes#%d: '%s'='%s'", i, a->a_att_field, a->a_att_value); + } + loggers::get_instance().log_msg("sip_codec_message_body::decode_sdp: f: ", f); + if (f.is_bound()) { + l[j++] = f; + } + i += 1; + } while ((a = ::sdp_message_attribute_get(sdp, 0, i)) != nullptr); + loggers::get_instance().log_msg("sip_codec_message_body::decode_sdp: After Attribute loop: ", l); + if (j == 0) { // Empty list + p_sdp_header.attributes().set_to_omit(); + } else { + p_sdp_header.attributes() = OPTIONAL(l); + } + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: No attributes in sdp"); + p_sdp_header.attributes().set_to_omit(); + } + // Bandwith, b + i = 0; + sdp_bandwidth_t* b; + if ((b = ::sdp_message_bandwidth_get(sdp, 0, i)) != nullptr) { + LibSip__SDPTypes::SDP__bandwidth__list l; + do { + loggers::get_instance().log("sip_codec_message_body::decode_sdp: Bandwidths#%d: '%s'='%s'", i, b->b_bwtype, b->b_bandwidth); + LibSip__SDPTypes::SDP__bandwidth a(b->b_bwtype, INTEGER(std::stoi(b->b_bandwidth))); + loggers::get_instance().log_msg("sip_codec_message_body::decode_sdp_sdp: Bandwith: ", a); + l[i] = a; + i += 1; + } while((b = ::sdp_message_bandwidth_get(sdp, 0, i)) != nullptr); + p_sdp_header.bandwidth() = OPTIONAL(l); + } else { + p_sdp_header.bandwidth().set_to_omit(); + } + // Connection, c + char* net__type; + if ((net__type = ::sdp_message_c_nettype_get(sdp, 0, 0)) != nullptr) { + loggers::get_instance().log("sip_codec_message_body::decode_sdp: Connections#%d: '%s'", 0, a); + LibSip__SDPTypes::SDP__connection c; + c.net__type() = CHARSTRING(net__type); + c.addr__type() = CHARSTRING(::sdp_message_c_addrtype_get(sdp, 0, 0)); + LibSip__SDPTypes::SDP__conn__addr a; + a.addr() = CHARSTRING(::sdp_message_c_addr_get(sdp, 0, 0)); + if (::sdp_message_c_addr_multicast_ttl_get(sdp, 0, 0) != nullptr) { + a.ttl() = OPTIONAL(::stoi(::sdp_message_c_addr_multicast_ttl_get(sdp, 0, 0))); + } else { + a.ttl().set_to_omit(); + } + if (::sdp_message_c_addr_multicast_int_get(sdp, 0, 0) != nullptr) { + a.num__of__addr() = OPTIONAL(::stoi(::sdp_message_c_addr_multicast_int_get(sdp, 0, 0))); + } else { + a.num__of__addr().set_to_omit(); + } + c.conn__addr() = a; + loggers::get_instance().log_msg("sip_codec_message_body::decode_sdp_sdp: connection: ", c); + p_sdp_header.connection() = OPTIONAL(c); + } else { + p_sdp_header.connection().set_to_omit(); + } + i = 0; + + // TODO + p_sdp_header.uri().set_to_omit(); + p_sdp_header.phone__numbers().set_to_omit(); + p_sdp_header.timezone__adjustments().set_to_omit(); + p_sdp_header.key().set_to_omit(); + + } else { + loggers::get_instance().warning("sip_codec_message_body::decode_sdp: Failed to parse SDP"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_message_body::decode_sdp: sdp: ", p_sdp_header); + return 0; +} + +int sip_codec_message_body::encode_xml(const LibSip__XMLTypes::XmlBody& p_message_body, osip_body_t** p_body) { + loggers::get_instance().log_msg(">>> sip_codec_message_body::encode_xml: ", p_message_body); + + ::osip_body_init(p_body); + + TTCN_EncDec::clear_error(); + TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_DEFAULT); + TTCN_Buffer encoding_buffer; + + CHARSTRING h("\n"); + encoding_buffer.put_s(h.lengthof(), (const unsigned char*)static_cast(h)); + if (p_message_body.ischosen(LibSip__XMLTypes::XmlBody::ALT_presence)) { // Held codec + const urn__ietf__params__xml__ns__pidf::Presence& presence = p_message_body.presence(); + loggers::get_instance().log_msg("sip_codec_message_body::encode_xml: Process Presence", (const Base_Type&)presence); + presence.encode(urn__ietf__params__xml__ns__pidf::Presence_descr_, encoding_buffer, TTCN_EncDec::CT_XER, XER_EXTENDED); + } else { + loggers::get_instance().warning("sip_codec_message_body::encode_xml: Unsupported variant"); + return -1; + } + OCTETSTRING data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()); + + if (p_message_body.ischosen(LibSip__XMLTypes::XmlBody::ALT_presence)) { // NG112-2021 Workaround for TITAN/XSD issue + // TODO TITAN work-around, replace tq0003 namespace??? + std::string s(static_cast(data), data.lengthof() + static_cast(data)); + /*size_t idx = 0; + + std::string f("tq0000:"); + std::string t(""); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign(":tq0000"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign("tq0001:"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign(":tq0001"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign("tq0002:"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign(":tq0002"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign("tq0003:"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign(":tq0003"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign("tq0004:"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + f.assign(":tq0004"); + while ((idx = s.find(f)) != std::string::npos) { + s.replace(idx, f.length(), t); + idx += t.length(); + } // End of 'while' statement + */ + data = OCTETSTRING(s.length(), (const unsigned char*)s.c_str()); + } + (*p_body)->body = ::strdup(static_cast(oct2char(data))); + (*p_body)->length = strlen((*p_body)->body); + + loggers::get_instance().log("<<< sip_codec_message_body::encode_xml: %s", (*p_body)->body); + return 0; +} + +int sip_codec_message_body::decode_xml(const osip_body_t* p_body, LibSip__XMLTypes::XmlBody& p_xml_header) { + loggers::get_instance().log(">>> sip_codec_message_body::decode_xml: %s", p_body->body); + + // TODO Unify held_codec for bothHttp & Sip: instead of LibHttp__XmlMessageBodyTypes::XmlBody, use a generic XmlBody common to LibItsHttp & LibSip + TTCN_EncDec::clear_error(); + TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_DEFAULT); + OCTETSTRING data(p_body->length, (const unsigned char*)p_body->body); + TTCN_Buffer decoding_buffer(data); + loggers::get_instance().log_to_hexa("sip_codec_message_body::decode_xml: decoding_buffer: ", decoding_buffer); + + if (strstr(p_body->body, " +{ +public: + explicit sip_codec_message_body() { }; + virtual ~sip_codec_message_body() { }; + + virtual int encode (const LibSip__MessageBodyTypes::MessageBody& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__MessageBodyTypes::MessageBody& msg, params* p_params = NULL); + + virtual int encode_message_body(const LibSip__MessageBodyTypes::MessageBody& p_message_body, osip_message_t* p_sip_message); + virtual void decode_message_body(const osip_message_t* p_sip_message, OPTIONAL& p_message_body); + +private: + int encode_sdp(const LibSip__SDPTypes::SDP__Message& p_message_body, sdp_message_t** p_sdp_body); + int decode_sdp(const osip_body_t* p_body, LibSip__SDPTypes::SDP__Message& p_sdp_header); + int encode_xml(const LibSip__XMLTypes::XmlBody& p_message_body, osip_body_t** p_body); + int decode_xml(const osip_body_t* p_body, LibSip__XMLTypes::XmlBody& p_xml_header); + +}; // End of class sip_codec_message_body diff --git a/ccsrc/Protocols/Sip/sip_codec_message_request.cc b/ccsrc/Protocols/Sip/sip_codec_message_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..9314d548578144bd2a98437bd3f105447d5740ff --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_message_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_message_request.hh" +#include "loggers.hh" + +int sip_codec_message_request::encode (const LibSip__SIPTypesAndValues::MESSAGE__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_message_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_message_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_message_request::encode: data=", data); + return 0; +} + +int sip_codec_message_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::MESSAGE__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_message_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_message_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_message_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::MESSAGE__E) { + loggers::get_instance().warning("sip_codec_message_request::decode: Wrong SIP Method, expected MESSAGE"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_message_request.hh b/ccsrc/Protocols/Sip/sip_codec_message_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..8df7dd180c611f5f602c991d3df8a693a48a68aa --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_message_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class MESSAGE__Request; +} + +class sip_codec_message_request: public codec_gen < +LibSip__SIPTypesAndValues::MESSAGE__Request, +LibSip__SIPTypesAndValues::MESSAGE__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_message_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_message_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::MESSAGE__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::MESSAGE__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_message_request diff --git a/ccsrc/Protocols/Sip/sip_codec_notify_request.cc b/ccsrc/Protocols/Sip/sip_codec_notify_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..88429a14b11d4acccfa8472b910d68dc6cd907a8 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_notify_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_notify_request.hh" +#include "loggers.hh" + +int sip_codec_notify_request::encode (const LibSip__SIPTypesAndValues::NOTIFY__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_notify_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_notify_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_notify_request::encode: data=", data); + return 0; +} + +int sip_codec_notify_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::NOTIFY__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_notify_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_notify_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_notify_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::NOTIFY__E) { + loggers::get_instance().warning("sip_codec_notify_request::decode: Wrong SIP Method, expected NOTIFY"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_notify_request.hh b/ccsrc/Protocols/Sip/sip_codec_notify_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..8114f68b3ac381caeba5939ec442ce860d45974d --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_notify_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class NOTIFY__Request; +} + +class sip_codec_notify_request: public codec_gen < +LibSip__SIPTypesAndValues::NOTIFY__Request, +LibSip__SIPTypesAndValues::NOTIFY__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_notify_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_notify_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::NOTIFY__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::NOTIFY__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_notify_request diff --git a/ccsrc/Protocols/Sip/sip_codec_options_request.cc b/ccsrc/Protocols/Sip/sip_codec_options_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..195a183419c1a7d1d2e05b0e721cb4d84a2fd490 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_options_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_options_request.hh" +#include "loggers.hh" + +int sip_codec_options_request::encode (const LibSip__SIPTypesAndValues::OPTIONS__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_options_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_options_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_options_request::encode: data=", data); + return 0; +} + +int sip_codec_options_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::OPTIONS__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_options_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_options_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_options_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::OPTIONS__E) { + loggers::get_instance().warning("sip_codec_options_request::decode: Wrong SIP Method, expected OPTIONS"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_options_request.hh b/ccsrc/Protocols/Sip/sip_codec_options_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..29b6000f8ba5f9ad827f32b00abcac6232f7cf29 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_options_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class OPTIONS__Request; +} + +class sip_codec_options_request: public codec_gen < +LibSip__SIPTypesAndValues::OPTIONS__Request, +LibSip__SIPTypesAndValues::OPTIONS__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_options_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_options_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::OPTIONS__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::OPTIONS__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_options_request diff --git a/ccsrc/Protocols/Sip/sip_codec_register_request.cc b/ccsrc/Protocols/Sip/sip_codec_register_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..af45a9810f9e45c2456086dc122c97a13f78a1b6 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_register_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_register_request.hh" +#include "loggers.hh" + +int sip_codec_register_request::encode (const LibSip__SIPTypesAndValues::REGISTER__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_register_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_register_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_register_request::encode: data=", data); + return 0; +} + +int sip_codec_register_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::REGISTER__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_register_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_register_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_register_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::REGISTER__E) { + loggers::get_instance().warning("sip_codec_register_request::decode: Wrong SIP Method, expected REGISTER"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_register_request.hh b/ccsrc/Protocols/Sip/sip_codec_register_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..804fa4984f9dd57de9865729ca564f376250d0de --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_register_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class REGISTER__Request; +} + +class sip_codec_register_request: public codec_gen < +LibSip__SIPTypesAndValues::REGISTER__Request, +LibSip__SIPTypesAndValues::REGISTER__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_register_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_register_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::REGISTER__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::REGISTER__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_register_request diff --git a/ccsrc/Protocols/Sip/sip_codec_request.cc b/ccsrc/Protocols/Sip/sip_codec_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..90f1f629a6563e70898357dcb070b938cc3e425f --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_request.cc @@ -0,0 +1,210 @@ +#include "LibSip_SIPTypesAndValues.hh" +#include "LibSip_Common.hh" + +#include "sip_codec_request.hh" +#include "loggers.hh" + +#include "converter.hh" + +#ifdef WIN32 +#undef osip_malloc +#undef osip_free +#define osip_malloc(S) malloc(S) +#define osip_free(P) { if (P!=NULL) { free(P);} } +#endif + +int sip_codec_request::encode (const LibSip__SIPTypesAndValues::Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_request::encode: ", (const Base_Type&)msg); + + TRACE_INITIALIZE(TRACE_LEVEL7, NULL); + OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, ">>> sip_codec_request::encode\n")); + + osip_message_t* sip_message = nullptr; // TODO Use smart pointer + ::parser_init(); + int result = ::osip_message_init(&sip_message); + if (result != 0) { + loggers::get_instance().warning("sip_codec_request::encode: Failed to initialise internal data structures"); + return -1; + } + + if (encode_request(msg, sip_message) == -1) { + loggers::get_instance().warning("sip_codec_request::encode: Failed to encode Request"); + ::osip_message_free(sip_message); + sip_message = nullptr; + return -1; + } + + char* buffer = nullptr; + size_t length = 0; + result = ::osip_message_to_str(sip_message, &buffer, &length); + if (result != 0) { + loggers::get_instance().warning("sip_codec_request::encode: Failed to encode data structures"); + ::osip_message_free(sip_message); + return -1; + } + loggers::get_instance().log("sip_codec_request::encode: Message:%s", buffer); + data = OCTETSTRING(length, (const unsigned char*)buffer); + osip_free(buffer); + ::osip_message_free(sip_message); + + loggers::get_instance().log_msg("<<< sip_codec_request::encode: data=", data); + return result; +} + +int sip_codec_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_request::decode: data=", data); + + TRACE_INITIALIZE(TRACE_LEVEL7, NULL); + OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_ERROR, NULL, ">>> sip_codec_request::decode\n")); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_request::decode: Wrong parameters"); + return -1; + } + + osip_message_t* sip_message; + ::parser_init(); + int result = ::osip_message_init(&sip_message); + if (result != 0) { + loggers::get_instance().warning("sip_codec_request::decode: Failed to initialise internal data structures"); + return -1; + } + result = ::osip_message_parse(sip_message, (const char*)static_cast(data), data.lengthof()); + if (result != 0) { + loggers::get_instance().warning("sip_codec_request::decode: Failed to parse SIP message"); + ::osip_message_free(sip_message); + return -1; + } + + // Fill RequestLine + decode_request_line(sip_message, msg); + + // Fill Headers + decode_request_headers(sip_message, msg); + + // Fill MessageBody + decode_message_body(sip_message, msg.messageBody()); + + // Fill Payload + decode_payload(sip_message, msg); + + ::osip_message_free(sip_message); + loggers::get_instance().log_msg("sip_codec_request::decode: ", msg); + + return 0; +} + +int sip_codec_request::encode_request(const LibSip__SIPTypesAndValues::Request& p_request, osip_message_t* p_sip_message) +{ + loggers::get_instance().log(">>> sip_codec_request::encode_request"); + + encode_request_line(p_request.requestLine(), p_sip_message); + + encode_request_headers(p_request.msgHeader(), p_sip_message); + + if (p_request.messageBody().is_present()) { + const LibSip__MessageBodyTypes::MessageBody& m = static_cast(*p_request.messageBody().get_opt_value()); + encode_message_body(m, p_sip_message); + } + + if (p_request.payload().is_present()) { + const LibSip__SIPTypesAndValues::Payload& p = static_cast(*p_request.payload().get_opt_value()); + encode_request_payload(p, p_sip_message); + } + + return 0; +} // End of method encode_request + +int sip_codec_request::encode_request_line(const LibSip__SIPTypesAndValues::RequestLine& p_request_line, osip_message_t* p_sip_message) +{ + loggers::get_instance().log_msg(">>> sip_codec_request::encode_request_line", p_request_line); + + // Sip method + std::string str(LibSip__SIPTypesAndValues::Method::enum_to_str(p_request_line.method())); + char *p = (char*)osip_malloc(str.length() - 2 + 1); // Will be freed by osip_message_free + ::strcpy(p, str.substr(0, str.length() - 2).c_str()); // Remove _E + ::osip_message_set_method(p_sip_message, p); + + // Sip uri + osip_uri_t *uri; + if (encode_sip_url(p_request_line.requestUri(), &uri) == -1) { + loggers::get_instance().warning("sip_codec_request::encode_request_line: Faile to encode SipUrl"); + return -1; + } + ::osip_message_set_uri(p_sip_message, uri); + // FIXME: Add parameter to support udp/tcp/tls transport + //::osip_uri_set_transport_tcp(uri); + ::osip_uri_set_transport_tls(uri); + + // SIP version + p = (char*)osip_malloc(p_request_line.sipVersion().lengthof() + 1); // Will be freed by osip_message_free + ::strcpy(p, (char*)static_cast(p_request_line.sipVersion())); + ::osip_message_set_version(p_sip_message, p); + + return 0; +} // End of method encode_request_line + +int sip_codec_request::encode_request_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message) +{ // TODO Rename to encode_headers and call sip_codec_headers::encode_headers + loggers::get_instance().log_msg(">>> sip_codec_request::encode_request_headers: ", p_msg_header); + + if (encode_headers(p_msg_header, p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_request::encode_request_headers: Failed to encode headers"); + return -1; + } + + return 0; +} // End of method encode_request_headers + +int sip_codec_request::encode_request_payload(const LibSip__SIPTypesAndValues::Payload& p_payload, osip_message_t* p_sip_message) +{ + loggers::get_instance().log(">>> sip_codec_request::encode_request_payload"); + + return 0; +} // End of method encode_request_payload + +void sip_codec_request::decode_request_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request) +{ // TODO rename into decode_headers and call sip_code_headers::decode_headers + loggers::get_instance().log(">>> sip_codec_request::decode_request_headers"); + + LibSip__SIPTypesAndValues::MessageHeader& headers = p_request.msgHeader(); + decode_headers(p_sip_message, headers); + if (!headers.is_bound()) { + loggers::get_instance().warning("sip_codec_request::decode_request_headers: Failed to decode headers"); + return; + } + + loggers::get_instance().log_msg("<<< sip_codec_request::decode_request_headers: ", p_request); +} // End of method decode_request_headers + +void sip_codec_request::decode_payload(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request) +{ + loggers::get_instance().log(">>> sip_codec_request::decode_payload"); + + p_request.payload().set_to_omit(); + +} // End of method decode_payload + +void sip_codec_request::decode_request_line(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request) +{ + loggers::get_instance().log(">>> sip_codec_request::decode_request_line"); + + LibSip__SIPTypesAndValues::RequestLine request_line; + std::string str(::osip_message_get_method(p_sip_message)); + str += "_E"; + request_line.method() = LibSip__SIPTypesAndValues::Method(LibSip__SIPTypesAndValues::Method::str_to_enum(str.c_str())); + loggers::get_instance().log_msg("sip_codec_request::decode_request_line: Method: ", request_line.method()); + LibSip__SIPTypesAndValues::SipUrl uri; + decode_uri(uri, ::osip_message_get_uri(p_sip_message)); + loggers::get_instance().log_msg("sip_codec_request::decode_request_line: SipUrl: ", uri); + request_line.requestUri() = uri; + request_line.sipVersion() = CHARSTRING(::osip_message_get_version(p_sip_message)); + p_request.requestLine() = request_line; + // FIXME To be continued + + loggers::get_instance().log_msg("<<< sip_codec_request::decode_request_line: ", p_request); +} + diff --git a/ccsrc/Protocols/Sip/sip_codec_request.hh b/ccsrc/Protocols/Sip/sip_codec_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..e339b9dea7b620ee56fd7c2dd164948142ac70ac --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_request.hh @@ -0,0 +1,45 @@ +#pragma once + +#include "codec_gen.hh" +#include "params.hh" + +#include "sip_codec_headers.hh" +#include "sip_codec_message_body.hh" + +#include "osipparser2/osip_parser.h" +#include "osipparser2/sdp_message.h" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class Request; + class RequestLine; + class MessageHeader; + class Payload; +} + +class sip_codec_request: public codec_gen < + LibSip__SIPTypesAndValues::Request, + LibSip__SIPTypesAndValues::Request>, + sip_codec_headers, sip_codec_message_body +{ +public: + explicit sip_codec_request() : codec_gen() { }; + virtual ~sip_codec_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::Request& msg, params* p_params = NULL); +private: + int encode_request(const LibSip__SIPTypesAndValues::Request& p_request, osip_message_t* p_sip_message); + int encode_request_line(const LibSip__SIPTypesAndValues::RequestLine& p_request_line, osip_message_t* p_sip_message); + int encode_request_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message); + int encode_request_payload(const LibSip__SIPTypesAndValues::Payload& p_payload, osip_message_t* p_sip_message); + +private: + void decode_payload(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& p_request); + void decode_request_line(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& msg); + void decode_request_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Request& msg); + +}; // End of class sip_codec_request diff --git a/ccsrc/Protocols/Sip/sip_codec_response.cc b/ccsrc/Protocols/Sip/sip_codec_response.cc new file mode 100644 index 0000000000000000000000000000000000000000..939353e959bfa18226359021f0f3d0d9c460c3d7 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_response.cc @@ -0,0 +1,191 @@ +#include "LibSip_SIPTypesAndValues.hh" +#include "LibSip_Common.hh" + +#include "sip_codec_response.hh" +#include "loggers.hh" + +#include "converter.hh" + +#ifdef WIN32 +#undef osip_malloc +#undef osip_free +#define osip_malloc(S) malloc(S) +#define osip_free(P) { if (P!=NULL) { free(P);} } +#endif + +int sip_codec_response::encode (const LibSip__SIPTypesAndValues::Response& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_response::encode: ", (const Base_Type&)msg); + + osip_message_t* sip_message = nullptr; // TODO Use smart pointer + ::parser_init(); + int result = ::osip_message_init(&sip_message); + if (result != 0) { + loggers::get_instance().warning("sip_codec_response::encode: Failed to initialise internal data structures"); + return -1; + } + + if (encode_response(msg, sip_message) == -1) { + loggers::get_instance().warning("sip_codec_response::encode: Failed to encode Response"); + ::osip_message_free(sip_message); + sip_message = nullptr; + return -1; + } + + char* buffer = nullptr; + size_t length = 0; + result = ::osip_message_to_str(sip_message, &buffer, &length); + if (result != 0) { + loggers::get_instance().warning("sip_codec_response::encode: Failed to encode data structures: return code=%d", result); + ::osip_message_free(sip_message); + return -1; + } + loggers::get_instance().log("sip_codec_response::encode: Message:%s", buffer); + data = OCTETSTRING(length, (const unsigned char*)buffer); + osip_free(buffer); + ::osip_message_free(sip_message); + + loggers::get_instance().log_msg("<<< sip_codec_response::encode: data=", data); + return result; +} + +int sip_codec_response::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::Response& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_response::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_response::decode: Wrong parameters"); + return -1; + } + + osip_message_t* sip_message; + ::parser_init(); + int result = ::osip_message_init(&sip_message); + if (result != 0) { + loggers::get_instance().warning("sip_codec_response::decode: Failed to initialise internal data structures"); + return -1; + } + result = ::osip_message_parse(sip_message, (const char*)static_cast(data), data.lengthof()); + if (result != 0) { + loggers::get_instance().warning("sip_codec_response::decode: Failed to parse SIP message"); + ::osip_message_free(sip_message); + return -1; + } + + // Fill StatusLine + decode_status_line(sip_message, msg); + + // Fill Headers + decode_response_headers(sip_message, msg); + + // Fill MessageBody + decode_message_body(sip_message, msg.messageBody()); + + // Fill Payload + decode_payload(sip_message, msg); + + ::osip_message_free(sip_message); + loggers::get_instance().log_msg("sip_codec_response::decode: ", msg); + + return 0; +} + +int sip_codec_response::encode_response(const LibSip__SIPTypesAndValues::Response& p_response, osip_message_t* p_sip_message) +{ + loggers::get_instance().log(">>> sip_codec_response::encode_response"); + + encode_status_line(p_response.statusLine(), p_sip_message); + + encode_response_headers(p_response.msgHeader(), p_sip_message); + + if (p_response.messageBody().is_present()) { + const LibSip__MessageBodyTypes::MessageBody& m = static_cast(*p_response.messageBody().get_opt_value()); + encode_message_body(m, p_sip_message); + } + + if (p_response.payload().is_present()) { + const LibSip__SIPTypesAndValues::Payload& p = static_cast(*p_response.payload().get_opt_value()); + encode_response_payload(p, p_sip_message); + } + + return 0; +} // End of method encode_response + +int sip_codec_response::encode_status_line(const LibSip__SIPTypesAndValues::StatusLine& p_status_line, osip_message_t* p_sip_message) +{ + loggers::get_instance().log(">>> sip_codec_response::encode_status_line"); + + // Sip version + char* p = (char*)osip_malloc(p_status_line.sipVersion().lengthof() + 1); // Will be freed by osip_message_free + ::strcpy(p, (char*)static_cast(p_status_line.sipVersion())); + ::osip_message_set_version(p_sip_message, p); + + // Status code + loggers::get_instance().log("sip_codec_response::encode_status_line: status code=%d", static_cast(p_status_line.statusCode())); + ::osip_message_set_status_code(p_sip_message, static_cast(p_status_line.statusCode())); + + // Reason phrase + p = (char*)osip_malloc(p_status_line.reasonPhrase().lengthof() + 1); // Will be freed by osip_message_free + ::strcpy(p, (char*)static_cast(p_status_line.reasonPhrase())); + ::osip_message_set_reason_phrase(p_sip_message, p); + + return 0; +} // End of method encode_status_line + +int sip_codec_response::encode_response_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message) +{ // TODO Rename to encode_headers and call sip_codec_headers::encode_headers + loggers::get_instance().log_msg(">>> sip_codec_response::encode_response_headers: ", p_msg_header); + + if (encode_headers(p_msg_header, p_sip_message) == -1) { + loggers::get_instance().warning("sip_codec_response::encode_response_headers: Failed to encode headers"); + return -1; + } + + return 0; +} // End of method encode_response_headers + +int sip_codec_response::encode_response_payload(const LibSip__SIPTypesAndValues::Payload& p_payload, osip_message_t* p_sip_message) +{ + loggers::get_instance().log(">>> sip_codec_response::encode_response_payload"); + + return 0; +} // End of method encode_response_payload + +void sip_codec_response::decode_status_line(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Response& p_response) +{ + loggers::get_instance().log(">>> sip_codec_response::decode_status_line"); + + LibSip__SIPTypesAndValues::StatusLine status_line; + status_line.sipVersion() = CHARSTRING(::osip_message_get_version(p_sip_message)); + loggers::get_instance().log_msg("sip_codec_response::decode_status_line: sipVersion: ", status_line.sipVersion()); + status_line.statusCode() = INTEGER(osip_message_get_status_code(p_sip_message)); + loggers::get_instance().log_msg("sip_codec_response::decode_status_line: statusCode: ", status_line.statusCode()); + status_line.reasonPhrase() = CHARSTRING(::osip_message_get_reason_phrase(p_sip_message)); + loggers::get_instance().log_msg("sip_codec_response::decode_status_line: reasonPhrase: ", status_line.reasonPhrase()); + p_response.statusLine() = status_line; + + loggers::get_instance().log_msg("<<< sip_codec_response::decode_status_line: ", p_response.statusLine()); +} // End of method decode_status_line + +void sip_codec_response::decode_response_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Response& p_response) +{ // TODO rename into decode_headers and call sip_code_headers::decode_headers + loggers::get_instance().log(">>> sip_codec_response::decode_response_headers"); + + LibSip__SIPTypesAndValues::MessageHeader& headers = p_response.msgHeader(); + decode_headers(p_sip_message, headers); + if (!headers.is_bound()) { + loggers::get_instance().warning("sip_codec_response::decode_response_headers: Failed to decode headers"); + return; + } + + loggers::get_instance().log_msg("<<< sip_codec_response::decode_response_headers: ", p_response); +} // End of method decode_response_headers + +void sip_codec_response::decode_payload(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Response& p_response) +{ + loggers::get_instance().log(">>> sip_codec_response::decode_payload"); + + p_response.payload().set_to_omit(); + +} // End of method decode_payload diff --git a/ccsrc/Protocols/Sip/sip_codec_response.hh b/ccsrc/Protocols/Sip/sip_codec_response.hh new file mode 100644 index 0000000000000000000000000000000000000000..c0f8f83a0e30478d1c063389a96c390bbd6cc13c --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_response.hh @@ -0,0 +1,46 @@ +#pragma once + +#include "codec_gen.hh" +#include "params.hh" + +#include "sip_codec_headers.hh" +#include "sip_codec_message_body.hh" + +#include "osipparser2/osip_parser.h" +#include "osipparser2/sdp_message.h" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class Response; + class StatusLine; + class MessageHeader; + class Payload; +} + +class sip_codec_response: public codec_gen < + LibSip__SIPTypesAndValues::Response, + LibSip__SIPTypesAndValues::Response>, + sip_codec_headers, sip_codec_message_body + +{ +public: + explicit sip_codec_response() : codec_gen() { }; + virtual ~sip_codec_response() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::Response& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::Response& msg, params* p_params = NULL); +private: + int encode_response(const LibSip__SIPTypesAndValues::Response& p_response, osip_message_t* p_sip_message); + int encode_status_line(const LibSip__SIPTypesAndValues::StatusLine& p_status_line, osip_message_t* p_sip_message); + int encode_response_headers(const LibSip__SIPTypesAndValues::MessageHeader& p_msg_header, osip_message_t* p_sip_message); + int encode_response_payload(const LibSip__SIPTypesAndValues::Payload& p_payload, osip_message_t* p_sip_message); + +private: + void decode_status_line(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Response& msg); + void decode_response_headers(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Response& msg); + void decode_payload(const osip_message_t* p_sip_message, LibSip__SIPTypesAndValues::Response& p_response); + +}; // End of class sip_codec_response diff --git a/ccsrc/Protocols/Sip/sip_codec_subscribe_request.cc b/ccsrc/Protocols/Sip/sip_codec_subscribe_request.cc new file mode 100644 index 0000000000000000000000000000000000000000..2c52c4f6777270b72d8f250063327fcfe102990c --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_subscribe_request.cc @@ -0,0 +1,46 @@ +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_codec_subscribe_request.hh" +#include "loggers.hh" + +int sip_codec_subscribe_request::encode (const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& msg, OCTETSTRING& data) +{ + loggers::get_instance().log_msg(">>> sip_codec_subscribe_request::encode: ", (const Base_Type&)msg); + + if (_codec.encode((LibSip__SIPTypesAndValues::Request&)msg, data) == -1) { + loggers::get_instance().warning("sip_codec_subscribe_request::encode: Failed to encode message"); + return -1; + } + + loggers::get_instance().log_msg("<<< sip_codec_subscribe_request::encode: data=", data); + return 0; +} + +int sip_codec_subscribe_request::decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::SUBSCRIBE__Request& msg, params* p_params) +{ + loggers::get_instance().log_msg(">>> sip_codec_subscribe_request::decode: data=", data); + + // Sanity checks + if (data.lengthof() == 0) { + loggers::get_instance().warning("sip_codec_subscribe_request::decode: Wrong parameters"); + return -1; + } + + // LibSip__SIPTypesAndValues::Request request; + if (_codec.decode(data, (LibSip__SIPTypesAndValues::Request&)msg) == -1) { + // if (_codec.decode(data, request) == -1) { + loggers::get_instance().warning("sip_codec_subscribe_request::decode: Failed to decode message"); + return -1; + } + // msg.requestLine() = request.requestLine(); + // msg.msgHeader() = request.msgHeader(); + // msg.messageBody() = request.messageBody(); + // msg.payload() = request.payload(); + + if (msg.requestLine().method() != LibSip__SIPTypesAndValues::Method::SUBSCRIBE__E) { + loggers::get_instance().warning("sip_codec_subscribe_request::decode: Wrong SIP Method, expected SUBSCRIBE"); + return -1; + } + + return 0; +} diff --git a/ccsrc/Protocols/Sip/sip_codec_subscribe_request.hh b/ccsrc/Protocols/Sip/sip_codec_subscribe_request.hh new file mode 100644 index 0000000000000000000000000000000000000000..98d087f5cf175b58645975d68de415e18a5c27c2 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_codec_subscribe_request.hh @@ -0,0 +1,24 @@ +#pragma once + +#include "sip_codec_request.hh" + +class Base_Type; +class TTCN_Typedescriptor_t; +class TTCN_Buffer; + +namespace LibSip__SIPTypesAndValues { + class SUBSCRIBE__Request; +} + +class sip_codec_subscribe_request: public codec_gen < +LibSip__SIPTypesAndValues::SUBSCRIBE__Request, +LibSip__SIPTypesAndValues::SUBSCRIBE__Request> +{ + sip_codec_request _codec; +public: + explicit sip_codec_subscribe_request() : codec_gen(), _codec() { }; + virtual ~sip_codec_subscribe_request() { }; + + virtual int encode (const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& msg, OCTETSTRING& data); + virtual int decode (const OCTETSTRING& data, LibSip__SIPTypesAndValues::SUBSCRIBE__Request& msg, params* p_params = NULL); +}; // End of class sip_codec_subscribe_request diff --git a/ccsrc/Protocols/Sip/sip_layer.cc b/ccsrc/Protocols/Sip/sip_layer.cc new file mode 100644 index 0000000000000000000000000000000000000000..64be3bdda37fe05ef81ce7b2d3894f9ba09bbbe7 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_layer.cc @@ -0,0 +1,146 @@ +#include "LibSip_Interface.hh" +#include "LibSip_SIPTypesAndValues.hh" + +#include "sip_layer_factory.hh" + +#include "loggers.hh" + +#include "converter.hh" + +sip_layer::sip_layer(const std::string & p_type, const std::string & p_param) : t_layer(p_type), _params(), _codec_request(), _codec_response(), _codec_register(), _codec_invite(), _codec_ack(), _codec_subscribe(), _codec_message(), _codec_options(), _codec_cancel(), _codec_notify(), _codec_info(), _codec_bye() { + loggers::get_instance().log(">>> sip_layer::sip_layer: %s, %s", to_string().c_str(), p_param.c_str()); + // Setup parameters + params::convert(_params, p_param); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::REGISTER__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_register.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::INVITE__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_invite.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::ACK__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_ack.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_subscribe.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::MESSAGE__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_message.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::OPTIONS__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_options.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::BYE__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_bye.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::CANCEL__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_cancel.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::NOTIFY__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_notify.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::INFO__Request& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_info.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::sendMsg(const LibSip__SIPTypesAndValues::Response& p_sip_message, params& p_param) { + loggers::get_instance().log_msg(">>> sip_layer::sendMsg: ", p_sip_message); + + // Encode SipMessage + OCTETSTRING data; + _codec_response.encode(p_sip_message, data); + send_data(data, _params); +} + +void sip_layer::send_data(OCTETSTRING& data, params& p_params) { + loggers::get_instance().log_msg(">>> sip_layer::send_data: ", data); + + send_to_all_layers(data, p_params); +} + +void sip_layer::receive_data(OCTETSTRING& data, params& p_params) +{ + loggers::get_instance().log_msg(">>> sip_layer::receive_data: ", data); + + // Decode SIP message + if ((data[0].get_octet() == 'S') && (data[1].get_octet() == 'I') && (data[2].get_octet() == 'P')) { // SIP... Assume it is a responce + LibSip__SIPTypesAndValues::Response sip_response; + if (_codec_response.decode(data, sip_response) == -1) { + loggers::get_instance().warning("sip_layer::receive_data: Failed to decode response data"); + return; + } + // Pass it to the ports + to_all_upper_ports(sip_response, p_params); + } else { // Assume it is a request + LibSip__SIPTypesAndValues::Request sip_request; + if (_codec_request.decode(data, sip_request) == -1) { + loggers::get_instance().warning("sip_layer::receive_data: Failed to decode request data"); + return; + } + // Pass it to the ports + to_all_upper_ports(sip_request, p_params); + } +} + +sip_layer_factory sip_layer_factory::_f; + diff --git a/ccsrc/Protocols/Sip/sip_layer.hh b/ccsrc/Protocols/Sip/sip_layer.hh new file mode 100644 index 0000000000000000000000000000000000000000..c8a58428c422478d469b47cc47039c781b98931d --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_layer.hh @@ -0,0 +1,129 @@ +/*! + * \file sip_layer.hh + * \brief Header file for ITS HTTP protocol layer. + * \author ETSI STF549 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include + +#include "t_layer.hh" + +#include "sip_codec_request.hh" +#include "sip_codec_response.hh" +#include "sip_codec_register_request.hh" +#include "sip_codec_invite_request.hh" +#include "sip_codec_ack_request.hh" +#include "sip_codec_subscribe_request.hh" +#include "sip_codec_message_request.hh" +#include "sip_codec_options_request.hh" +#include "sip_codec_notify_request.hh" +#include "sip_codec_cancel_request.hh" +#include "sip_codec_info_request.hh" +#include "sip_codec_bye_request.hh" + +namespace LibSip__Interface { + class SipPort; //! Forward declaration of TITAN class +} + +namespace LibSip__SIPTypesAndValues { + class REGISTER__Request; //! Forward declaration of TITAN class + class INVITE__Request; //! Forward declaration of TITAN class + class ACK__Request; //! Forward declaration of TITAN class + class SUSCRIBE__Request; //! Forward declaration of TITAN class + class MESSAGE__Request; //! Forward declaration of TITAN class + class OPTIONS__Request; //! Forward declaration of TITAN class + class CANCEL__Request; //! Forward declaration of TITAN class + class NOTIFY__Request; //! Forward declaration of TITAN class + class INFO__Request; //! Forward declaration of TITAN class + class BYE__Request; //! Forward declaration of TITAN class + class Resquest; //! Forward declaration of TITAN class + class Response; //! Forward declaration of TITAN class +} + +class OCTETSTRING; //! Forward declaration of TITAN class + +/*! + * \class sip_layer + * \brief This class provides a factory class to create an sip_layer class instance + */ +class sip_layer : public t_layer { + params _params; + sip_codec_request _codec_request; + sip_codec_response _codec_response; + sip_codec_register_request _codec_register; + sip_codec_invite_request _codec_invite; + sip_codec_ack_request _codec_ack; + sip_codec_subscribe_request _codec_subscribe; + sip_codec_message_request _codec_message; + sip_codec_options_request _codec_options; + sip_codec_cancel_request _codec_cancel; + sip_codec_notify_request _codec_notify; + sip_codec_info_request _codec_info; + sip_codec_bye_request _codec_bye; + +public: //! \publicsection + /*! + * \brief Specialised constructor + * Create a new instance of the sip_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + sip_layer() : t_layer(), _params(), _codec_request(), _codec_response(), _codec_register(), _codec_invite(), _codec_ack(), _codec_subscribe(), _codec_message(), _codec_options(), _codec_cancel(), _codec_notify(), _codec_info(), _codec_bye() {}; + /*! + * \brief Specialised constructor + * Create a new instance of the sip_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + sip_layer(const std::string& p_type, const std::string& p_param); + /*! + * \brief Default destructor + */ + virtual ~sip_layer() { }; + + void sendMsg(const LibSip__SIPTypesAndValues::REGISTER__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::INVITE__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::ACK__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::SUBSCRIBE__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::MESSAGE__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::OPTIONS__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::BYE__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::CANCEL__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::NOTIFY__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::INFO__Request& p_sip_message, params& p_param); + + void sendMsg(const LibSip__SIPTypesAndValues::Response& p_sip_message, params& p_param); + + /*! + * \virtual + * \fn void send_data(OCTETSTRING& data, params& p_params); + * \brief Send bytes formated data to the lower layers + * \param[in] p_data The data to be sent + * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters + */ + virtual void send_data(OCTETSTRING& data, params& p_params); + /*! + * \virtual + * \fn void receive_data(OCTETSTRING& data, params& p_params); + * \brief Receive bytes formated data from the lower layers + * \param[in] p_data The bytes formated data received + * \param[in] p_params Some lower layers parameters values when data was received + */ + virtual void receive_data(OCTETSTRING& data, params& info); +}; // End of class sip_layer + diff --git a/ccsrc/Protocols/Sip/sip_layer_factory.hh b/ccsrc/Protocols/Sip/sip_layer_factory.hh new file mode 100644 index 0000000000000000000000000000000000000000..115dbd707e3888a88751a796342e2ada3c42e8f5 --- /dev/null +++ b/ccsrc/Protocols/Sip/sip_layer_factory.hh @@ -0,0 +1,45 @@ +/*! + * \file sip_layer_factory.hh + * \brief Header file for ITS Sip protocol layer factory. + * \author ETSI STF525 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include "layer_stack_builder.hh" + +#include "sip_layer.hh" + +/*! + * \class sip_layer_factory + * \brief This class provides a factory class to create an sip_layer class instance + */ +class sip_layer_factory : public layer_factory { + static sip_layer_factory _f; //! Reference to the unique instance of this class +public: //! \publicsection + /*! + * \brief Default constructor + * Create a new instance of the udp_layer_factory class + * \remark The HTTP layer identifier is HTTP + */ + sip_layer_factory() { + // Register factory + layer_stack_builder::register_layer_factory("SIP", this); + }; + /*! + * \fn layer* create_layer(const std::string & type, const std::string & param); + * \brief Create the layers stack based on the provided layers stack description + * \param[in] p_type The provided layers stack description + * \param[in] p_params Optional parameters + * \return 0 on success, -1 otherwise + * \inline + */ + inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param){ + return new sip_layer(p_type, p_param); + }; +}; // End of class sip_layer_factory + diff --git a/ccsrc/Protocols/UpperTester/module.mk b/ccsrc/Protocols/UpperTester/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..b704706671c2eab0d61a7123af46b7c710555058 --- /dev/null +++ b/ccsrc/Protocols/UpperTester/module.mk @@ -0,0 +1,5 @@ +sources := \ + upper_tester_layer.cc \ + + +includes := . diff --git a/ccsrc/Protocols/UpperTester/upper_tester_layer.cc b/ccsrc/Protocols/UpperTester/upper_tester_layer.cc new file mode 100644 index 0000000000000000000000000000000000000000..9304ef974e14b942b7ca9cb6b35bba2400ca5336 --- /dev/null +++ b/ccsrc/Protocols/UpperTester/upper_tester_layer.cc @@ -0,0 +1,39 @@ +#include "LibIot_TestInterface.hh" +#include "LibUpperTester.hh" + +#include "upper_tester_layer_factory.hh" + +#include "loggers.hh" + +#include "converter.hh" + +upper_tester_layer::upper_tester_layer(const std::string & p_type, const std::string & p_param) : t_layer(p_type), _params() { + loggers::get_instance().log(">>> upper_tester_layer::upper_tester_layer: %s, %s", to_string().c_str(), p_param.c_str()); + // Setup parameters + params::convert(_params, p_param); +} + +void upper_tester_layer::sendMsg(const LibUpperTester::EquipmentOperationReq& p_equipment_operation_req, params& p_param) { + loggers::get_instance().log_msg(">>> upper_tester_layer::sendMsg: ", p_equipment_operation_req); + + // Encode DiameterMessage + OCTETSTRING data; + //_codec_register.encode(p_equipment_operation_req, data); + //send_data(data, _params); +} + +void upper_tester_layer::send_data(OCTETSTRING& data, params& p_params) { + loggers::get_instance().log_msg(">>> upper_tester_layer::send_data: ", data); + + send_to_all_layers(data, p_params); +} + +void upper_tester_layer::receive_data(OCTETSTRING& data, params& p_params) +{ + loggers::get_instance().log_msg(">>> upper_tester_layer::receive_data: ", data); + + // Decode Diameter message +} + +upper_tester_layer_factory upper_tester_layer_factory::_f; + diff --git a/ccsrc/Protocols/UpperTester/upper_tester_layer.hh b/ccsrc/Protocols/UpperTester/upper_tester_layer.hh new file mode 100644 index 0000000000000000000000000000000000000000..2358550c1976316c1018a6fabd86014445df55ce --- /dev/null +++ b/ccsrc/Protocols/UpperTester/upper_tester_layer.hh @@ -0,0 +1,73 @@ +/*! + * \file upper_tester_layer.hh + * \brief Header file for ITS HTTP protocol layer. + * \author ETSI STF549 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include + +#include "t_layer.hh" + +namespace LibIot__TestInterface { + class EquipmentAccessPort; //! Forward declaration of TITAN class +} + +namespace LibUpperTester { + class EquipmentOperationReq; //! Forward declaration of TITAN class +} + +class OCTETSTRING; //! Forward declaration of TITAN class + +/*! + * \class upper_tester_layer + * \brief This class provides a factory class to create an upper_tester_layer class instance + */ +class upper_tester_layer : public t_layer { + params _params; + +public: //! \publicsection + /*! + * \brief Specialised constructor + * Create a new instance of the upper_tester_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + upper_tester_layer() : t_layer(), _params() {}; + /*! + * \brief Specialised constructor + * Create a new instance of the upper_tester_layer class + * \param[in] p_type \todo + * \param[in] p_param \todo + */ + upper_tester_layer(const std::string& p_type, const std::string& p_param); + /*! + * \brief Default destructor + */ + virtual ~upper_tester_layer() { }; + + void sendMsg(const LibUpperTester::EquipmentOperationReq& p_equipment_operation_req, params& p_param); + + /*! + * \virtual + * \fn void send_data(OCTETSTRING& data, params& p_params); + * \brief Send bytes formated data to the lower layers + * \param[in] p_data The data to be sent + * \param[in] p_params Some parameters to overwrite default value of the lower layers parameters + */ + virtual void send_data(OCTETSTRING& data, params& p_params); + /*! + * \virtual + * \fn void receive_data(OCTETSTRING& data, params& p_params); + * \brief Receive bytes formated data from the lower layers + * \param[in] p_data The bytes formated data received + * \param[in] p_params Some lower layers parameters values when data was received + */ + virtual void receive_data(OCTETSTRING& data, params& info); +}; // End of class upper_tester_layer + diff --git a/ccsrc/Protocols/UpperTester/upper_tester_layer_factory.hh b/ccsrc/Protocols/UpperTester/upper_tester_layer_factory.hh new file mode 100644 index 0000000000000000000000000000000000000000..558dfa8f34884515e5da580ddf880aa2a39a7e91 --- /dev/null +++ b/ccsrc/Protocols/UpperTester/upper_tester_layer_factory.hh @@ -0,0 +1,45 @@ +/*! + * \file upper_tester_layer_factory.hh + * \brief Header file for INT LibIot protocol layer factory. + * \author ETSI TTF T010 + * \copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * \version 0.1 + */ +#pragma once + +#include "layer_stack_builder.hh" + +#include "upper_tester_layer.hh" + +/*! + * \class upper_tester_layer_factory + * \brief This class provides a factory class to create an upper_tester_layer class instance + */ +class upper_tester_layer_factory : public layer_factory { + static upper_tester_layer_factory _f; //! Reference to the unique instance of this class +public: //! \publicsection + /*! + * \brief Default constructor + * Create a new instance of the udp_layer_factory class + * \remark The HTTP layer identifier is HTTP + */ + upper_tester_layer_factory() { + // Register factory + layer_stack_builder::register_layer_factory("UT", this); + }; + /*! + * \fn layer* create_layer(const std::string & type, const std::string & param); + * \brief Create the layers stack based on the provided layers stack description + * \param[in] p_type The provided layers stack description + * \param[in] p_params Optional parameters + * \return 0 on success, -1 otherwise + * \inline + */ + inline virtual layer* create_layer(const std::string& p_type, const std::string& p_param){ + return new upper_tester_layer(p_type, p_param); + }; +}; // End of class upper_tester_layer_factory + diff --git a/config.mk b/config.mk new file mode 100644 index 0000000000000000000000000000000000000000..3c8bdf72574a81f32f781c6df584701d921101f8 --- /dev/null +++ b/config.mk @@ -0,0 +1,6 @@ +TTCN3_COMPILER_OPTIONS := -b -d -e -f -g -l -L -M -O -R -U none +TTCN3_DIR := $(HOME)/frameworks/titan/titan.core/Install +#WPCAP_DLL_PATH := /cygdrive/c/windows/system32/npcap/wpcap.dll +#NPCAP_INCLUDE := /cygdrive/c/PROGRA~1/Npcap/sdk/include +OSIP_INCLUDE=$(HOME)/frameworks/osip/include +OSIP_LIB=$(HOME)/frameworks/osip/src/osipparser2/.libs diff --git a/docs/o2.cfg b/docs/o2.cfg new file mode 100644 index 0000000000000000000000000000000000000000..e2b6f9ad1844d69c5b6d783870dc46630084f4a2 --- /dev/null +++ b/docs/o2.cfg @@ -0,0 +1,1768 @@ +# Doxyfile 1.8.1.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "ETSI TTF T009" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "This project provides the Test System for ETSI NG 112 Conformance testing" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./AtsImsIotDocs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = "license=@par License:\n" + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../ccsrc + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.h *.hh *.hpp \ + *.c *.cc *.cpp \ + *.inl \ + *.s \ + *.md *.dox + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = TES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = YES + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __cplusplus + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = NO + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 50 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/emergency-iop.code-workspace b/emergency-iop.code-workspace new file mode 100644 index 0000000000000000000000000000000000000000..d7e19c19f34c5d778fbef5d6e2eb20733c300ed1 --- /dev/null +++ b/emergency-iop.code-workspace @@ -0,0 +1,85 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../../tmp/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator" + }, + { + "path": "../../tmp/emergency-iop-ttf010" + }, + { + "path": "../../tmp/vxlte-iop" + }, + { + "path": "../../frameworks/titan/titan.core/Install/include" + } + ], + "settings": { + "files.associations": { + "cmath": "cpp", + "vector": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } + } +} \ No newline at end of file diff --git a/etc/AtsImsIot/AtsImsIot.cfg b/etc/AtsImsIot/AtsImsIot.cfg new file mode 100644 index 0000000000000000000000000000000000000000..3318c8ada3051a2d4133c07f236bf9f0688769e0 --- /dev/null +++ b/etc/AtsImsIot/AtsImsIot.cfg @@ -0,0 +1,64 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/AtsImsIot/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. +# I1 interface +## Unsecured +system.diameterPort.params := "DIAMETER/SCTP(debug=1,server=172.25.1.54,port=8200)" + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +# Emergency Network Attachment and Establishment of the Emergency Bearer with USIM. +AtsImsIot_Emergency.TC_VoLTE_ECO_INT_ATT_01 + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000000000000000000000000000000000000..61dd4f2e3f68742556e0c152d987a7f10b7db332 --- /dev/null +++ b/install.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +#set -e +set -vx + +BASE_PATH=`pwd` + +git checkout devel +git submodule update --init --recursive --remote + +if [ ! -f ./titan-test-system-framework ] +then + git clone --recurse-submodules --branch devel https://labs.etsi.org/rep/cti-tools/titan-test-system-framework.git + cd ./titan-test-system-framework +else + cd ./titan-test-system-framework + git checkout devel +fi +cd ./ttcn/LibHttp +ln -sf module_emtel.mk module.mk + +cd $BASE_PATH/ttcn/LibSip +git checkout TTF016 + +cd $BASE_PATH/ttcn/LibMsrp +git checkout TTF006 + +cd $BASE_PATH/ttcn/LibIms +git checkout TTF006 + +cd $BASE_PATH +ln -f ./ttcn/patch_lib_common_titan/module.mk ./ttcn/LibCommon/ +ln -f ./ttcn/patch_lib_ims_titan/module.mk ./ttcn/LibIms/ +ln -f ./ttcn/patch_lib_sip_titan/module.mk ./ttcn/LibSip/ +ln -f ./ttcn/patch_lib_diameter_titan/module.mk ./ttcn/LibDiameter +ln -f ./ttcn/patch_lib_msrp_titan/module.mk ./ttcn/LibMsrp +ln -f ./ttcn/patch_lib_iot_titan/module.mk ./ttcn/LibIot +ln -f ./ttcn/patch_lib_config_and_trigger_titan/module.mk ./ttcn/LibIms_ConfigAndTrigger +ln -f ./ttcn/patch_lib_upper_tester_titan/module.mk ./ttcn/LibUpperTester +ln -f ./ttcn/patch_ats_ims_iot/module.mk ./ttcn/AtsImsIot + +exit 0 diff --git a/plantuml/README.md b/plantuml/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/plantuml/__main__.py b/plantuml/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..a3f73cf262acf39cceeb46e32be848c49d8e5642 --- /dev/null +++ b/plantuml/__main__.py @@ -0,0 +1,180 @@ +# -*- Coding: utf-8 -*- + +from __future__ import division # Import floating-point division (1/4=0.25) instead of Euclidian division (1/4=0) + +import os +import glob +import sys +import logging + +from regex_list import * + +MSG_PATH = "" +IN_FILE_PATH = "" +OUT_FILE_PATH = "" +out_streams = object() +logger = object() +parser = object() +data_ctx = dict() + +def process_command_line_args(): + global IN_FILE_PATH + + print(f"Arguments count: {len(sys.argv)}") + for i, arg in enumerate(sys.argv): + print(f"Argument {i:>6}: {arg}") + IN_FILE_PATH = sys.argv[1] + # End of function process_command_line_args + +def process_line(line): + global MSG_PATH, out_streams, logger, parser, data_ctx + + match = parser.parse_line(line) + if match != None: + logger.info(f"Matching: {match}") + if 'testcase' in match: + logger.info('Got testcase') + out_streams.write('@startuml\n') + out_streams.write(f"title {match['testcase']}\n") + out_streams.write("/'Editor: https://plantuml-editor.kkeisuke.com/ '/\n") + out_streams.write("/'Syntax: http://plantuml.com/fr/sequence-diagram '/\n") + out_streams.write('!include etsi-style.iuml\n') + out_streams.write('!pragma teoz true\n') + out_streams.write('autonumber\n') + out_streams.write('participant system\n') + out_streams.write('box "TTCN-3 Environment" #LightBlue\n') + elif 'operation' in match: + logger.info('Got operation') + if match['operation'] == 'mapped': + out_streams.write(f"participant \"{match['comp']}:{match['protocol_port']}\"\n") + data_ctx['protocol_port'].append(f"{match['comp']}:{match['protocol_port']}") + else: + if match['protocol_port'] != 'syncPort': + out_streams.write(f"\"{match['comp']}:{match['protocol_port']}\" --> system: unmap\n") + elif 'request' in match: + logger.info('Got request') + if data_ctx['box_ended'] == False: + out_streams.write('endbox\n') + data_ctx['box_ended'] = True + for p in data_ctx['protocol_port']: + out_streams.write(f"\"{p}\" --> system: map\n") + out_streams.write(f"\"{match['comp']}:{match['port']}\" -[#green]> system: @{match['module']}.{match['message']}\n") + s = match['request'].replace(",", ",\\n").replace("\"", "").strip() + if len(s) > 128: + n = match['hours'] + "_" + match['minutes'] + "_" + match['seconds'] + "_" + match['milliseconds'] + ".txt" + n = os.path.join(MSG_PATH, n) + with open(n, "w") as msg: + msg.write(s) + s = f'[[file://{n} request := ...]]' #{Click to read the message} + out_streams.write(f"note right: {s}\n") + out_streams.write(f"note left: {match['hours']}:{match['minutes']}:{match['seconds']}.{match['milliseconds']}\n") + elif 'response' in match: + logger.info('Got response') + if data_ctx['box_ended'] == False: + out_streams.write('endbox\n') + data_ctx['box_ended'] = True + out_streams.write(f"system -[#green]> \"{match['comp']}:{match['port']}\": @{match['module']}.{match['message']}\n") + s = match['response'].replace(",", ",\\n").replace("\"", "").strip() + if len(s) > 128: + n = match['hours'] + "_" + match['minutes'] + "_" + match['seconds'] + "_" + match['milliseconds'] + ".txt" + n = os.path.join(MSG_PATH, n) + with open(n, "w") as msg: + msg.write(s) + s = f'[[file://{n} response := ...]]' #{Click to read the message} + out_streams.write(f"note right: {s}\n") + out_streams.write(f"note left: {match['hours']}:{match['minutes']}:{match['seconds']}.{match['milliseconds']}\n") + elif 'timer_name' in match: + logger.info('Got timer') + if match['timer_name'] == 'tc_sync': + pass + else: + for p in data_ctx['protocol_port']: + if p.startswith(match['comp']): + out_streams.write(f"\"{p}\" -> \"{p}\": {match['start_stop']}, duration: {match['duration']}\n") + break + out_streams.write(f"note left: {match['hours']}:{match['minutes']}:{match['seconds']}.{match['milliseconds']}\n") + elif 'verdict' in match: + logger.info('Got verdict') + if 'ptcid' in match and match['ptcid'] != None: + s = match['ptcid'].split('(') + s = s[1].split(')') + for p in data_ctx['protocol_port']: + if p.startswith(s[0]): + if match['verdict'] == 'fail': + out_streams.write(f"hnote over \"{p}\" #red: fail\n") + elif match['verdict'] == 'pass': + out_streams.write(f"hnote over \"{p}\" #green: pass\n") + elif match['verdict'] == 'inconc': + out_streams.write(f"hnote across #yellow: inconc\n") + else: + out_streams.write(f"hnote over \"{p}\" #gray: error\n") + out_streams.write(f"note left: {match['hours']}:{match['minutes']}:{match['seconds']}.{match['milliseconds']}\n") + break + elif 'final_verdict' in match: + logger.info('Got verdict') + if match['final_verdict'] == 'fail': + out_streams.write(f"hnote across #red: fail\n") + elif match['final_verdict'] == 'pass': + out_streams.write(f"hnote across #green: pass\n") + elif match['final_verdict'] == 'inconc': + out_streams.write(f"hnote across #yellow: inconc\n") + else: + out_streams.write(f"hnote across #gray: error\n") + out_streams.write(f"note left: {match['hours']}:{match['minutes']}:{match['seconds']}.{match['milliseconds']}\n") + out_streams.write('@enduml\n') + else: + logger.info('Got unsupported item') + # End of 'if' statement + out_streams.flush() + # End of function process_line + +def main(): + global MSG_PATH, OUT_FILE_PATH, out_streams, logger, parser, data_ctx + + process_command_line_args() + + # Initialize the logger + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + l = logging.StreamHandler() + l.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + logger.addHandler(l) + + # Prepare outputs + OUT_FILE_PATH = sys.argv[2] + CURRENT_PATH = os.getcwd() + MSG_PATH = os.path.join(CURRENT_PATH, "msgs") + logger.info(f'CURRENT_PATH:{CURRENT_PATH} - MSG_PATH{MSG_PATH}') + if os.path.exists(MSG_PATH): + files = glob.glob(os.path.join(MSG_PATH, '*')) + for f in files: + os.remove(f) + else: + os.mkdir(MSG_PATH) + + # Setup the regex + parser = regex_list(logger) + parser.reset_state() + + data_ctx = dict() + data_ctx['protocol_port'] = [] + data_ctx['box_ended'] = False + + print(f"IN_FILE_PATH= {IN_FILE_PATH}") + with open(IN_FILE_PATH, "r") as in_stream: + with open(OUT_FILE_PATH, "w") as out_streams: + line = in_stream.readline() + while line != '': + process_line(line) + line = in_stream.readline() + # End of 'for' statement + # End of 'with' statement + # End of 'with' statement + + os.system('java -DPLANTUML_LIMIT_SIZE=8192 -jar ./plantuml.jar -svg {}'.format(OUT_FILE_PATH)) +# End of main function + +if __name__ == "__main__": + main() + +# End of file diff --git a/plantuml/etsi-style.iuml b/plantuml/etsi-style.iuml new file mode 100644 index 0000000000000000000000000000000000000000..e26d257713d678a0011da52cb4400a16a1264b16 --- /dev/null +++ b/plantuml/etsi-style.iuml @@ -0,0 +1,46 @@ +hide footbox +autonumber +skinparam { + dpi 300 + shadowing false + 'handwritten true + defaultFontSize 8 +} + +skinparam note { + FontSize 8 + FontStyle bold + FontColor White + borderColor Black + backgroundColor DimGray +} + +skinparam participant { + FontSize 8 + FontStyle bold + FontColor White + borderColor Navy + backgroundColor RoyalBlue +} + +skinparam actor { + FontSize 8 + FontStyle bold + FontColor Navy + borderColor Navy + backgroundColor RoyalBlue +} + +skinparam sequence { + ArrowFontColor Black + ArrowColor SlateGray + LifeLineBorderColor Navy + LifeLineBackgroundColor DimGray +} + +skinparam ParticipantPadding 5 +skinparam BoxPadding 5 + +!define sendrcvRTP(a,b,c) a <-[#LimeGreen]> b : c +!define sendRTP(a,b,c) a -[#LimeGreen]> b : c +!define setParticipant(a,b) participant a as b diff --git a/plantuml/plantuml.jar b/plantuml/plantuml.jar new file mode 100644 index 0000000000000000000000000000000000000000..506b8c4b818bcb6f8ac254e898da44470cbad888 Binary files /dev/null and b/plantuml/plantuml.jar differ diff --git a/plantuml/regex_list.py b/plantuml/regex_list.py new file mode 100644 index 0000000000000000000000000000000000000000..ecd5fbc6b91347cad5cc1eb0430da2756da2e6f2 --- /dev/null +++ b/plantuml/regex_list.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +from __future__ import division # Import floating-point division (1/4=0.25) instead of Euclidian division (1/4=0) + +import logging +import re +import os +class regex_list(object): + """ + For testing purposes: https://regex101.com/ + """ + def __init__(self, p_logger): + self.__logger = p_logger + self.__state = 'none' + self.__flags = re.DOTALL | re.VERBOSE + self.__regexps = dict() + self.__regexps['exec_test'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sTESTCASE\s.*\sTest\scase\s(?P\w+)\sstarted\.$', self.__flags) + self.__regexps['map_port'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sPORTEVENT\s.*\sPort\s(?P\w+)\swas\s(?P\w+)\sto\s(?P\w+):(?P\w+)\.$', self.__flags) + self.__regexps['unmap_port'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sPORTEVENT\s.*\sPort\s(?P\w+)\swas\s(?P\w+)\sfrom\s(?P\w+):(?P\w+)\.$', self.__flags) + self.__regexps['messages'] = self.__regexps['unmap_port'] + self.__regexps['message_out'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sPORTEVENT\s.*\sSent\son\s(?P\w+)\sto\ssystem(\(.*\)){0,1}\s@(?P\w+).(?P\w+)\s:\s\{(?P.+)\}$', self.__flags) + self.__regexps['message_in'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sPORTEVENT\s.*\sMessage\senqueued\son\s(?P\w+)\sfrom\ssystem\s@(?P\w+).(?P\w+)\s:\s\{(?P.+)\}\sid\s\w+$', self.__flags) + self.__regexps['timer'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sTIMEROP\s.*\s(?P\w+)\stimer\s(?P\w+):\s(?P\w+).*$', self.__flags) + self.__regexps['final_verdict'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sTESTCASE\s.*\sTest\scase\s(.+)\sfinished\.\sVerdict:\s(?P\w+)$', self.__flags) + self.__regexps['verdict'] = re.compile(r'^(?P\d+):(?P\d+):(?P\d+).(?P\d+)(\s((?Pmtc|\d+))){0,1}\sVERDICTOP\s.*\sLocal\sverdict\sof\s(MTC|PTC)(\s(?P.+)){0,1}:\s(?P\w+).*$', self.__flags) + # End of __init__ class + + def reset_state(self): + self.__state = 'exec_test' + self.__logger.info('Reset state: ' + self.__state) + # End of reset_state + + def parse_line(self, p_line): + self.__logger.debug('>>> regex_list::parse_line: ' + self.__get_state()) + self.__logger.debug('regex_list::parse_line: ' + p_line) + + if self.__get_state() == 'exec_test': + m = self.__regexps[self.__state].match(p_line) + if m: + self.__set_next_state() + return m.groupdict() + elif self.__get_state() == 'map_port': + m = self.__regexps[self.__state].match(p_line) + if m: + return m.groupdict() + else: # In map_port, check for TTCN-3 message sent ('message_out') and received ('message_in') + m = self.__regexps['message_out'].match(p_line) + if m: + self.__set_next_state() + return m.groupdict() + else: + m = self.__regexps['message_in'].match(p_line) + if m: + self.__set_next_state() + return m.groupdict() + else: + m = self.__regexps['timer'].match(p_line) + if m: + return m.groupdict() + elif self.__get_state() == 'messages': + m = self.__regexps[self.__state].match(p_line) + if m: + self.__set_next_state() + return m.groupdict() + else: # Check for TTCN-3 message sent ('message_out') and received ('message_in') + m = self.__regexps['message_out'].match(p_line) + if m: + return m.groupdict() + else: + m = self.__regexps['message_in'].match(p_line) + if m: + return m.groupdict() + else: + m = self.__regexps['timer'].match(p_line) + if m: + return m.groupdict() + elif self.__get_state() == 'unmap_port': + m = self.__regexps[self.__state].match(p_line) + if m: + return m.groupdict() + else: # In unmap_port, check for final_verdict + m = self.__regexps['verdict'].match(p_line) + if m: + self.__set_next_state() + return m.groupdict() + elif self.__get_state() == 'verdict' or self.__get_state() == 'final_verdict': + m = self.__regexps['verdict'].match(p_line) + if m: + return m.groupdict() + else: + m = self.__regexps['final_verdict'].match(p_line) + if m: + self.__set_next_state() + return m.groupdict() + return None + # End of method parse_line + + def __set_next_state(self): + if self.__state == 'exec_test': + self.__logger.info('regex_list::parse_line: Set state to map_port') + self.__state = 'map_port' + elif self.__state == 'map_port': + self.__logger.info('regex_list::parse_line: Set state to messages') + self.__state = 'messages' + elif self.__state == 'messages': + self.__logger.info('regex_list::parse_line: Set state to unmap_port') + self.__state = 'unmap_port' + elif self.__state == 'unmap_port': + self.__logger.info('regex_list::parse_line: Set state to verdict') + self.__state = 'verdict' + elif self.__state == 'verdict': + self.__logger.info('regex_list::parse_line: Set state to final_verdict') + self.__state = 'final_verdict' + elif self.__state == 'final_verdict': + self.__logger.info('regex_list::parse_line: Terminated') + self.reset_state() + # End of method __set_next_state + + def __get_state(self): + return self.__state + # End of method __get_state + +# End of class regex_list + +# End of file diff --git a/scripts/build_titan.bash b/scripts/build_titan.bash new file mode 100755 index 0000000000000000000000000000000000000000..9d39632ab48255e2ed3ec1e21f67235a07bf108c --- /dev/null +++ b/scripts/build_titan.bash @@ -0,0 +1,106 @@ +#!/bin/bash +# Copyright ETSI 2018 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +set -e +#set -vx + +clear + +if [ -z "${TOP}" ] +then + echo "Failed, TOP variable not defined, exit" + exit 1 +fi + +CURDIR=`pwd` +TITAN_DIR=${TOP}/.. + +# Move to the right directory +if [ ! -d ${TITAN_DIR} ] +then + echo "Titan directory does not exist, create it" + # Create TITAN directories + mkdir -p ${TITAN_DIR} + if [ ! "$?" -eq "0" ] + then + echo "Failed, TOP variable not defined, exit" + exit 2 + fi + cd ${TITAN_DIR} + # Clone all TITAN repositories + if [ ! -f ${CURDIR}/titan_repos.txt ] + then + echo "${HOME_BIN}/titan_repos.txt file does not exist, exit" + rm -fr ${TOP} + rm -fr ${TOP}/.. + exit 3 + fi + TITAN_REPOS=`cat ${CURDIR}/titan_repos.txt` + for i in ${TITAN_REPOS}; + do + git clone $i + if [ ! "$?" -eq "0" ] + then + echo "Failed to clone $i, exit" + exit 4 + fi + done +else + cd ${TITAN_DIR} + # Update github folders + DIRS=`find . -type d -name ".git" -exec dirname {} \;` + for i in ${DIRS}; + do + echo "Processing $i..." + cd $i + git fetch + if [ ! "$?" -eq "0" ] + then + echo "Failed to fetch $i, continue" + else + git pull + if [ ! "$?" -eq "0" ] + then + echo "Failed to pull $i, continue" + fi + fi + cd - + done +fi + +# Build TITAN core +export JNI=no +export GUI=no +export DEBUG=no +export GEN_PDF=no +if [ -d ${TTCN3_DIR} ] +then + rm -fr ${TTCN3_DIR} +fi +mkdir ${TTCN3_DIR} +cd ./titan.core +/bin/cat < Makefile.personal +JNI:=no +GUI:=no +DEBUG:=no +GEN_PDF:=no +EOF + +# To prevent link error /usr/bin/ld: /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command lineema +sed --in-place 's/LINUX_LIBS := -lxml2/LINUX_LIBS := -lxml2 -lpthread/g' ./core/Makefile + +echo "Starting build..." +make clean +if [ "${OSTYPE}" == "cygwin" ] +then + make -j +else + make +fi +make install +echo "Build done" + +# Go back to initial directory +cd ${CURDIR} +exit 0 diff --git a/scripts/devenv.bash.ubuntu b/scripts/devenv.bash.ubuntu new file mode 100755 index 0000000000000000000000000000000000000000..af00444e6af93e604b0c1188921e1e90d5c64cba --- /dev/null +++ b/scripts/devenv.bash.ubuntu @@ -0,0 +1,73 @@ +#!/bin/bash + +# Turn on debug mode +#set -vx + +set -e + +# Colors and Prompt +#export PS1="\w\$ " +#export PS1="\D{%Y-%m-%d %H:%M:%S} \w\n\$ " + +export TERM=xterm +export EDITOR=emacs +set -o emacs + +# Home working directories +export HOME_FRAMEWORKS=${HOME}/frameworks +export HOME_LIB=${HOME}/lib +export HOME_BIN=${HOME}/bin +export HOME_ETC=${HOME}/etc +export HOME_TMP=${HOME}/tmp +export HOME_DOCS=${HOME}/docs + +# Home common include directory +export HOME_INC=${HOME}/include + +# Update PATH environment variable +export PATH=${HOME_BIN}:${PATH} + +# Update LD_LIBRARY_PATH environment variable +if [ "${LD_LIBRARY_PATH}" == "" ] +then + export LD_LIBRARY_PATH=${HOME_LIB}:/usr/local/lib +else + export LD_LIBRARY_PATH=${HOME_LIB}:/usr/local/lib:${LD_LIBRARY_PATH} +fi + + +# Add JAVA support +export JAVA_VERSION=1.8.0_92 +export JAVA_JDK=jdk${JAVA_VERSION} +if [ -d "${HOME_FRAMEWORKS}/${JAVA_JDK}" ] +then + export JAVA_HOME=${HOME_FRAMEWORKS}/${JAVA_JDK}/bin +else + unset JAVA_VERSION + unset JAVA_JDK +fi + +# Add TITAN support +export TOP=${HOME_FRAMEWORKS}/titan/titan.core +export TTCN3_DIR=${TOP}/Install +if [ -d ${TTCN3_DIR} ] +then + export TTCN3_BROWSER=mozilla + export PATH=${TTCN3_DIR}/bin:${PATH} + export LD_LIBRARY_PATH=${TTCN3_DIR}/lib:${LD_LIBRARY_PATH} + export MANPATH=${TTCN3_DIR}/man:${MANPATH} + export TTCN3_LICENSE_FILE=${TTCN3_DIR}/etc/license/license.dat + export PATH_DEV_TTCN=${HOME}/dev/ttcn3 + # ITS support + export PATH_DEV_ITS=${HOME}/dev/TS.ITS + # Emergency Communication support + export PATH_DEV_EMCOM=${HOME}/dev/AtsImsIot + # Mobile-Edge Computing support + export PATH_DEV_MEC=${HOME}/dev/gs032p3-ttcn-test-suite + # CDM/CISE support + export PATH_DEV_MEC=${HOME}/dev/cise + # Validation folder + export VALIDATION_DIR=${HOME} +fi + +export BROWSER=netsurf diff --git a/scripts/f.bash b/scripts/f.bash new file mode 100755 index 0000000000000000000000000000000000000000..9e2bb399203a9b59c6085597f70effb5d49e2be6 --- /dev/null +++ b/scripts/f.bash @@ -0,0 +1,19 @@ +#!/bin/bash +#set -vx + +if [ "$1" == "" ] +then + echo "Search In Files usage: f.bash " + echo " : With default = ttcn" + echo " e.g.: f.bash module ttcn" + exit 0 +fi + +EXT=ttcn +if [ "$2" != "" ] +then + EXT=$2 +fi +find .. -type f -name "*.$EXT" -exec grep -nH $1 {} \; + +exit $? diff --git a/scripts/generate_png.sh b/scripts/generate_png.sh new file mode 100755 index 0000000000000000000000000000000000000000..7c73718dc96a14fca9f3e76cba9e917204909942 --- /dev/null +++ b/scripts/generate_png.sh @@ -0,0 +1,17 @@ +#!/bin/bash +#set -e +set -vx + +clear + +if [ -z $ATS ] +then + echo "ATS shall be defined" + exit 1 +fi + +cd ../plantuml/ +python3 . ../logs/${ATS}/merged.log ./${ATS}.txt +cd - + +exit 0 diff --git a/scripts/run_all.bash b/scripts/run_all.bash new file mode 100755 index 0000000000000000000000000000000000000000..f5fe4490ed33e548810b911615a0299df7d2a264 --- /dev/null +++ b/scripts/run_all.bash @@ -0,0 +1,60 @@ +#!/bin/bash +#set -e +#set -vx + +clear + +if [ -z $ATS ] +then + echo "ATS shall be defined" + exit 1 +fi + +if ! [[ $1 =~ "^[0-9]+$" ]] +then + COUNTER=$1 +else + COUNTER=1 +fi + +if [ $COUNTER == 0 ] +then + COUNTER=1 + cd .. && make && cd - +fi + +CURPWD=`pwd` +if [ ! "${PWD##*/}" == "scripts" ] +then + cd ../scripts + if [ ! $? == 0 ] + then + echo "Please move to PROJECT/scripts directory" + exit 1 + fi +fi + +rm ../logs/$ATS/*.log + +for i in $(seq 1 1 $COUNTER) +do + ./run_mtc.bash & + ./run_ptcs.bash + + dup=$(ps -ef | grep "$0" | grep -v grep | wc -l) + while [ ${dup} -eq 3 ] + do + sleep 1 + dup=$(ps -ef | grep "$0" | grep -v grep | wc -l) + done + sleep 1 + + if [ -f ../logs/$ATS/merged_formated.log ] + then + mv ../logs/$ATS/merged_formated.log ../logs/$ATS/merged.`date +'%Y%m%d%S'`.log + fi +done + +exit 0 + + diff --git a/scripts/run_mtc.bash b/scripts/run_mtc.bash new file mode 100755 index 0000000000000000000000000000000000000000..1fc0784d8c23b5d80a5d8fc5a7277732df00f470 --- /dev/null +++ b/scripts/run_mtc.bash @@ -0,0 +1,48 @@ +#!/bin/bash +#set -e +#set -vx + +clear + +if [ -z $ATS ] +then + echo "ATS shall be defined" + exit 1 +fi + +CURPWD=`pwd` +if [ ! "${PWD##*/}" == "scripts" ] +then + cd ../scripts + if [ ! $? == 0 ] + then + echo "Please move to PROJECT/scripts directory" + exit 1 + fi +fi + +TITAN_LOG_DIR=../logs/$ATS +if [ ! -d ${TITAN_LOG_DIR} ] +then + mkdir ${TITAN_LOG_DIR} +else + rm -f ${TITAN_LOG_DIR}/*.log +fi + +CFG_FILES=`find ../etc/$ATS -name '*.cfg'` + +echo "> cmtc: to create the MTC server" +echo "> smtc [module_name[[.control]|.testcase_name|.*]: when MyExample is connected, run the TCs in [EXECUTE] section" +echo "> emtc: Terminate MTC." +mctr ${CFG_FILES} + +sudo chown -R `whoami` ${TITAN_LOG_DIR} +LOG_FILES=`find ${TITAN_LOG_DIR} -name '*.log'` +if [ "${TITAN_LOG_DIR}" != "" ] +then + ttcn3_logmerge -o ${TITAN_LOG_DIR}/merged.log ${LOG_FILES} + ttcn3_logformat -o ${TITAN_LOG_DIR}/merged_formated.log ${TITAN_LOG_DIR}/merged.log + echo "log files were merged into ${TITAN_LOG_DIR}/merged_formated.log" +fi + +cd ${CURPWD} diff --git a/scripts/run_ptcs.bash b/scripts/run_ptcs.bash new file mode 100755 index 0000000000000000000000000000000000000000..87cf8bcc643c7af573e512971b7227753dc1c94d --- /dev/null +++ b/scripts/run_ptcs.bash @@ -0,0 +1,31 @@ +#!/bin/bash +#set -e +#set -vx + +clear + +if [ -z $ATS ] +then + echo "ATS shall be defined" + exit 1 +fi + +CURPWD=`pwd` +if [ ! "${PWD##*/}" == "scripts" ] +then + cd ../scripts + if [ ! $? == 0 ] + then + echo "Please move to PROJECT/scripts directory" + exit 1 + fi +fi + +if [ -f ./core ] +then + rm -f ./core +fi + +sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH ../bin/$ATS 127.0.0.1 12000 + +cd ${CURPWD} diff --git a/scripts/titan_repos.txt b/scripts/titan_repos.txt new file mode 100644 index 0000000000000000000000000000000000000000..8842f4e0283928a94ebbbd37aff6b25fe27c2279 --- /dev/null +++ b/scripts/titan_repos.txt @@ -0,0 +1,56 @@ +https://gitlab.eclipse.org/eclipse/titan/titan.core.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.Common_Components.Abstract_Socket.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.HTTPmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.LANL2asp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.PCAPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.PIPEasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SCTPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SIPmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SQLasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.TCPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.TELNETasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.UDPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.COMMON.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DHCP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DHCPv6.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DNS.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ICMP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ICMPv6.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.RTP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.RTSP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SMPP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SMTP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SNMP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.TCP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.UDP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.XMPP.git +https://gitlab.eclipse.org/eclipse/titan/titan.misc.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.LDAPasp_RFC4511.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.LDAPmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.Common_Components.Socket-API.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SSHCLIENTasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.STDINOUTmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SUNRPCasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.UNIX_DOMAIN_SOCKETasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.IPL4asp.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.FrameRelay.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.H248_v2.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IMAP_4rev1.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ICAP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IKEv2.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IPsec.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IUA.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.JSON_v07_2006.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.L2TP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.M3UA.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.MIME.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.MSRP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.PPP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ProtoBuff.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.RADIUS_ProtocolModule_Generator.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SRTP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.WebSocket.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.HTTP2.0.git +https://gitlab.eclipse.org/eclipse/titan/titan.Libraries.TCCUsefulFunctions.git diff --git a/scripts/update_user_name.sh b/scripts/update_user_name.sh new file mode 100755 index 0000000000000000000000000000000000000000..b5c5d7f3aa7a64d722acac43be8be11ebc2a15df --- /dev/null +++ b/scripts/update_user_name.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Debug mode +#set -e +#set -vx + +# Usage: sudo ./update_user_name.bash +# TODO Use git clone in temporary directory + +USER_NAME='s/etsi/vagrant/g' +for i in `find /home/vagrant/dev/$1 -name "*.cf*"` +do + sed --in-place ${USER_NAME} $i +done + +exit 0 diff --git a/test_purposes/Cx/TP_CX.tplan2 b/test_purposes/Cx/TP_CX.tplan2 index 20bdf54405bf8d78626f0f5a995c16331d389cbb..f8693a50ea4fd1093b9b6462babace4f7af64bef 100644 --- a/test_purposes/Cx/TP_CX.tplan2 +++ b/test_purposes/Cx/TP_CX.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ @@ -23,13 +25,13 @@ Package TP_CX { Test Purpose { TP Id TP_CX_HSS_ECO_UAA_01 //TP_CX_HSS_UAA_01 from TS 103 653-1 V2.1.1 without emergency registration - Test objective "IUT successfully processes all mandatory AVPs in a UA-Request received due to first UE emergency registration and sends UA-Answer." + Test objective "Verify that the IUT successfully processes all mandatory AVPs in a UA-Request received due to first UE emergency registration and sends UA-Answer." Reference "TS 129 228 [4], clause 6.1.1 and tables 6.1.1.1 and 6.1.1.2", "TS 129 229 [5], clauses 6.1.1 and 6.1.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -76,12 +78,12 @@ Package TP_CX { Test Purpose { TP Id TP_CX_HSS_ECO_UAA_02 //TP_CX_HSS_UAA_02 from TS 103 653-1 V2.1.1 without emergency registration - Test objective "IUT successfully processes all mandatory AVPs in a UA-Request received due to protected UE emergency registration and sends UA-Answer." + Test objective "Verify that the IUT successfully processes all mandatory AVPs in a UA-Request received due to protected UE emergency registration and sends UA-Answer." Reference "TS 129 228 [4], clause 6.1.1.1" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -114,13 +116,13 @@ Package TP_CX { Test Purpose { TP Id TP_CX_HSS_ECO_SAA_01 - Test objective "IUT successfully processes all mandatory AVPs in a SA-Request received due to S-CSCF registration notification procedure when credentials not matches and sends SA-Answer." + Test objective "Verify that the IUT successfully processes all mandatory AVPs in a SA-Request received due to S-CSCF registration notification procedure when credentials not matches and sends SA-Answer." Reference "TS 129 228 [4], clause 6.1.2", "TS 129 229 [5], clauses 6.1.3 and 6.1.4" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE diff --git a/test_purposes/Diameter_Common.tplan2 b/test_purposes/Diameter_Common.tplan2 index a87b9f2f14fa883e521be384e9c2e7cdabd80eb1..d9e7cbcc58698f4dcfa647d6ee6d60aa23af4f3a 100644 --- a/test_purposes/Diameter_Common.tplan2 +++ b/test_purposes/Diameter_Common.tplan2 @@ -1,20 +1,18 @@ -/* ETSI Software License -* As long as the here under conditions are respected, non-exclusive permission is hereby granted, -* free of charge, to use, reproduce and modify this software source code, under the following conditions: -* This source code is provided AS IS with no warranties, express or implied, including but not limited to, -* the warranties of merchant ability, fitness for a particular purpose and warranties for non-infringement -* of intellectual property rights. -* ETSI shall not be held liable in any event for any direct or indirect damages whatsoever (including, without -* limitation, damages for loss of profits, business interruption, loss of information, or any other pecuniary -* loss) arising out of or related to the use of or inability to use the source code. -* This permission is granted to facilitate the implementation of the related ETSI standard, provided that -* ETSI is given the right to use, reproduce and amend the modified source code under the same conditions -* as the present permission. -* This permission does not apply to any documentation associated with this source code for which ETSI keeps -* all rights reserved. -* The present ETSI Source Code license shall be included in all copies of whole or part of this source code -* and shall not imply any sub-license right. -* (c) ETSI 2019-2020 +/* +Copyright (c) ETSI 2023. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +* +* @author TTF T010 */ diff --git a/test_purposes/E_CSCF/TP_E_CSCF.tplan2 b/test_purposes/E_CSCF/TP_E_CSCF.tplan2 index 4812f2161d6e9091bcf6d8c0824426a6ac95c400..1e650ba28f297e7058bae707c6d2b559e31b5fe9 100644 --- a/test_purposes/E_CSCF/TP_E_CSCF.tplan2 +++ b/test_purposes/E_CSCF/TP_E_CSCF.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ /* E-CSCF interfaces to @@ -29,13 +31,12 @@ Package TP_E_CSCF { TP Id TP_I4_ECSCF_ECO_INVITE_01 /* I4 interface at E-CSCF/EATF */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the EATF." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the EATF." Reference - "ETSI TS 124 229 [1], Clauses 5.11.2 1)" + "ETSI TS 124 229 [1], Clause 5.11.2 1" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -83,13 +84,12 @@ Package TP_E_CSCF { TP Id TP_ML_ECSCF_ECO_INVITE_01 /* MI interface at E-CSCF/LRF */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the LRF." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the LRF." Reference - "ETSI TS 124 229 [1], Clauses 5.11.3" + "ETSI TS 124 229 [1], Clause 5.11.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -133,13 +133,12 @@ Package TP_E_CSCF { TP Id TP_MM_ECSCF_ECO_INVITE_01 /* Mm interface at E-CSCF/IM CN subsystem of own network */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the PSAP in the IM CN subsystem of own network." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the PSAP in the IM CN subsystem of own network." Reference - "ETSI TS 124 229 [1], Clauses 5.11.2" + "ETSI TS 124 229 [1], Clause 5.11.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -169,6 +168,7 @@ Package TP_E_CSCF { Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, RecordRoute PX_E_CSCF_SERVICE_ROUTE, PChargingVector, + not PChargingFunctionAddresses, MessageBody; to the IM_CN entity } @@ -181,14 +181,12 @@ Package TP_E_CSCF { TP Id TP_MM_ECSCF_ECO_INVITE_02 /* Mm interface at E-CSCF/IM CN subsystem of own network */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the PSAP in the IM CN subsystem of own network - and includes the LRF provided URI in the Route header." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the PSAP in the IM CN subsystem of own network and includes the LRF provided URI in the Route header." Reference "ETSI TS 124 229 [1], Clauses 5.11.2 and 5.11.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -213,6 +211,7 @@ Package TP_E_CSCF { Via indicating value PX_E_CSCF_VIA, Route indicating value LRF_provided_SIP_URI, RecordRoute PX_E_CSCF_SERVICE_ROUTE, + not PChargingFunctionAddresses, PChargingVector, MessageBody; to the IM_CN entity @@ -221,18 +220,65 @@ Package TP_E_CSCF { } // End of TP_MM_ECSCF_ECO_INVITE_02 + Test Purpose { + + TP Id TP_MM_ECSCF_ECO_INVITE_03 + /* Mm interface at E-CSCF/IM CN subsystem of own network */ + + Test objective "Verify that the E-CSCF successfully processes an callback INVITE from PSAP over the IM CN subsystem of own network and routes the request to the P-CSCF." + + Reference + "ETSI TS 123 167 [1], Clause 4.1 item 12" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IM_CN + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives an INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_P_CSCF_A_VIA, + Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + PAssertedIdentity, + MessageBody; + from the IM_CN entity + } + then { + the IMS_E_CSCF entity sends an INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_E_CSCF_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + RecordRoute PX_E_CSCF_SERVICE_ROUTE, + PChargingVector, + not PChargingFunctionAddresses, + MessageBody; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MM_ECSCF_ECO_INVITE_03 + Test Purpose { TP Id TP_MX_ECSCF_ECO_INVITE_01 /* Mx interface at E-CSCF/IBCF */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the IBCF for a PSAP in another network." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the IBCF for a PSAP in another network." Reference - "ETSI TS 124 229 [1], Clauses 5.11.2" + "ETSI TS 124 229 [1], Clause 5.11.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -278,14 +324,12 @@ Package TP_E_CSCF { TP Id TP_MX_ECSCF_ECO_INVITE_02 /* Mx interface at E-CSCF/IBCF */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the IBCF for a PSAP in another network - and includes the LRF provided URI in the Route header." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the IBCF for a PSAP in another network and includes the LRF provided URI in the Route header." Reference - "ETSI TS 124 229 [1], Clauses 5.11.2" + "ETSI TS 124 229 [1], Clause 5.11.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -322,18 +366,67 @@ Package TP_E_CSCF { } // End of TP_MX_ECSCF_ECO_INVITE_02 + Test Purpose { + + TP Id TP_MX_ECSCF_ECO_INVITE_03 + /* Mx interface at E-CSCF/IBCF */ + + Test objective "Verify that the E-CSCF successfully processes a callback INVITE from the PSAP in another network over the IBCF and routes the request to the P-CSCF." + + Reference + "ETSI TS 123 167 [1], Clause 4.1 item 12" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives an INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_P_CSCF_A_VIA, + Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + PAssertedIdentity, + MessageBody; + from the IMS_IBCF_A entity + } + then { + the IMS_E_CSCF entity sends an INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_E_CSCF_VIA, + Route indicating value PX_P_SCSF_SERVICE_ROUTE_IBCF, + RecordRoute PX_E_CSCF_SERVICE_ROUTE, + PChargingVector containing + not term_ioi_parameter, + orig_ioi_parameter + indicating value "Operator Identifier Of ImsA";, + MessageBody; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MX_ECSCF_ECO_INVITE_03 + Test Purpose { TP Id TP_MI_ECSCF_ECO_INVITE_01 /* Mx interface at E-CSCF/BGCF */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the BGCF for a PSAP in the PSTN." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the BGCF for a PSAP in the PSTN." Reference - "ETSI TS 124 229 [1], Clauses 5.11.2" + "ETSI TS 124 229 [1], Clause 5.11.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -368,7 +461,7 @@ Package TP_E_CSCF { orig_ioi_parameter indicating value "Operator Identifier Of ImsA";, MessageBody; - to the IMS_IBCF_A entity + to the IMS_BGCF_A entity } } @@ -379,14 +472,12 @@ Package TP_E_CSCF { TP Id TP_MI_ECSCF_ECO_INVITE_02 /* Mx interface at E-CSCF/BGCF */ - Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF - and routes the request to the BGCF for a PSAP in the PSTN - and includes the LRF provided URI in the Request-URI." + Test objective "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the BGCF for a PSAP in the PSTN and includes the LRF provided URI in the Request-URI." Reference - "ETSI TS 124 229 [1], Clauses 5.11.2" + "ETSI TS 124 229 [1], Clause 5.11.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -417,11 +508,698 @@ Package TP_E_CSCF { orig_ioi_parameter indicating value "Operator Identifier Of ImsA";, MessageBody; - to the IMS_IBCF_A entity + to the IMS_BGCF_A entity } } } // End of TP_MI_ECSCF_ECO_INVITE_02 + Test Purpose { + + TP Id TP_MI_ECSCF_ECO_INVITE_03 + /* Mx interface at E-CSCF/BGCF */ + + Test objective "Verify that the E-CSCF successfully processes a callback INVITE from PSAP in the PSTN over BGCF and routes the request to the P-CSCF." + + Reference + "ETSI TS 123 167 [1], Clause 4.1 item 12" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the BGCF + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives an INVITE containing + From indicating value PX_PSAP_TEL_URI,// see 5.11.2 6) b) + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_BGCF_VIA, + Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + PAssertedIdentity, + MessageBody; + from the IMS_BGCF_A entity + } + then { + the IMS_E_CSCF entity sends an INVITE containing + RequestLine indicating value PX_UE_A_SIP_URI, + From indicating value PX_PSAP_TEL_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_E_CSCF_VIA, + Route indicating value PX_P_CSCD_SERVICE_ROUTE, + RecordRoute PX_E_CSCF_SERVICE_ROUTE, + PChargingVector containing + not term_ioi_parameter, + orig_ioi_parameter + indicating value "Operator Identifier Of ImsA";, + MessageBody; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MI_ECSCF_ECO_INVITE_03 + + Test Purpose { + + TP Id TP_MM_ECSCF_ECO_BYE_01 + /* Mm interface at E-CSCF/IM CN subsystem of own network */ + + Test objective "Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the PSAP in the IM CN subsystem of own network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_P_CSCF_A entity + } + then { + the IMS_E_CSCF entity sends a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IM_CN entity + } + } + + } // End of TP_MM_ECSCF_ECO_BYE_01 + + Test Purpose { + + TP Id TP_MM_ECSCF_ECO_BYE_02 + /* Mm interface at E-CSCF/IM CN subsystem of own network */ + Test objective "Verify that the E-CSCF successfully processes a BYE from the PSAP in the IM CN subsystem for an Emergency Call and routes the request to the P-CSCF of home network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a BYE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA; + from the IM_CN entity + } + then { + the IMS_E_CSCF entity sends a BYE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MM_ECSCF_ECO_BYE_02 + + Test Purpose { + + TP Id TP_MX_ECSCF_ECO_BYE_01 + /* Mx interface at E-CSCF/IBCF */ + + Test objective "Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the IBCF for a PSAP in another network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_P_CSCF_A entity + } + then { + the IMS_E_CSCF entity sends a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_IBCF_A entity + } + } + + } // End of TP_MX_ECSCF_ECO_BYE_01 + + Test Purpose { + + TP Id TP_MX_ECSCF_ECO_BYE_02 + /* Mx interface at E-CSCF/IBCF */ + + Test objective "Verify that the E-CSCF successfully processes a BYE from the IBCF for a PSAP in another network for an Emergency Call and routes the request to the P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a BYE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA; + from the IMS_IBCF_A entity + } + then { + the IMS_E_CSCF entity sends a BYE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MX_ECSCF_ECO_BYE_02 + + Test Purpose { + + TP Id TP_MI_ECSCF_ECO_BYE_01 + /* Mx interface at E-CSCF/BGCF */ + + Test objective "Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the BGCF for a PSAP in the PSTN." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the BGCF and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_BGCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_P_CSCF_A entity + } + then { + the IMS_E_CSCF entity sends a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_BGCF_A entity + } + } + + } // End of TP_MI_ECSCF_ECO_BYE_01 + + Test Purpose { + + TP Id TP_MI_ECSCF_ECO_BYE_02 + /* Mx interface at E-CSCF/BGCF */ + + Test objective "Verify that the E-CSCF successfully processes a BYE from the BGCF for a PSAP in the PSTN for an Emergency Call and routes the request to the P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the BGCF and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_BGCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a BYE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA; + from the IMS_BGCF_A entity + } + then { + the IMS_E_CSCF entity sends a BYE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MI_ECSCF_ECO_BYE_02 + + Test Purpose { + + TP Id TP_MM_ECSCF_EMC_CANCEL_01 + /* Mm interface at E-CSCF/IM CN subsystem of own network */ + + Test objective "Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the PSAP in the IM CN subsystem of own network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + the UE_A entity hasAchievedInitialEmergencyINVITE + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_P_CSCF_A entity + } + then { + the IMS_E_CSCF entity sends a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IM_CN entity + } + } + + } // End of TP_MM_ECSCF_EMC_CANCEL_01 + + Test Purpose { + + TP Id TP_MX_ECSCF_EMC_CANCEL_01 + /* Mx interface at E-CSCF/IBCF */ + + Test objective "Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the IBCF for a PSAP in another network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + the UE_A entity hasAchievedInitialEmergencyINVITE via the IMS_IBCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_P_CSCF_A entity + } + then { + the IMS_E_CSCF entity sends a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_IBCF_A entity + } + } + + } // End of TP_MX_ECSCF_EMC_CANCEL_01 + + Test Purpose { + + TP Id TP_MI_ECSCF_EMC_CANCEL_01 + /* Mx interface at E-CSCF/BGCF */ + + Test objective "Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the BGCF for a PSAP in the PSTN." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the BGCF and + the UE_A entity hasAchievedInitialEmergencyINVITE the PSAP via IMS_BGCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_P_CSCF_A entity + } + then { + the IMS_E_CSCF entity sends a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_BGCF_A entity + } + } + + } // End of TP_MI_ECSCF_EMC_CANCEL_01 + + Test Purpose { + + TP Id TP_MM_ECSCF_ECO_480INVITE_01 + /* Mm interface at E-CSCF/IM CN subsystem of own network */ + Test objective "Verify that the E-CSCF successfully processes a 480 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a 480INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IM_CN entity + } + then { + the IMS_E_CSCF entity sends a 480INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MM_ECSCF_ECO_480INVITE_01 + + Test Purpose { + + TP Id TP_MX_ECSCF_ECO_480INVITE_01 + /* Mx interface at E-CSCF/IBCF */ + + Test objective "Verify that the E-CSCF successfully processes a 480 response from the IBCF for a PSAP in another network for an Emergency Call and routes the response to the P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a 480INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_IBCF_A entity + } + then { + the IMS_E_CSCF entity sends a 480INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MX_ECSCF_ECO_480INVITE_01 + + Test Purpose { + + TP Id TP_MI_ECSCF_ECO_480INVITE_01 + /* Mx interface at E-CSCF/BGCF */ + + Test objective "Verify that the E-CSCF successfully processes a 480 response from the BGCF for a PSAP in the PSTN for an Emergency Call and routes the response to the P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the BGCF and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_BGCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a 480INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_BGCF_A entity + } + then { + the IMS_E_CSCF entity sends a 480INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MI_ECSCF_ECO_480INVITE_01 + + Test Purpose { + + TP Id TP_MM_ECSCF_EMC_487INVITE_01 + /* Mm interface at E-CSCF/IM CN subsystem of own network */ + Test objective "Verify that the E-CSCF successfully processes a 487 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a 487INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IM_CN entity + } + then { + the IMS_E_CSCF entity sends a 487INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MM_ECSCF_EMC_487INVITE_01 + + Test Purpose { + + TP Id TP_MX_ECSCF_EMC_487INVITE_01 + /* Mx interface at E-CSCF/IBCF */ + + Test objective "Verify that the E-CSCF successfully processes a 487 response from the IBCF for a PSAP in another network for an Emergency Call and routes the response to the P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a 487INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_IBCF_A entity + } + then { + the IMS_E_CSCF entity sends a 487INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MX_ECSCF_EMC_487INVITE_01 + + Test Purpose { + + TP Id TP_MI_ECSCF_EMC_487INVITE_01 + /* Mx interface at E-CSCF/BGCF */ + + Test objective "Verify that the E-CSCF successfully processes a 487 response from the BGCF for a PSAP in the PSTN for an Emergency Call and routes the response to the P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clause 5.11.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the IMS_E_CSCF entity supportsRoutingTo the BGCF and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_BGCF_A + } + + Expected behaviour + ensure that { + when { + the IMS_E_CSCF entity receives a 487INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the IMS_BGCF_A entity + } + then { + the IMS_E_CSCF entity sends a 487INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_P_CSCF_A entity + } + } + + } // End of TP_MI_ECSCF_EMC_487INVITE_01 + } // End of Package TP_E_CSCF diff --git a/test_purposes/Gm/TP_GM.tplan2 b/test_purposes/Gm/TP_GM.tplan2 index f6c841807feff840a588eea92f321453d1f10cde..eceb18d129a19936a5a444cd4b29204e68483584 100644 --- a/test_purposes/Gm/TP_GM.tplan2 +++ b/test_purposes/Gm/TP_GM.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ /* Gm interface at UE/P-CSCF */ @@ -27,7 +29,7 @@ Package TP_GM { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2, 5.2.10.1, 5.1.1.1, 6.1.1 and 6.1.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -51,10 +53,10 @@ Package TP_GM { Realm indicating value PX_UE_A_REALM, Algorithm indicating value PX_UE_A_AUTH_ALG, Nonce indicating value "", - not term_ioi, + not term_ioi;, not SecurityClient, - Contact indicating value "sos";; - to the UE_A entity + Contact indicating value "sos"; + from the UE_A entity } then { the IMS_P_CSCF_A entity sends a 401_Unauthorized containing @@ -71,7 +73,7 @@ Package TP_GM { Algorithm indicating value PX_UE_A_AUTH_ALG, Nonce indicating value "not empty", qop indicating value "auth";; - from the UE_A entity + to the UE_A entity } } } // End of TP_GM_PCSCF_ECO_REGISTER_01 @@ -85,7 +87,7 @@ Package TP_GM { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2, 5.2.10.1, 5.1.1.1, 6.1.1 and 6.1.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -144,7 +146,7 @@ Package TP_GM { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2 and 5.2.10.5" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -163,7 +165,7 @@ Package TP_GM { Via indicating value PX_UE_A_VIA, Authorization indicating value "Invalid credentials", Contact indicating value "sos"; - to the UE_A entity + from the UE_A entity } then { the IMS_P_CSCF_A entity sends a 403_Forbiden containing @@ -171,7 +173,7 @@ Package TP_GM { To indicating value PX_UE_A_SIP_URI, CallId indicating value PX_UE_A_CALLID, Via indicating value PX_UE_A_VIA; - from the UE_A entity + to the UE_A entity } } } // End of TP_GM_PCSCF_ECO_REGISTER_03 @@ -185,7 +187,7 @@ Package TP_GM { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2 and 5.2.10.5" - Config Id CF_VxLTE_RMI + Config Id CF_VoLTE_RMI_ES PICS Selection NONE @@ -204,7 +206,7 @@ Package TP_GM { Via indicating value PX_UE_A_VIA, Authorization not indicating value GPRS_IMS_Bundled_authentication, Contact indicating value "sos"; - to the UE_A entity + from the UE_A entity } then { the IMS_P_CSCF_B entity sends a 403_Forbidden containing @@ -215,7 +217,7 @@ Package TP_GM { MessageBody containing XML containing ims_3gpp_element indicating value anonymous_emergencycall;;; - from the UE_A entity + to the UE_A entity } } } // End of TP_GM_PCSCF_ECO_REGISTER_04 @@ -229,7 +231,7 @@ Package TP_GM { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2 and 5.2.10.5" - Config Id CF_VxLTE_RMI + Config Id CF_VoLTE_RMI_ES PICS Selection NONE @@ -248,7 +250,7 @@ Package TP_GM { Via indicating value PX_UE_A_VIA, Authorization not indicating value GPRS_IMS_Bundled_authentication, Contact indicating value "sos"; - to the UE_A entity + from the UE_A entity } then { the IMS_P_CSCF_B entity sends a 420_BadExtension containing @@ -260,7 +262,7 @@ Package TP_GM { MessageBody containing XML containing ims_3gpp_element indicating value anonymous_emergencycall;;; - from the UE_A entity + to the UE_A entity } } } // End of TP_GM_PCSCF_ECO_REGISTER_05 @@ -272,9 +274,9 @@ Package TP_GM { Test objective "Verify that the P-CSCF successfully receives an initial emergency INVITE from an unregistered UE." Reference - "ETSI TS 124 229 [1], Clauses 5.1.6.8.2" + "ETSI TS 124 229 [1], Clause 5.1.6.8.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -294,7 +296,7 @@ Package TP_GM { From indicating value "Anonymous", To indicating value PX_SIP_EMERGENCY_SERVICE_URN, CallId indicating value PX_UE_A_CALLID, - Via indicating value PX_UE_A_VIA, // see 5.1.6.8.2 7) + Via indicating value PX_UE_A_VIA, // see 5.1.6.8.2 7 Route indicating value PX_UE_A_SERVICE_ROUTE, MessageBody; from the UE_A entity @@ -309,9 +311,9 @@ Package TP_GM { Test objective "Verify that the P-CSCF successfully receives an initial emergency INVITE from an emergency registered UE." Reference - "ETSI TS 124 229 [1], Clauses 5.1.6.8.3" + "ETSI TS 124 229 [1], Clause 5.1.6.8.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -347,9 +349,9 @@ Package TP_GM { Test objective "Verify that the P-CSCF successfully receives an initial emergency INVITE from a registered but not emergency registered UE." Reference - "ETSI TS 124 229 [1], Clauses 5.1.6.8.4" + "ETSI TS 124 229 [1], Clause 5.1.6.8.4" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -383,14 +385,14 @@ Package TP_GM { Test Purpose { - TP Id TP_GM_PCSCF_ECO_INVITE_04 + TP Id TP_GM_PCSCF_NGC_INVITE_01 Test objective "Verify that the P-CSCF successfully receives an initial eCall type INVITE from an emergency registered UE." Reference - "ETSI TS 124 229 [1], Clauses 5.1.6.11" + "ETSI TS 124 229 [1], Clause 5.1.6.11" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -413,14 +415,339 @@ Package TP_GM { Route indicating value PX_UE_A_SERVICE_ROUTE, Accept indicating value "application/EmergencyCallData.Control+xml", RecvInfo indicating value "EmergencyCallData.eCall.MSD", - PPreferredIdentity, // one or two instances + PPreferredIdentity, // one or two instances, + ContentDisposition containing + handling indicating value "optional";, // TODO Geolocation header maybe added later, check! MessageBody containing - MIME containing MSD;;; // MIME may contain additional parts e.g., sdp, xml + MIME containing MSD;;; // "application/EmergencyCallData.eCall.MSD" MIME body + // MIME may contain additional parts e.g., sdp, xml + from the UE_A entity + } + } + } // End of TP_GM_PCSCF_NGC_INVITE_01 + + Test Purpose { + + TP Id TP_GM_PCSCF_NGC_INFO_01 + + Test objective "Verify that the P-CSCF successfully receives an INFO from the UE in an + established eCall type emergency call that has been requested to transfer + an updated MSD." + + Reference + "ETSI TS 124 229 [1], Clause 5.1.6.11.3" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the UE_A entity isRequestedToTransferUpdatedMSD + // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + } + then { + the IMS_P_CSCF_A entity receives an INFO containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + // MSD not exceeding 140 bytes and encoded in binary ASN.1 + ContentDisposition indicating value "By-Reference";; + from the UE_A entity + } + } + } // End of TP_GM_PCSCF_NGC_INFO_01 + + Test Purpose { + + TP Id TP_GM_PCSCF_ECO_INVITE_05 + + Test objective "Verify that the P-CSCF successfully receives an initial emergency INVITE from a registered but not emergency registered UE." + + Reference + "ETSI TS 124 229 [1], Clause 5.1.6.8.4" + + Config Id CF_VoLTE_RMI_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_B and + the UE_A entity isRegisteredTo the IMS_A and + the UE_A entity not isEmergencyRegisteredTo the IMS_A + /* This implies that the UE is currently attached and registered + to its home operator's network and the IP-CAN does not define emergency bearers + see 5.1.6.1 3rd paragraph */ + } + + Expected behaviour + ensure that { + when { + the UE_A entity isRequestedToEstablishEmergencyCall + } + then { + the IMS_P_CSCF_A entity receives an INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE, + PPreferredIdentity, // one or two instances + MessageBody; + from the UE_A entity + } + } + } // End of TP_GM_PCSCF_ECO_INVITE_05 + + Test Purpose { + + TP Id TP_GM_PCSCF_ECO_BYE_01 + + Test objective "Verify that the P-CSCF successfully processes a BYE for an emergency call." + + Reference + "ETSI TS 124 229 [2] Clause 5.1.6.9" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the UE_A entity isRequestedToSend a BYE + } + then { + the IMS_P_CSCF_A entity receives a BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the UE_A entity + } + } + + } // End of TP_GM_PCSCF_ECO_BYE_01 + + Test Purpose { + + TP Id TP_GM_PCSCF_EMC_CANCEL_01 + + Test objective "Verify that the P-CSCF successfully processes a CANCEL during Emergency Call establishment." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.3 and 6.1" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A and + the UE_A entity hasAchievedInitialEmergencyINVITE + } + + Expected behaviour + ensure that { + when { + the UE_A entity isRequestedToSend a CANCEL + } + then { + the IMS_P_CSCF_A entity receives a CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; from the UE_A entity } } - } // End of TP_GM_PCSCF_ECO_INVITE_04 + + } // End of TP_GM_PCSCF_EMC_CANCEL_01 + + Test Purpose { + + TP Id TP_GM_PCSCF_ECO_200OK_BYE_01 + + Test objective "Verify that the P-CSCF successfully processes a 200 (OK) BYE (Originating Leg)." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.5 and 6.1" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity sends a 200_Ok containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE; + to the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a 200_Ok containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + not PChargingVector, + not PChargingFunctionAddresses, + not PPreferredIdentity; + to the UE_A entity + } + } + + } // End of TP_GM_PCSCF_ECO_200OK_01 + + Test Purpose { + + TP Id TP_GM_PCSCF_ECO_200OK_BYE_02 + + Test objective "Verify that the P-CSCF successfully processes a 200 (OK) BYE (Terminating Leg)." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.5 and 6.1" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a 200_Ok containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_PSAP_SIP_URI, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE, + not PChargingVector, + not PChargingFunctionAddresses, + not PPreferredIdentity; + from the UE_A entity + } + then { + the IMS_P_CSCF_A entity sends a 200_Ok containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_PSAP_SIP_URI, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_E_CSCF entity + } + } + + } // End of TP_GM_PCSCF_ECO_200OK_02 + + Test Purpose { + + TP Id TP_GM_PCSCF_EMS_200OK_CANCEL_01 + // TP_GM_PCSCF_200OK_CANCEL_01 from ETSI TS 103 653-1 + + Test objective "Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Originating Leg)." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.3 and 6.1" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the UE_A entity isRequestedToSend a CANCEL + } + then { + the IMS_P_CSCF_A entity receives a 200_Ok containing + not PChargingVector, + not PChargingFunctionAddresses, + not PPreferredIdentity; + from the IMS_E_CSCF entity + } + } + + } // End of TP_GM_PCSCF_EMS_200OK_CANCEL_01 + + Test Purpose { + + TP Id TP_GM_PCSCF_EMC_487INVITE_01 + // TP_GM_PCSCF_487INVITE_01 from ETSI TS 103 653-1 + + Test objective "Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) (Originating Leg)." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.3 and 6.1" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the UE_A entity isRequestedToSend an CANCEL + } + then { + the IMS_P_CSCF_A entity sends a 487_INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE; + to the UE_A entity + } + } + + } // End of TP_GM_PCSCF_EMC_487INVITE_01 } // End of Package TP_GM diff --git a/test_purposes/Gx/TP_GX.tplan2 b/test_purposes/Gx/TP_GX.tplan2 index 0e22af94d59deac1a1a9d2686fd856f77243f0fc..e7488b71a4ce31d1747af8b4b070edbc12f1c2b2 100644 --- a/test_purposes/Gx/TP_GX.tplan2 +++ b/test_purposes/Gx/TP_GX.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ @@ -22,14 +24,14 @@ Package TP_GX { Test Purpose { - TP Id TP_GX_PCRF_CCA_01 + TP Id TP_GX_PCRF_ECO_CCA_01 //TP_GX_PCRF_CCA_01 from TS 103 653-1 V2.1.1 without emergency registration Test objective "Verify that IUT when receives CC-Request for PCC Rules containing IMSI for emergency services sends a CC-Answer in case of attachment procedure." Reference - "TS 129 212 [9], clauses 4.5.15.2.1" + "TS 129 212 [9], clause 4.5.15.2.1" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -70,15 +72,50 @@ Package TP_GX { } } // End of TP_GX_PCRF_ECO_CCA_01 + + + Test Purpose { + TP Id TP_GX_PCRF_ECO_CCA_02 + //TP_EPC_7004_01 and TP_EPC_7004_02 from TS 103 029 V5.1.1 + Test objective "Verify that IUT when receives CC-Request for PCC Rules sends a CC-Answer in case of emergency detachment procedure." + + Reference + "TS 129 212 [9], clause 4.5.15.2.4" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A + } + + Expected behaviour + ensure that { + when { + the EPC_PGW_A entity sends an CCR containing + CC_Request_Type_AVP + indicating value TERMINATION_REQUEST; + to the EPC_PCRF_A entity + } + then { + the EPC_PCRF_A entity sends the CCA containing + Result_Code_AVP + indicating value DIAMETER_SUCCESS; + to the EPC_PGW_A entity + } + } + } // End of TP_GX_PCRF_ECO_CCA_02 + Test Purpose { - TP Id TP_GX_PCRF_CCA_02 + TP Id TP_GX_PCRF_EMC_CCA_01 - Test objective "Verify that IUT when receives CC-Request for PCC Rules containing IMEI for emergency services sends a CC-Answer in case of attachment procedure." + Test objective "Verify that IUT when receives CC-Request for PCC Rules containing IMEI for emergency call sends a CC-Answer in case of attachment procedure." Reference - "TS 129 212 [9], clauses 4.5.15.2.1" + "TS 129 212 [9], clause 4.5.15.2.1" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE diff --git a/test_purposes/Ic/TP_IC.tplan2 b/test_purposes/Ic/TP_IC.tplan2 index 6230279f3e241ab45bd35bd57ddcba4620ccb52c..751d0a5fdbd735d3393686b2bdbf5c009464645a 100644 --- a/test_purposes/Ic/TP_IC.tplan2 +++ b/test_purposes/Ic/TP_IC.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,15 +11,47 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ -/* Gm interface at IBCF/IBCF*/ +/* Ic interface at IBCF/IBCF*/ Package TP_IC { import all from Sip_Common; + Test Purpose { + TP Id TP_IC_IBCF_ECO_480INVITE_01 + Test objective + "Verify that the IBCF successfully processes a 480 INVITE (Temporary unavailable) originating leg. " + Reference + "TS 124 229 [1], clause 5.10.3.2 and RFC 3261 [18], clause 13.3.1.3" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + UE_A isAttachedTo the EPC_A and + UE_A isRegisteredTo the IMS_A and + PSAP isTemporaryUnavailable + } + + Expected behaviour + ensure that { + when { + the PSAP entity sends a 480_INVITE "addressed to UE_A" to the IMS_A entity + } + then { + the IMS_IBCF_A entity receives the 480_INVITE + from the PSAP entity and + the IMS_IBCF_A entity forwards the 480_INVITE + to the IMS_E_CSCF entity + } + } + } // End of TP_IC_IBCF_ECO_480INVITE_01 } // End of Package TP_IC diff --git a/test_purposes/Isc/TP_ISC.tplan2 b/test_purposes/Isc/TP_ISC.tplan2 index 5ea504ed72383057bb390f5cfd8dec69ea89e0ad..0d23f2535ab4a87fa5c8cafae70e005f98bc75dd 100644 --- a/test_purposes/Isc/TP_ISC.tplan2 +++ b/test_purposes/Isc/TP_ISC.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ /* Isc interface at S-CSCF<->AS */ @@ -18,6 +20,46 @@ Package TP_ISC { import all from Sip_Common; + Test Purpose { + + TP Id TP_ISC_SCSCF_EMC_INVITE_01 + + Test objective "Verify that the AS successfully identify the request for emergency call and forwards it towards S-CSCF." + + Reference + "ETSI TS 124 229 [2], Clauses 4.7.3 and 5.7.1.14" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A and + the UE_A entity not isEmergencyRegisteredTo the IMS_A + + } + + Expected behaviour + ensure that { + when { + the IMS_AS_A entity receives an INVITE + from the UE_A entity + } + then { + the IMS_AS_A entity sends an INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + Request_Uri indicating value PX_SIP_EMERGENCY_SERVICE_URN, + Route indicating value PX_E_CSCF_SERVICE_ROUTE, + PChargingVector, + // TODO Geolocation header maybe added later, check! + MessageBody; + to the IMS_S_CSCF_A entity + } + } + } // End of TP_ISC_SCSCF_EMC_INVITE_01 + } // End of Package TP_ISC diff --git a/test_purposes/Mw/TP_MW_IS.tplan2 b/test_purposes/Mw/TP_MW_IS.tplan2 index 75255ef98492d52ebf1df6b8314852e43db48193..566a0d122b891b16eaf6f601bb68fac7bb4328e8 100644 --- a/test_purposes/Mw/TP_MW_IS.tplan2 +++ b/test_purposes/Mw/TP_MW_IS.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ /* Mw interface at I-CSCF/S-CSCF */ @@ -29,7 +31,7 @@ Package TP_MW_IS { Reference "ETSI TS 124 229 [1], Clauses 5.4.1.1 and 6.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -78,7 +80,7 @@ Package TP_MW_IS { Reference "ETSI TS 124 229 [1], Clauses 5.4.1.1 and 6.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -137,7 +139,7 @@ Package TP_MW_IS { Reference "ETSI TS 124 229 [1], Clause 5.2.2.1 and Clause 6.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -177,7 +179,7 @@ Package TP_MW_IS { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2 and 5.2.10.5" - Config Id CF_VxLTE_RMI + Config Id CF_VoLTE_RMI_ES PICS Selection NONE @@ -216,7 +218,7 @@ Package TP_MW_IS { Reference "ETSI TS 124 229 [1], Clauses 5.1.6.2 and 5.2.10.5" - Config Id CF_VxLTE_RMI + Config Id CF_VoLTE_RMI_ES PICS Selection NONE diff --git a/test_purposes/Mw/TP_MW_PS.tplan2 b/test_purposes/Mw/TP_MW_PS.tplan2 index c33d606bac2302cf3f4389fa4b19e03d4505f291..f2fbad4e82f0d964f10dee17e667181cf7fb6f57 100644 --- a/test_purposes/Mw/TP_MW_PS.tplan2 +++ b/test_purposes/Mw/TP_MW_PS.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ /* Mw interface at P-CSCF/E-CSCF */ @@ -27,7 +29,7 @@ Package TP_MW_PS { Reference "ETSI TS 124 229 [1], Clauses 5.2.2.1 and 6.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -89,7 +91,7 @@ Package TP_MW_PS { Reference "ETSI TS 124 229 [1], Clauses 5.2.2.1 and 6.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -157,14 +159,14 @@ Package TP_MW_PS { Test Purpose { - TP Id TP_MW_PCSCF_REGISTER_03 + TP Id TP_MW_PCSCF_ECO_REGISTER_03 Test objective "Verify that the P-CSCF rejects invalid credentials within registration (Unsuccessful)." Reference - "ETSI TS 124 229 [1], Clauses 5.2.2.1" + "ETSI TS 124 229 [1], Clause 5.2.2.1" - Config Id CF_VxLTE_RMI_B + Config Id CF_VoLTE_RMI_ES PICS Selection NONE @@ -203,7 +205,7 @@ Package TP_MW_PS { to the UE_A entity } } - } // End of TP_MW_PCSCF_REGISTER_03 + } // End of TP_MW_PCSCF_ECO_REGISTER_03 @@ -216,7 +218,7 @@ Package TP_MW_PS { Reference "ETSI TS 124 229 [1], Clauses 5.2.10.2 and 5.2.6.3.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -261,7 +263,7 @@ Package TP_MW_PS { Reference "ETSI TS 124 229 [1], Clauses 5.2.10.3 and 5.2.6.3.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -307,7 +309,7 @@ Package TP_MW_PS { Reference "ETSI TS 124 229 [1], Clauses 5.2.10.4 and 5.2.6.3.3" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -345,5 +347,474 @@ Package TP_MW_PS { } // End of TP_MW_PCSCF_ECO_INVITE_03 + Test Purpose { + + TP Id TP_MW_PCSCF_ECO_INVITE_04 + + Test objective "Verify that the P-CSCF rejects an initial INVITE from a not emergency registered UE + if the IM CN subsystem of the P-CSCF is not capable to handle emergency sessions." + + Reference + "ETSI TS 124 229 [1], Clause 5.2.10.5" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity not isRegisteredTo the IMS_A and + the UE_A entity not isEmergencyRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives an INVITE containing + From indicating value "Anonymous", + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE, + MessageBody; + from the UE_A entity + } + then { + the IMS_P_CSCF_A entity sends a 380_AlternativeService containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_P_CSCF_A_VIA, + PAssertedIdentity, + MessageBody containing + XML containing + Version indicating value "1", + Type_child indicating value "emergency", + Reason_child, + Action_child;;; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_ECO_INVITE_04 + + Test Purpose { + + TP Id TP_MW_PCSCF_ECO_INVITE_05 + + Test objective "Verify that the E-CSCF successfully processes a callback INVITE from PSAP towards P-CSCF." + + Reference + "ETSI TS 124 229 [1], Clauses 5.2.10.3 and 5.2.6.3.3" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives an INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_P_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + PAssertedIdentity, + MessageBody; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends an INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_P_CSCF_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE, + PPreferredIdentity, // one or two instances + MessageBody; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_ECO_INVITE_05 + + Test Purpose { + + TP Id TP_MW_PCSCF_ECO_480INVITE_01 + + Test objective "Verify that the P-CSCF rejects an initial INVITE from an emergency registered UE + if the E-CSCF informs the P-CSCF that Emergency Services are currently not available." + + Reference + "ETSI TS 124 229 [1], Clause 5.2.10.5" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A and + the UE_A entity hasAchievedInitialEmergencyINVITE + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a 480_INVITE containing // Temporarily Unavailable + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_E_CSCF_VIA, + Route indicating value PX_E_CSCF_SERVICE_ROUTE; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a 380_AlternativeService containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_P_CSCF_A_VIA, + PAssertedIdentity, + MessageBody containing + XML containing + Version indicating value "1", + Type_child indicating value "emergency", + Reason_child, + Action_child;;; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_ECO_480INVITE_01 + + Test Purpose { + + TP Id TP_MW_PCSCF_ECO_380INVITE_01 + + Test objective "Verify that the P-CSCF rejects an initial INVITE from an emergency registered UE + if the IMS is not capable or does not handle emergency sessions." + + Reference + "ETSI TS 124 229 [1], Clause 5.2.10.5" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_E_CSCF_VIA, + Route indicating value PX_E_CSCF_SERVICE_ROUTE; + from the UE_A entity + } + then { + the IMS_P_CSCF_A entity sends a 380_AlternativeService containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_P_CSCF_A_VIA, + PAssertedIdentity, + MessageBody containing + XML containing + Version indicating value "1", + Type_child indicating value "emergency", + Reason_child, + Action_child;;; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_ECO_380INVITE_01 + + Test Purpose { + + TP Id TP_MW_PCSCF_ECO_380INVITE_02 + + Test objective "Verify that the P-CSCF rejects an initial INVITE from an emergency registered UE + if received Request-URI is wrong - not in accordance with RFC 5031." + + Reference + "ETSI TS 124 229 [1], Clauses 5.2.10.4 and 5.2.10.5 + RFC 5031" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a INVITE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_WRONG_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_E_CSCF_VIA, + Route indicating value PX_E_CSCF_SERVICE_ROUTE; + from the UE_A entity + } + then { + the IMS_P_CSCF_A entity sends a 380_AlternativeService containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Content_type, + Via indicating value PX_P_CSCF_A_VIA, + PAssertedIdentity, + MessageBody containing + XML containing + Version indicating value "1", + Type_child indicating value "emergency", + Reason_child, + Action_child;;; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_ECO_380INVITE_02 + + Test Purpose { + + TP Id TP_MW_PCSCF_ECO_BYE_01 + + Test objective "Verify that the P-CSCF successfully processes a BYE for an emergency call." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.6.9, 5.4.5.2 and 6.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A and + the UE_A entity not isEmergencyRegisteredTo the IMS_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives an BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the UE_A entity + } + then { + the IMS_P_CSCF_A entity sends an BYE containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_E_CSCF entity + } + } + + } // End of TP_MW_PCSCF_ECO_BYE_01 + + Test Purpose { + + TP Id TP_MW_PCSCF_EMC_CANCEL_01 + + Test objective "Verify that the P-CSCF successfully processes a CANCEL during Emergency Call establishment." + + Reference + "ETSI TS 124 229 [1], Clauses 5.1.3 and 6.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isEmergencyAttachedTo the EPC_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A and + the UE_A entity hasAchievedInitialEmergencyINVITE and + the UE_A entity isRequestedToSend a CANCEL + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives an CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + from the UE_A entity + } + then { + the IMS_P_CSCF_A entity sends an CANCEL containing + From indicating value PX_UE_A_SIP_URI, + To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA, + Route indicating value PX_UE_A_SERVICE_ROUTE; + to the IMS_E_CSCF entity + } + } + + } // End of TP_MW_PCSCF_EMC_CANCEL_01 + + Test Purpose { + + TP Id TP_MW_PCSCF_EMC_200OK_CANCEL_01 + + Test objective "Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Originating Leg)." + + Reference + "ETSI TS 124 229 [1], clauses 5.2.7 and 6.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a 200_Ok containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a 200_Ok containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_EMC_200OK_CANCEL_01 + + Test Purpose { + + TP Id TP_MW_PCSCF_EMC_487INVITE_01 + // TP_MW_PCSCF_487INVITE_01 from ETSI TS 103 653-1 + + Test objective "Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) to reject call (Originating Leg)." + + Reference + "ETSI TS 124 229 [1], clauses 5.2.7 and 6.2" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A and + the UE_A entity isRequestedToSend a CANCEL + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a 487_INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a 487_INVITE containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_EMC_487INVITE_01 + + Test Purpose { + + TP Id TP_MW_PCSCF_NGC_INFO_01 + + Test objective "Verify that the P-CSCF sends an INFO request demanding a transfer of updated MSD." + + Reference + "ETSI TS 124 229 [1], clause 5.1.6.11.3" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A and + the UE_A entity isEmergencyRegisteredTo the IMS_A and + the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + } + + Expected behaviour + ensure that { + when { + the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD"; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a INFO containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml + request containing + action indicating value "send-data", + datatype indicating value "eCall.MSD";, + ContentDisposition indicating value "By-Reference";; + to the UE_A entity + } + } + + } // End of TP_MW_PCSCF_NGC_INFO_01 + } // End of Package TP_MW_PS diff --git a/test_purposes/Mw/TP_MW_SI.tplan2 b/test_purposes/Mw/TP_MW_SI.tplan2 index cf33fbb8d0922f561992cb48503ebd0682454fb7..14b2d841dc6bbbc1409ede6dfcce2c9a0bac2c04 100644 --- a/test_purposes/Mw/TP_MW_SI.tplan2 +++ b/test_purposes/Mw/TP_MW_SI.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019-2020. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ /* Mw interface at S-CSCF/IBCF */ diff --git a/test_purposes/Rtp/TP_Rtp.tplan2 b/test_purposes/Rtp/TP_Rtp.tplan2 index f56d54c9f43baae54c8950528c85df2007475417..c49cd886305f46a46d0e0389cafc6b5a7cfa776d 100644 --- a/test_purposes/Rtp/TP_Rtp.tplan2 +++ b/test_purposes/Rtp/TP_Rtp.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ @@ -20,7 +22,70 @@ Package TP_RTP { //import all from Diameter_Common; import all from Rtp_Common; - + + + Test Purpose { + TP Id TP_RTP_ECO_01 + // TP_RTP_UE_01 from VxLTE TTF T006 + Test objective "Verify that media between UE_A/IVS and PSAP is not delivered in any direction before call establishment." + + Reference + "TS 124 229 [1], clause 6" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the UE_A entity sends packets to the PSAP entity and + the PSAP entity sends packets to the UE_A entity + } + then { + the PSAP entity not receive media from the UE_A entity and + the UE_A entity not receive media from the PSAP entity + } + + } + } // End of TP_RTP_ECO_01 + + + Test Purpose { + TP Id TP_RTP_ECO_03 + // TP_RTP_UE_03 from VxLTE TTF T006 + Test objective "Verify that media between UE_A and UE_B is successfully routed." + + Reference + "TS 124 229 [1], clause 6" + + Config Id CF_VoLTE_INT_ES + + PICS Selection NONE + + Initial conditions with { + the UE_A entity isAttachedTo the EPC_A and + the UE_A entity isRegisteredTo the IMS_A + } + + Expected behaviour + ensure that { + when { + the UE_A entity sends packets to the PSAP entity and + the PSAP entity sends packets to the UE_A entity + } + then { + the PSAP entity receives media from the UE_A entity and + the UE_A entity receives media from the PSAP entity + } + + } + } // End of TP_RTP_ECO_03 } // End of Package TP_RTP diff --git a/test_purposes/Rtp_Common.tplan2 b/test_purposes/Rtp_Common.tplan2 index 7da1861d962dcfc8c15d262bca411195edd9c381..6cb40b5d2f2c33c69e62e05213bea820808e61de 100644 --- a/test_purposes/Rtp_Common.tplan2 +++ b/test_purposes/Rtp_Common.tplan2 @@ -1,20 +1,18 @@ -/* ETSI Software License -* As long as the here under conditions are respected, non-exclusive permission is hereby granted, -* free of charge, to use, reproduce and modify this software source code, under the following conditions: -* This source code is provided AS IS with no warranties, express or implied, including but not limited to, -* the warranties of merchant ability, fitness for a particular purpose and warranties for non-infringement -* of intellectual property rights. -* ETSI shall not be held liable in any event for any direct or indirect damages whatsoever (including, without -* limitation, damages for loss of profits, business interruption, loss of information, or any other pecuniary -* loss) arising out of or related to the use of or inability to use the source code. -* This permission is granted to facilitate the implementation of the related ETSI standard, provided that -* ETSI is given the right to use, reproduce and amend the modified source code under the same conditions -* as the present permission. -* This permission does not apply to any documentation associated with this source code for which ETSI keeps -* all rights reserved. -* The present ETSI Source Code license shall be included in all copies of whole or part of this source code -* and shall not imply any sub-license right. -* (c) ETSI 2019-2020 +/* +Copyright (c) ETSI 2023. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +* +* @author TTF T010 */ diff --git a/test_purposes/Rx/TP_RX.tplan2 b/test_purposes/Rx/TP_RX.tplan2 index 9489a2b92b4b9c6fab1745fbdd7b18ac40947d4f..0c5daef2a9b37cd76f92bc7ec1a295791b03e282 100644 --- a/test_purposes/Rx/TP_RX.tplan2 +++ b/test_purposes/Rx/TP_RX.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ @@ -29,7 +31,7 @@ Package TP_RX { Reference "TS 129 214 [8], Annex A.5" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -69,7 +71,7 @@ Package TP_RX { Reference "TS 129 214 [8], Annex A.5" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE @@ -108,7 +110,7 @@ Package TP_RX { Reference "TS 129 214 [8], Annex A.5" //clauses 4.4.1, A.1, A.2 and annex B" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE diff --git a/test_purposes/S6a/TP_S6A.tplan2 b/test_purposes/S6a/TP_S6A.tplan2 index 25fafe6365831c33cec02a821d3101e352f90cb9..0057f0ae3391ad48bb6e19bea5557dc8858310a5 100644 --- a/test_purposes/S6a/TP_S6A.tplan2 +++ b/test_purposes/S6a/TP_S6A.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ @@ -29,7 +31,7 @@ Package TP_S6A { Reference "TS 129 272 [10], clause 5.2.1.1.2" - Config Id CF_VxLTE_INT + Config Id CF_VoLTE_INT_ES PICS Selection NONE diff --git a/test_purposes/S9/TP_S9.tplan2 b/test_purposes/S9/TP_S9.tplan2 index c35e0b929c7d6ac2b6d1025de47bd8a6eedfb9c4..ddeab028087c184443abf1ff46d33dd726e942ef 100644 --- a/test_purposes/S9/TP_S9.tplan2 +++ b/test_purposes/S9/TP_S9.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -11,6 +11,8 @@ from its use or inability of use.This permission does not apply to any documenta associated with this file for which ETSI keeps all rights reserved. The present copyright notice shall be included in all copies of whole or part of this file and shall not imply any sub-license right. +* +* @author TTF T010 */ diff --git a/test_purposes/Sh/TP_Sh.tplan2 b/test_purposes/Sh/TP_Sh.tplan2 index ecde9689cf1ec444a86af63fc3ac413f6cf27d36..fd249bbe6c86ef8976b4dd45ac3c7e7932d858a0 100644 --- a/test_purposes/Sh/TP_Sh.tplan2 +++ b/test_purposes/Sh/TP_Sh.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2019. +Copyright (c) ETSI 2023. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file diff --git a/test_purposes/Sip_Common.tplan2 b/test_purposes/Sip_Common.tplan2 index 63ab6e530b55d887f925b03931941b85681481a4..eeb2bd6bfb9d23fb87f51241e70c91caf79142b0 100644 --- a/test_purposes/Sip_Common.tplan2 +++ b/test_purposes/Sip_Common.tplan2 @@ -1,20 +1,18 @@ -/* ETSI Software License -* As long as the here under conditions are respected, non-exclusive permission is hereby granted, -* free of charge, to use, reproduce and modify this software source code, under the following conditions: -* This source code is provided AS IS with no warranties, express or implied, including but not limited to, -* the warranties of merchant ability, fitness for a particular purpose and warranties for non-infringement -* of intellectual property rights. -* ETSI shall not be held liable in any event for any direct or indirect damages whatsoever (including, without -* limitation, damages for loss of profits, business interruption, loss of information, or any other pecuniary -* loss) arising out of or related to the use of or inability to use the source code. -* This permission is granted to facilitate the implementation of the related ETSI standard, provided that -* ETSI is given the right to use, reproduce and amend the modified source code under the same conditions -* as the present permission. -* This permission does not apply to any documentation associated with this source code for which ETSI keeps -* all rights reserved. -* The present ETSI Source Code license shall be included in all copies of whole or part of this source code -* and shall not imply any sub-license right. -* (c) ETSI 2019-2020 +/* +Copyright (c) ETSI 2023. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +* +* @author TTF T010 */ @@ -47,6 +45,7 @@ Package Sip_Common { - IMS_P_CSCF_A - IMS_I_CSCF_A - IMS_S_CSCF_A + - IMS_BGCF_A - IMS_IBCF_A - IMS_AS_A - IMS_HSS_A @@ -57,11 +56,14 @@ Package Sip_Common { - IMS_HSS_B - IM_CN // IM CN subsystem of own network - BGCF + - PSAP ; events: - receives - sends - forwards + // to express route to PSAP + - via // Initial conditions - isTriggeredToStart - isTriggeredToStartEmergencyCall @@ -88,20 +90,25 @@ Package Sip_Common { - registeredPublicIdsWithTelUriAndSipUri - hasReceivedSubsequentOrTargetRefreshRequestInDialog - previouslyEstablishedCallWith + - previouslyEstablishedEmergencyCallWith - isRequestedToSend - isRequestedToEstablishEmergencyCall - isRequestedToEstablisheCallTypeEmergencyCall + - isRequestedToTransferUpdatedMSD - isRequestedToDeregisterUser - isBusy + - isTemporaryUnavailable - isNoLongerAvailable - isTriggeredToDetachUser - isRequestedToDetachfromNetwork - hasAchievedFirstREGISTER - hasResponded486INVITE - hasAchievedInitialINVITE + - hasAchievedInitialEmergencyINVITE - hasAchievedINVITE - hasSentINVITETo - supportsRoutingTo + - supportsCallbackTo ; } // End of Domain section @@ -151,6 +158,7 @@ Package Sip_Common { SipMessage r_200_Ok; SipMessage r_2xx_Any; SipMessage r_3xx_Any; + SipMessage r_380_AlternativeService; SipMessage r_401_Unauthorized; SipMessage r_403_Forbidden; SipMessage r_404_NotFound; @@ -183,6 +191,23 @@ Package Sip_Common { connection between IMS_S_CSCF_A.g and IMS_AS_A.g ; + Test Configuration CF_VoLTE_INT_ES + containing + SUT component UE_A of type SipComponent + SUT component IMS_P_CSCF_A of type SipComponent + SUT component IMS_S_CSCF_A of type SipComponent + SUT component IMS_I_CSCF_A of type SipComponent + SUT component IMS_AS_A of type SipComponent + SUT component IMS_IBCF_A of type SipComponent + SUT component IMS_IBCF_B of type SipComponent + connection between UE_A.g and IMS_P_CSCF_A.g + connection between IMS_P_CSCF_A.g and IMS_S_CSCF_A.g + connection between IMS_S_CSCF_A.g and IMS_I_CSCF_A.g + connection between IMS_I_CSCF_A.g and IMS_IBCF_A.g + connection between IMS_IBCF_A.g and IMS_IBCF_B.g + connection between IMS_S_CSCF_A.g and IMS_AS_A.g + ; + Test Configuration CF_VxLTE_RMI containing SUT component UE_A of type SipComponent @@ -199,6 +224,22 @@ Package Sip_Common { connection between IMS_IBCF_B.g and IMS_IBCF_A.g ; + Test Configuration CF_VoLTE_RMI_ES + containing + SUT component UE_A of type SipComponent + SUT component IMS_P_CSCF_B of type SipComponent + SUT component IMS_S_CSCF_B of type SipComponent + SUT component IMS_I_CSCF_B of type SipComponent + SUT component IMS_AS_B of type SipComponent + SUT component IMS_IBCF_B of type SipComponent + SUT component IMS_IBCF_A of type SipComponent + connection between UE_A.g and IMS_P_CSCF_B.g + connection between IMS_P_CSCF_B.g and IMS_S_CSCF_B.g + connection between IMS_S_CSCF_B.g and IMS_I_CSCF_B.g + connection between IMS_I_CSCF_B.g and IMS_IBCF_B.g + connection between IMS_IBCF_B.g and IMS_IBCF_A.g + ; + Test Configuration CF_VxLTE_RMI_A containing SUT component UE_B of type SipComponent diff --git a/titan-test-system-framework b/titan-test-system-framework new file mode 160000 index 0000000000000000000000000000000000000000..c38a2f267cb659c8180548bc82721d34dc71ef85 --- /dev/null +++ b/titan-test-system-framework @@ -0,0 +1 @@ +Subproject commit c38a2f267cb659c8180548bc82721d34dc71ef85 diff --git a/ttcn/AtsImsIot/AtsImsIot_Diameter_Templates.ttcn b/ttcn/AtsImsIot/AtsImsIot_Diameter_Templates.ttcn index 9680275d453990c569aa1410e78710835f02f7f4..fbc9a371eff18f094d361340a1d82973270f432e 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Diameter_Templates.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Diameter_Templates.ttcn @@ -10,18 +10,18 @@ module AtsImsIot_Diameter_Templates { //LibCommon - import from LibCommon_DataStrings {type Bit1, Bit4, Bit5, Bit8;}//all; - import from LibCommon_BasicTypesAndValues {type UInt8, UInt32, UInt64;}; + import from LibCommon_DataStrings all; + import from LibCommon_BasicTypesAndValues all; //LibDiameter import from LibDiameter_TypesAndValues all; + import from LibDiameter_Types_Base_AVPs all; import from LibDiameter_Templates all; import from LibDiameter_Steps all; - import from LibDiameter_Types_Base_AVPs all; import from LibDiameter_Types_Gx_AVPs all; import from LibDiameter_Types_Rx_AVPs all; import from LibDiameter_Types_CxDx_AVPs all; - import from LibDiameter_Types_S6a_AVPs {type Cancellation_Type_AVP, Cancellation_Type_Code}; + import from LibDiameter_Types_S6a_AVPs all; import from LibDiameter_Types_S9_AVPs all; group DiameterHeaderFields { @@ -215,6 +215,18 @@ module AtsImsIot_Diameter_Templates { aVP_Data := p_avpData } + template AF_Requested_Data_AVP mw_aF_Requested_Data(template (present) UInt32 p_avpData := ?) := + { + aVP_Header := mw_aVP_Header_any_Code(?), + aVP_Data := p_avpData + }; + + template Service_URN_AVP mw_service_URN(template (present) octetstring p_avpData := ?) := + { + aVP_Header := mw_aVP_Header_any_Code(c_service_URN_AVP_Code), + aVP_Data := p_avpData + }; + } //end group RxHeaderFields group GxHeaderFields{ @@ -387,6 +399,13 @@ module AtsImsIot_Diameter_Templates { final_unit_action := * } + template User_Equipment_Info_AVP mw_userEquipmentInfo_IMEI:= + { + aVP_Header := mw_aVP_Header_any_Code(458/*c_User_Equipment_Info_code*/), + user_Equipment_Info_Type := {aVP_Header := ?/*459*/, aVP_Data := IMEISV_E/*0*/ }, + user_Equipment_Info_Value := ? + } + } //end group GxHeaderFields group S6aHeaderFields{ @@ -396,6 +415,10 @@ module AtsImsIot_Diameter_Templates { cancellation_Type := p_cancellation_Type } // End of template m_cancellationType + template Subscription_Data_AVP mw_subscriptionData_emergencyInfo:= { + aVP_Header := mw_aVP_Header_any_Code(c_subscription_Data_AVP_Code), + aVP_Type := ?//emergency_Info := ? FIXME To be reviewed + } } //end group S6aHeaderFields @@ -882,6 +905,27 @@ module AtsImsIot_Diameter_Templates { } } + template AAR_MSG mw_AAR_AfRequestedData_ServiceUrn modifies mw_AAR_basic := { + aAR_Body :={ + //media_Component_Description := {mw_mediaComponentDescription_FlowStatusEnabled}, + specific_Action := *, + framed_IP_Address := ?, + //framed_IPv6_Address := *, + aF_Requested_Data := mw_aF_Requested_Data, + service_URN := mw_service_URN + } + } + + template AAR_MSG mw_AAR_ServiceUrn modifies mw_AAR_basic := { + aAR_Body :={ + //media_Component_Description := {mw_mediaComponentDescription_FlowStatusEnabled}, + specific_Action := *, + framed_IP_Address := ?, + //framed_IPv6_Address := *, + service_URN := mw_service_URN + } + } + template ASR_MSG mw_ASR_abortCause(template (present) Abort_Cause_Type p_avpData) modifies mw_ASR_basic := { aSR_Body :={ abort_cause := mw_abortCause(p_avpData) @@ -948,6 +992,31 @@ module AtsImsIot_Diameter_Templates { } } + template AAA_MSG mw_AAA_resultCode_subscriptionId_userEquipmentInfo modifies mw_AAA_basic := { + aAA_Body :={ + result_Code := mw_resultCode(mw_resultCode_diameterSuccess), + user_Equipment_Info := ?, + subscription_Id_AVP := ? + + } + } + + template AAA_MSG mw_AAA_resultCode_userEquipmentInfo modifies mw_AAA_basic := { + aAA_Body :={ + result_Code := mw_resultCode(mw_resultCode_diameterSuccess), + user_Equipment_Info := ? + + } + } + + template AAA_MSG mw_AAA_resultCode_subscriptionId modifies mw_AAA_basic := { + aAA_Body :={ + result_Code := mw_resultCode(mw_resultCode_diameterSuccess), + subscription_Id_AVP := ? + + } + } + template ASA_MSG mw_ASA_resultCode modifies mw_ASA_basic := { aSA_Body :={ result_Code := mw_resultCode(mw_resultCode_diameterSuccess) @@ -1004,6 +1073,38 @@ module AtsImsIot_Diameter_Templates { } } + template CCR_MSG mw_CCR_SubscriberIMSI_qosInformation_class5_ES(CC_Request_Ty_Type p_avpData) modifies mw_CCR_basic := { + cCR_Body :={ + cC_Request_Type := mw_cC_Request_Type(p_avpData), + subscription_Id := {*,mw_subscription_Id(mw_subscription_Id_Type(END_USER_IMSI_E))}, + iP_CAN_Type := ?, + rat_Type := ?, + called_Station_Id := ?, + pDN_Connection_ID := *, + framed_IP_Address := ?, + //framed_IPv6_Prefix := *, + //bearer_Usage := mw_bearer_Usage(IMS_SIGNALLING_E), + qoS_Information := mw_qoS_Information, + default_EPS_Bearer_QoS := mw_default_EPS_Bearer_QoS_Class_5 + } + } + template CCR_MSG mw_CCR_SubscriberIMEI_qosInformation_class5_ES(CC_Request_Ty_Type p_avpData) modifies mw_CCR_basic := { + cCR_Body :={ + cC_Request_Type := mw_cC_Request_Type(p_avpData), + //subscription_Id := {*,mw_subscription_Id(mw_subscription_Id_Type(END_USER_IMSI_E))}, + user_Equipment_Info := mw_userEquipmentInfo_IMEI, + iP_CAN_Type := ?, + rat_Type := ?, + called_Station_Id := ?, + pDN_Connection_ID := *, + framed_IP_Address := ?, + //framed_IPv6_Prefix := *, + //bearer_Usage := mw_bearer_Usage(IMS_SIGNALLING_E), + qoS_Information := mw_qoS_Information, + default_EPS_Bearer_QoS := mw_default_EPS_Bearer_QoS_Class_5 + } + } + template RAR_MSG mw_RAR_ChargingRuleInstall(template Charging_Rule_Install_AVP p_Charging_Rule_Install) modifies mw_RAR_Gx_basic := { rAR_Body :={ charging_Rule_Install := {p_Charging_Rule_Install} @@ -1161,6 +1262,13 @@ module AtsImsIot_Diameter_Templates { ula_Flags := ? } } + template ULA_MSG mw_ULA_subsdata_flags modifies mw_ULA_resultCode_flags := { + uLA_Body :={ + //result_Code := mw_resultCode(mw_resultCode_diameterSuccess), + //ula_Flags := ? + subscription_Data :=mw_subscriptionData_emergencyInfo + } + } }// end group S6aRequestMessageTemplates }//end group S6aMessageTemplates diff --git a/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn b/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn index ab2dbcb785d07385a3c5cf1318c4cfaee6ea5710..d85026b4257287ca7d50832fae0938e51d387bdc 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn @@ -9,23 +9,29 @@ module AtsImsIot_Emergency { // LibCommon // LibSip // LibIms - import from LibIms_UpperTester { type ImsUserInfo }; + import from LibIms_UpperTester all; // LibIot - import from LibIot_TestInterface { type IotEquipmentUser }; - import from LibIot_TestConfiguration { function f_cf_create_IotEquipmentUser }; - import from LibIot_PIXITS { modulepar PX_EUT_A, PX_EUT_B, PX_EUT_C }; + import from LibIot_TestInterface all; + import from LibIot_TestConfiguration all; + import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Functions all; // LibImsIot - import from AtsImsIot_Functions { function f_getImUser }; + import from AtsImsIot_Functions all; // ImsIot - import from AtsImsIot_TestConfiguration all; - import from AtsImsIot_TestSystem all; - import from AtsImsIot_Functions all; + import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_TestConfiguration all; + import from AtsImsIot_TestSystem all; + import from AtsImsIot_Functions all; + import from AtsImsIot_Templates all; import from AtsImsIot_TP_behavior_GM all; import from AtsImsIot_TP_behavior_MW_PS all; import from AtsImsIot_TP_behavior_MW_SI all; import from AtsImsIot_TP_behavior_MW_IS all; + import from AtsImsIot_TP_behavior_MX all; + import from AtsImsIot_TP_behavior_MM all; + import from AtsImsIot_TP_behavior_MI all; + import from AtsImsIot_TP_behavior_ML all; import from AtsImsIot_TP_behavior_IC all; import from AtsImsIot_TP_behavior_CX all; import from AtsImsIot_TP_behavior_GX all; @@ -34,42 +40,161 @@ module AtsImsIot_Emergency { import from AtsImsIot_TP_behavior_S9 all; import from AtsImsIot_TP_behavior_SH all; import from AtsImsIot_TP_behavior_RX all; + import from AtsImsIot_PIXITS all; + + // For Diameter codec tests only + import from LibDiameter_TypesAndValues all; /** - * @see ETSI TS 103 795-2 Clause 5 Test Descriptions (Interoperability at HPLMN) + * @see ETSI TS 103 795-2 Clause 5 Test Descriptions (Interoperability at HPLMN) */ group Interoperability { /** - * @see ETSI TS 103 795-2 Clause 5.1 Network Attachment + * @see ETSI TS 103 795-2 Clause 5.1 Network Attachment */ group NetworkAttachment { group UENetworkAttachmentWithUSIM { + /** + * @desc UE Emergency Network Attachment and Establishment of the Emergency Bearer with USIM. + * On successful emergency attachment, the UE/IVS should discover the P-CSCF IP address. + * The EPC will create the Emergency Bearers which will allow communication only between the UE and the P-CSCF + * and allowed forwarding towards E-CSCF + * @see ETSI TS 103 795-2 Clause 5.1.1 + * TS 124 229 [2], clause 9.2.1 and L.2.2.6; TS 129 212 [7], clauses 4.5.15 and 4a.5.12; + * TS 129 272 [8], clause 5.2.1.1 (MME shall proceed even if Update Location fails) + * + */ + testcase TC_VoLTE_ECO_INT_ATT_01 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A ); + + // f_validate_uar('010001a0c000012c010000000001fc43c521ba2d000001074000002d7363736366696d73342e696d73342e69736b726174656c2e6d616b3b3131303b373131333400000000000104400000200000010a4000000c000028af000001024000000c01000000000001154000000c0000000100000108400000237363736366696d73342e696d73342e69736b726174656c2e6d616b000000012840000019696d73342e69736b726174656c2e6d616b00000000000125400000236873733131696d73342e696d73342e69736b726174656c2e6d616b000000011b40000019696d73342e69736b726174656c2e6d616b00000000000258c000001d000028af696d73342e69736b726174656c2e6d616b0000000000026fc0000010000028af0000000000000259c0000041000028af7369703a30303130313130303130303232303740696d732e6d6e633030312e6d63633030312e336770706e6574776f726b2e6f7267000000000000014000003930303130313130303130303232303740696d732e6d6e633030312e6d63633030312e336770706e6574776f726b2e6f7267000000'O); + // stop; + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_DIAMETER_GX_INTERFACENAME,PX_DIAMETER_S6A_INTERFACENAME})){ + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // preamble + f_mtc_userRadioEnabled ( v_ueA, true, true ); // UA-A trigger an initial network_attachment by enabling radio interface of its mobile + + // test body + // Check that user A starts initial network attachment + f_mtc_check_TP_S6A_MME_ULR_01 ( vc_vxlte_monitor_components.s6a, true ); // Check (ULR – Event 2) + f_mtc_check_TP_S6A_HSS_ECO_ULA_01 ( vc_vxlte_monitor_components.s6a); // Check (ULA – Event 3) + f_mtc_check_TP_GX_PCRF_ECO_CCA_01 ( vc_vxlte_monitor_components.gx); // Check (CCR, CCA – Events 4, 5) + + // postamble + f_mtc_userRadioEnabled ( v_ueA, false, true ); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_INT_ATT_01 + + + // function f_validate_uar(in octetstring p_uar) { + // var bitstring v_conv := oct2bit(p_uar); + // var UAR_MSG v_msg; + // var integer v_result := decvalue(v_conv, v_msg); + // log("msg: ", v_msg); + // if (v_result == 0) { + // var octetstring v_uar_enc := bit2oct(encvalue(v_msg)); + // log("v_uar_enc: ", v_uar_enc); + // log("Matching v_uar_enc: ", match(p_uar, v_uar_enc)); + // if (match(p_uar, v_uar_enc)) { + // setverdict(pass); + // } else { + // setverdict(fail); + // } + // } else { + // setverdict(fail); + // } + // stop; + // } } // End of group UENetworkAttachmentWithUSIM group UENetworkAttachmentWithoutUSIM { + /** + * @desc UE Emergency Network Attachment and Establishment of the Emergency Bearer without USIM. + * On successful emergency attachment, the UE/IVS should discover the P-CSCF IP address. + * The EPC will create the Emergency Bearers which will allow communication only between the UE and the P-CSCF + * and allowed forwarding towards E-CSCF + * @see ETSI TS 103 795-2 Clause 5.1.2 + * TS 124 229 [2], clause 9.2.1 and L.2.2.6; TS 129 212 [7], clauses 4.5.15 and 4a.5.12; + * TS 129 272 [8], clause 5.2.1.1 (MME shall proceed even if Update Location fails) + * + */ + testcase TC_VoLTE_EMC_INT_ATT_02 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_DIAMETER_GX_INTERFACENAME,PX_DIAMETER_S6A_INTERFACENAME})){ + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // preamble + f_mtc_userRadioEnabled ( v_ueA, true, true ); // UA-A trigger an initial network_attachment by enabling radio interface of its mobile + + // test body + // Check that user A starts initial network attachment + f_mtc_check_TP_S6A_MME_ULR_01 ( vc_vxlte_monitor_components.s6a, true ); // Check (ULR – Event 2) + f_mtc_check_TP_S6A_HSS_ECO_ULA_01 ( vc_vxlte_monitor_components.s6a); // Check (ULA – Event 3) + f_mtc_check_TP_GX_PCRF_EMC_CCA_01 ( vc_vxlte_monitor_components.gx); // Check (CCR, CCA – Events 4, 5) + // postamble + f_mtc_userRadioEnabled ( v_ueA, false, true ); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_INT_ATT_02 } // End of group UENetworkAttachmentWithoutUSIM } // End of group NetworkAttachment /** - * @see ETSI TS 103 795-2 Clause 5.2 IMS Emergency Registration + * @see ETSI TS 103 795-2 Clause 5.2 IMS Emergency Registration */ group EmergencyRegistration { /** * @desc To perform emergency registration via the established emergency bearer. Note that some UEs perform emergency registration automatically on attachment - in which case this test becomes merged with the previous ones. - * @see ETSI TS 103 795-2 Clause 5.2.1 IMS Emergency Registration - Successful + * @see ETSI TS 103 795-2 Clause 5.2.1 IMS Emergency Registration - Successful */ testcase TD_VoLTE_ECO_INT_REG_01() runs on ImsTestCoordinator system IotSystemInterface { - - var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); - var ImsUserInfo v_userInfoA := f_getSipUserId ( PX_EUT_A ); - + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var ImsUserInfo v_userInfoA := f_getSipUserId ( PX_EUT_A_EMERGENCY ); + f_setVxLteMonIterfacesAvailability(); //Check required monitor interfaces due to TD if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, @@ -80,7 +205,7 @@ module AtsImsIot_Emergency { PX_DIAMETER_RX_INTERFACENAME, PX_DIAMETER_GX_INTERFACENAME})) { - f_cf_createVxLteMonitor(); + f_cf_createVxLteMonitor(); // map/connect component ports f_cf_adapter_up ( ); @@ -89,45 +214,45 @@ module AtsImsIot_Emergency { // preamble f_mtc_userRadioEnabled ( v_ueA, true, true ); // UA-A trigger an initial network_attachment by enabling radio interface of its mobile - + // Test body - f_mtc_check_TP_GM_PCSCF_REGISTER_01(vc_vxlte_monitor_components.gmA); // Events 1, 12 - f_mtc_check_TP_MW_PCSCF_REGISTER_01(vc_vxlte_monitor_components.mwPI); // Event 4, 11 - f_mtc_check_TP_MW_ICSCF_REGISTER_01(vc_vxlte_monitor_components.mwIS, true); // Event 7, 10 + f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_01(vc_vxlte_monitor_components.gmA); // Events 1, 12 + f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_01(vc_vxlte_monitor_components.mwPI); // Event 4, 11 + f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_01(vc_vxlte_monitor_components.mwIS, true); // Event 7, 10 - f_mtc_check_TP_CX_HSS_UAA_01(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 5, 6 + f_mtc_check_TP_CX_HSS_ECO_UAA_01(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 5, 6 f_mtc_check_TP_CX_HSS_MAA_01(vc_vxlte_monitor_components.cxSH);// Event 8, 9 - f_mtc_check_TP_GM_PCSCF_REGISTER_02(vc_vxlte_monitor_components.gmA); // Events 13, 22 - f_mtc_check_TP_MW_PCSCF_REGISTER_02(vc_vxlte_monitor_components.mwPI); // Events 14, 21 - f_mtc_check_TP_MW_ICSCF_REGISTER_02(vc_vxlte_monitor_components.mwIS, true); // Event 17, 20 - - f_mtc_check_TP_CX_HSS_UAA_02(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 15, 16 + f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_02(vc_vxlte_monitor_components.gmA); // Events 13, 22 + f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_02(vc_vxlte_monitor_components.mwPI); // Events 14, 21 + f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_02(vc_vxlte_monitor_components.mwIS, true); // Event 17, 20 + + f_mtc_check_TP_CX_HSS_ECO_UAA_02(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 15, 16 f_mtc_check_TP_CX_HSS_SAA_01(vc_vxlte_monitor_components.cxSH);// Event 18, 19 // postamble f_PO_user_home_deregistration ( v_ueA ); f_mtc_userRadioEnabled ( v_ueA, false, true ); - + //unmap/disconnet component ports f_cf_user_down ( v_ueA ); f_cf_VxLteMonitor_Down(); f_cf_adapter_down ( ); }else{ //log... - setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs"); } } // End of testcase TD_VoLTE_ECO_INT_REG_01 /** * @desc To attempt initial emergency registration via the established emergency bearer. In this case, the emergency registration is not successful due to not accepted UE credentials. Emergency call can be established without emergency registration. - * @see ETSI TS 103 795-2 Clause 5.2.2 IMS Emergency Registration - Unsuccessful + * @see ETSI TS 103 795-2 Clause 5.2.2 IMS Emergency Registration - Unsuccessful */ testcase TD_VoLTE_ECO_INT_REG_02() runs on ImsTestCoordinator system IotSystemInterface { - - var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); - var ImsUserInfo v_userInfoA := f_getSipUserId ( PX_EUT_A ); - + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var ImsUserInfo v_userInfoA := f_getSipUserId ( PX_EUT_A_EMERGENCY ); + f_setVxLteMonIterfacesAvailability(); //Check required monitor interfaces due to TD if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, @@ -138,7 +263,7 @@ module AtsImsIot_Emergency { PX_DIAMETER_RX_INTERFACENAME, PX_DIAMETER_GX_INTERFACENAME})) { - f_cf_createVxLteMonitor(); + f_cf_createVxLteMonitor(); // map/connect component ports f_cf_adapter_up ( ); @@ -147,82 +272,4040 @@ module AtsImsIot_Emergency { // preamble f_mtc_userRadioEnabled ( v_ueA, true, true ); // UA-A trigger an initial network_attachment by enabling radio interface of its mobile - + // Test body - f_mtc_check_TP_GM_PCSCF_REGISTER_01(vc_vxlte_monitor_components.gmA); // Events 1, 12 - f_mtc_check_TP_MW_PCSCF_REGISTER_01(vc_vxlte_monitor_components.mwPI); // Event 4, 11 - f_mtc_check_TP_MW_ICSCF_REGISTER_01(vc_vxlte_monitor_components.mwIS, true); // Event 7, 10 + f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_01(vc_vxlte_monitor_components.gmA); // Events 1, 12 + f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_01(vc_vxlte_monitor_components.mwPI); // Event 4, 11 + f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_01(vc_vxlte_monitor_components.mwIS, true); // Event 7, 10 - f_mtc_check_TP_CX_HSS_UAA_01(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 5, 6 + f_mtc_check_TP_CX_HSS_ECO_UAA_01(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 5, 6 f_mtc_check_TP_CX_HSS_MAA_01(vc_vxlte_monitor_components.cxSH);// Event 8, 9 - f_mtc_check_TP_GM_PCSCF_REGISTER_04(vc_vxlte_monitor_components.gmA); // Events 13, 22 - f_mtc_check_TP_MW_PCSCF_REGISTER_04(vc_vxlte_monitor_components.mwPI); // Events 14, 21 - f_mtc_check_TP_MW_ICSCF_REGISTER_04(vc_vxlte_monitor_components.mwIS, true); // Event 17, 20 + f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_03(vc_vxlte_monitor_components.gmA); // Events 13, 22 + f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_03(vc_vxlte_monitor_components.mwPI); // Events 14, 21 + f_mtc_check_TP_MW_ICSCF_REGISTER_03(vc_vxlte_monitor_components.mwIS, true); // Event 17, 20 + + f_mtc_check_TP_CX_HSS_ECO_UAA_02(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 15, 16 f_mtc_check_TP_CX_HSS_SAA_01(vc_vxlte_monitor_components.cxSH);// Event 18, 19 // postamble f_PO_user_home_deregistration ( v_ueA ); f_mtc_userRadioEnabled ( v_ueA, false, true ); - + //unmap/disconnet component ports f_cf_user_down ( v_ueA ); f_cf_VxLteMonitor_Down(); f_cf_adapter_down ( ); }else{ //log... - setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs"); } } // End of testcase TD_VoLTE_ECO_INT_REG_02 } // End of group EmergencyRegistration /** - * @see ETSI TS 103 795-2 Clause 5.3 Emergency Session and Emergency Bearer Operations + * @see ETSI TS 103 795-2 Clause 5.3 Emergency Session and Emergency Bearer Operations */ group EmergencySessionEmergencyBearerOperations { - } // End of group EmergencySessionEmergencyBearerOperations + /** + * @see ETSI TS 103 795-2 Clause 5.3.1 Emergency Session Establishment + */ + group EmergencySessionEstablishment { - /** - * @see ETSI TS 103 795-2 Clause 5.4 Emergency Deregistration - */ - group EmergencyNetworkDetachment { + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment within an emergency registration. + * PSAP is located in the IM CN subsystem of IMS A + * @see ETSI TS 103 795-2 Clause 5.3.1.2 UE calling PSAP with emergency registration + */ + testcase TD_VoLTE_ECO_INT_INI_01() runs on ImsTestCoordinator system IotSystemInterface { - group EmergencySessionEstablishment { + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); - } // End of group EmergencySessionEstablishment + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; - group EmergencySessionRelease { + f_cf_createVxLteMonitor(); - } // End of group EmergencySessionRelease + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); - group EmergencySessionAbortOrReject { + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01(); - } // End of group EmergencySessionAbortOrReject + // Test body + if (not PX_ECALL) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); - } // End of group EmergencyNetworkDetachment + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 - } // End of group Interoperability + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); - /** - * @see ETSI TS 103 795-2 Clause 6 Test Descriptions (Roaming) - */ - group Roaming { + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); - /** - * @see ETSI TS 103 795-2 6.1 Network Attachment - */ - group NetworkAttachment { + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 - } // End of group NetworkAttachment + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 - /** - * @see ETSI TS 103 795-2 Clause 6.2 IMS Emergency Registration in a visited network - */ - group IMSEmergencyRegistration { + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 20 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 21 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 22 - } // End of group IMSEmergencyRegistration + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueA); // Event 19 + f_mtc_userAnswerCall(v_psap); // Event 26 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // ACK Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_01 + + group f_TD_VoLTE_ECO_INT_INI_01 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01 + + } // End of group f_TD_VoLTE_ECO_INT_INI_01 + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session session establishment within non-emergency registration. + * PSAP is located in the IM CN subsystem of IMS A. + * @see ETSI TS 103 795-2 Clause 5.3.1.3 UE calling PSAP with non-emergency registration + * @remark This is option2: IBCF is connected to the PSAP, the interface IBCF and the PSAP is the Mm interface + */ + testcase TD_VoLTE_ECO_INT_INI_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_02(); + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_03(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_03(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueA); // Event 19 + f_mtc_userAnswerCall(v_psap); // Event 26 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_02 + + group f_TD_VoLTE_ECO_INT_INI_02 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_02 + + } // End of group f_TD_VoLTE_ECO_INT_INI_02 + + /** + * @desc To demonstrate the establishment of emergency bearers at the originating EPC due to SIP emergency session establishment without any registration. + * PSAP is located in the IM CN subsystem of IMS A. + * @see ETSI TS 103 795-2 Clause 5.3.1.4 UE calling PSAP without any registration + */ + testcase TD_VoLTE_ECO_INT_INI_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + // No registration for user A + f_mtc_userRegistration(v_psap, v_infoPsap); + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_03(); + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueA); // Event 19 + f_mtc_userAnswerCall(v_psap); // Event 26 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_03 + + group f_TD_VoLTE_ECO_INT_INI_03 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_03 + + } // End of group f_TD_VoLTE_ECO_INT_INI_03 + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment within an emergency registration. + * PSAP is located in the IM CN subsystem of IMS A. The PSAP URI is delivered by the LRF. + * @see ETSI TS 103 795-2 Clause 5.3.1.5 UE calling PSAP in same network, LRF derived PSAP URI + * @remark This is option2: IBCF is connected to the PSAP, the interface IBCF and the PSAP is the Mm interface + */ + testcase TD_VoLTE_ECO_INT_INI_04() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME, // E-CSCF -> PSAP + PX_SIP_ML_E_LRF_INTERFACENAME // E-CSCF -> LRF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + if (not(PX_ECALL)) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_ML_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mlE_LRF, -, v_sip); // Event 11 + f_mtc_check_TP_ML_ECSCF_ECO_3xx_01(vc_vxlte_monitor_components.mlE_LRF, -, v_sip); // Event 12 + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 13 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 14 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 15 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 23 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 24 + + f_mtc_userCheckRinging(v_psap); // Event 21 + f_mtc_userCheckPeerIsRinging(v_ueA); // Event 21 + f_mtc_userAnswerCall(v_psap); // Event 28 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 25 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 26 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 27 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // ACK Event 28 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 29 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 30 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 31 + f_mtc_userCheckCallEstablished(v_psap); // Event 31 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_04 + + group f_TD_VoLTE_ECO_INT_INI_04 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_04() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_04 + + } // End of group f_TD_VoLTE_ECO_INT_INI_04 + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment within an emergency registration. + * PSAP is located in the IM CN subsystem of another network connected via IBCF. + * @see ETSI TS 103 795-2 Clause 5.3.1.6 UE calling PSAP in other network via IBCF + */ + testcase TD_VoLTE_ECO_INT_INI_05 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS_B -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_05(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + if (not(PX_ECALL)) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + //f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MX_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 11 + f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + + f_mtc_check_TP_IC_IBCF_INVITE_01(vc_vxlte_monitor_components.ic, true); // INVITE Event 12 (NOTE: comment out if ISC simulated by Ic) + f_mtc_check_TP_IC_IBCF_INVITE_02(vc_vxlte_monitor_components.ic, true); // INVITE Event 12 (NOTE: comment out if ISC simulated by Ic) + f_mtc_check_TP_IC_IBCF_INVITE_03(vc_vxlte_monitor_components.ic); // INVITE ENUM Event 8 + + // 183 Session Progress + f_mtc_check_TP_IC_IBCF_183RESP_01(vc_vxlte_monitor_components.ic, -); // 183 Event 13 + f_mtc_check_TP_MX_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 14 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 15 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 16 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 17 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 18 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 19 + + f_mtc_check_TP_IC_IBCF_180RESP_01(vc_vxlte_monitor_components.ic); // 180 Ringing – Event 22 + f_mtc_check_TP_MX_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_userCheckRinging(v_psap); + f_mtc_userCheckPeerIsRinging(v_ueA); + f_mtc_userAnswerCall(v_psap); + + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 26 + f_mtc_check_TP_IC_IBCF_2XXRESP_02(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 26 + f_mtc_check_TP_IC_IBCF_2XXRESP_03(vc_vxlte_monitor_components.ic); // 200 OK – Event 26 + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 27 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 28 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 30 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 31 + f_mtc_check_TP_MX_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 32 + f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.ic); // ACK – Event 33 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 34 + f_mtc_userCheckCallEstablished(v_psap); // Event 34 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_05 + + group f_TD_VoLTE_ECO_INT_INI_05 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_05() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_05 + + } // End of f_TD_VoLTE_ECO_INT_INI_05 + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment within an emergency registration. + * PSAP is located in the IM CN subsystem of another network vonnected via IBCF. The PSAP URI is delivered by the LRF. + * @see ETSI TS 103 795-2 Clause 5.3.1.7 UE calling PSAP in other network via IBCF, LRF derived PSAP URI + * @remark This is option2: IBCF is connected to the PSAP, the interface IBCF and the PSAP is the Mm interface + */ + testcase TD_VoLTE_ECO_INT_INI_06() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME, // IBCF -> IMS_B -> PSAP + PX_SIP_ML_E_LRF_INTERFACENAME // E-CSCF -> LRF: mlE_LRF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_06(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + if (not(PX_ECALL)) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + //f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + // FIXME f_mtc_check_TP_MW_IBCF_xxx <--> f_mtc_check_TP_ML_EBCF_xxx + f_mtc_check_TP_ML_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mlE_LRF, -, v_sip); // Event 11 + f_mtc_check_TP_MX_LRF_3xxAny_01(vc_vxlte_monitor_components.mlE_LRF, -, v_sip); // Event 12 + + f_mtc_check_TP_MX_ECSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 13 + f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + + f_mtc_check_TP_IC_IBCF_INVITE_01(vc_vxlte_monitor_components.ic, true); // INVITE Event 14 + f_mtc_check_TP_IC_IBCF_INVITE_02(vc_vxlte_monitor_components.ic, true); // INVITE Event 14 + f_mtc_check_TP_IC_IBCF_183RESP_01(vc_vxlte_monitor_components.ic,-); // 183 Event 15 + + + // 183 Session Progress + f_mtc_check_TP_MX_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 16 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 24 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 18 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 19 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 20 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 21 + + f_mtc_check_TP_IC_IBCF_180RESP_01(vc_vxlte_monitor_components.ic, true); // 180 Ringing – Event 24 + f_mtc_check_TP_MX_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 25 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 26 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 27 + + f_mtc_userCheckRinging(v_psap); + f_mtc_userCheckPeerIsRinging(v_ueA); + f_mtc_userAnswerCall(v_psap); + + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 28 + f_mtc_check_TP_IC_IBCF_2XXRESP_02(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 28 + f_mtc_check_TP_IC_IBCF_2XXRESP_03(vc_vxlte_monitor_components.ic); // 200 OK – Event 28 + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 29 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 30 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 31 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 32 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 33 + f_mtc_check_TP_MX_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 34 + f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.ic); // ACK – Event 35 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 36 + f_mtc_userCheckCallEstablished(v_psap); // Event 36 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_06 + + group f_TD_VoLTE_ECO_INT_INI_06 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_06() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_06 + + } // End of group f_TD_VoLTE_ECO_INT_INI_06 + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment within an emergency registration. + * PSAP is located in the PSTN connected via BGCF. + * @see ETSI TS 103 795-2 Clause 5.3.1.8 UE calling PSAP in PSTN via BGCF + */ + testcase TD_VoLTE_ECO_INT_INI_07() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_07(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + if (not(PX_ECALL)) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + //f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MI_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 11 + f_mtc_check_TP_MI_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 12 + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 13 + f_mtc_check_TP_MI_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 14 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 15 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 16 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 17 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 18 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 19 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 22 + f_mtc_check_TP_MI_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_userCheckRinging(v_psap); + f_mtc_userCheckPeerIsRinging(v_ueA); + f_mtc_userAnswerCall(v_psap); + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK – Event 26 + f_mtc_check_TP_MI_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 27 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 28 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 30 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 31 + f_mtc_check_TP_MI_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 32 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 33 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 34 + f_mtc_userCheckCallEstablished(v_psap); // Event 34 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_07 + + group f_TD_VoLTE_ECO_INT_INI_07 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_07() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_07 + + } // End of group f_TD_VoLTE_ECO_INT_INI_07 + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment within an emergency registration. + * PSAP is located in the PSTN connected via BGCF. The PSAP URI is delivered by the LRF + * @see ETSI TS 103 795-2 Clause 5.3.1.9 UE calling PSAP in PSTN via BGCF, LRF derived PSAP URI + */ + testcase TD_VoLTE_ECO_INT_INI_08() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> BGCF + PX_SIP_ML_E_LRF_INTERFACENAME // E-CSCF -> LRF: mlE_LRF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_08(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + + if (not(PX_ECALL)) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + //f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + // FIXME f_mtc_check_TP_MW_IBCF_xxx <--> f_mtc_check_TP_ML_EBCF_xxx + f_mtc_check_TP_ML_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mlE_LRF, -, v_sip); // Event 11 + f_mtc_check_TP_MX_LRF_3xxAny_01(vc_vxlte_monitor_components.mlE_LRF, -, v_sip); // Event 12 + + f_mtc_check_TP_MX_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 13 + f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + + f_mtc_check_TP_IC_IBCF_INVITE_01(vc_vxlte_monitor_components.ic, true); // INVITE Event 14 + f_mtc_check_TP_IC_IBCF_INVITE_02(vc_vxlte_monitor_components.ic, true); // INVITE Event 14 + f_mtc_check_TP_IC_IBCF_183RESP_01(vc_vxlte_monitor_components.ic,-); // 183 Event 15 + + // 183 Session Progress + f_mtc_check_TP_MX_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 16 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 24 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 18 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 19 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 20 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 21 + + f_mtc_check_TP_IC_IBCF_180RESP_01(vc_vxlte_monitor_components.ic, true); // 180 Ringing – Event 24 + f_mtc_check_TP_MX_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 25 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 26 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 27 + + f_mtc_userCheckRinging(v_psap); + f_mtc_userCheckPeerIsRinging(v_ueA); + f_mtc_userAnswerCall(v_psap); + + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 28 + f_mtc_check_TP_IC_IBCF_2XXRESP_02(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 28 + f_mtc_check_TP_IC_IBCF_2XXRESP_03(vc_vxlte_monitor_components.ic); // 200 OK – Event 28 + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 29 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 30 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 31 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 32 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 33 + f_mtc_check_TP_MX_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 34 + f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.ic); // ACK – Event 35 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 36 + f_mtc_userCheckCallEstablished(v_psap); // Event 36 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_08 + + group f_TD_VoLTE_ECO_INT_INI_08 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_08() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_08 + + } // End of group f_TD_VoLTE_ECO_INT_INI_08 + + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment over AS with non-emergency registration. + * PSAP is located in the IM CN subsystem of IMS A. + * + * @see ETSI TS 103 795-2 Clause 5.3.1.10 UE calling PSAP over AS with non-emergency registration + */ + testcase TD_VoLTE_ECO_INT_INI_09() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_MM_B_PSAP_INTERFACENAME, + PX_SIP_ISC_INTERFACENAME + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_09_01(); + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_infoPsap); + action("UE A needs to trigger an emergency call"); // Event 1 + + // Session INVITE + f_mtc_check_TP_ISC_SCSCF_ECO_INVITE_01(vc_vxlte_monitor_components.isc, -, v_sip); // INVITE Event 2 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.isc, -, v_sip); + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwIE, -, v_sip); // Event 3 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwIE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // Event 4 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // Event 5 + f_mtc_check_TP_MI_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwIE, -, v_sip); // Event 6 + f_mtc_check_TP_ISC_SCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.isc, -, v_sip); // Event 7 + + // 180 Ringing + f_mtc_check_TP_IC_IBCF_180RESP_01(vc_vxlte_monitor_components.mwS_PSAP, true); // 180 Ringing – Event 10 + f_mtc_check_TP_MX_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwIE, -, v_sip); // Event 11 + f_mtc_check_TP_ISC_SCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.isc, -, v_sip); // Event 12 + + f_mtc_userCheckRinging(v_psap); + f_mtc_userCheckPeerIsRinging(v_ueA); + f_mtc_userAnswerCall(v_psap); + + // 200 OK + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // Event 14 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwIE, -, v_sip); // Event 15 + f_mtc_check_TP_ISC_SCSCF_ECO_200OK_01(vc_vxlte_monitor_components.isc, -, v_sip); // Event 16 + + f_mtc_check_TP_ISC_SCSCF_ECO_ACK_01(vc_vxlte_monitor_components.isc, -, v_sip); // Event 19 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwIE, -, v_sip); // Event 20 + f_mtc_check_TP_MX_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // Event 21 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 22 + f_mtc_userCheckCallEstablished(v_psap); // Event 22 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_09 + + group f_TD_VoLTE_ECO_INT_INI_09 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_09_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_09 + + } // End of group f_TD_VoLTE_ECO_INT_INI_09 + + /** + * @desc To demonstrate that if an emergency call has been terminated, the attempt by the PSAP call taker to communicate back to the emergency caller shall be answered. + * @see ETSI TS 103 795-2 Clause 5.3.1.11 Callback from PSAP + * @remark Option 1: PSAP in IMS A + */ + testcase TD_VoLTE_ECO_INT_INI_10_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME // E-CSCF -> BGCF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_01(); + + // Test body + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_03(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 6 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 7 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 8 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 9 + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 10 + + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 16 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 20 + + f_mtc_userCheckRinging(v_ueA); // Event 15 + f_mtc_userCheckPeerIsRinging(v_psap); // Event 15 + f_mtc_userAnswerCall(v_ueA); // Event 26 + + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 19 + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 21 + + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 35 + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // ACK Event 36 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 37 + f_mtc_userCheckCallEstablished(v_psap); // Event 37 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_10_01 + + group f_TD_VoLTE_ECO_INT_INI_10_01 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_01 + + } // End of group f_TD_VoLTE_ECO_INT_INI_10_01 + + /** + * @desc To demonstrate that if an emergency call has been terminated, the attempt by the PSAP call taker to communicate back to the emergency caller shall be answered. + * @see ETSI TS 103 795-2 Clause 5.3.1.11 Callback from PSAP + * @remark Option 2: PSAP NOT in IMS A + */ + testcase TD_VoLTE_ECO_INT_INI_10_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS_B -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_02(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_IC_IBCF_INVITE_01(vc_vxlte_monitor_components.ic); // Event 2 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.ic, -, v_sip); + + f_mtc_check_TP_MX_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 3 + f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 6 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_GM_PCSCF_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 7 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 8 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 9 + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 10 + + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 16 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 20 + + f_mtc_userCheckRinging(v_ueA); // Event 15 + f_mtc_userCheckPeerIsRinging(v_psap); // Event 15 + f_mtc_userAnswerCall(v_ueA); // Event 26 + + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 19 + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 21 + + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 35 + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // ACK Event 36 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 37 + f_mtc_userCheckCallEstablished(v_psap); // Event 37 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_10_02 + + group f_TD_VoLTE_ECO_INT_INI_10_02 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_02 + + } // End of group f_TD_VoLTE_ECO_INT_INI_10_02 + + /** + * @desc To demonstrate that if an emergency call has been terminated, the attempt by the PSAP call taker to communicate back to the emergency caller shall be answered. + * @see ETSI TS 103 795-2 Clause 5.3.1.11 Callback from PSAP + * @remark Option 3: PSAP in PSTN A + */ + testcase TD_VoLTE_ECO_INT_INI_10_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME // E-CSCF -> BGCF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_03(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + f_mtc_check_TP_IC_IBCF_INVITE_02(vc_vxlte_monitor_components.ic); // Event 4 + + f_mtc_check_TP_MX_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 5 + f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 6 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_GM_PCSCF_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 7 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 8 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 9 + + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_IC_IBCF_183RESP_01(vc_vxlte_monitor_components.ic); // Event 14 + + f_mtc_userCheckRinging(v_ueA); // Event 15 + f_mtc_userCheckPeerIsRinging(v_psap); // Event 15 + + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 16 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 19 + + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 29 + f_mtc_check_TP_IC_IBCF_180RESP_01(vc_vxlte_monitor_components.ic); // Event 30 + + f_mtc_check_TP_MW_PCSCF_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 31 + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic); // Event 32 + + f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.ic); // Event 33 + f_mtc_check_TP_MW_PCSCF_ACK_02(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 34 + + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 35 + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // ACK Event 36 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 37 + f_mtc_userCheckCallEstablished(v_psap); // Event 37 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_10_03 + + group f_TD_VoLTE_ECO_INT_INI_10_03 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_10_03 + + } // End of group f_TD_VoLTE_ECO_INT_INI_10_03 + + } // End of group EmergencySessionEstablishment + + group EmergencySessionRelease { + + /** + * @desc To perform originating UE session release and the tear down of related dedicated bearers. + * @see ETSI TS 103 795-2 Clause 5.3.2.1 UE Initiated Emergency Session Release + * @remark This is option 1: PSAP is in IMS A network + */ + testcase TD_VoLTE_EMC_INT_REL_01_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_01(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + f_mtc_check_TP_MW_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 3 + f_mtc_check_TP_MM_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 4 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 10 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 11) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 12) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 13) + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 13 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 18 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 19 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 20 + f_mtc_userCheckCallCancelled(v_psap); // Event 21 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_EMC_INT_REL_01_01 + + group f_TD_VoLTE_EMC_INT_REL_01_01 { + + function f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_01 + + } // End of group f_TD_VoLTE_EMC_INT_REL_01_01 + + /** + * @desc To perform originating UE session release and the tear down of related dedicated bearers. + * @see ETSI TS 103 795-2 Clause 5.3.2.1 UE Initiated Emergency Session Release + * @remark This is option 2: PSAP is not in IMS A network + */ + testcase TD_VoLTE_EMC_INT_REL_01_02 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS_B -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_02(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + + f_mtc_check_TP_GM_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + f_mtc_check_TP_MW_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 3 + f_mtc_check_TP_MX_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 5 + f_mtc_check_TP_IC_IBCF_ECO_BYE_01(vc_vxlte_monitor_components.ic); // Event 6 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 10 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 11) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 12) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 13) + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 15 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 18 + f_mtc_check_TP_GM_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 19 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 22 + f_mtc_userCheckCallCancelled(v_psap); // Event 23 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC f_TD_VoLTE_EMC_INT_REL_01_01 + + group f_TD_VoLTE_EMC_INT_REL_01_02 { + + function f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + } // End of function f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_02 + + } // End of f_TD_VoLTE_EMC_INT_REL_01_02 + + /** + * @desc To perform originating UE session release and the tear down of related dedicated bearers. + * @see ETSI TS 103 795-2 Clause 5.3.3.1 UE Initiated Emergency Session Release + * @remark This is option 3: PSAP is in PSTN network + */ + testcase TD_VoLTE_EMC_INT_REL_01_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_03(); + + // Test body + + // SIP BYE + f_mtc_check_TP_GM_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + f_mtc_check_TP_MW_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 3 + f_mtc_check_TP_MI_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 7 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 10 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 11) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 12) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 13) + + f_mtc_check_TP_MI_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 17 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 20 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 21 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 22 + f_mtc_userCheckCallCancelled(v_psap); // Event 23 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_EMC_INT_REL_01_03 + + group f_TD_VoLTE_EMC_INT_REL_01_03 { + + function f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_EMC_INT_REL_01_03 + + } // End of group f_TD_VoLTE_EMC_INT_REL_01_03 + + /** + * @desc To perform originating PSAP session release and the tear down of related dedicated bearers. + * @see ETSI TS 103 795-2 Clause 5.3.2.2 PSAP Initiated Emergency Session Release + * @remark This is option 1: PSAP is in IMS A network + */ + testcase TD_VoLTE_ECO_INT_REL_02_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_01(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + f_mtc_check_TP_MM_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 1 + f_mtc_check_TP_MW_PCSCF_ECO_BYE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 7 + f_mtc_check_TP_GM_PCSCF_ECO_BYE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 8 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 9 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // Event 10 + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // Event 1 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 12 + + f_mtc_check_TP_GM_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 13 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 14 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 15 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 21 + f_mtc_userCheckCallCancelled(v_psap); // Event 20 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REL_02_01 + + group f_TD_VoLTE_ECO_INT_REL_02_01 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_01 + + } // End of group f_TD_VoLTE_ECO_INT_REL_02_01 + + /** + * @desc To perform originating PSAP session release and the tear down of related dedicated bearers. + * @see ETSI TS 103 795-2 Clause 5.3.2.2 PSAP Initiated Emergency Session Release + * @remark This is option2: PSAP is not in IMS A network + */ + testcase TD_VoLTE_ECO_INT_REL_02_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_02(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + + f_mtc_check_TP_IC_IBCF_BYE_01(vc_vxlte_monitor_components.ic); // Event 3 + f_mtc_check_TP_MM_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 4 + + f_mtc_check_TP_MW_PCSCF_ECO_BYE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 7 + f_mtc_check_TP_GM_PCSCF_ECO_BYE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 8 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 9 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // Event 10 + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // Event 1 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 12 + + f_mtc_check_TP_GM_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 13 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 14 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 16 + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic); // Event 17 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 21 + f_mtc_userCheckCallCancelled(v_psap); // Event 20 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REL_02_02 + + group f_TD_VoLTE_ECO_INT_REL_02_02 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_02 + + } // End of group f_TD_VoLTE_ECO_INT_REL_02_02 + + /** + * @desc To perform originating PSAP session release and the tear down of related dedicated bearers. + * On call release initiated bye PSAP, the P-CSCF A should trigger the removal of all relevant previously created bearers + * @see ETSI TS 103 795-2 Clause 5.3.2.2 PSAP Initiated Emergency Session Release + * @remark This is option3: PSAP is in PSTN network + */ + testcase TD_VoLTE_ECO_INT_REL_02_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME // E-CSCF -> BGCF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_03(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + + action("PSAP Initiated Emergency Session Release via PSTN"); // Event 5 + f_mtc_check_TP_MX_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 6 + + f_mtc_check_TP_MW_PCSCF_ECO_BYE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 7 + f_mtc_check_TP_GM_PCSCF_ECO_BYE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 8 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 9 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // Event 10 + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // Event 1 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 12 + + f_mtc_check_TP_GM_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 13 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 14 + + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 18 + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic); // Event 19 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 21 + f_mtc_userCheckCallCancelled(v_psap); // Event 20 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REL_02_03 + + group f_TD_VoLTE_ECO_INT_REL_02_03 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REL_02_03 + + } // End of group f_TD_VoLTE_ECO_INT_REL_02_03 + + } // End of group EmergencySessionRelease + + /** + * @see ETSI TS 103 795-2 Clause 5.3.3 Emergency Session Abort/Reject + */ + group EmergencySessionAbortOrReject { + + /** + * @desc To perform SIP session abort (originating side) and the related interactions with PCRF A and EPC A. + * @see ETSI TS 103 795-2 Clause 5.3.3.1 Emergency Session Abort + * @remark This is option 1: PSAP is in IMS A network + */ + testcase TD_VoLTE_EMC_INT_ABT_01_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_01(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 1 + + //Rx/Gx exchange after CANCEL was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 2 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 3) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 4) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 5) + + f_mtc_check_TP_MW_PCSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 6 + + // Option 1 + f_mtc_check_TP_MM_ECSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 7 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 8 + + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + + f_mtc_check_TP_MW_PCSCF_EMC_487INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_487INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 28 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 33 + f_mtc_userCheckCallCancelled(v_psap); // Event 34 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_EMC_INT_ABT_01_01 + + group f_TD_VoLTE_EMC_INT_ABT_01_01 { + + function f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_01 + + } // End of group f_TD_VoLTE_EMC_INT_ABT_01_01 + + /** + * @desc To perform SIP session abort (originating side) and the related interactions with PCRF A and EPC A. + * @see ETSI TS 103 795-2 Clause 5.3.3.1 Emergency Session Abort + * @remark This is option 2: PSAP is not in IMS A network + */ + testcase TD_VoLTE_EMC_INT_ABT_01_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_02(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 1 + + //Rx/Gx exchange after CANCEL was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 2 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 3) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 4) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 5) + + f_mtc_check_TP_MW_PCSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 6 + + f_mtc_check_TP_MX_ECSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 9 + f_mtc_check_TP_IC_IBCF_CANCEL_01(vc_vxlte_monitor_components.ic, true); // CANCEL Event 10 (NOTE: comment out if ISC simulated by Ic) + + f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic); // 200 CANCEL – Event 11 + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 12 + + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + + f_mtc_check_TP_IC_IBCF_487INVITE_01(vc_vxlte_monitor_components.ic); // Event 20 + f_mtc_check_TP_MX_ECSCF_EMC_487INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 21 + f_mtc_check_TP_MW_PCSCF_EMC_487INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_487INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MX_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 29 + f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.ic, true); // Event 30 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 33 + f_mtc_userCheckCallCancelled(v_psap); // Event 34 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_EMC_INT_ABT_01_02 + + group f_TD_VoLTE_EMC_INT_ABT_01_02 { + + function f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_02 + + } // End of group f_TD_VoLTE_EMC_INT_ABT_01_02 + + /** + * @desc To perform SIP session abort (originating side) and the related interactions with PCRF A and EPC A. + * @see ETSI TS 103 795-2 Clause 5.3.3.1 Emergency Session Abort + * @remark This is option 3: PSAP is in PSTN network + */ + testcase TD_VoLTE_EMC_INT_ABT_01_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_03(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 1 + + //Rx/Gx exchange after CANCEL was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 2 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 3) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 4) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 5) + + f_mtc_check_TP_MW_PCSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 6 + + f_mtc_check_TP_MI_ECSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 13 + f_mtc_check_TP_MM_ECSCF_EMC_CANCEL_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 14 + f_mtc_check_TP_MI_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 16 + + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 17 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + + f_mtc_check_TP_MM_ECSCF_EMC_487INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 22 + f_mtc_check_TP_MI_ECSCF_EMC_487INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 23 + f_mtc_check_TP_MW_PCSCF_EMC_487INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_487INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MI_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 31 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 32 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 33 + f_mtc_userCheckCallCancelled(v_psap); // Event 34 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_EMC_INT_ABT_01_03 + + group f_TD_VoLTE_EMC_INT_ABT_01_03 { + + function f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_EMC_INT_ABT_01_03 + + } // End of group f_TD_VoLTE_EMC_INT_ABT_01_03 + + /** + * @desc To demonstrate interaction between UE A and PSAP when an emergency session is rejected. + * @see ETSI TS 103 795-2 5.3.3.2 Emergency Session Reject from PSAP + * @remark This is option 1: PSAP is in IMS A network + */ + testcase TD_VoLTE_ECO_INT_REJ_01_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + f_cf_user_down ( v_psap ); // PSAP unavailable + f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_01(); + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 3 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 4 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 5 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 6 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 7 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 8,9 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 10,11 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_03(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + // 480 Temporary Unvailable + f_mtc_check_TP_MM_ECSCF_ECO_480INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 480 Temporary Unavailables Event 14 + f_mtc_check_TP_MW_PCSCF_ECO_480INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 23 + + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 24 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 25 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 26 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 27 + + f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 28 + + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 30 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 31 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 36 + f_mtc_userCheckCallCancelled(v_psap); // Event 37 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REJ_01_01 + + group f_TD_VoLTE_ECO_INT_REJ_01_01 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_01 + + } // End of group f_TD_VoLTE_ECO_INT_REJ_01_01 + + /** + * @desc To demonstrate interaction between UE A and PSAP when an emergency session is rejected. + * @see ETSI TS 103 795-2 5.3.4.3 Emergency Session Reject + * @remark This is option 1: PSAP is not in IMS A network + */ + testcase TD_VoLTE_ECO_INT_REJ_01_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + f_cf_user_down ( v_psap ); // PSAP unavailable + + f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_02(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 3 + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 3 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 4 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 5 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 6 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 7 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 8,9 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 10,11 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 15 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_IC_IBCF_INVITE_01(vc_vxlte_monitor_components.ic); // INVITE Event 16 (NOTE: comment out if ISC simulated by Ic) + + // 480 Temporary Unavailable + f_mtc_check_TP_IC_IBCF_480TEMPAV_01(vc_vxlte_monitor_components.ic, -, v_sip); // INVITE Event 18 (NOTE: comment out if ISC simulated by Ic) + f_mtc_check_TP_MW_PCSCF_ECO_480INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 23 + + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 24 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 25 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 26 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 27 + + f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 28 + + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 30 + f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.mmB_PSAP); // Event 31 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 36 + f_mtc_userCheckCallCancelled(v_psap); // Event 37 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REJ_01_02 + + group f_TD_VoLTE_ECO_INT_REJ_01_02 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_02 + + } // End of group f_TD_VoLTE_ECO_INT_REJ_01_02 + + /** + * @desc To demonstrate interaction between UE A and PSAP when an emergency session is rejected. + * @see ETSI TS 103 795-2 5.3.4.3 Emergency Session Reject + * @remark This is option 1: PSAP is in PSTN network + */ + testcase TD_VoLTE_ECO_INT_REJ_01_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + f_cf_user_down ( v_psap ); // PSAP unavailable + + f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_03(); + + // Test body + //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB); + + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 3 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 4 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 5 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 6 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 7 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 8,9 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 10,11 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MI_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 19 + f_mtc_check_TP_MI_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwEB, -, v_sip); + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 20 + + // 480 Temporary Unavailable + f_mtc_check_TP_MM_ECSCF_ECO_480INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 21 + f_mtc_check_TP_MI_ECSCF_ECO_480INVITE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_480INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 23 + + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 24 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 25 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 26 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 27 + + f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 28 + + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 30 + f_mtc_check_TP_MI_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 34 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 35 + + f_mtc_userCheckCallTerminated(v_ueA); // Event 33 + f_mtc_userCheckCallCancelled(v_psap); // Event 34 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REJ_01_03 + + group f_TD_VoLTE_ECO_INT_REJ_01_03 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_01_03 + + } // End of group f_TD_VoLTE_ECO_INT_REJ_01_03 + + /** + * @desc To demonstrate interaction between UE A and P-CSCF when an emergency session is rejected. + * @see ETSI TS 103 795-2 Clause 5.3.3.3 Emergency Session Reject - IMS not able to handle emergency sessions + */ + testcase TD_VoLTE_ECO_INT_REJ_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + // Configure IMS so that IMS is not capable to handle emergency session + f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_02(); + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 3 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REJ_02 + + group f_TD_VoLTE_ECO_INT_REJ_02 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + log("Check that IMS is not capable to handle emergency session"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_02 + + } // End of group f_TD_VoLTE_ECO_INT_REJ_02 + + /** + * @desc To demonstrate interaction between UE A and P-CSCF when an emergency session is rejected due to wrong urn + * @see ETSI TS 103 795-2 Clause 5.3.3.4 Emergency Session Reject – due to wrong urn + */ + testcase TD_VoLTE_ECO_INT_REJ_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_03(); + + // Test body + //Send incorrect URN to SIP message + f_mtc_check_TP_GM_PCSCF_ECO_INVALID_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 3 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_REJ_03 + + group f_TD_VoLTE_ECO_INT_REJ_03 { + + function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_REJ_03 + + } // End of group f_TD_VoLTE_ECO_INT_REJ_03 + + } // End of group EmergencySessionAbortOrReject + + + + /** + * @see ETSI TS 103 795-2 Clause 5.3.4 NG eCall tests + */ + group NGeCallTests { + + /** + * @desc To demonstrate the establishment of IMS emergency call of the (automatically or manually) initiated eCall type of emergency service within an emergency registration + * @see ETSI TS 103 795-2 Clause 5.3.4.1 MSD sent during NG eCall establishment + */ + testcase TD_VoLTE_NGC_INT_INI_01() runs on ImsTestCoordinator system IotSystemInterface { + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_NGC_INT_INI_01(); + + // Test body + f_mtc_check_TP_GM_PCSCF_NGC_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_NGC_INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_NGC_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 18 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 20 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 21 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 22 + + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueA); // Event 19 + f_mtc_userAnswerCall(v_psap); // Event 26 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // ACK Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueA); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + + } // End of TC TD_VoLTE_NGC_INT_INI_01 + + group f_TD_VoLTE_NGC_INT_INI_01 { + + function f_mtc_check_precond_TD_VoLTE_NGC_INT_INI_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_NGC_INT_INI_01 + + } // End of group f_TD_VoLTE_NGC_INT_INI_01 + + + /** + * @desc To demonstrate the if an IMS emergency call of the (automatically or manually) initiated eCall type of emergency service has been established, + * the attempt by the PSAP to request transfer of an updated MSD shall be answered. + * @see ETSI TS 103 795-2 Clause 5.3.4.1 MSD update during NG eCall + */ + testcase TD_VoLTE_NGC_INT_INF_01_01() runs on ImsTestCoordinator system IotSystemInterface { + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + f_mtc_check_precond_TD_VoLTE_NGC_INT_INF_01(); + + // Test body + + //Send INFO + f_mtc_check_TP_MM_ECSCF_NGC_INFO_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // INFO Event 1 + f_mtc_check_TP_MW_PCSCF_NGC_INFO_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // INFO Event 6 + f_mtc_check_TP_GM_PCSCF_NGC_INFO_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INFO Event 7 + + //Receive INFO + + f_mtc_check_TP_GM_PCSCF_NGC_INFO_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INFO Event 8 + f_mtc_check_TP_MW_PCSCF_NGC_INFO_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // INFO Event 9 + f_mtc_check_TP_MM_ECSCF_NGC_INFO_02(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // INFO Event 10 + + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + + } // End of TC TD_VoLTE_NGC_INT_INF_01_01 + + testcase TD_VoLTE_NGC_INT_INF_01_02() runs on ImsTestCoordinator system IotSystemInterface { + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME // E-CSCCF -> IBCF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + f_mtc_check_precond_TD_VoLTE_NGC_INT_INF_01(); + + // Test body + + //Send INFO + f_mtc_check_TP_MX_ECSCF_NGC_INFO_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // INFO Event 3 + f_mtc_check_TP_MW_PCSCF_NGC_INFO_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // INFO Event 6 + f_mtc_check_TP_GM_PCSCF_NGC_INFO_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INFO Event 7 + + //Receive INFO + + f_mtc_check_TP_GM_PCSCF_NGC_INFO_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INFO Event 8 TODO + f_mtc_check_TP_MW_PCSCF_NGC_INFO_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // INFO Event 9 TODO + f_mtc_check_TP_MX_ECSCF_NGC_INFO_02(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // INFO Event 11 + + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + + } // End of TC TD_VoLTE_NGC_INT_INF_01_02 + + testcase TD_VoLTE_NGC_INT_INF_01_03() runs on ImsTestCoordinator system IotSystemInterface { + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MI_EB_INTERFACENAME // E-CSCCF -> BGCF + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + f_mtc_check_precond_TD_VoLTE_NGC_INT_INF_01(); + + // Test body + + //Send INFO + f_mtc_check_TP_MI_ECSCF_NGC_INFO_01(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // INFO Event 5 + f_mtc_check_TP_MW_PCSCF_NGC_INFO_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // INFO Event 6 + f_mtc_check_TP_GM_PCSCF_NGC_INFO_01(vc_vxlte_monitor_components.gmA, -, v_sip); // INFO Event 7 + + //Receive INFO + + f_mtc_check_TP_GM_PCSCF_NGC_INFO_02(vc_vxlte_monitor_components.gmA, -, v_sip); // INFO Event 8 TODO + f_mtc_check_TP_MW_PCSCF_NGC_INFO_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // INFO Event 9 TODO + f_mtc_check_TP_MI_ECSCF_NGC_INFO_02(vc_vxlte_monitor_components.mwS_PSAP, -, v_sip); // INFO Event 13 + + + // Postamble + f_mtc_EndCall(v_ueA); + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + + } // End of TC TD_VoLTE_NGC_INT_INF_01_03 + + group f_TD_VoLTE_NGC_INT_INF_01 { + + function f_mtc_check_precond_TD_VoLTE_NGC_INT_INF_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_NGC_INT_INI_01 + + } // End of group f_TD_VoLTE_NGC_INT_INF_01_01 + } + + } // End of group EmergencySessionEmergencyBearerOperations + + /** + * @see ETSI TS 103 795-2 Clause 5.5 Emergency Network Detachment + */ + group EmergencyNetworkDetachment { + + group EmergencySessionDetachment { + + /** + * @desc To demonstrate UE initiated network emergency detachment (IP-CAN session termination) for a UE that has not yet emergency registered to the IMS or for UE that has been emergency registered to the IMS + * @see ETSI TS 103 795-2 Clause 5.5.1 UE Emergency Network Detachment (with/without Emergency Registration) + */ + testcase TC_VoLTE_ECO_INT_DTC_01 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_DIAMETER_GX_INTERFACENAME})){ + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + //preamble + f_mtc_userRadioEnabled ( v_ueA, true, true ); // UE-A trigger an initial network_attachment by enabling radio interface of its mobile + f_mtc_userRadioEnabled ( v_ueA, false, true ); + + // test body + // Check that user A starts initial network attachment + f_mtc_check_TP_GX_PCRF_EMC_CCA_01(vc_vxlte_monitor_components.gx, false);//f_mtc_check_TP_GX_PCRF_ECO_CCA_02 ( vc_vxlte_monitor_components.gx, false ); // Check (CCA – Event 3) + + //postamble + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_INT_DTC_01 + + /** + * @desc To demonstrate UE initiated emergency network detachment (emergency IP-CAN session termination) for a UE that is emergency registered to IMS and also has active emergency session + * @see ETSI TS 103 795-2 Clause 5.5.2 UE Emergency Network Detachment with Previously Established Emergency Registration & Emergency Session + * @remark This is option 1: PSAP is in IMS A network + */ + testcase TC_VoLTE_ECO_INT_DTC_02_01 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })){ + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_01(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // Event 3 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // Event 4 + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // Event 5 + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // Event 6 + + f_mtc_check_TP_MW_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 7 + + f_mtc_check_TP_MM_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 8 + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 13 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 18 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 19 + + f_mtc_check_TP_GX_PCRF_ECO_CCA_02 ( vc_vxlte_monitor_components.gx, false ); // Check (CCA – Event 20) + + f_mtc_userCheckCallTerminated(v_ueA); // Event 22 + f_mtc_userCheckCallCancelled(v_psap); // Event 23 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_INT_DTC_02_01 + + group f_TC_VoLTE_ECO_INT_DTC_02_01 { + + function f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + } // End of function f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_01 + + } // End of f_TC_VoLTE_ECO_INT_DTC_02_01 + + /** + * @desc To demonstrate UE initiated emergency network detachment (emergency IP-CAN session termination) for a UE that is emergency registered to IMS and also has active emergency session + * @see ETSI TS 103 795-2 Clause 5.5.2 UE Emergency Network Detachment with Previously Established Emergency Registration & Emergency Session + * @remark This is option 2: PSAP is not in IMS A network + */ + testcase TC_VoLTE_ECO_INT_DTC_02_02 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MW_EB_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS_B -> PSAP + })){ + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_02(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 3 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 4) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 5) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 6) + + f_mtc_check_TP_MW_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 7 + + f_mtc_check_TP_MX_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 9 + f_mtc_check_TP_IC_IBCF_ECO_BYE_01(vc_vxlte_monitor_components.ic); // Event 10 + + f_mtc_check_TP_MX_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 15 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 18 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 19 + + f_mtc_check_TP_GX_PCRF_ECO_CCA_02 ( vc_vxlte_monitor_components.gx, false ); // Check (CCA – Event 20) + + f_mtc_userCheckCallTerminated(v_ueA); // Event 22 + f_mtc_userCheckCallCancelled(v_psap); // Event 23 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_INT_DTC_02_02 + + group f_TC_VoLTE_ECO_INT_DTC_02_02 { + + function f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + } // End of function f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_02 + + } // End of f_TC_VoLTE_ECO_INT_DTC_02_02 + + /** + * @desc To demonstrate UE initiated emergency network detachment (emergency IP-CAN session termination) for a UE that is emergency registered to IMS and also has active emergency session + * @see ETSI TS 103 795-2 Clause 5.5.2 UE Emergency Network Detachment with Previously Established Emergency Registration & Emergency Session + * @remark This is option 3: PSAP is in PSTN network + */ + testcase TC_VoLTE_ECO_INT_DTC_02_03 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, // E-CSCF -> IBCF + PX_SIP_IC_INTERFACENAME // IBCF -> IMS -> PSAP + })){ + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueA, v_userInfoA); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_03(); + f_mtc_userInitiateCall (v_ueA, v_infoPsap); // Event 1 + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 2 + + //Rx/Gx exchange after BYE was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_STR_01(vc_vxlte_monitor_components.rx); // (STR – Event 3 + f_mtc_check_TP_GX_PCRF_RAR_02(vc_vxlte_monitor_components.gx, true); // (RAR – Event 4) + f_mtc_check_TP_GX_PGW_RAA_03(vc_vxlte_monitor_components.gx); // (RAA – Event 5) + f_mtc_check_TP_RX_PCRF_STA_01(vc_vxlte_monitor_components.rx); // (STA – Event 6) + + f_mtc_check_TP_MW_PCSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 7 + + f_mtc_check_TP_MI_ECSCF_ECO_BYE_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 11 + + f_mtc_check_TP_MI_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwEB, -, v_sip); // Event 17 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 18 + f_mtc_check_TP_GM_PCSCF_200OK_02(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 19 + + f_mtc_check_TP_GX_PCRF_ECO_CCA_02 ( vc_vxlte_monitor_components.gx, false ); // Check (CCA – Event 20) + + f_mtc_userCheckCallTerminated(v_ueA); // Event 22 + f_mtc_userCheckCallCancelled(v_psap); // Event 23 + + // Postamble + f_PO_user_home_deregistration(v_ueA); + f_PO_user_home_deregistration(v_psap); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_INT_DTC_02_03 + + group f_TC_VoLTE_ECO_INT_DTC_02_03 { + + function f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + } // End of function f_mtc_check_precond_TC_VoLTE_ECO_INT_DTC_02_03 + + } // End of f_TC_VoLTE_ECO_INT_DTC_02_03 + + } // End of group EmergencySessionDetachment + + } // End of group EmergencyNetworkDetachment + + } // End of group Interoperability + + /** + * @see ETSI TS 103 795-2 Clause 6 Test Descriptions (Roaming) + */ + group Roaming { + + /** + * @see ETSI TS 103 795-2 6.1 Network Attachment + */ + group NetworkAttachment { + + group UENetworkAttachmentWithUSIM { + /** + * @desc Emergency Network Attachment and Establishment of the Emergency Bearer with USIM. + * On successful emergency attachment, the UE/IVS should discover the P-CSCF IP address. + * The EPC will create the Emergency Bearers which will allow communication only between the UE and the P-CSCF + * and allowed forwarding towards E-CSCF + * @see ETSI TS 103 795-2 6.1.1 UE Emergency Network Attachment with USIM + * TS 124 229 [2], clause 9.2.1 and L.2.2.6; TS 129 212 [7], clauses 4.5.15 and 4a.5.12; + * TS 129 272 [8], clause 5.2.1.1 (MME shall proceed even if Update Location fails) + * + */ + testcase TC_VoLTE_ECO_RMI_ATT_01 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser ( c_userUE_B ); + var ImsUserInfo v_userInfoB := f_getImUser ( PX_EUT_B ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_DIAMETER_GX_INTERFACENAME,PX_DIAMETER_S6A_INTERFACENAME})){ + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueB ); + f_cf_VxLteMonitor_Up(); + + // preamble + f_mtc_userRadioEnabled ( v_ueB, true, true ); // UE-B trigger an initial network_attachment by enabling radio interface of its mobile + + // test body + // TODO: Check that user B starts initial network attachment + f_mtc_check_TP_S6A_MME_ULR_01 ( vc_vxlte_monitor_components.s6a, true ); // Check (ULR – Event 2) + f_mtc_check_TP_S6A_HSS_ECO_ULA_01 ( vc_vxlte_monitor_components.s6a); // Check (ULA – Event 3) + f_mtc_check_TP_GX_PCRF_ECO_CCA_01 ( vc_vxlte_monitor_components.gx); // Check (CCR, CCA – Events 4, 5) + + // postamble + f_mtc_userRadioEnabled ( v_ueB, false, true ); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueB ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_RMI_ATT_01 + } // End of group UENetworkAttachmentWithUSIM + + group UENetworkAttachmentWithoutUSIM { + /** + * @desc Emergency Network Attachment and Establishment of the Emergency Bearer without USIM. + * On successful emergency attachment, the UE/IVS should discover the P-CSCF IP address. + * The EPC will create the Emergency Bearers which will allow communication only between the UE and the P-CSCF + * and allowed forwarding towards E-CSCF + * @see ETSI TS 103 795-2 6.1.2 UE Emergency Network Attachment without USIM + * TS 124 229 [2], clause 9.2.1 and L.2.2.6; TS 129 212 [7], clauses 4.5.15 and 4a.5.12; + * TS 129 272 [8], clause 5.2.1.1 (MME shall proceed even if Update Location fails) + * + */ + testcase TC_VoLTE_EMC_RMI_ATT_02 ( ) runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser ( c_userUE_B ); + var ImsUserInfo v_userInfoB := f_getImUser ( PX_EUT_B ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_DIAMETER_GX_INTERFACENAME,PX_DIAMETER_S6A_INTERFACENAME})){ + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueB ); + f_cf_VxLteMonitor_Up(); + + // preamble + f_mtc_userRadioEnabled ( v_ueB, true, true ); // UE-B trigger an initial network_attachment by enabling radio interface of its mobile + + // test body + // TODO Check that user B starts initial network attachment + f_mtc_check_TP_S6A_MME_ULR_01 ( vc_vxlte_monitor_components.s6a, true ); // Check (ULR – Event 2) + f_mtc_check_TP_S6A_HSS_ECO_ULA_01 ( vc_vxlte_monitor_components.s6a); // Check (ULA – Event 3) + f_mtc_check_TP_GX_PCRF_EMC_CCA_01 ( vc_vxlte_monitor_components.gx); // Check (CCR, CCA – Events 4, 5) + + // postamble + f_mtc_userRadioEnabled ( v_ueB, false, true ); + + //unmap/disconnect component ports + f_cf_user_down ( v_ueB ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + } // End of TC TC_VoLTE_ECO_RMI_ATT_02 + } // End of group UENetworkAttachmentWithoutUSIM + + } // End of group NetworkAttachment + + /** + * @see ETSI TS 103 795-2 Clause 6.2 IMS Emergency Registration in a visited network + */ + group IMSEmergencyRegistration { + + /** + * @desc To attempt initial emergency registration via the established emergency bearer. In this case, the emergency registration is not successful due to not accepted UE credentials. Emergency call can be established without emergency registration. + * @see ETSI TS 103 795-2 Clause 6.2.1 IMS Emergency Registration - Rejection + * @remark This is option 1: Emergency registration rejected by the visited network + */ + testcase TD_VoLTE_ECO_RMI_REG_01_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var ImsUserInfo v_userInfoA := f_getSipUserId ( PX_EUT_A_EMERGENCY ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_SIP_MW_PI_INTERFACENAME, + PX_DIAMETER_CX_SH_INTERFACENAME, + PX_DIAMETER_CX_IH_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME})) + { + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // preamble + f_mtc_userRadioEnabled ( v_ueA, true, true ); // UE-A trigger an initial network_attachment by enabling radio interface of its mobile + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_04(vc_vxlte_monitor_components.gmA); // Events 1, 8 + + + f_mtc_check_TP_RX_PCSCF_ECO_AAR_01(vc_vxlte_monitor_components.rx, true);// Event 2 //true because AAR repeated in next TP + f_mtc_check_TP_RX_PCRF_ECO_AAA_01(vc_vxlte_monitor_components.rx); // Event 3 + + f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_04(vc_vxlte_monitor_components.mwPI); // Event 4, 7 + + f_mtc_check_TP_CX_HSS_UAA_03(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 5, 6 + + // postamble + f_PO_user_home_deregistration ( v_ueA ); + f_mtc_userRadioEnabled ( v_ueA, false, true ); + + //unmap/disconnet component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs"); + } + } // End of testcase TD_VoLTE_ECO_RMI_REG_01_01 + + /** + * @desc To attempt initial emergency registration via the established emergency bearer. In this case, the emergency registration is not successful due to not accepted UE credentials. Emergency call can be established without emergency registration. + * @see ETSI TS 103 795-2 Clause 6.2.1 IMS Emergency Registration - Rejection + * @remark This is option 1: Emergency registration rejected - UE not supporting GIBA + */ + testcase TD_VoLTE_ECO_RMI_REG_01_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var ImsUserInfo v_userInfoA := f_getSipUserId ( PX_EUT_A_EMERGENCY ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_SIP_MW_PI_INTERFACENAME, + PX_DIAMETER_CX_SH_INTERFACENAME, + PX_DIAMETER_CX_IH_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME})) + { + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // preamble + f_mtc_userRadioEnabled ( v_ueA, true, true ); // UE-A trigger an initial network_attachment by enabling radio interface of its mobile + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_05(vc_vxlte_monitor_components.gmA); // Events 1, 10 + + + f_mtc_check_TP_RX_PCSCF_ECO_AAR_01(vc_vxlte_monitor_components.rx, true);// Event 2 //true because AAR repeated in next TP + f_mtc_check_TP_RX_PCRF_ECO_AAA_01(vc_vxlte_monitor_components.rx); // Event 3 + + f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_05(vc_vxlte_monitor_components.mwPI); // Event 4, 9 + + f_mtc_check_TP_CX_HSS_UAA_03(f_getCxInterface(PX_DIAMETER_CX_SINGLE_INTERFACE));// Event 5, 6 + + // postamble + f_PO_user_home_deregistration ( v_ueA ); + f_mtc_userRadioEnabled ( v_ueA, false, true ); + + //unmap/disconnet component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + f_cf_adapter_down ( ); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs"); + } + } // End of testcase TD_VoLTE_ECO_RMI_REG_01_02 + + } // End of group IMSEmergencyRegistration + + /** + * @see ETSI TS 103 795-3 Clause 6.3 Emergency Session Establishment(Roaming) + */ + group EmergencySessionEstablishmentRoaming { + + /** + * @see ETSI TS 103 795-3 Clause 6.3.1 Roaming UE calling PSAP with emergency registration + */ + group RoamingUECallingPSAPWithEmergencyRegistration { + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP roaming emergency session establishment within an emergency registration. + * PSAP is located in the IM CN subsystem of IMS A + * @see ETSI TS 103 795-2 Clause 6.3.1 Roaming UE calling PSAP with emergency registration + */ + testcase TD_VoLTE_ECO_RMI_INI_01() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser ( c_userUE_B_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoB := f_getImUser ( PX_EUT_B_EMERGENCY ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueB ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueB, v_userInfoB); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_01(); + + // Test body + if (not PX_ECALL) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmB, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmB, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmB, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 18 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 20 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 21 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 22 + + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueB); // Event 19 + f_mtc_userAnswerCall(v_psap); + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmB, -, v_sip); // ACK Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // ACK Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueB); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueB); + f_PO_user_home_deregistration(v_ueB); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueB ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_INT_INI_01 + + group f_TD_VoLTE_ECO_RMI_INI_01 { + + function f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_01() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_01 + + } // End of group f_TD_VoLTE_ECO_RMI_INI_01 + } // End of group RoamingUECallingPSAPWithEmergencyRegistration + + /** + * @see ETSI TS 103 795-3 Clause 6.3.2 Roaming UE calling PSAP with non-emergency registration + */ + group RoamingUECallingPSAPWithNonEmergencyRegistration { + + /** + * @desc To demonstrate the establishment of dedicated bearers at the originating EPC due to roaming SIP emergency session establishment within non-emergency registration. + * PSAP is located in the IM CN subsystem of IMS A + * @see ETSI TS 103 795-2 Clause 6.3.2.1 Roaming UE calling PSAP in same network + */ + testcase TD_VoLTE_ECO_RMI_INI_02() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser ( c_userUE_B_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_userInfoB := f_getImUser ( PX_EUT_B ); //non-emergency registration + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMB_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueB ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + f_mtc_userRegistration(v_ueB, v_userInfoB); + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_02(); + + // Test body + // Test body + if (not PX_ECALL) { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.gmB, -, v_sip); // INVITE Event 1 + } else { + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04(vc_vxlte_monitor_components.gmB, -, v_sip); // INVITE Event 1 + } + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmB, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 18 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 20 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 21 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 22 + + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueB); // Event 19 + f_mtc_userAnswerCall(v_psap); + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmB, -, v_sip); // ACK Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // ACK Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueB); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueB); + f_PO_user_home_deregistration(v_ueB); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueB ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_RMI_INI_02 + + group f_TD_VoLTE_ECO_RMI_INI_02 { + + function f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_02() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_02 + + } // End of group f_TD_VoLTE_ECO_RMI_INI_02 + + + /** + * @desc To demonstrate the rejection of roaming UE emergency session establishment when the + * P-CFCF is in home operator's network within non-emergency registration. + * P-CFCF is located in the IM CN subsystem of IMS A + * @see ETSI TS 103 795-2 Clause 6.3.2.2 Roaming UE calling PSAP in home operator's network + */ + testcase TD_VoLTE_ECO_RMI_INI_03() runs on ImsTestCoordinator system IotSystemInterface { + + var IotEquipmentUser v_ueA := f_cf_create_IotEquipmentUser ( c_userUE_A_emergency ); + var ImsUserInfo v_userInfoA := f_getImUser ( PX_EUT_A ); //non-emergency registration + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueA ); + f_cf_VxLteMonitor_Up(); + + // Preamble + //registration is not needed + + //similar to TC_VxLTE_RMI_ATT_01 UE A has perform a network_attachment + f_mtc_userRadioEnabled ( v_ueA, true, true ); // UE-A trigger an initial network_attachment by enabling radio interface of its mobile + + // Test body + // UE A requests emergency session initiation // Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_05(vc_vxlte_monitor_components.gmA, -, v_sip); // INVITE Event 2 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip); + + // 380 (Alternative Service) + f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 3 + + // ACK + f_mtc_check_TP_GM_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 6 + + //unmap/disconnect component ports + f_cf_user_down ( v_ueA ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } // End of TC TD_VoLTE_ECO_RMI_INI_02 + + group f_TD_VoLTE_ECO_RMI_INI_03 { + + function f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_03() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_02 + + } // End of group f_TD_VoLTE_ECO_RMI_INI_03 + + + /** + * @desc To demonstrate the establishment of dedicated bearers for a roaming UE without any registration. + * PSAP is located in the IM CN subsystem of IMS A + * @see ETSI TS 103 795-2 Clause 6.3.2.3 Roaming UE calling PSAP with non-registration + */ + testcase TD_VoLTE_ECO_RMI_INI_04() runs on ImsTestCoordinator system IotSystemInterface { + var IotEquipmentUser v_ueB := f_cf_create_IotEquipmentUser ( c_userUE_B_emergency ); + var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap ); + var ImsUserInfo v_infoPsap := f_getImUser ( PX_PSAP ); + + f_setVxLteMonIterfacesAvailability(); + //Check required monitor interfaces due to TD + if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMB_INTERFACENAME, + PX_DIAMETER_GX_INTERFACENAME, + PX_DIAMETER_RX_INTERFACENAME, + PX_SIP_MW_PE_INTERFACENAME, + PX_SIP_MM_B_PSAP_INTERFACENAME // E-CSCCF -> PSAP + })) + { + var SipMessage v_sip; + + f_cf_createVxLteMonitor(); + + // map/connect component ports + f_cf_adapter_up ( ); + f_cf_user_up ( v_ueB ); + f_cf_user_up ( v_psap ); + f_cf_VxLteMonitor_Up(); + + // Preamble + //UE B non-registered + if (PX_PSAP_REGISTERED) { + f_mtc_userRegistration(v_psap, v_infoPsap); + } else { + // TODO Check OPTIONS from PSAP to E-CSCF + } + f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_04(); + + // Test body + f_mtc_check_TP_GM_PCSCF_ECO_INVITE_03(vc_vxlte_monitor_components.gmB, -, v_sip); // INVITE Event 1 + f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.gmB, -, v_sip); + + //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 4 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5 + f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8 + f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9 + + f_mtc_check_TP_MW_PCSCF_ECO_INVITE_03(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10 + f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip); + + f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // Event 11 + f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); + + // 183 Session Progress + f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 183 In Progress Event 12 + f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 13 + f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 18 + + //Rx/Gx exchange after 183(SDP) was received at P-CSCF + f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 14 + f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 15 + f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx); // Event 16 + f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 17 + + f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 180 Ringing – Event 22 + f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 25 + + f_mtc_userCheckRinging(v_psap); // Event 19 + f_mtc_userCheckPeerIsRinging(v_ueB); // Event 19 + f_mtc_userAnswerCall(v_psap); // Event 26 + + f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // 200 OK Event 23 + f_mtc_check_TP_MW_PCSCF_ECO_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24 + f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 25 + + f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmB, -, v_sip); // Event 26 + f_mtc_check_TP_MW_PCSCF_ECO_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27 + f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(vc_vxlte_monitor_components.mmB_PSAP, -, v_sip); // ACK – Event 28 + + f_mtc_userCheckCallEstablished(v_ueB); // Event 29 + f_mtc_userCheckCallEstablished(v_psap); // Event 29 + + // Postamble + f_mtc_EndCall(v_ueB); + f_PO_user_home_deregistration(v_ueB); + f_PO_user_home_deregistration(v_psap); + //f_cf_int_call_down(v_config); + + //unmap/disconnect component ports + f_cf_user_down ( v_psap ); + f_cf_user_down ( v_ueB ); + f_cf_VxLteMonitor_Down(); + }else{ + //log... + setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs") + } + f_cf_adapter_down ( ); + } + group f_TD_VoLTE_ECO_RMI_INI_04 { + + function f_mtc_check_precond_TD_VoLTE_ECO_RMI_INI_04() runs on ImsTestCoordinator { + log("If the test case fails, please check the preconditions"); + // TODO Add real code to check pre-conditions + } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_04 + + } // End of group f_TD_VoLTE_ECO_RMI_INI_02 + + } // End of group RoamingUECallingPSAPWithNonEmergencyRegistration + + } // End of group EmergencySessionEstablishmentRoaming } // End of group Roaming diff --git a/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn b/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn index 9a94e23cc26e6e76f9cc7b3a78df047ff5bd4d6a..19f0bd141de1a2e6ebe63aba0e97b4f3b0f1dd50 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Functions.ttcn @@ -6,7 +6,7 @@ module AtsImsIot_Functions { //LibDiameter - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;} + import from LibDiameter_TypesAndValues all; //LibSip import from LibSip_SIPTypesAndValues all; @@ -15,22 +15,22 @@ module AtsImsIot_Functions { import from LibIms_UpperTester all; //LibIot - import from LibIot_PIXITS { modulepar PX_MAX_MSG_WAIT, PX_PRODUCTS, PX_AVAILABLE_INTERFACES; } + import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; - import from LibIot_Functions { function f_setConformanceVerdict, f_sendEquipmentCmd; } - import from LibIot_TestInterface { type InterfaceMonitor, TestCoordinator, EquipmentUser; } - import from LibIot_Functions { function f_getE2EVerdict; } - import from LibIot_TypesAndValues { type DefaultList, MonitorInterfaceInfo; } - import from LibIot_VxLTE_Functions {function f_SipMonitorInterface_available,f_DiameterMonitorInterface_available;} + import from LibIot_Functions all; + import from LibIot_TestInterface all; + import from LibIot_Functions all; + import from LibIot_TypesAndValues all; + import from LibIot_VxLTE_Functions all; //LibUpperTester import from LibUpperTester all; //AtsImsIot - import from AtsImsIot_Templates { template mw_EnumQuery_Base, mw_EnumResponse_Base, mw_SIP_URI_Base; } + import from AtsImsIot_Templates all; import from AtsImsIot_TestSystem all; - import from AtsImsIot_TestSystem { type ImsTestCoordinator, ImsInterfaceMonitor; } - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumMessage, SkipType, DiameterMessageList, SkipTypeDiameter;} + import from AtsImsIot_TestSystem all; + import from AtsImsIot_TypesAndValues all; group ue { diff --git a/ttcn/AtsImsIot/AtsImsIot_PIXITS.ttcn b/ttcn/AtsImsIot/AtsImsIot_PIXITS.ttcn index b8bd9b00832f8eb4758962bb9131d4a5e59c80dc..366a1f8ad533985bb38c4b7bc49bf0e14d2dbe6d 100644 --- a/ttcn/AtsImsIot/AtsImsIot_PIXITS.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_PIXITS.ttcn @@ -1,32 +1,62 @@ -/* - * @author STF 574 - * @version $Id$ - * @desc This module provides the module parameter - */ - -module AtsImsIot_PIXITS -{ - -group SUT { - -group SUT_CONF { - /** - * @desc charstring for SUT/conference domain - */ - modulepar charstring PX_IMS_SUT_CONF_HOME_DOMAIN := "conf.sut.net"; - /** - * @desc charstring for conference factory URI name - */ - modulepar charstring PX_IMS_SUT_CONF_FACTORY_NAME := "factory.uri.name"; - /** - * @desc charstring for PChargingVector TP_IC_IBCF_INVITE_04 - */ - modulepar charstring PX_IMS_A_ICID := "PX_IMS_A_ICID"; - -} // end group SUT_CONF - -} // end group SUT -group TS { - -} // end group TS -} // end module AtsImsIot_PIXITS +/* + * @author STF 574 + * @version $Id$ + * @desc This module provides the module parameter + */ +module AtsImsIot_PIXITS { + import from LibSip_SIPTypesAndValues all; + + group SUT { + + group SUT_CONF { + /** + * @desc charstring for SUT/conference domain + */ + modulepar charstring PX_IMS_SUT_CONF_HOME_DOMAIN := "conf.sut.net"; + /** + * @desc charstring for conference factory URI name + */ + modulepar + charstring PX_IMS_SUT_CONF_FACTORY_NAME := "factory.uri.name"; + /** + * @desc charstring for PChargingVector TP_IC_IBCF_INVITE_04 + */ + modulepar charstring PX_IMS_A_ICID := "PX_IMS_A_ICID"; + + /** + * @desc Set to true of PSAP shall be registered to the IMS + */ + modulepar boolean PX_PSAP_REGISTERED := true; + + /** + * @desc Set to true if the emergency call is an issued by an eCall + */ + modulepar boolean PX_ECALL := false; + + /** + * @desc charstring for emergency service urn + */ + // modulepar charstring PX_URN_SERVICE_SOS := "urn:service:sos"; + // modulepar UrnUriComponents PX_URN_SERVICE_SOS := { + // namespaceId := "service", + // namespaceSpecificString := "sos" + // }; + modulepar SipUrl PX_URN_SERVICE_SOS := { + scheme := "sip", + components := { + urn := { + namespaceId := "service", + namespaceSpecificString := "sos" + } + }, + urlParameters := omit, + headers := omit + }; + + } // end group SUT_CONF + + + } // end group SUT + group TS { + } // end group TS +} diff --git a/ttcn/AtsImsIot/AtsImsIot_TD_ATT.ttcn b/ttcn/AtsImsIot/AtsImsIot_TD_ATT.ttcn index ca42c582af795f85d6bb1b7380fc627c9de1905f..7b10a47bb63f3d467f79404c5ce257a35ed92bb6 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TD_ATT.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TD_ATT.ttcn @@ -9,15 +9,15 @@ module AtsImsIot_TD_ATT{ // LibCommon // LibSip // LibIms - import from LibIms_UpperTester { type ImsUserInfo }; + import from LibIms_UpperTester all; // LibIot - import from LibIot_TestInterface { type IotEquipmentUser }; - import from LibIot_TestConfiguration { function f_cf_create_IotEquipmentUser }; + import from LibIot_TestInterface all; + import from LibIot_TestConfiguration all; import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Functions all; // LibImsIot - import from AtsImsIot_Functions { function f_getImUser}; + import from AtsImsIot_Functions all; // ImsIot import from AtsImsIot_TestConfiguration all; import from AtsImsIot_TestSystem all; diff --git a/ttcn/AtsImsIot/AtsImsIot_TD_DRG.ttcn b/ttcn/AtsImsIot/AtsImsIot_TD_DRG.ttcn index 0dd94a779ed5a8eaf86b84ca69aedabf826a347a..c3d3639dd5afbadaeeb6f0889e276864ed1ba732 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TD_DRG.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TD_DRG.ttcn @@ -9,15 +9,15 @@ module AtsImsIot_TD_DRG{ // LibCommon // LibSip // LibIms - import from LibIms_UpperTester { type ImsUserInfo }; + import from LibIms_UpperTester all; // LibIot - import from LibIot_TestInterface { type IotEquipmentUser }; - import from LibIot_TestConfiguration { function f_cf_create_IotEquipmentUser }; - import from LibIot_PIXITS { modulepar PX_EUT_A, PX_EUT_B, PX_EUT_C }; + import from LibIot_TestInterface all; + import from LibIot_TestConfiguration all; + import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Functions all; // LibImsIot - import from AtsImsIot_Functions { function f_getImUser }; + import from AtsImsIot_Functions all; // ImsIot import from AtsImsIot_TestConfiguration all; import from AtsImsIot_TestSystem all; diff --git a/ttcn/AtsImsIot/AtsImsIot_TD_DTC.ttcn b/ttcn/AtsImsIot/AtsImsIot_TD_DTC.ttcn index a88b3f0c7ac6e23809c9ecb75d09d45bb7277747..066a4d2eb44d704808ff0a3c025b7a9e307779f0 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TD_DTC.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TD_DTC.ttcn @@ -9,15 +9,15 @@ module AtsImsIot_TD_DTC{ // LibCommon // LibSip // LibIms - import from LibIms_UpperTester { type ImsUserInfo }; + import from LibIms_UpperTester all; // LibIot - import from LibIot_TestInterface { type IotEquipmentUser }; - import from LibIot_TestConfiguration { function f_cf_create_IotEquipmentUser }; - import from LibIot_PIXITS { modulepar PX_EUT_A, PX_EUT_B, PX_EUT_C }; + import from LibIot_TestInterface all; + import from LibIot_TestConfiguration all; + import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Functions all; // LibImsIot - import from AtsImsIot_Functions { function f_getImUser }; + import from AtsImsIot_Functions all; // ImsIot import from AtsImsIot_TestConfiguration all; import from AtsImsIot_TestSystem all; diff --git a/ttcn/AtsImsIot/AtsImsIot_TD_INI.ttcn b/ttcn/AtsImsIot/AtsImsIot_TD_INI.ttcn index a41eadaddcaa983793f8f76e848273aacbb9edf7..ad9f369ba82dab0d435c7bab6b0378f3cdd92faa 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TD_INI.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TD_INI.ttcn @@ -11,17 +11,15 @@ module AtsImsIot_TD_INI{ // LibCommon // LibSip // LibIms - import from LibIms_UpperTester {type ImsUserInfo;} + import from LibIms_UpperTester all; // LibIot - import from LibIot_TestInterface {type IotEquipmentUser;} - import from LibIot_TestConfiguration { - function f_cf_create_IotEquipmentUser; - } - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B, PX_EUT_C;} + import from LibIot_TestInterface all; + import from LibIot_TestConfiguration all; + import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Functions all; // LibImsIot - import from AtsImsIot_Functions {function f_getImUser;} + import from AtsImsIot_Functions all; // ImsIot import from AtsImsIot_TypesAndValues all; import from AtsImsIot_TestConfiguration all; @@ -2440,7 +2438,7 @@ module AtsImsIot_TD_INI{ //MwPS TP_MW_PCSCF_INVITE_04 (Event 4) f_mtc_check_TP_IC_IBCF_INVITE_04(vc_vxlte_monitor_components.ic, false); // (INVITE – Event 3) f_mtc_check_TP_IC_IBCF_100TRY_01(vc_vxlte_monitor_components.ic, false); // (INVITE, 100 Trying – Event 3) - f_mtc_check_TP_MW_PCSCF_INVITE_04(vc_vxlte_monitor_components.mwPS); // (Event 4) + f_mtc_check_TP_MW_PCSCF_INVITE_04(vc_vxlte_monitor_components.mwPS, -, v_sip); // (Event 4) //Rx/Gx/S9 exchange after INVITE was received at P-CSCF diff --git a/ttcn/AtsImsIot/AtsImsIot_TD_REG.ttcn b/ttcn/AtsImsIot/AtsImsIot_TD_REG.ttcn index bde4e5489100212c57e4ffdd3e963c2037e50f94..51a6fd15c87370f4e0bd6245337a49ad1f706612 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TD_REG.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TD_REG.ttcn @@ -9,15 +9,15 @@ module AtsImsIot_TD_REG{ // LibCommon // LibSip // LibIms - import from LibIms_UpperTester { type ImsUserInfo }; + import from LibIms_UpperTester all; // LibIot - import from LibIot_TestInterface { type IotEquipmentUser }; - import from LibIot_TestConfiguration { function f_cf_create_IotEquipmentUser }; - import from LibIot_PIXITS { modulepar PX_EUT_A, PX_EUT_B, PX_EUT_C }; + import from LibIot_TestInterface all; + import from LibIot_TestConfiguration all; + import from LibIot_PIXITS all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Functions all; // LibImsIot - import from AtsImsIot_Functions { function f_getImUser }; + import from AtsImsIot_Functions all; // ImsIot import from AtsImsIot_TestConfiguration all; import from AtsImsIot_TestSystem all; diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_CX.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_CX.ttcn index 55300d3592d5192377b99394245d3ecb8497edba..3d58b2afaa9e65ed4a96b645f9225121d1513090 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_CX.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_CX.ttcn @@ -9,21 +9,21 @@ module AtsImsIot_TP_behavior_CX // LibDiameter import from LibDiameter_Templates all; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;}; + import from LibDiameter_TypesAndValues all; // LibIot - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from LibIot_PIXITS all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; + import from LibIot_PIXITS all; // AtsImsIot - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; import from AtsImsIot_Functions all; import from AtsImsIot_Diameter_Templates all; - import from AtsImsIot_TestSystem { type DiameterInterfaceMonitor, ImsTestCoordinator; } + import from AtsImsIot_TestSystem all; // LibIms import from LibIms_UpperTester all; @@ -95,13 +95,15 @@ group g_HSS { if (isvalue(p_monitorCompRef)){ var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + var template DIAMETER_MSG mw_diameter_msg_pass := { mAR_MSG := mw_MAR(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { mAR_MSG := mw_MAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{mAR_MSG := mw_MAR(mw_publicIdentity(v_publicIdentity))} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{mAR_MSG := mw_MAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_MAA_01 - MAR", @@ -111,13 +113,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { mAA_MSG := mw_MAA }; + mw_diameter_msg_fail := { mAA_MSG := mw_MAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{mAA_MSG := mw_MAA} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{mAA_MSG := mw_MAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_MAA_01 - MAA", @@ -183,13 +187,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rTR_MSG := mw_RTR }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rTR_MSG := mw_RTR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{rTR_MSG := mw_RTR} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{rTR_MSG := mw_RTR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_RTA_01 - RTR", @@ -199,13 +205,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { rTA_MSG := mw_RTA }; + mw_diameter_msg_fail := { rTA_MSG := mw_RTA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{rTA_MSG := mw_RTA} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{rTA_MSG := mw_RTA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_RTA_01 - RTA", @@ -277,13 +285,15 @@ group g_HSS { if (isvalue(p_monitorCompRef)){ var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + var template DIAMETER_MSG mw_diameter_msg_pass := { sAR_MSG := mw_SAR_Registration(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sAR_MSG := mw_SAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{sAR_MSG := mw_SAR_Registration(mw_publicIdentity(v_publicIdentity))} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{sAR_MSG := mw_SAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_SAA_01 - SAR", @@ -293,13 +303,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { sAA_MSG := mw_SAA_userData }; + mw_diameter_msg_fail := { sAA_MSG := mw_SAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{sAA_MSG := mw_SAA_userData} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{sAA_MSG := mw_SAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_SAA_01 - SAA", @@ -369,13 +381,15 @@ group g_HSS { if (isvalue(p_monitorCompRef)){ var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + var template DIAMETER_MSG mw_diameter_msg_pass := { sAR_MSG := mw_SAR_UserDeregistration(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sAR_MSG := mw_SAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{sAR_MSG := mw_SAR_UserDeregistration(mw_publicIdentity(v_publicIdentity))} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{sAR_MSG := mw_SAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_SAA_02 -SAR", @@ -385,13 +399,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { sAA_MSG := mw_SAA }; + mw_diameter_msg_fail := { sAA_MSG := mw_SAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{sAA_MSG := mw_SAA} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{sAA_MSG := mw_SAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_SAA_02 - SAA", @@ -467,13 +483,15 @@ group g_HSS { var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; //"sip:"&v_userInfoA.publicId&@&v_userInfoA.domain + var template DIAMETER_MSG mw_diameter_msg_pass := { uAR_MSG := mw_UAR_Registration(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uAR_MSG := mw_UAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAR_MSG := mw_UAR_Registration(mw_publicIdentity(v_publicIdentity))} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAR_MSG := mw_UAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_01 - UAR", @@ -483,13 +501,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uAA_MSG := mw_UAA_diamFirstRegistration }; + mw_diameter_msg_fail := { uAA_MSG := mw_UAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAA_MSG := mw_UAA_diamFirstRegistration} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAA_MSG := mw_UAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_01 - UAA", @@ -501,6 +521,107 @@ group g_HSS { } } // End of function f_mtc_check_TP_CX_HSS_UAA_01 + /** + * Starts monitor component behavior for f_mtc_check_TP_CX_HSS_ECO_UAA_01 + * @param p_monitorCompRef Reference to monitor component + *
+     * Test objective  "IUT successfully processes all mandatory AVPs in a UA-Request received due to first UE initial registration and sends UA-Answer."
+     *
+     * 
+     * 
+     * Config Id CF_VxLTE_INT
+     * 
+     * Initial conditions with {
+     *     the UE_A entity isNotRegisteredTo the IMS_A
+     * }
+     * 
+     * ensure that {
+     *     when {
+     *         the IMS_I_CSCF_A entity sends a UAR containing
+     *             Session_ID_AVP
+     *             Vendor_Specific_Application_Id_AVP
+     *             Auth_Session_State_AVP
+     *                 indicating value NO_STATE_MAINTAINED,
+     *             Origin_Host_AVP
+     *             Origin_Realm_AVP
+     *             Public_Identity_AVP
+     *             Visited_Network_Identifier_AVP
+     *             User_Authorization_Type_AVP 
+     *                 indicating value REGISTRATION,
+     *             User_Name_AVP
+     *             Destination_Host_AVP
+     *             Destination_Realm_AVP
+     *             UAR_Flags_AVP 
+     *                 indicating value IMS_Emergency_Registration_bit_not_set
+     *             ;
+     *         to the IMS_HSS_A entity
+     *     }
+     *     then {
+     *         the IMS_HSS_A entity sends the UAA containing
+     *             Session_ID_AVP
+     *             Vendor_Specific_Application_Id_AVP
+     *             Auth_Session_State_AVP
+     *             Origin_Host_AVP
+     *             Origin_Realm_AVP 
+     *             not Result_Code_AVP
+     *             Experimental_Result_AVP containing
+     *                 Experimental_Result_Code_AVP 
+     *                     indicating value DIAMETER_FIRST_REGISTRATION
+     *                 ;
+     *             ;
+     *         to the IMS_I_CSCF_A entity
+     *     }
+     * }
+     * 
+ * @see TS 103 653-1 clause 7.4 + */ + function f_mtc_check_TP_CX_HSS_ECO_UAA_01( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + //"sip:"&v_userInfoA.publicId&@&v_userInfoA.domain + var template DIAMETER_MSG mw_diameter_msg_pass := { uAR_MSG := mw_UAR_Registration(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uAR_MSG := mw_UAR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_CX_HSS_UAA_01 - UAR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + mw_diameter_msg_pass := { uAA_MSG := mw_UAA_diamFirstRegistration }; + mw_diameter_msg_fail := { uAA_MSG := mw_UAA_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_CX_HSS_UAA_01 - UAA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_CX_HSS_ECO_UAA_01 + /** * Starts monitor component behavior for TP_CX_HSS_UAA_02 * @param p_monitorCompRef Reference to monitor component @@ -547,13 +668,16 @@ group g_HSS { if (isvalue(p_monitorCompRef)){ var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + var template DIAMETER_MSG mw_diameter_msg_pass := { uAR_MSG := mw_UAR(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uAR_MSG := mw_UAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAR_MSG := mw_UAR(mw_publicIdentity(v_publicIdentity))} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAR_MSG := mw_UAR_basic}}, + mw_diameter_msg_fail + }, {0, omit}, "TP_CX_HSS_UAA_02 - UAR", p_forward_to_mtc, @@ -562,13 +686,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uAA_MSG := mw_UAA_diamSuccess/*uAA_MSG := mw_UAA_diamSubsequentRegistration*/ }; //TODO:Check TP + mw_diameter_msg_fail := { uAA_MSG := mw_UAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAA_MSG := mw_UAA_diamSuccess/*uAA_MSG := mw_UAA_diamSubsequentRegistration*/}//TODO:Check TP + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAA_MSG := mw_UAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_02 - UAA", @@ -580,6 +706,52 @@ group g_HSS { } } // End of function f_mtc_check_TP_CX_HSS_UAA_02 + function f_mtc_check_TP_CX_HSS_ECO_UAA_02( // FIXME To be reviewed + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + var template DIAMETER_MSG mw_diameter_msg_pass := { uAR_MSG := mw_UAR(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uAR_MSG := mw_UAR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_CX_HSS_UAA_02 - UAR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + mw_diameter_msg_pass := { uAA_MSG := mw_UAA_diamSuccess/*uAA_MSG := mw_UAA_diamSubsequentRegistration*/ }; //TODO:Check TP + mw_diameter_msg_fail := { uAA_MSG := mw_UAA_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_CX_HSS_UAA_02 - UAA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_CX_HSS_ECO_UAA_02 + /** * Starts monitor component behavior for TP_CX_HSS_UAA_03 * @param p_monitorCompRef Reference to monitor component @@ -623,13 +795,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { uAR_MSG := mw_UAR_unknownPrivateId }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uAR_MSG := mw_UAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAR_MSG := mw_UAR_unknownPrivateId} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAR_MSG := mw_UAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_03 - UAR", @@ -638,13 +812,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uAA_MSG := mw_UAA_diamErrorUserUnknown }; + mw_diameter_msg_fail := { uAA_MSG := mw_UAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAA_MSG := mw_UAA_diamErrorUserUnknown} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAA_MSG := mw_UAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_03 - UAA", @@ -701,13 +877,15 @@ group g_HSS { if (isvalue(p_monitorCompRef)){ var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); var charstring v_publicIdentity := "sip:"&v_userInfoA.publicId&"@"&v_userInfoA.domain; + var template DIAMETER_MSG mw_diameter_msg_pass := { uAR_MSG := mw_UAR_deRegistration(mw_publicIdentity(v_publicIdentity)) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uAR_MSG := mw_UAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAR_MSG := mw_UAR_deRegistration(mw_publicIdentity(v_publicIdentity))} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAR_MSG := mw_UAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_04 - UAR", @@ -717,13 +895,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uAA_MSG := mw_UAA_diamSuccess }; + mw_diameter_msg_fail := { uAA_MSG := mw_UAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uAA_MSG := mw_UAA_diamSuccess} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{uAA_MSG := mw_UAA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_CX_HSS_UAA_04 - UAA", diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GM.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GM.ttcn index cec6cb6aaee05febe453544f7d2187da7a9c8208..6d49ec92f988f039f89ca376f83390135f3096ab 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GM.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GM.ttcn @@ -6,3508 +6,5071 @@ module AtsImsIot_TP_behavior_GM { - // LibIms - import from LibIms_Templates all; - import from LibIms_UpperTester all; - // LibIot - import from LibIot_TypesAndValues all; - import from LibIot_Functions all; - import from LibIot_TestInterface all; - import from LibIot_PIXITS all; - // LibSip - import from LibSip_SIPTypesAndValues all; - import from LibSip_Templates all; - import from LibSip_Common all; - import from LibSip_SDPTypes all; - // LibMsrp - import from LibMsrp_TypesAndValues all; - import from LibMsrp_Functions all; - import from LibMsrp_Templates all; - // AtsImsIot - import from AtsImsIot_TestSystem all; - import from AtsImsIot_Templates all; - import from AtsImsIot_Templates_GM all; - import from AtsImsIot_TypesAndValues all; - import from AtsImsIot_Functions all; + // LibIms + import from LibIms_Templates all; + import from LibIms_UpperTester all; + // LibIot + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; + import from LibIot_TestInterface all; + import from LibIot_PIXITS all; + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Common all; + import from LibSip_SDPTypes all; + // LibMsrp + import from LibMsrp_TypesAndValues all; + import from LibMsrp_Functions all; + import from LibMsrp_Templates all; + // AtsImsIot + import from AtsImsIot_TestSystem all; + import from AtsImsIot_Templates all; + import from AtsImsIot_Templates_GM all; + import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_Functions all; + import from AtsImsIot_PIXITS all; - group imsMessages { + group imsMessages { - /** - * @desc Verify that the P-CSCF successfully processes a SIP messages greater than 1300 bytes - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isNotRegisteredTo the IMS_A - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a MESSAGE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * ContentLength indicating value greater than 1300 bytes - * ; - * to the IMS_P_CSCF_A entity - * } - * then { - * the IMS_P_CSCF_A entity receives the MESSAGE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * ContentLength indicating value greater than 1300 bytes - * ; - * from the UE_A entity - * and the IMS_P_CSCF_A entity sends a 200_Ok containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * PChargingVector containing - * orig_ioi indicating value PX_OPERATOR_ID_A, - * term_ioi indicating value PX_OPERATOR_ID_B, - * not PAccessNetworkInfo - * ;; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_MESSAGE_01( - SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := true - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mdw_MESSAGE_1500c) - }, // FIXME CallId and more can be checked - { mw_SipRequest(mw_MESSAGE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_MESSAGE_01 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK_Base) - }, // FIXME CallId and more can be checked - { }, - {0, omit}, - "TP_GM_PCSCF_MESSAGE_01 - Response", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_MESSAGE_01 + /** + * @desc Verify that the P-CSCF successfully processes a SIP messages greater than 1300 bytes + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a MESSAGE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * ContentLength indicating value greater than 1300 bytes + * ; + * to the IMS_P_CSCF_A entity + * } + * then { + * the IMS_P_CSCF_A entity receives the MESSAGE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * ContentLength indicating value greater than 1300 bytes + * ; + * from the UE_A entity + * and the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * PChargingVector containing + * orig_ioi indicating value PX_OPERATOR_ID_A, + * term_ioi indicating value PX_OPERATOR_ID_B, + * not PAccessNetworkInfo + * ;; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_MESSAGE_01( + SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := true + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mdw_MESSAGE_1500c) + }, // FIXME CallId and more can be checked + { mw_SipRequest(mw_MESSAGE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_MESSAGE_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK_Base) + }, // FIXME CallId and more can be checked + { }, + {0, omit}, + "TP_GM_PCSCF_MESSAGE_01 - Response", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_MESSAGE_01 - } // End of group imsMessages + } // End of group imsMessages - // 5.2 IMS Registration - group imsRegistration { + // 5.2 IMS Registration + group imsRegistration { - /** - * @desc Verify that the P-CSCF successfully processes a first registration (Successful) - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isNotRegisteredTo the IMS_A and - * the UE_B entity isNotRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isTriggeredToStart - * } - * then { - * the UE_A entity sends a REGISTER containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Authorization containing - * Authentication_Schema indicating value PX_TO_BE_DEFINED, - * Authentication_URI indicating value PX_TO_BE_DEFINED, - * Username indicating value PX_UE_A_USERNAME, - * Realm indicating value PX_UE_A_REALM, - * Algorithm indicating value PX_UE_A_AUTH_ALG, - * Nonce indicating value "", - * not term_ioi, - * not SecurityClient - * ;; - * to the IMS_P_CSCF_A entity - * and the UE_A entity receives an 401_Unauthorized containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Path, - * Warning, - * PAccessNetworkInfo, - * WwwAuthenticate containing - * Digest, - * Realm indicating value PX_UE_A_REALM, - * Algorithm indicating value PX_UE_A_AUTH_ALG, - * Nonce indicating value "not empty", - * qop indicating value "auth" - * ;; - * from the IMS_P_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_REGISTER_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var SipMessage v_sip; + /** + * @desc Verify that the P-CSCF successfully processes a first registration (Successful) + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_A and + * the UE_B entity isNotRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isTriggeredToStart + * } + * then { + * the UE_A entity sends a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Schema indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Username indicating value PX_UE_A_USERNAME, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "", + * not term_ioi, + * not SecurityClient + * ;; + * to the IMS_P_CSCF_A entity + * and the UE_A entity receives an 401_Unauthorized containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Path, + * Warning, + * PAccessNetworkInfo, + * WwwAuthenticate containing + * Digest, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth" + * ;; + * from the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_REGISTER_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var SipMessage v_sip; - // Check the first REGISTER - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_REGISTER_01( // FIXME Add CallId... - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_Authorization_other - ) - ) - }, - { - mw_SipRequest(mw_REGISTER_Request_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_01 - First request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 401 Unauthorized response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) - }, - { - mw_SipResponse(mw_401Unauthorized_Base), - mw_SipResponse(mw_Response_4xx_Base( - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.cSeq - )) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_01 - 401 Unauthorized", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_01 + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_REGISTER_01( // FIXME Add CallId... + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_01 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 401 Unauthorized response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_401Unauthorized_Base), + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_01 - 401 Unauthorized", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_01 - /** - * @desc Verify that the P-CSCF successfully processes a first registration (Successful) - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isNotRegisteredTo the IMS_A and - * the UE_B entity isNotRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the IMS_P_CSCF_A entity receives a REGISTER containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Authorization containing - * Authentication_Schema indicating value PX_TO_BE_DEFINED, - * Authentication_URI indicating value PX_TO_BE_DEFINED, - * Username indicating value PX_UE_A_USERNAME, - * Realm indicating value PX_UE_A_REALM, - * Algorithm indicating value PX_UE_A_AUTH_ALG, - * Nonce indicating value "not empty", - * qop indicating value "auth", - * not SecurityClient - * ;; - * from the UE_A entity - * } - * then { - * the IMS_P_CSCF_A entity sends an 200_Ok containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * AuthenticationInfo, - * PAccessNetworkInfo, - * PAssociatedURI indicating value PX_UE_A_SIP_URI, - * PChargingVector, - * orig_ioi_parameter - * indicating value "Operator Identifier Of ImsA" , - * term_ioi_parameter - * indicating value "Operator Identifier Of ImsB" - * Path, - * ServiceRoute - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_REGISTER_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var SipMessage v_sip; + /** + * @desc Verify that the P-CSCF successfully processes a first registration (Successful) + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Path, + * Warning, + * WwwAuthenticate containing + * Digest,, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "", + * not term_ioi, + * not SecurityClient, + * Contact indicating value "sos";; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a 401_Unauthorized containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Path, + * Warning, + * PAccessNetworkInfo, + * WwwAuthenticate containing + * Digest, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth";; + * ; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; - // Check the first REGISTER - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_REGISTER_02( - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_Authorization_other - ) - ) - }, - { - mw_SipRequest(mw_REGISTER_Request_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_02 - Second request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_02 - 200 OK", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_02 + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_ECO_REGISTER_01( // FIXME Add CallId... + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other, + -, -, + mw_contact(mw_ContactAddress) + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_01 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 401 Unauthorized response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_401Unauthorized_Base), + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_GM_PCSCF_ECO_REGISTER_01 - 401 Unauthorized", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_01 - /** - * @desc Verify that the P-CSCF successfully processes an invalid first registration (Unsuccessful). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isNotRegisteredTo the IMS_A and - * the UE_B entity isNotRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isTriggeredToStart - * } - * then { - * the IMS_P_CSCF_A entity receives a REGISTER containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Authorization containing - * Authentication_Schema indicating value PX_TO_BE_DEFINED, - * Authentication_URI indicating value PX_TO_BE_DEFINED, - * Username indicating value PX_UE_A_INVALID_USERNAME, - * Realm indicating value PX_UE_A_REALM, - * Algorithm indicating value PX_UE_A_AUTH_ALG, - * Nonce indicating value "" - * ;; - * from the UE_A entity - * and the IMS_P_CSCF_A entity sends an 404_NotFound containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_A_CALLID - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_REGISTER_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); // User removed from HSS - var SipMessage v_sip; + /** + * @desc Verify that the P-CSCF successfully processes a first registration (Successful) + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_A and + * the UE_B entity isNotRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Schema indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Username indicating value PX_UE_A_USERNAME, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth", + * not SecurityClient + * ;; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * AuthenticationInfo, + * PAccessNetworkInfo, + * PAssociatedURI indicating value PX_UE_A_SIP_URI, + * PChargingVector, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA" , + * term_ioi_parameter + * indicating value "Operator Identifier Of ImsB" + * Path, + * ServiceRoute + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_REGISTER_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var SipMessage v_sip; - // Check the first REGISTER - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_REGISTER_03( - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_Authorization_other - ) - ) - }, - { - mw_SipRequest(mw_REGISTER_Request_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_03 - First request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - log("v_sip", v_sip); - // Check REGISTER 404 Not Found response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_404NotFound(v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)), - mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)) - }, - { - mw_SipResponse(mw_Response_4xx_Base( - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.cSeq - )) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_03 - 404 Not Found", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_03 - - function f_mtc_check_TP_GM_PCSCF_REGISTER_04( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var SipMessage v_sip; + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_REGISTER_02( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_02 - Second request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_02 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_02 + + /** + * @desc Verify that the P-CSCF successfully processes a full emergency registration (Successful). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_A and + * the UE_A entity hasAchievedFirstRegistration + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Schema indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Username indicating value PX_UE_A_USERNAME, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth", + * not SecurityClient, + * Contact indicating value "sos";; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * AuthenticationInfo, + * PAccessNetworkInfo, + * PAssociatedURI indicating value PX_UE_A_SIP_URI, + * PChargingVector, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA" , + * term_ioi_parameter + * indicating value "Operator Identifier Of ImsB" + * Path, + * ServiceRoute; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; - // Check the first REGISTER - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_REGISTER_04( - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_Authorization_other - ) - ) - }, - { - mw_SipRequest(mw_REGISTER_Request_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_04 - First request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_ECO_REGISTER_02( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other, + -, -, + mw_contact(mw_ContactAddress) + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_ECO_REGISTER_02 - Second request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_02 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_02 + + /** + * @desc Verify that the P-CSCF successfully processes an invalid first registration (Unsuccessful). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_A and + * the UE_B entity isNotRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isTriggeredToStart + * } + * then { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Schema indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Username indicating value PX_UE_A_INVALID_USERNAME, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "" + * ;; + * from the UE_A entity + * and the IMS_P_CSCF_A entity sends an 404_NotFound containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_REGISTER_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); // User removed from HSS + var SipMessage v_sip; - // Check REGISTER 404 Not Found response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)), - mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) - }, - { - mw_SipResponse(mw_401Unauthorized_Base), - mw_SipResponse(mw_Response_4xx_Base( - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.cSeq - )) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_04 - 401 Unauthorized", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_04 - - function f_mtc_check_TP_GM_PCSCF_REGISTER_05( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var SipMessage v_sip; + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_REGISTER_03( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_03 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + log("v_sip", v_sip); + // Check REGISTER 404 Not Found response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_404NotFound(v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)) + }, + { + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_03 - 404 Not Found", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_03 + + /** + * @desc Verify that the emergency registration is rejected with 403 (Forbidden) in case invalid credentials sent from UE. (Unsuccessful emergency registration). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isTriggeredToStart + * } + * then { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value "Invalid credentials", + * Contact indicating value "sos"; + * from the UE_A entity + * and the IMS_P_CSCF_A entity sends an 403_Forbiden containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + Via indicating value PX_UE_A_VIA; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); // User removed from HSS + var SipMessage v_sip; - // Check the first REGISTER - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_REGISTER_05( - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_Authorization_other - ) - ) - }, - { - mw_SipRequest(mw_REGISTER_Request_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_05 - Second request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_05 - 200 OK", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_05 + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_ECO_REGISTER_03( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other, // FIXME indicating value "Invalid credentials" + -, -, + mw_contact(mw_ContactAddress) + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_ECO_REGISTER_03 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + log("v_sip", v_sip); + // Check REGISTER 404 Not Found response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_403Forbidden(v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)) + }, + { + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_03 - 404 Not Found", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_03 + + function f_mtc_check_TP_GM_PCSCF_REGISTER_04( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_REGISTER_04( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_04 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + + // Check REGISTER 404 Not Found response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_401Unauthorized_Base), + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_04 - 401 Unauthorized", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_04 - } // End of group imsRegistration + /** + * @desc Verify that the emergency registration is rejected with 403 (Forbidden) in case the UE and P-CSCF does not support GPRS-IMS-Bundled authentication. (Unsuccessful emergency registration). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_B and + * the UE_A entity not isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_B entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value GPRS_IMS_Bundled_authentication, + * Contact indicating value "sos"; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_B entity sends an 403_Forbiden containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * MessageBody containing + * XML containing + * ims_3gpp_element indicating value anonymous_emergencycall;;; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_ECO_REGISTER_04( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other // FIXME not indicating value GPRS_IMS_Bundled_authenticatio + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_ECO_REGISTER_04 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + + // Check REGISTER 404 Not Found response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_403Forbidden(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_401Unauthorized_Base), + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_04 - 401 Unauthorized", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_04 + + function f_mtc_check_TP_GM_PCSCF_REGISTER_05( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_REGISTER_05( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_05 - Second request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_05 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_05 + + function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_05( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_ECO_REGISTER_05( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_ECO_REGISTER_05 - Second request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_420BadExtension( + v_sip.request.msgHeader.cSeq, + mw_WwwAuthenticate, + mw_MBody_MIME_Ims3gpp( + *, + ? // FIXME XML message body + ) + )), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_05 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_REGISTER_05 + + } // End of group imsRegistration - group imsDeRegistration { + group imsDeRegistration { - /** - * @desc Verify that the P-CSCF successfully processes a user de-registration (no SIP session active). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isRegisteredTo the IMS_A - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isTriggeredToDetachUser - * } - * then { - * the UE_A entity sends a REGISTER containing - * Expire indicating value 0 - * ; - * to the IMS_P_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_REGISTER_07( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var SipMessage v_sip; + /** + * @desc Verify that the P-CSCF successfully processes a user de-registration (no SIP session active). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isTriggeredToDetachUser + * } + * then { + * the UE_A entity sends a REGISTER containing + * Expire indicating value 0 + * ; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_REGISTER_07( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var SipMessage v_sip; - // Check first DeREGISTER request - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_REGISTER_07( - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_Authorization_other/*(mw_credentialIntegrityYes)*/ - ) - ) - }, - { - mw_SipRequest(mw_REGISTER_Request_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_07 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check DeREGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_GM_PCSCF_REGISTER_07 - 200 OK", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_07 + // Check first DeREGISTER request + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_REGISTER_07( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other/*(mw_credentialIntegrityYes)*/ + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_07 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check DeREGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_REGISTER_07 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_07 - /** - * @desc Verify that the P-CSCF successfully processes a user de-registration (no SIP session active). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isRegisteredTo the IMS_A - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_A entity previouslyEstablishedCallWith the UE_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isTriggeredToDetachUser - * } - * then { - * the UE_A entity sends a REGISTER containing - * Expire indicating value 0 - * ; - * to the IMS_P_CSCF_A entity and - * the UE_A entity receives a BYE - * from the IMS_P_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_REGISTER_10( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := true - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_REGISTER_Request_Base) - //AXR mw_SipRequest(mw_BYE_Base), - }, - {}, - {0, omit}, - "TP_GM_PCSCF_REGISTER_10", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - }} // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_10 - - } // End of group imsDeRegistration + /** + * @desc Verify that the P-CSCF successfully processes a user de-registration (no SIP session active). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_A entity previouslyEstablishedCallWith the UE_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isTriggeredToDetachUser + * } + * then { + * the UE_A entity sends a REGISTER containing + * Expire indicating value 0 + * ; + * to the IMS_P_CSCF_A entity and + * the UE_A entity receives a BYE + * from the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_REGISTER_10( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := true + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_REGISTER_Request_Base) + //AXR mw_SipRequest(mw_BYE_Base), + }, + {}, + {0, omit}, + "TP_GM_PCSCF_REGISTER_10", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + }} // End of function f_mtc_check_TP_GM_PCSCF_REGISTER_10 + + } // End of group imsDeRegistration - group imsSubscribe { + group imsSubscribe { - /** - * @desc Verify that the P-CSCF successfully processes a SUBSCRIBE. - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isRegisteredTo the IMS_A - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a SUBSCRIBE - * } - * then { - * the IMS_P_CSCF_A entity receives an SUBSCRIBE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE - * ; - * from the UE_A entity - * and the IMS_P_CSCF_A entity sends a 200_Ok containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); - var SipMessage v_sip; + /** + * @desc Verify that the P-CSCF successfully processes a SUBSCRIBE. + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a SUBSCRIBE + * } + * then { + * the IMS_P_CSCF_A entity receives an SUBSCRIBE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the UE_A entity + * and the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + var SipMessage v_sip; - // Check the SUBSCRIBE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_SUBSCRIBE_01( - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), - mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) - )) - }, - { mw_SipRequest(mw_SUBSCRIBE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_SUBSCRIBE_01 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_MW_PCSCF_SUBSCRIBE_01 - Response", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_01 - - function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_02( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ -// var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); -// var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); - var SipMessage v_sip; + // Check the SUBSCRIBE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_SUBSCRIBE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), + mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) + )) + }, + { mw_SipRequest(mw_SUBSCRIBE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_SUBSCRIBE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_MW_PCSCF_SUBSCRIBE_01 - Response", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_01 + + function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_02( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ +// var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); +// var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + var SipMessage v_sip; - // Check the SUBSCRIBE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest( - mw_TP_GM_PCSCF_SUBSCRIBE_02( - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), - mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) -// mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), -// mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) - )) - }, - {mw_SipRequest(mw_SUBSCRIBE_Request_Base)}, - {0, omit}, - "TP_GM_PCSCF_SUBSCRIBE_02 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_MW_PCSCF_SUBSCRIBE_02 - Response", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_02 + // Check the SUBSCRIBE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_GM_PCSCF_SUBSCRIBE_02( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), + mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) +// mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), +// mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) + )) + }, + {mw_SipRequest(mw_SUBSCRIBE_Request_Base)}, + {0, omit}, + "TP_GM_PCSCF_SUBSCRIBE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_MW_PCSCF_SUBSCRIBE_02 - Response", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_SUBSCRIBE_02 - } // End of group imsSubscribe + } // End of group imsSubscribe - group imsNotify { + group imsNotify { - /** - * @desc Verify that the P-CSCF successfully processes a NOTIFY in case of IMS Administrative de-registration. - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isRegisteredTo the IMS_A - * } - * - * Expected behaviour - * ensure that { - * when { - * the IMS_S_CSCF_A entity isRequestedToSend a NOTIFY - * } - * then { - * the IMS_P_CSCF_A entity sends an NOTIFY containing - * Event indicating value "reg,de-reg" - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_NOTIFY_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); - var SipMessage v_sip; + /** + * @desc Verify that the P-CSCF successfully processes a NOTIFY in case of IMS Administrative de-registration. + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_S_CSCF_A entity isRequestedToSend a NOTIFY + * } + * then { + * the IMS_P_CSCF_A entity sends an NOTIFY containing + * Event indicating value "reg,de-reg" + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_NOTIFY_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + var SipMessage v_sip; - // Check the NOTIFY - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_NOTIFY_01( - -, - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), - mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) - )) - }, - { mw_SipRequest(mw_NOTIFY_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_NOTIFY_01 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_GM_PCSCF_NOTIFY_01 - Response", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_NOTIFY_01 + // Check the NOTIFY + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_NOTIFY_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), + mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) + )) + }, + { mw_SipRequest(mw_NOTIFY_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_NOTIFY_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_NOTIFY_01 - Response", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_NOTIFY_01 - } // End of group imsNotify + } // End of group imsNotify - group imsPrack { + group imsPrack { - /** - * @desc Verify that the P-CSCF successfully processes a PRACK in case of IMS Administrative de-registration. - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_A entity isRegisteredTo the IMS_A - * } - * - * Expected behaviour - * ensure that { - * when { - * the IMS_S_CSCF_A entity isRequestedToSend a PRACK - * } - * then { - * the IMS_P_CSCF_A entity sends an PRACK - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_PRACK_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ + /** + * @desc Verify that the P-CSCF successfully processes a PRACK in case of IMS Administrative de-registration. + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_S_CSCF_A entity isRequestedToSend a PRACK + * } + * then { + * the IMS_P_CSCF_A entity sends an PRACK + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_PRACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ - var SipMessage v_sip; + var SipMessage v_sip; - // Check the PRACK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_PRACK_01( - -, - -, // FIXME Set expected value - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_PRACK_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_PRACK_01 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); - if (not(isbound(v_sip))) { - return; - } - // Check REGISTER 200 OK response - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse(mw_200OK( - v_sip.request.msgHeader.cSeq, - v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.fromField, - v_sip.request.msgHeader.toField - )) - }, - { - mw_SipResponse(mw_Response_2xx_Base) - }, - {0, omit}, - "TP_GM_PCSCF_PRACK_01 - Response", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_PRACK_01 + // Check the PRACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_PRACK_01( + -, + -, // FIXME Set expected value + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_PRACK_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_PRACK_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_GM_PCSCF_PRACK_01 - Response", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_PRACK_01 - } // End of group imsPrack + } // End of group imsPrack - group imsInvite { + group imsInvite { - /** - * @desc Verify that the P-CSCF successfully processes an initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend an INVITE - * } - * then { - * the IMS_P_CSCF_A entity receives an INVITE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * PAccessNetworkInfo, - * MessageBody containing - * SDP containing - * Version indicating value "0" - * ; - * ;; - * from the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_INVITE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - out SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + /** + * @desc Verify that the P-CSCF successfully processes an initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend an INVITE + * } + * then { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PAccessNetworkInfo, + * MessageBody containing + * SDP containing + * Version indicating value "0" + * ; + * ;; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); - // Check the INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_INVITE_01( - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId - mw_To_AddrUnion_TelUrl(-) // v_userInfoB.publicId - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_INVITE_01 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - log("##### GM p_sip: ", p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_01 + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_INVITE_01( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_userInfoB.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### GM p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_01 - /** - * @desc Verify that the P-CSCF successfully processes an initial INVITE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend an INVITE - * } - * then { - * the IMS_P_CSCF_B entity sends an INVITE containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * PAccessNetworkInfo, - * MessageBody containing - * SDP containing - * Version indicating value "0" - * ; - * ;; - * to the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_INVITE_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - out SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + /** + * @desc Verify that the P-CSCF successfully receives an initial emergency INVITE from an unregistered UE. + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.8.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToEstablishEmergencyCall + * } + * then { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, // see 5.1.6.8.2 7) + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * MessageBody; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getTelUserId(PX_PSAP); - // Check the INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_INVITE_02( - -, // FIXME Set expected value - ( - mw_From_NameAddr_SipUrl({quotedString:=v_userInfoB.publicId}, v_userInfoB.publicId, v_userInfoB.domain), - mw_From_AddrUnion_TelUrl(v_userInfoB.publicId) - ), - ( - mw_To_NameAddr_SipUrl({quotedString:=v_userInfoA.publicId}, v_userInfoA.publicId/*, v_userInfoA.domain*/), - mw_To_AddrUnion_TelUrl(-)//v_userInfoA.publicId - ) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_INVITE_02 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_02 - - function f_mtc_check_TP_GM_PCSCF_INVITE_03( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - out SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ECO_INVITE_01( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_TelUrl(mw_SipUrl_Anonymous.components.sip.userInfo.userOrTelephoneSubscriber), + mw_To_AddrUnion_TelUrl(v_psap.publicId) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_ECO_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### GM p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_01 + + /** + * @desc Verify that the P-CSCF successfully processes an initial INVITE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend an INVITE + * } + * then { + * the IMS_P_CSCF_B entity sends an INVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * PAccessNetworkInfo, + * MessageBody containing + * SDP containing + * Version indicating value "0" + * ; + * ;; + * to the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); - // Check the INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_INVITE_03( - -, // FIXME Set expected value - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_INVITE_03 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_03 - - function f_mtc_check_TP_GM_PCSCF_INVITE_04( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - out SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_INVITE_02( + PX_URN_SERVICE_SOS, + ( + mw_From_NameAddr_SipUrl({quotedString:=v_userInfoB.publicId}, v_userInfoB.publicId, v_userInfoB.domain), + mw_From_AddrUnion_TelUrl(v_userInfoB.publicId) + ), + ( + mw_To_NameAddr_SipUrl({quotedString:=v_userInfoA.publicId}, v_userInfoA.publicId/*, v_userInfoA.domain*/), + mw_To_AddrUnion_TelUrl(-)//v_userInfoA.publicId + ) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_02 + + /** + * @desc "Verify that the P-CSCF successfully receives an initial emergency INVITE from an emergency registered UE." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.8.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToEstablishEmergencyCall + * } + * then { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * // TODO Geolocation header maybe added later, check! + * MessageBody; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_PSAP); - // Check the INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_INVITE_04( - -, // FIXME Set expected value - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_INVITE_04 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_04 - - /** - * @desc Verify that the P-CSCF successfully processes an initial RE-INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_A entity previouslyEstablishedCallWith the UE_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the IMS_P_CSCF_A entity receives a ReINVITE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * PAccessNetworkInfo, - * MessageBody containing - * SDP containing - * Version indicating value "0" - * ; - * ;; - * from the UE_A entity - * } - * then { - * the IMS_P_CSCF_A entity sends a ReINVITE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * PAccessNetworkInfo, - * MessageBody containing - * SDP containing - * Version indicating value "0" - * ; - * ;; - * to the IMS_S_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_RE_INVITE_01( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ECO_INVITE_02( + PX_URN_SERVICE_SOS, + ( + mw_From_NameAddr_SipUrl({quotedString:=v_userInfoA.publicId}, v_userInfoA.publicId, v_userInfoA.domain), + mw_From_AddrUnion_TelUrl(v_userInfoA.publicId) + ), + ( + mw_To_NameAddr_SipUrl({quotedString:=v_userInfoB.publicId}, v_userInfoB.publicId/*, v_userInfoA.domain*/), + mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) + ) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_ECO_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_02 + + function f_mtc_check_TP_GM_PCSCF_INVITE_03( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_INVITE_03( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_INVITE_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_03 + + /** + * @desc Verify that the P-CSCF successfully receives an initial emergency INVITE from a registered but not emergency registered UE. + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.8.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToEstablishEmergencyCall + * } + * then { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_ECO_INVITE_03( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_ECO_INVITE_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_03 + + /** + * @desc Verify that the P-CSCF successfully receives an initial eCall type INVITE from an emergency registered UE. + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.8.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToEstablishEmergencyCall + * } + * then { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_04( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); - // Check the RE-INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_01( - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), - mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_RE_INVITE_01 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function TP_GM_PCSCF_RE_INVITE_01 - - /** - * @desc Verify that the P-CSCF successfully processes an initial RE-INVITE (Terminating Leg). + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_ECO_INVITE_04( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_INVITE_04 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_04 + + /** + * @desc Verify that the P-CSCF successfully receives an initial emergency INVITE from a registered but not emergency registered UE. + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.8.4" + * Config Id CF_VoLTE_RMI_ES + * PICS Selection NONE * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_B entity previouslyEstablishedCallWith the UE_A + * the UE_A entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * // This implies that the UE is currently attached and registered + * to its home operator's network and the IP-CAN does not define emergency bearers + * see 5.1.6.1 3rd paragraph // * } - * * Expected behaviour - * ensure that { - * when { - * the IMS_P_CSCF_B entity receives an ReINVITE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * PAccessNetworkInfo, - * MessageBody containing - * SDP containing - * Version indicating value "0" - * ; - * ;; - * from the IMS_S_CSCF_B entity - * } - * then { - * the IMS_P_CSCF_B entity sends an ReINVITE containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * PAccessNetworkInfo, - * MessageBody containing - * SDP containing - * Version indicating value "0" - * ; - * ;; - * to the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_RE_INVITE_02( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + * ensure that { + * when { + * the UE_A entity isRequestedToEstablishEmergencyCall + * } + * then { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_INVITE_05( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); - // Check the RE-INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_02( - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(v_userInfoB.publicId), - mw_To_AddrUnion_TelUrl(v_userInfoA.publicId) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_RE_INVITE_02 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function TP_GM_PCSCF_RE_INVITE_02 - - function f_mtc_check_TP_GM_PCSCF_RE_INVITE_03( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_ECO_INVITE_05( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_ECO_INVITE_05 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_05 + + + + /** + * @desc Send out INVITE message with incorrect urn + */ + function f_mtc_check_TP_GM_PCSCF_ECO_INVALID_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); - // Check the RE-INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_03( - -, // FIXME Set expected value - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_RE_INVITE_03 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function TP_GM_PCSCF_RE_INVITE_03 - - function f_mtc_check_TP_GM_PCSCF_RE_INVITE_04( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); - // Check the RE-INVITE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_04( - -, // FIXME Set expected value - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) - )) - }, - { mw_SipRequest(mw_INVITE_Request_Base) }, - {0, omit}, - "TP_GM_PCSCF_RE_INVITE_04 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function TP_GM_PCSCF_RE_INVITE_04 - - - } // End of group imsInvite + var SipUrl v_invalidUrnServiceSos := { + scheme := "sip", + components := {urn := { + namespaceId := "service", + namespaceSpecificString := "sosxxxx" + } + }, + urlParameters := omit, + headers := omit + } + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_ECO_INVITE_01( + v_invalidUrnServiceSos, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + - + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "f_mtc_check_TP_GM_PCSCF_ECO_INVALID_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_INVALID_INVITE_01 + + function f_mtc_check_TP_GM_PCSCF_INVITE_04( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_INVITE_04( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_INVITE_04 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_04 + + /** + * @desc Verify that the P-CSCF successfully processes an initial RE-INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_A entity previouslyEstablishedCallWith the UE_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a ReINVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PAccessNetworkInfo, + * MessageBody containing + * SDP containing + * Version indicating value "0" + * ; + * ;; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a ReINVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PAccessNetworkInfo, + * MessageBody containing + * SDP containing + * Version indicating value "0" + * ; + * ;; + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_RE_INVITE_01( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + + // Check the RE-INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_01( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), + mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_RE_INVITE_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function TP_GM_PCSCF_RE_INVITE_01 + + /** + * @desc Verify that the P-CSCF successfully processes an initial RE-INVITE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_B entity previouslyEstablishedCallWith the UE_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_B entity receives an ReINVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PAccessNetworkInfo, + * MessageBody containing + * SDP containing + * Version indicating value "0" + * ; + * ;; + * from the IMS_S_CSCF_B entity + * } + * then { + * the IMS_P_CSCF_B entity sends an ReINVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * PAccessNetworkInfo, + * MessageBody containing + * SDP containing + * Version indicating value "0" + * ; + * ;; + * to the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_RE_INVITE_02( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + + // Check the RE-INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_02( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_TelUrl(v_userInfoB.publicId), + mw_To_AddrUnion_TelUrl(v_userInfoA.publicId) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_RE_INVITE_02 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function TP_GM_PCSCF_RE_INVITE_02 + + function f_mtc_check_TP_GM_PCSCF_RE_INVITE_03( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the RE-INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_03( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_RE_INVITE_03 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function TP_GM_PCSCF_RE_INVITE_03 + + function f_mtc_check_TP_GM_PCSCF_RE_INVITE_04( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the RE-INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_RE_INVITE_04( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_RE_INVITE_04 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function TP_GM_PCSCF_RE_INVITE_04 + + /** + * @desc Verify that the P-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_NGC_INVITE_01( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_NGC_INVITE_01( + PX_URN_SERVICE_SOS, + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_INVITE_04 + + + } // End of group imsInvite - group ims100Trying { + group ims100Trying { - /** - * @desc Verify that the P-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the IMS_P_CSCF_A entity receives a 100_Trying - * from the UE_A entity - * } - * then { - * the IMS_P_CSCF_A entity forwards the 100_Trying - * to the IMS_S_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_100Trying_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 100 TRYING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_01( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_100Trying_Base) }, - { 0, omit }, - "TP_GM_PCSCF_100Trying_01", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_01 + /** + * @desc Verify that the P-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a 100_Trying + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity forwards the 100_Trying + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_100Trying_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_GM_PCSCF_100Trying_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_01 - /** - * @desc Verify that the P-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity sends a 100_Trying containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * to the IMS_P_CSCF_B entity - * } - * then { - * the IMS_P_CSCF_B entity receives a 100_Trying containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_100Trying_02( - SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 100 TRYING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_02( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_100Trying_Base) }, - { 0, omit }, - "TP_GM_PCSCF_100Trying_02", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_02 - - function f_mtc_check_TP_GM_PCSCF_100Trying_03( // FIXME RMI To be reviewed - SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 100 TRYING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_03( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_100Trying_Base) }, - { 0, omit }, - "TP_GM_PCSCF_100Trying_03", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_03 - - function f_mtc_check_TP_GM_PCSCF_100Trying_04( // FIXME RMI To be reviewed - SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 100 TRYING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_04( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_100Trying_Base) }, - { 0, omit }, - "TP_GM_PCSCF_100Trying_04", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_04 + function f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ECO_100Trying_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_100Trying_01 + + /** + * @desc Verify that the P-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity sends a 100_Trying containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * to the IMS_P_CSCF_B entity + * } + * then { + * the IMS_P_CSCF_B entity receives a 100_Trying containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_100Trying_02( + SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_02( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_GM_PCSCF_100Trying_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_02 - } // End of group ims100Trying + function f_mtc_check_TP_GM_PCSCF_100Trying_03( // FIXME RMI To be reviewed + SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_03( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_GM_PCSCF_100Trying_03", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_03 + + function f_mtc_check_TP_GM_PCSCF_100Trying_04( // FIXME RMI To be reviewed + SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_100Trying_04( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_GM_PCSCF_100Trying_04", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_100Trying_04 + + } // End of group ims100Trying - group ims180Ringing { + group ims180Ringing { - /** - * @desc Verify that the P-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity hasAchieveInitialINVITE - * } - * then { - * the IMS_P_CSCF_A entity receives a 180_Ringing containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_180RINGING_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 180 RINGING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_01( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_180Ringing_Base) }, - { 0, omit }, - "TP_GM_PCSCF_180RINGING_01", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_01 + /** + * @desc Verify that the P-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity hasAchieveInitialINVITE + * } + * then { + * the IMS_P_CSCF_A entity receives a 180_Ringing containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_180RINGING_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_GM_PCSCF_180RINGING_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_01 - /** - * @desc Verify that the P-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity sends a 180_Ringing containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * to the IMS_P_CSCF_B entity - * - * } - * then { - * the IMS_P_CSCF_B entity receives a 180_Ringing containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_180RINGING_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 180 RINGING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_02( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_180Ringing_Base) }, - { 0, omit }, - "TP_GM_PCSCF_180RINGING_02", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_02 - - function f_mtc_check_TP_GM_PCSCF_180RINGING_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 180 RINGING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_03( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_180Ringing_Base) }, - { 0, omit }, - "TP_GM_PCSCF_180RINGING_03", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_03 - - function f_mtc_check_TP_GM_PCSCF_180RINGING_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 180 RINGING - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_04( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_180Ringing_Base) }, - { 0, omit }, - "TP_GM_PCSCF_180RINGING_04", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_04 + /** + * @desc Verify that the P-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity sends a 180_Ringing containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * to the IMS_P_CSCF_B entity + * + * } + * then { + * the IMS_P_CSCF_B entity receives a 180_Ringing containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_180RINGING_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_02( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_GM_PCSCF_180RINGING_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_02 - } // End of group ims180Ringing + function f_mtc_check_TP_GM_PCSCF_180RINGING_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_03( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_GM_PCSCF_180RINGING_03", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_03 + + function f_mtc_check_TP_GM_PCSCF_180RINGING_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_180Ringing_04( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_GM_PCSCF_180RINGING_04", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_180RINGING_04 + + } // End of group ims180Ringing - group ims183SessionProgress { + group ims183SessionProgress { - /** - * @desc Verify that the P-CSCF successfully processes a 183 (SessionProgress) provisional response on initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity hasAchieveInitialINVITE - * } - * then { - * the IMS_P_CSCF_A entity receives a 183_SessionProgress containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 183 SESSION_PROGRESS - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_01( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_183SessionProgress_Base) }, - { 0, omit }, - "TP_GM_PCSCF_183SESSION_PROGRESS_01", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01 + /** + * @desc Verify that the P-CSCF successfully processes a 183 (SessionProgress) provisional response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity hasAchieveInitialINVITE + * } + * then { + * the IMS_P_CSCF_A entity receives a 183_SessionProgress containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_GM_PCSCF_183SESSION_PROGRESS_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01 - /** - * @desc Verify that the P-CSCF successfully processes a 183 (SessionProgress) provisional response on initial INVITE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity sends a 183_SessionProgress containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * to the IMS_P_CSCF_B entity - * - * } - * then { - * the IMS_P_CSCF_B entity receives a 183_SessionProgress containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 183 SESSION_PROGRESS - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_02( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_183SessionProgress_Base) }, - { 0, omit }, - "TP_GM_PCSCF_183SESSION_PROGRESS_02", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_02 - - function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 183 SESSION_PROGRESS - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_03( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_183SessionProgress_Base) }, - { 0, omit }, - "TP_GM_PCSCF_183SESSION_PROGRESS_03", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_03 - - function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 183 SESSION_PROGRESS - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_04( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_183SessionProgress_Base) }, - { 0, omit }, - "TP_GM_PCSCF_183SESSION_PROGRESS_04", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_04 + /** + * @desc Verify that the P-CSCF successfully processes a 183 (SessionProgress) provisional response on initial INVITE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity sends a 183_SessionProgress containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * to the IMS_P_CSCF_B entity + * + * } + * then { + * the IMS_P_CSCF_B entity receives a 183_SessionProgress containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_02( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_GM_PCSCF_183SESSION_PROGRESS_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_02 - } // End of group ims183SessionProgress + function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_03( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_GM_PCSCF_183SESSION_PROGRESS_03", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_03 + + function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_GM_PCSCF_183SessionProgress_04( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_GM_PCSCF_183SESSION_PROGRESS_04", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_04 + + } // End of group ims183SessionProgress - group ims200Ok { + group ims200Ok { - /** - * @desc Verify that the P-CSCF successfully processes a 200 (OK) provisional response on initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity hasAchieveInitialINVITE - * } - * then { - * the IMS_P_CSCF_A entity sends a 200_Ok containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_200OK_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) provisional response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity hasAchieveInitialINVITE + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { - // Check the 200 OK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - ( - mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), - mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), - p_sip.request.msgHeader.toField - ) - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_01", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_01 + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), + mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_01 - /** - * @desc Verify that the P-CSCF successfully processes a 200 (Ok) provisional response on initial INVITE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity sends a 200_Ok containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the IMS_P_CSCF_B entity - * } - * then { - * the IMS_P_CSCF_A entity sends a 200_Ok containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_200OK_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_02", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_02 - - function f_mtc_check_TP_GM_PCSCF_200OK_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_03", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_03 - - function f_mtc_check_TP_GM_PCSCF_200OK_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_04", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_04 + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Originating Leg) + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE; + * from the IMS_E_CSCF entity + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), + mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_200OK_01 - } // End of group ims200Ok + /** + * @desc Verify that the P-CSCF successfully processes a 200 (Ok) provisional response on initial INVITE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the IMS_P_CSCF_B entity + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_200OK_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_02 + + function f_mtc_check_TP_GM_PCSCF_200OK_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_03", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_03 + + function f_mtc_check_TP_GM_PCSCF_200OK_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_04", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_04 + + } // End of group ims200Ok - group imsAck { + group imsAck { - /** - * @desc Verify that the P-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity hasAchieveInitialINVITE - * } - * then { - * the IMS_P_CSCF_A entity receives an ACK containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE - * ; - * from the UE_A entity - * } - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_ACK_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the ACK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_ACK_01( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_ACK_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_ACK_01 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_ACK_01 + /** + * @desc Verify that the P-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity hasAchieveInitialINVITE + * } + * then { + * the IMS_P_CSCF_A entity receives an ACK containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the UE_A entity + * } + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ACK_01 - /** - * @desc Verify that the P-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity hasAchieveInitialINVITE - * } - * then { - * the UE_B entity receives an ACK containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * from the IMS_P_CSCF_B entity - * } - */ - function f_mtc_check_TP_GM_PCSCF_ACK_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the ACK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_ACK_02( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_ACK_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_ACK_02 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_ACK_02 - - function f_mtc_check_TP_GM_PCSCF_ACK_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the ACK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_ACK_03( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_ACK_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_ACK_03 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_ACK_03 - - function f_mtc_check_TP_GM_PCSCF_ACK_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the ACK - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_ACK_04( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_ACK_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_ACK_04 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_ACK_04 + function f_mtc_check_TP_GM_PCSCF_ECO_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_ACK_01 + + /** + * @desc Verify that the P-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity hasAchieveInitialINVITE + * } + * then { + * the UE_B entity receives an ACK containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * from the IMS_P_CSCF_B entity + * } + */ + function f_mtc_check_TP_GM_PCSCF_ACK_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ACK_02( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ACK_02 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ACK_02 + + function f_mtc_check_TP_GM_PCSCF_ACK_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ACK_03( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ACK_03 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ACK_03 + + function f_mtc_check_TP_GM_PCSCF_ACK_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_ACK_04( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ACK_04 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ACK_04 - } // End of group imsAck + } // End of group imsAck - group imsBye { + group imsBye { - /** - * @desc Verify that the P-CSCF successfully processes a BYE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_A entity previouslyEstablishedCallWith the UE_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a BYE - * } - * then { - * the IMS_P_CSCF_A entity receives a BYE containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE - * ; - * from the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_BYE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_BYE_01( - p_sip.request.msgHeader.callId, - -, // New CSeq - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_BYE_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_BYE_01 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_BYE_01 + /** + * @desc Verify that the P-CSCF successfully processes a BYE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_A entity previouslyEstablishedCallWith the UE_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a BYE + * } + * then { + * the IMS_P_CSCF_A entity receives a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_BYE_01 - /** - * @desc Verify that the P-CSCF successfully processes a BYE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_A entity previouslyEstablishedCallWith the UE_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity isRequestedToSend a BYE - * } - * then { - * the IMS_P_CSCF_B entity receives a BYE containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_BYE_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_BYE_02( - p_sip.request.msgHeader.callId, - -, // New CSeq - -, // FIXME To be set - { - fieldName := FROM_E, - addressField := p_sip.request.msgHeader.toField.addressField, - fromParams := * - }, //p_sip.request.msgHeader.fromField, - { - fieldName := TO_E, - addressField := p_sip.request.msgHeader.fromField.addressField, - toParams := * - } //p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_BYE_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_BYE_02 - Request", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_BYE_02 + /** + * @desc Verify that the P-CSCF successfully processes a BYE for an emergency call. + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a BYE + * } + * then { + * the IMS_P_CSCF_A entity receives a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_BYE_01 - /** - * @desc Verify that the P-CSCF successfully processes a BYE (Network initiated). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_A entity previouslyEstablishedCallWith the UE_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isNoLongerAvailable - * } - * then { - * the IMS_P_CSCF_A entity sends a BYE containing - * From indicating value PX_S_CSCF_A_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * from the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_BYE_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_BYE_03( - p_sip.request.msgHeader.callId, - -, // New CSeq - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_BYE_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_BYE_03 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_BYE_03 - - function f_mtc_check_TP_GM_PCSCF_BYE_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_BYE_04( - p_sip.request.msgHeader.callId, - -, // New CSeq - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_BYE_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_BYE_04 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_BYE_04 - - function f_mtc_check_TP_GM_PCSCF_BYE_05( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_BYE_05( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_ACK_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_BYE_05 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_BYE_05 - - function f_mtc_check_TP_GM_PCSCF_BYE_06( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_BYE_06( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_ACK_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_BYE_06 - Request", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_BYE_06 + /** + * @desc Verify that the P-CSCF successfully processes a BYE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_A entity previouslyEstablishedCallWith the UE_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity isRequestedToSend a BYE + * } + * then { + * the IMS_P_CSCF_B entity receives a BYE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_02( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + { + fieldName := FROM_E, + addressField := p_sip.request.msgHeader.toField.addressField, + fromParams := * + }, //p_sip.request.msgHeader.fromField, + { + fieldName := TO_E, + addressField := p_sip.request.msgHeader.fromField.addressField, + toParams := * + } //p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_BYE_02 + + function f_mtc_check_TP_GM_PCSCF_ECO_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_02( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + { + fieldName := FROM_E, + addressField := p_sip.request.msgHeader.toField.addressField, + fromParams := * + }, //p_sip.request.msgHeader.fromField, + { + fieldName := TO_E, + addressField := p_sip.request.msgHeader.fromField.addressField, + toParams := * + } //p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ECO_BYE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_BYE_02 + + /** + * @desc Verify that the P-CSCF successfully processes a BYE (Network initiated). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_A entity previouslyEstablishedCallWith the UE_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isNoLongerAvailable + * } + * then { + * the IMS_P_CSCF_A entity sends a BYE containing + * From indicating value PX_S_CSCF_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_BYE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_03( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_03 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_BYE_03 - } // End of group imsBye + function f_mtc_check_TP_GM_PCSCF_BYE_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_04( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_04 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_BYE_04 + + function f_mtc_check_TP_GM_PCSCF_BYE_05( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_05( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_05 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_BYE_05 + + function f_mtc_check_TP_GM_PCSCF_BYE_06( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_BYE_06( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_BYE_06 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_BYE_06 + + } // End of group imsBye - group ims200OkBye { + group ims200OkBye { - /** - * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a BYE - * } - * then { - * the IMS_P_CSCF_A entity sends a 200_Ok containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * to the IMS_S_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_200OK_BYE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_BYE_01", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_01 + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a BYE + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_200OK_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_01 - /** - * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity isRequestedToSend a BYE - * } - * then { - * the IMS_P_CSCF_B entity sends a 200_Ok containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_200OK_BYE_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_BYE_02", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_02 - - function f_mtc_check_TP_GM_PCSCF_200OK_BYE_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_BYE_03", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_03 - - function f_mtc_check_TP_GM_PCSCF_200OK_BYE_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_BYE_04", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_04 - - function f_mtc_check_TP_GM_PCSCF_200OK_BYE_05( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_BYE_05", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_05 - - function f_mtc_check_TP_GM_PCSCF_200OK_BYE_06( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK BYE - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_BYE_06", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_06 + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Originating Leg) + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE; + * from the IMS_E_CSCF entity + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_200OK_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_ECO_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ECO_200OK_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_200OK_BYE_01 + + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity isRequestedToSend a BYE + * } + * then { + * the IMS_P_CSCF_B entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_200OK_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_BYE_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_02 + + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Terminating Leg) + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IMS_E_CSCF entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_ECO_200OK_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_ECO_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_ECO_200OK_BYE_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_200OK_BYE_02 + + function f_mtc_check_TP_GM_PCSCF_200OK_BYE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_BYE_03", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_03 + + function f_mtc_check_TP_GM_PCSCF_200OK_BYE_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_BYE_04", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_04 + + function f_mtc_check_TP_GM_PCSCF_200OK_BYE_05( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_BYE_05", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_05 - } // End of group ims200OkBye + function f_mtc_check_TP_GM_PCSCF_200OK_BYE_06( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_BYE_06", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_BYE_06 + + } // End of group ims200OkBye - group imsCancel { + group imsCancel { - /** - * @desc Verify that the P-CSCF successfully processes a CANCEL (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and and - * the UE_A entity hasAchieveInitialINVITE - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a CANCEL - * } - * then { - * the IMS_P_CSCF_A entity receives a CANCEL containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE - * ; - * from the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_CANCEL_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_01( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_CANCEL_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_CANCEL_01", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_01 + /** + * @desc Verify that the P-CSCF successfully processes a CANCEL (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and and + * the UE_A entity hasAchieveInitialINVITE + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_A entity receives a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_CANCEL_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_01 - /** - * @desc Verify that the P-CSCF successfully processes a CANCEL (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and and - * the UE_A entity hasAchieveInitialINVITE - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a CANCEL - * } - * then { - * the IMS_P_CSCF_B entity sends a CANCEL containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE - * ; - * to the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_CANCEL_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_02( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_CANCEL_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_CANCEL_02", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_02 - - function f_mtc_check_TP_GM_PCSCF_CANCEL_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_03( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_CANCEL_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_CANCEL_03", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_03 - - function f_mtc_check_TP_GM_PCSCF_CANCEL_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_04( - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, - -, // FIXME To be set - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipRequest(mw_CANCEL_Request_Base) }, - { 0, omit }, - "TP_GM_PCSCF_CANCEL_04", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_04 + /** + * @desc Verify that the P-CSCF successfully processes a CANCEL during Emergency Call establishment. + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity hasAchievedInitialEmergencyINVITE + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_A entity receives a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_EMC_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_EMC_CANCEL_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_EMC_CANCEL_01 + + /** + * @desc Verify that the P-CSCF successfully processes a CANCEL (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and and + * the UE_A entity hasAchieveInitialINVITE + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_B entity sends a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * to the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_CANCEL_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_02( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_CANCEL_02", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_02 + + function f_mtc_check_TP_GM_PCSCF_CANCEL_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_03( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_CANCEL_03", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_03 - } // End of group imsCancel + function f_mtc_check_TP_GM_PCSCF_CANCEL_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_GM_PCSCF_CANCEL_04( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_GM_PCSCF_CANCEL_04", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_CANCEL_04 + + } // End of group imsCancel - group ims200OkCancel { + group ims200OkCancel { - /** - * @desc Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a CANCEL - * } - * then { - * the IMS_P_CSCF_A entity sends a 200_Ok containing - * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, - * CallId indicating value PX_UE_A_CALLID, - * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * to the IMS_S_CSCF_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_CANCEL_01", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_01 + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_A entity sends a 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_CANCEL_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_01 - /** - * @desc Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity isRequestedToSend a CANCEL - * } - * then { - * the IMS_P_CSCF_B entity sends a 200_Ok containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE, - * not PChargingVector, - * not PChargingFunctionAddresses, - * not PPreferredIdentity - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_CANCEL_02", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_02 - - function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_CANCEL_03", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_03 - - function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - in SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 200 OK CANCEL - p_monitorCompRef.start( - f_Iot_Sip_receive( - { mw_SipResponse(mw_200OK( - p_sip.request.msgHeader.cSeq, - p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - )) - }, - { mw_SipResponse(mw_200OK_Base) }, - { 0, omit }, - "TP_GM_PCSCF_200OK_CANCEL_04", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - } - } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_04 + /** + * @desc Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_B entity sends a 200_Ok containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE, + * not PChargingVector, + * not PChargingFunctionAddresses, + * not PPreferredIdentity + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_CANCEL_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_02 + + function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_CANCEL_03", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_03 - } // End of group ims200OkCancel + function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_GM_PCSCF_200OK_CANCEL_04", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GM_PCSCF_200OK_CANCEL_04 + + } // End of group ims200OkCancel - group imsBusy { + group imsBusy { - /** - * @desc Verify that the P-CSCF successfully processes a 486 INVITE (busy) to reject call (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and and - * the UE_B entity isBusy - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity isRequestedToSend a 486_INVITE - * } - * then { - * the IMS_P_CSCF_A entity sends a 486_INVITE containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_486INVITE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 486 Busy - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - ( - mw_SipResponse( - mw_486Busy( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField, - omit - ) - ), - mw_SipResponse( - mw_600BusyEverywhere( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField, - omit - ) - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_486INVITE_01", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_01 + /** + * @desc Verify that the P-CSCF successfully processes a 486 INVITE (busy) to reject call (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and and + * the UE_B entity isBusy + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity isRequestedToSend a 486_INVITE + * } + * then { + * the IMS_P_CSCF_A entity sends a 486_INVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_486INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 486 Busy + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + ( + mw_SipResponse( + mw_486Busy( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ), + mw_SipResponse( + mw_600BusyEverywhere( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_486INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_01 - /** - * @desc Verify that the P-CSCF successfully processes a 486 INVITE (busy) to reject call (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and and - * the UE_B entity isBusy - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_B entity isRequestedToSend a 486_INVITE - * } - * then { - * the IMS_P_CSCF_B entity receives a CANCEL containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_486INVITE_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 486 Busy - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - ( - mw_SipResponse( - mw_486Busy( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField, - omit - ) - ), - mw_SipResponse( - mw_600BusyEverywhere( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField, - omit - ) - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_486INVITE_02", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_02 - - function f_mtc_check_TP_GM_PCSCF_486INVITE_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 486 Busy - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse( - mw_486Busy( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_486INVITE_03", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_03 - - function f_mtc_check_TP_GM_PCSCF_486INVITE_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 486 Busy - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse( - mw_486Busy( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_486INVITE_04", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_04 + /** + * @desc Verify that the P-CSCF successfully processes a 486 INVITE (busy) to reject call (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and and + * the UE_B entity isBusy + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_B entity isRequestedToSend a 486_INVITE + * } + * then { + * the IMS_P_CSCF_B entity receives a CANCEL containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_486INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 486 Busy + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + ( + mw_SipResponse( + mw_486Busy( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ), + mw_SipResponse( + mw_600BusyEverywhere( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_486INVITE_02", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_02 + + function f_mtc_check_TP_GM_PCSCF_486INVITE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 486 Busy + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_486Busy( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_486INVITE_03", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_03 - } // End of group imsBusy + function f_mtc_check_TP_GM_PCSCF_486INVITE_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 486 Busy + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_486Busy( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_486INVITE_04", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_486INVITE_04 + + } // End of group imsBusy - group imsRequestTermination { + group imsRequestTermination { - /** - * @desc Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) (Originating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and and - * the UE_A entity hasAchieveInitialINVITE - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a CANCEL - * } - * then { - * the IMS_P_CSCF_A entity sends a 487_INVITE containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * to the UE_A entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_487INVITE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 487 Request Terminated - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse( - mw_487RequestTerminated( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField, - omit - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_487INVITE_01", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_01 + /** + * @desc Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and and + * the UE_A entity hasAchieveInitialINVITE + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_A entity sends a 487_INVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_487INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_487INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_01 - /** - * @desc Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) (Terminating Leg). - * Initial conditions with { - * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and - * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and and - * the UE_A entity hasAchieveInitialINVITE - * } - * - * Expected behaviour - * ensure that { - * when { - * the UE_A entity isRequestedToSend a CANCEL - * } - * then { - * the IMS_P_CSCF_B entity receives a 487_INVITE containing - * From indicating value PX_UE_B_SIP_URI, - * To indicating value PX_UE_A_SIP_URI, - * CallId indicating value PX_UE_B_CALLID, - * Via indicating value PX_UE_B_VIA, - * Route indicating value PX_UE_B_SERVICE_ROUTE - * ; - * from the UE_B entity - * } - * } - */ - function f_mtc_check_TP_GM_PCSCF_487INVITE_02( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 487 Request Terminated - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse( - mw_487RequestTerminated( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_487INVITE_02", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_02 - - function f_mtc_check_TP_GM_PCSCF_487INVITE_03( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 487 Request Terminated - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse( - mw_487RequestTerminated( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_487INVITE_03", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_03 - - function f_mtc_check_TP_GM_PCSCF_487INVITE_04( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)) { - // Check the 487 Request Terminated - p_monitorCompRef.start( - f_Iot_Sip_receive( - { - mw_SipResponse( - mw_487RequestTerminated( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - ) - ) - }, - { - mw_SipResponse(mdw_4XX_Base) - }, - { 0, omit }, - "TP_GM_PCSCF_487INVITE_04", - true, - p_checkMessage - ) - ); - p_monitorCompRef.done; - // Retrieve messge - f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); - } - } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_04 + function f_mtc_check_TP_GM_PCSCF_ECO_487INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_487INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_ECO_487INVITE_01 + + /** + * @desc Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) (Terminating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and and + * the UE_A entity hasAchieveInitialINVITE + * } + * + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToSend a CANCEL + * } + * then { + * the IMS_P_CSCF_B entity receives a 487_INVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE + * ; + * from the UE_B entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_487INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_487INVITE_02", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_02 - } // End of group imsRequestTermination + function f_mtc_check_TP_GM_PCSCF_487INVITE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_487INVITE_03", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_03 + + function f_mtc_check_TP_GM_PCSCF_487INVITE_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_487INVITE_04", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_487INVITE_04 + + } // End of group imsRequestTermination + group imsAlternateService { + + function f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_380AlternateService(p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_3XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_ECO_380ALTSRV_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_380ALTSRV_01 + + function f_mtc_check_TP_GM_PCSCF_ECO_380ALTSRV_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_380AlternateService(p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_3XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_ECO_380ALTSRV_02", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_380ALTSRV_02 + + } // End of group imsTemporaryUnavailable + + group imsTemporaryUnavailable { + + function f_mtc_check_TP_GM_PCSCF_480TEMPAV_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_GM_PCSCF_480TEMPAV_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_480TEMPAV_01 + + } // End of group imsTemporaryUnavailable + + + group imsINFO{ + + /** + * @desc Verify that the P-CSCF sends an INFO request demanding a transfer of updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VoLTE_INT_ES + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + when { + the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD"; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a INFO containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml + request containing + action indicating value "send-data", + datatype indicating value "eCall.MSD";, + ContentDisposition indicating value "By-Reference";; + to the UE_A entity + } + } + + */ + function f_mtc_check_TP_GM_PCSCF_NGC_INFO_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_NGC_INFO_01 + + /** + * @desc Verify that the P-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_GM_PCSCF_NGC_INFO_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_GM_PCSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.MSD")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_NGC_INFO_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_GM_PCSCF_NGC_INFO_02 + + }// End of group imsINFO + + + + } // End of module AtsImsIot_TP_behavior_GM \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GX.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GX.ttcn index 7596bc0d4586027312dc4f03354d17bda475fb8c..c62ebfb9d4884d06e7c671b725d42e1a98dbc835 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GX.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_GX.ttcn @@ -7,21 +7,21 @@ module AtsImsIot_TP_behavior_GX { - import from AtsImsIot_TestSystem { type DiameterInterfaceMonitor, ImsTestCoordinator; } - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from AtsImsIot_TestSystem all; + import from LibIot_PIXITS all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; import from AtsImsIot_Functions all; - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from LibIot_PIXITS all; import from AtsImsIot_Diameter_Templates all; // LibDiameter import from LibDiameter_Templates all; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;}; + import from LibDiameter_TypesAndValues all; group g_PGW { @@ -87,13 +87,15 @@ group g_PGW { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_SubscriberIMSI_qosInformation_class5(INITIAL_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_SubscriberIMSI_qosInformation_class5(INITIAL_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_CCR_01 - CCR", @@ -142,13 +144,15 @@ group g_PGW { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_RequestType(TERMINATION_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_RequestType(TERMINATION_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_CCR_02 - CCR", @@ -211,13 +215,15 @@ group g_PGW { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_ChargingRuleInstall(mw_chrgRuleInstall) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_ChargingRuleInstall(mw_chrgRuleInstall)} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_01 - RAR", @@ -227,13 +233,15 @@ group g_PGW { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { rAA_MSG := mw_RAA_resultCode }; + mw_diameter_msg_fail := { rAA_MSG := mw_RAA_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_resultCode} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_Gx_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_01 - RAA", @@ -283,13 +291,15 @@ group g_PGW { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_Gx_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_02 - RAR", @@ -299,13 +309,15 @@ group g_PGW { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { rAA_MSG := mw_RAA_resultCode }; + mw_diameter_msg_fail := { rAA_MSG := mw_RAA_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_Gx_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_02 - RAA", @@ -355,13 +367,15 @@ group g_PGW { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_Gx_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_dummy} + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_03 - RAR", @@ -371,13 +385,15 @@ group g_PGW { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { rAA_MSG := mw_RAA_resultCode }; + mw_diameter_msg_fail := { rAA_MSG := mw_RAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_03 - RAA", @@ -429,13 +445,15 @@ group g_PGW { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_ChargingRuleRemove }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_ChargingRuleRemove } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_04 - RAR", @@ -445,13 +463,15 @@ group g_PGW { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { rAA_MSG := mw_RAA_resultCode }; + mw_diameter_msg_fail := { rAA_MSG := mw_RAA_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_Gx_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PGW_RAA_04 - RAA", @@ -463,7 +483,8 @@ group g_PGW { } } // End of function f_mtc_check_TP_GX_PGW_RAA_04 - + group ES{ + } //end group ES } // end group g_PGW group g_PCRF { @@ -533,13 +554,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_SubscriberIMSI_qosInformation_class5(INITIAL_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_SubscriberIMSI_qosInformation_class5(INITIAL_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_01 - CCR", @@ -549,13 +572,15 @@ group g_PCRF { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_01 - CCA", @@ -608,13 +633,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_RequestType(TERMINATION_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_RequestType(TERMINATION_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_02 - CCR", @@ -624,13 +651,15 @@ group g_PCRF { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_02 - CCA", @@ -682,13 +711,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_RequestType(TERMINATION_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_RequestType(TERMINATION_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_03 - CCR", @@ -698,13 +729,15 @@ group g_PCRF { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_03 - CCA", @@ -768,13 +801,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCA_MSG := mw_CCA_qosInformation_class5 }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_qosInformation_class5 } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_04 - CCA", @@ -825,13 +860,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_CCA_05 - CCA", @@ -901,13 +938,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_ChargingRuleInstall(mw_chrgRuleInstall_Qos) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_ChargingRuleInstall(mw_chrgRuleInstall_Qos)} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_RAR_01 - RAR", @@ -958,13 +997,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_ChargingRuleRemove }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_ChargingRuleRemove} + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_RAR_02 - RAR", @@ -1032,13 +1073,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_ChargingRuleInstall(mw_chrgRuleInstall_Qos) }; //During validation some additions may be required + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_ChargingRuleInstall(mw_chrgRuleInstall_Qos) } //During validation some additions may be required + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_RAR_03 - RAR", @@ -1088,13 +1131,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_ChargingRuleRemove }; //During validation some additions may be required + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_Gx_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_ChargingRuleRemove } //During validation some additions may be required + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_Gx_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_RAR_04 - RAR", @@ -1106,8 +1151,243 @@ group g_PCRF { } } // End of function f_mtc_check_TP_GX_PCRF_RAR_04 + group ES{ + /** + * Starts monitor component behavior for TP_GX_PCRF_ECO_CCA_01 + * @param p_monitorCompRef Reference to monitor component + *
+		 Test objective  "Verify that IUT when receives CC-Request for PCC Rules containing IMSI for emergency services sends a CC-Answer in case of attachment procedure."
+        
+        Reference 
+            "TS 129 212 [9], clauses 4.5.15.2.1"
+        
+        Config Id CF_VoLTE_INT_ES
+        
+        PICS Selection NONE
+        
+        Initial conditions with {
+            the UE_A entity isNotAttachedTo the EPC_A and
+            the UE_A entity isNotRegisteredTo the IMS_A
+        }
+        
+        Expected behaviour
+            ensure that {
+                when {
+                    the EPC_PGW_A entity sends an CCR containing
+                        CC_Request_Type_AVP indicating value INITIAL_REQUEST
+                        Subscription_Id_AVP containing
+                            Subscription_Id_Type_AVP
+                                indicating value END_USER_IMSI;,
+                        IP_CAN_Type_AVP indicating value RestrictedToEmergencyServices,
+                        RAT_Type_AVP,
+                        Called_Station_Id_AVP indicating value "Emergency_APN"
+                        Framed_IP_Address_AVP
+                        "or" Framed_IP6_IP_Address_AVP
+                        QoS_Information_AVP
+                        Default_EPS_Bearer_QoS_AVP containing
+                            QoS_Class_Identifier_AVP
+                                indicating value '5'
+                            Allocation_Retention_Priority_AVP containing
+                                Priority_Level_AVP
+                                Pre_emption_Capablity_AVP
+                                Pre_emption_Vulnerability_AVP;;;
+                    to the EPC_PCRF_A entity
+                }
+                then {
+                    the EPC_PCRF_A entity sends the CCA containing
+                        Result_Code_AVP
+                            indicating value DIAMETER_SUCCESS;
+                    to the EPC_PGW_A entity
+                }
+            }
+		 * 
+ * @see TS 103 653-1 clause 7.7 + */ + function f_mtc_check_TP_GX_PCRF_ECO_CCA_01( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_SubscriberIMSI_qosInformation_class5_ES(INITIAL_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_CCA_01 - CCR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic}; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_CCA_01 - CCA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GX_PCRF_ECO_CCA_01 + + function f_mtc_check_TP_GX_PCRF_ECO_CCA_02( // FIXME To be reviewd + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_SubscriberIMSI_qosInformation_class5_ES(INITIAL_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_CCA_02 - CCR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic}; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_CCA_01 - CCA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GX_PCRF_ECO_CCA_02 + + /** + * Starts monitor component behavior for TP_GX_PCRF_ECO_CCA_02 + * @param p_monitorCompRef Reference to monitor component + *
+		 Test objective  "Verify that IUT when receives CC-Request for PCC Rules containing IMEI for emergency services sends a CC-Answer in case of attachment procedure."
+        
+        Reference 
+            "TS 129 212 [9], clauses 4.5.15.2.1"
+        
+        Config Id CF_VxLTE_INT
+        
+        PICS Selection NONE
+        
+        Initial conditions with {
+            the UE_A entity isNotAttachedTo the EPC_A and
+            the UE_A entity isNotRegisteredTo the IMS_A
+        }
+        
+        Expected behaviour
+            ensure that {
+                when {
+                    the EPC_PGW_A entity sends an CCR containing
+                        CC_Request_Type_AVP indicating value INITIAL_REQUEST,
+                        User_Equipment_Info_AVP containing
+                             User_Equipment_Info_Type_AVP indicating value IMEISV
+                             User_Equipment_Info_Value_AVP;,
+                        IP_CAN_Type_AVP indicating value RestrictedToEmergencyServices,
+                        RAT_Type_AVP,
+                        Called_Station_Id_AVP indicating value "Emergency_APN"
+                        Framed_IP_Address_AVP
+                        "or" Framed_IP6_IP_Address_AVP
+                        QoS_Information_AVP
+                        Default_EPS_Bearer_QoS_AVP containing
+                            QoS_Class_Identifier_AVP
+                                indicating value '5'
+                            Allocation_Retention_Priority_AVP containing
+                                Priority_Level_AVP
+                                Pre_emption_Capablity_AVP
+                                Pre_emption_Vulnerability_AVP;;;
+                    to the EPC_PCRF_A entity
+                }
+                then {
+                    the EPC_PCRF_A entity sends the CCA containing
+                        Result_Code_AVP
+                            indicating value DIAMETER_SUCCESS;
+                    to the EPC_PGW_A entity
+                }
+            }
+		 * 
+ * @see TS 103 653-1 clause 7.7 + */ + function f_mtc_check_TP_GX_PCRF_EMC_CCA_01( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_SubscriberIMEI_qosInformation_class5_ES(INITIAL_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_CCA_02 - CCR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + mw_diameter_msg_pass := { cCA_MSG := mw_CCA_resultCode }; + mw_diameter_msg_fail := { cCA_MSG := mw_CCA_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_CCA_02 - CCA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_GX_PCRF_EMC_CCA_01 + } //end group ES } // end group g_PCRF -} // end module AtsImsIot_TP_behavior_GX \ No newline at end of file +} // end module AtsImsIot_TP_behavior_GX diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_IC.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_IC.ttcn index f46956de12723e164ff64f815ff1636c3be18682..0c90b1e370a41caa8ffd0e25232e9dae8c4238c8 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_IC.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_IC.ttcn @@ -7,27 +7,23 @@ module AtsImsIot_TP_behavior_IC { - import from AtsImsIot_TestSystem { type SipInterfaceMonitor , ImsTestCoordinator, SipInterfaceMonitor; } - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIms_UpperTester {type ImsUserInfo;} - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from AtsImsIot_TestSystem all; + import from LibIot_PIXITS all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIms_UpperTester all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; import from LibSip_SIPTypesAndValues all; import from LibSip_Templates all; - import from LibSip_Common { - type - GenericParam, - SemicolonParam_List - } + import from LibSip_Common all; import from AtsImsIot_Functions all; - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from LibIot_PIXITS all; // LibSip - import from LibSip_SDPTypes { type SDP_media_desc_list }; + import from LibSip_SDPTypes all; import from AtsImsIot_Templates_IC all; @@ -897,7 +893,28 @@ module AtsImsIot_TP_behavior_IC ); p_monitorCompRef.done; } - } //function + } + + function f_mtc_check_TP_IC_IBCF_ECO_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + var charstring v_EUT_A_Addr := f_GetEUTScscfAddress_1();//f_GetEUTScscfAddress(PX_EUT_A) + + if (isvalue(p_monitorCompRef)) { + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mdw_TP_IMS_5107_01_ic(?, mw_SipUrl_Host(v_EUT_A_Addr))) }, + { mw_SipRequest(mw_BYE_Request_Base) }, + {0, omit}, + "TP_IC_IBCF_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } /** * @desc Starts monitor component behavior @@ -1647,5 +1664,36 @@ module AtsImsIot_TP_behavior_IC } // end group g_IBCF + group imsTemporaryUnavailable { + + function f_mtc_check_TP_IC_IBCF_480TEMPAV_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_IC_IBCF_480TEMPAV_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_IC_IBCF_480TEMPAV_01 + + } // End of group imsTemporaryUnavailable + } // end module AtsImsIot_TP_behavior_IC \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ISC.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ISC.ttcn index 0559a250ed280d9a5aa2b102e20d70e4ef87feb7..adea268ea87b5470272893be77bd7ac38c1ca0ac 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ISC.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ISC.ttcn @@ -7,28 +7,24 @@ module AtsImsIot_TP_behavior_ISC { - import from AtsImsIot_TestSystem { type ImsInterfaceMonitor, ImsTestCoordinator, SipInterfaceMonitor; } - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIms_UpperTester {type ImsUserInfo;} - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from AtsImsIot_TestSystem all; + import from LibIot_PIXITS all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIms_UpperTester all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; import from LibSip_SIPTypesAndValues all; import from LibSip_Templates all; - import from LibSip_Common { - type - GenericParam, - SemicolonParam_List - } + import from LibSip_Common all; import from AtsImsIot_Functions all; - import from AtsImsIot_Templates_MW all; - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from AtsImsIot_Templates_ISC all; + import from LibIot_PIXITS all; // LibSip - import from LibSip_SDPTypes { type SDP_media_desc_list }; + import from LibSip_SDPTypes all; // LibMsrp // import from LibMsrp_TypesAndValues { type MsrpURI }; // import from LibMsrp_Functions { function f_str2msrpUri }; @@ -48,49 +44,250 @@ module AtsImsIot_TP_behavior_ISC group g_ISC { + group imsRegistration { /** - * @desc Starts monitor component behavior for TP_ISC_SCSCF_REGISTER_01 - * @param p_monitorCompRef Reference to monitor component - * @remark source function f_mtc_check_TP_IC_IBCF_REGISTER_02 - */ - function f_mtc_check_TP_ISC_SCSCF_REGISTER_01( - SipInterfaceMonitor p_monitorCompRef, - boolean p_checkMessage := false - ) runs on ImsTestCoordinator { - if (isvalue(p_monitorCompRef)){ - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + * @desc Starts monitor component behavior for TP_ISC_SCSCF_REGISTER_01 + * @param p_monitorCompRef Reference to monitor component + * @remark source function f_mtc_check_TP_IC_IBCF_REGISTER_02 + */ + function f_mtc_check_TP_ISC_SCSCF_REGISTER_01( + SipInterfaceMonitor p_monitorCompRef, + boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + + p_monitorCompRef.start( + f_Iot_Sip_receive( + {mw_SipRequest(mdw_TP_ISC_SCSCF_REGISTER_01(mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain)))}, + {mw_SipRequest(mw_REGISTER_Request_Base)}, + {0, omit}, + "TP_ISC_SCSCF_REGISTER_01 - REGISTER", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + var charstring v_EUT_A_Addr := f_GetEUTPcscfIpAddress_1(); + var template SipUrl v_eutBUri := mw_SipUrl_Host(f_GetEUTScscfAddress_1()); + + p_monitorCompRef.start( + f_Iot_Sip_receive( + {mw_SipResponse(mw_Response_Base_ToFrom(c_statusLine200, ?, ?,?,?))}, //TODO To/From + //{mw_SipResponse(mdw_TP_IC_IBCF_REGISTER200OK_02(v_EUT_A_Addr, v_eutBUri))}, + {mw_SipResponse (mw_200OK_Base)}, + {0, omit}, + "TP_ISC_SCSCF_REGISTER_01 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + } + }//end f_mtc_check_TP_ISC_SCSCF_REGISTER_01 + }// end imsRegistration - p_monitorCompRef.start( - f_Iot_Sip_receive( - {mw_SipRequest(mdw_TP_ISC_SCSCF_REGISTER_01(mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain)))}, - {mw_SipRequest(mw_REGISTER_Request_Base)}, - {0, omit}, - "TP_ISC_SCSCF_REGISTER_01 - REGISTER", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; + + group imsInvite { + + /** + * @desc Verify that the S-CSCF successfully receives an initial emergency INVITE from a registered but not emergency registered UE. + * Reference + * "ETSI TS 124 229 [1], Clauses 5.7.1.14" + * Config Id CF_VoLTE_INT_ES + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToEstablishEmergencyCall + * } + * then { + * the IMS_S_CSCF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_ISC_SCSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_ISC_SCSCF_ECO_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_GM_PCSCF_ECO_INVITE_01 - Request", //TODO + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_ISC_SCSCF_INVITE_01 + + } + + group ims183SessionProgress { + + function f_mtc_check_TP_ISC_SCSCF_ECO_183SESSION_PROGRESS_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_ISC_SCSCF_183SessionProgress_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_ISC_SCSCF_ECO_183SESSION_PROGRESS_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_ISC_SCSCF_ECO_183SESSION_PROGRESS_01 + + } // End of group ims183SessionProgress - var charstring v_EUT_A_Addr := f_GetEUTPcscfIpAddress_1(); - var template SipUrl v_eutBUri := mw_SipUrl_Host(f_GetEUTScscfAddress_1()); + group ims180Ringing { + + function f_mtc_check_TP_ISC_SCSCF_ECO_180RINGING_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_ISC_SCSCF_180Ringing_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + mw_To_NameAddr_TelUrl( + -, + p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber + ))) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_ISC_SCSCF_180RINGING_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_ISC_SCSCF_ECO_180RINGING_01 + + } // End of group ims180Ringing + + group ims200Ok { + + function f_mtc_check_TP_ISC_SCSCF_ECO_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); - p_monitorCompRef.start( - f_Iot_Sip_receive( - {mw_SipResponse(mw_Response_Base_ToFrom(c_statusLine200, ?, ?,?,?))}, //TODO To/From - //{mw_SipResponse(mdw_TP_IC_IBCF_REGISTER200OK_02(v_EUT_A_Addr, v_eutBUri))}, - {mw_SipResponse (mw_200OK_Base)}, - {0, omit}, - "TP_ISC_SCSCF_REGISTER_01 - 200 OK", - false, - p_checkMessage - ) - ); - p_monitorCompRef.done; - - } - }//end f_mtc_check_TP_ISC_SCSCF_REGISTER_01 + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), + mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_ISC_SCSCF_ECO_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + } + } // End of function f_mtc_check_TP_ISC_SCSCF_ECO_200OK_01 + + } // End of group ims200Ok + + group imsAck { + + function f_mtc_check_TP_ISC_SCSCF_ECO_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_ISC_SCSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_ISC_SCSCF_ECO_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_ISC_SCSCF_ECO_ACK_01 + + } // End of group imsAck + } // end of g_ISC diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MI.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MI.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..09e7834823712a37ecac382f254b375be9328b9a --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MI.ttcn @@ -0,0 +1,913 @@ +/* + * @author TTF T010 + * @version $Id$ + * @desc This module provides the TP behaviour functions at MI interface + */ +module AtsImsIot_TP_behavior_MI { + + // LibIms + import from LibIms_Templates all; + import from LibIms_UpperTester all; + // LibIot + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; + import from LibIot_TestInterface all; + import from LibIot_PIXITS all; + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Templates all; + import from LibSip_Common all; + import from LibSip_SDPTypes all; + // LibMsrp + import from LibMsrp_TypesAndValues all; + import from LibMsrp_Functions all; + import from LibMsrp_Templates all; + // AtsImsIot + import from AtsImsIot_TestSystem all; + import from AtsImsIot_Templates_MI all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_Functions all; + + group imsInvite { + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the BGCF for a PSAP in the PSTN." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the BGCF + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_LRF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_BGCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MI_ECSCF_ECO_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_INVITE_01 + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the BGCF for a PSAP in the PSTN and includes the LRF provided URI in the Request-URI." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_LRF and + * the IMS_E_CSCF entity hasSentINVITETo the IMS_LRF and + * the IMS_E_CSCF entity supportsRoutingTo the BGCF + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * Contact indicating value LRF_provided_SIP_URI; + * from the IMS_LRF entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_LRF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_BGCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_ECO_INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_INVITE_02( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MI_ECSCF_ECO_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_INVITE_02 + + /** + * @desc "Verify that the E-CSCF successfully processes a callback INVITE from PSAP in the PSTN over BGCF and routes the request to the P-CSCF." + * Reference + * "ETSI TS 124 229 [1], Clause 4.1 item 12" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the BGCF + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_PSAP_TEL_URI,// see 5.11.2 6) b) + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_PSAP_CALLID, + * Via indicating value PX_BGCF_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IMS_BGCF_A entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_P_CSCD_SERVICE_ROUTE, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_ECO_INVITE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_INVITE_03( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MI_ECSCF_ECO_INVITE_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_INVITE_03 + + } // End of group imsInvite + + group ims100Trying { + + function f_mtc_check_TP_MI_ECSCF_ECO_100Trying_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MI_ECSCF_100Trying_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_100Trying_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_100Trying_01 + + } // End of group ims100Trying + + group ims180Ringing { + + function f_mtc_check_TP_MI_ECSCF_ECO_180RINGING_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MI_ECSCF_180Ringing_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + mw_To_NameAddr_TelUrl( + -, + p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber + ))) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_180RINGING_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_180RINGING_01 + + } // End of group ims180Ringing + + group ims183SessionProgress { + + function f_mtc_check_TP_MI_ECSCF_ECO_183SESSION_PROGRESS_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MI_ECSCF_183SessionProgress_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_183SESSION_PROGRESS_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_183SESSION_PROGRESS_01 + + } // End of group ims183SessionProgress + + group ims200Ok { + + function f_mtc_check_TP_MI_ECSCF_ECO_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), + mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_200OK_01 + + } // End of group ims200Ok + + group imsAck { + + function f_mtc_check_TP_MI_ECSCF_ECO_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_ACK_01 + + } // End of group imsAck + + group imsBye { + + /** + * @desc Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the PSAP in the IM CN subsystem of own network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IM_CN entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_ECO_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_BYE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_BYE_01 + + /** + * @desc Verify that the E-CSCF successfully processes a BYE from the PSAP in the IM CN subsystem for an Emergency Call and routes the request to the P-CSCF of home network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a BYE containing + * From indicating value PX_PSAP_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_PSAP_CALLID, + * Via indicating value PX_PSAP_CALLID; + * from the IM_CN entity + * } + * then { + * the IMS_E_CSCF_A entity sends a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_ECO_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + { + fieldName := FROM_E, + addressField := p_sip.request.msgHeader.toField.addressField, + fromParams := * + }, //p_sip.request.msgHeader.fromField, + { + fieldName := TO_E, + addressField := p_sip.request.msgHeader.fromField.addressField, + toParams := * + } //p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_BYE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_BYE_02 + + } // End of group imsBye + + group ims200OkBye { + + function f_mtc_check_TP_MI_ECSCF_ECO_200OK_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_200OK_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_200OK_BYE_01 + + } // End of group ims200OkBye + + group imsCancel { + + /** + * @desc Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the BGCF for a PSAP in the PSTN + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the BGCF and + * the UE_A entity hasAchievedInitialEmergencyINVITE the PSAP via IMS_BGCF_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_BGCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_EMC_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MI_ECSCF_CANCEL_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_MI_ECSCF_ECO_CANCEL_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_EMC_CANCEL_01 + + } // End of group imsCancel + + group imsTemporaryUnavailable { + + /** + * @desc Verify that the E-CSCF successfully processes a 480 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IM_CN entity + * } + * then { + * the IMS_E_CSCF_A entity sends a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_ECO_480INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MI_ECSCF_ECO_480INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_ECO_480INVITE_01 + + } // End of group imsTemporaryUnavailable + + group imsRequestTermination { + + /** + * @desc Verify that the E-CSCF successfully processes a 487 response from the BGCF for a PSAP in the PSTN for an Emergency Call and routes the response to the P-CSCF + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the BGCF and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_BGCF_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a 487INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_BGCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a 487INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_EMC_487INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MI_ECSCF_EMC_487INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_EMC_487INVITE_01 + + } // End of group imsRequestTermination + + group imsINFO{ + + /** + * @desc Verify that the E-CSCF sends an INFO request demanding a transfer of updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VoLTE_INT_ES + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + when { + the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD"; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a INFO containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml + request containing + action indicating value "send-data", + datatype indicating value "eCall.MSD";, + ContentDisposition indicating value "By-Reference";; + to the UE_A entity + } + } + + */ + function f_mtc_check_TP_MI_ECSCF_NGC_INFO_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MI_ECSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + -, + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MI_ECSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_NGC_INFO_01 + + /** + * @desc Verify that the E-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MI_ECSCF_NGC_INFO_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MI_ECSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.MSD")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MI_ECSCF_NGC_INFO_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MI_ECSCF_NGC_INFO_02 + + }// End of group imsINFO + +} // End of module AtsImsIot_TP_behavior_MI \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ML.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ML.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..2cc6b3a314a702c8625b497d3822e1de8c2c0eda --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_ML.ttcn @@ -0,0 +1,143 @@ +/* + * @author TTF T010 + * @version $Id$ + * @desc This module provides the TP behaviour functions at ML interface + */ +module AtsImsIot_TP_behavior_ML { + + // LibIms + import from LibIms_Templates all; + import from LibIms_UpperTester all; + // LibIot + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; + import from LibIot_TestInterface all; + import from LibIot_PIXITS all; + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Common all; + import from LibSip_SDPTypes all; + // LibMsrp + import from LibMsrp_TypesAndValues all; + import from LibMsrp_Functions all; + import from LibMsrp_Templates all; + // AtsImsIot + import from AtsImsIot_TestSystem all; + import from AtsImsIot_Templates_MW all; + import from AtsImsIot_Templates_ML all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_Functions all; + + group imsInvite { + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the LRF." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_LRF + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_LRF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_LRF entity + * } + * } + */ + function f_mtc_check_TP_ML_ECSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_ML_ECSCF_INVITE_01( + -, // FIXME Set expected value + ( + mw_From_NameAddr_SipUrl({quotedString:=v_psapInfo.publicId}, v_psapInfo.publicId, v_psapInfo.domain), + mw_From_AddrUnion_TelUrl(v_psapInfo.publicId) + ), + ( + mw_To_NameAddr_SipUrl({quotedString:=v_userInfoA.publicId}, v_userInfoA.publicId/*, v_userInfoA.domain*/), + mw_To_AddrUnion_TelUrl(-)//v_userInfoA.publicId + ) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_ML_ECSCF_ECO_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_ML_ECSCF_ECO_INVITE_01 + + } // End of group imsInvite + + group ims3xxx { + + function f_mtc_check_TP_ML_ECSCF_ECO_3xx_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_ML_ECSCF_3XX_Base_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mdw_3XX_Base) }, + { 0, omit }, + "TP_ML_ECSCF_ECO_3xxx_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_ML_ECSCF_ECO_3xx_01 + + } // End of group ims183SessionProgress + +} // End of module AtsImsIot_TP_behavior_ML diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MM.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MM.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..48b94e7decfbcbb829ec75fe5ca37dc64e108885 --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MM.ttcn @@ -0,0 +1,979 @@ +/* + * @author TTF T010 + * @version $Id$ + * @desc This module provides the TP behaviour functions at MM interface + */ +module AtsImsIot_TP_behavior_MM { + + // LibIms + import from LibIms_Templates all; + import from LibIms_UpperTester all; + // LibIot + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; + import from LibIot_TestInterface all; + import from LibIot_PIXITS all; + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Common all; + import from LibSip_SDPTypes all; + // LibMsrp + import from LibMsrp_TypesAndValues all; + import from LibMsrp_Functions all; + import from LibMsrp_Templates all; + // AtsImsIot + import from AtsImsIot_TestSystem all; + import from AtsImsIot_Templates_MM all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_Functions all; + + group imsInvite { + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the PSAP in the IM CN subsystem of own network." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * PChargingVector, + * MessageBody; + * to the IM_CN entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MM_ECSCF_ECO_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01 + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the PSAP in the IM CN subsystem of own network and includes the LRF provided URI in the Route header." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_LRF and + * the IMS_E_CSCF entity hasSentINVITETo the IMS_LRF and + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an r_3xx_Any containing + * Contact indicating value LRF_provided_SIP_URI; + * from the IMS_LRF entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * not PChargingFunctionAddresses, + * PChargingVector, + * MessageBody; + * to the IM_CN entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_INVITE_02( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MM_ECSCF_ECO_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_02 + + /** + * @desc "Verify that the E-CSCF successfully processes an callback INVITE from PSAP over the IM CN subsystem of own network and routes the request to the P-CSCF." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IM_CN entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * not PChargingFunctionAddresses, + * PChargingVector, + * MessageBody; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_INVITE_03( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MM_ECSCF_ECO_INVITE_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_03 + + + /** + * @desc Verify that the E-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_NGC_INVITE_01( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MM_ECSCF_NGC_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, -, -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MM_ECSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_NGC_INVITE_01 + + } // End of group imsInvite + + group ims100Trying { + + function f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MM_ECSCF_100Trying_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_MM_ECSCF_100Trying_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01 + + } // End of group ims100Trying + + group ims180Ringing { + + function f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MM_ECSCF_180Ringing_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + mw_To_NameAddr_TelUrl( + -, + p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber + ))) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_MM_ECSCF_180RINGING_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01 + + } // End of group ims180Ringing + + group ims183SessionProgress { + + function f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MM_ECSCF_183SessionProgress_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_MM_ECSCF_183SESSION_PROGRESS_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01 + + } // End of group ims183SessionProgress + + group ims200Ok { + + function f_mtc_check_TP_MM_ECSCF_ECO_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), + mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MM_ECSCF_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_200OK_01 + + } // End of group ims200Ok + + group imsAck { + + function f_mtc_check_TP_MM_ECSCF_ECO_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_MM_ECSCF_ECO_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_ACK_01 + + } // End of group imsAck + + group imsBye { + + /** + * @desc Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the PSAP in the IM CN subsystem of own network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IM_CN entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_ECO_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MM_ECSCF_ECO_BYE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_BYE_01 + + /** + * @desc Verify that the E-CSCF successfully processes a BYE from the PSAP in the IM CN subsystem for an Emergency Call and routes the request to the P-CSCF of home network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a BYE containing + * From indicating value PX_PSAP_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_PSAP_SIP_URI, + * Via indicating value PX_PSAP_VIA; + * from the IM_CN entity + * } + * then { + * the IMS_E_CSCF_A entity sends a BYE containing + * From indicating value PX_PSAP_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_PSAP_SIP_URI, + * Via indicating value PX_PSAP_VIA; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_ECO_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_BYE_02( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + { + fieldName := FROM_E, + addressField := p_sip.request.msgHeader.toField.addressField, + fromParams := * + }, //p_sip.request.msgHeader.fromField, + { + fieldName := TO_E, + addressField := p_sip.request.msgHeader.fromField.addressField, + toParams := * + } //p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MM_ECSCF_ECO_BYE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_BYE_02 + + } // End of group imsBye + + group ims200OkBye { + + function f_mtc_check_TP_MM_ECSCF_ECO_200OK_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_ECO_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MM_ECSCF_200OK_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_200OK_BYE_01 + + } // End of group ims200OkBye + + group imsCancel { + + /** + * @desc Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the PSAP in the IM CN subsystem of own network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity hasAchievedInitialEmergencyINVITE + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IM_CN entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_EMC_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MM_ECSCF_CANCEL_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_MM_ECSCF_EMC_CANCEL_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_EMC_CANCEL_01 + + } // End of group imsCancel + + group imsRequestTermination { + + /** + * @desc Verify that the E-CSCF successfully processes a 487 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a 487INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IM_CN entity + * } + * then { + * the IMS_E_CSCF_A entity sends a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_EMC_487INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MM_ECSCF_EMC_487INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_EMC_487INVITE_01 + + } // End of group imsRequestTermination + + group imsTemporaryUnavailable { + + /** + * @desc Verify that the E-CSCF successfully processes a 480 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IM_CN entity + * } + * then { + * the IMS_E_CSCF_A entity sends a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_ECO_480INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MM_ECSCF_ECO_480INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_ECO_480INVITE_01 + + } // End of group imsTemporaryUnavailable + + + group imsINFO{ + + /** + * @desc Verify that the E-CSCF sends an INFO request demanding a transfer of updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VoLTE_INT_ES + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + when { + the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD"; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a INFO containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml + request containing + action indicating value "send-data", + datatype indicating value "eCall.MSD";, + ContentDisposition indicating value "By-Reference";; + to the UE_A entity + } + } + + */ + function f_mtc_check_TP_MM_ECSCF_NGC_INFO_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MM_ECSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + -, -, -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MM_ECSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_NGC_INFO_01 + + /** + * @desc Verify that the E-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MM_ECSCF_NGC_INFO_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MM_ECSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.MSD")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MM_ECSCF_NGC_INFO_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MM_ECSCF_NGC_INFO_02 + + }// End of group imsINFO + + +} // End of module AtsImsIot_TP_behavior_MM \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW.ttcn deleted file mode 100644 index 69203d79b2c941dc9e904fcd50a520026822d8ec..0000000000000000000000000000000000000000 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW.ttcn +++ /dev/null @@ -1,67 +0,0 @@ -/* - * @author STF 574 - * @version $Id$ - * @desc This module provides the TP behaviour functions at MW interface - */ -// FIXME To be removed, use AtsImsIot_TP_behavior_MW_PS, AtsImsIot_TP_behavior_MW_SI and AtsImsIot_TP_behavior_MW_IS to prevent very huge module -//module AtsImsIot_TP_behavior_MW -//{ -// -// import from AtsImsIot_TestSystem { type ImsInterfaceMonitor, ImsTestCoordinator; } -// import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} -// import from AtsImsIot_Templates {template all;} -// import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } -// import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; -// import from LibIms_UpperTester {type ImsUserInfo;} -// import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} -// import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } -// import from LibSip_SIPTypesAndValues all; -// import from LibSip_Templates all; -// -// import from LibSip_Common { -// type -// GenericParam, -// SemicolonParam_List -// } -// -// import from AtsImsIot_Functions all; -// import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} -// // LibSip -// import from LibSip_SDPTypes { type SDP_media_desc_list }; -// // LibMsrp -// import from LibMsrp_TypesAndValues { type MsrpURI }; -// import from LibMsrp_Functions { function f_str2msrpUri }; -// import from LibMsrp_Templates { -// template -// m_msrpSend_Dummy, mw_msrpSEND_toPath_fromPath_contentType, -// m_msrpReport_Dummy, mw_msrpREPORT_success, -// m_msrpResponse_Dummy, mw_msrpResponse_toPath_fromPath, -// mw_toPath, mw_fromPath, mw_msrpResponse_toPath_fromPath_with_transferReports, -// m_msrpURIs_ToPath_Dummy, m_msrpURIs_FromPath_Dummy, -// mw_contentType -// }; -// import from DiameterS6a_Templates all; -// import from DiameterS6a_PIXITS all; -// import from DiameterGx_Templates all; -// // LibDiameter -// import from LibDiameter_Templates all; -//// import from DiameterRx_Templates all; -// -// -// -//group g_PCSCF { -// -// -//} // end group g_PCSCF -// -//group g_ICSCF { -// -// -//} // end group g_ICSCF -// -//group g_SCSCF { -// -// -//} // end group g_SCSCF -// -//} // end module AtsImsIot_TP_behavior_MW \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..4d1c3fb0738e8240c1ab49336ea2c6fcae4c4d56 --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn @@ -0,0 +1,842 @@ +// TODO To be removed +// /** +// * @author TTF T010 +// * @version $Id$ +// * @desc This module provides the TP behaviour functions at Mw interface at E-CSCF/IBCF +// */ + +// module AtsImsIot_TP_behavior_MW_EB { + +// // LibIms +// import from LibIms_Templates all; +// import from LibIms_UpperTester all; +// // LibIot +// import from LibIot_TypesAndValues all; +// import from LibIot_Functions all; +// import from LibIot_TestInterface all; +// import from LibIot_PIXITS all; +// // LibSip +// import from LibSip_SIPTypesAndValues all; +// import from LibSip_Templates all; +// import from LibSip_Common all; +// import from LibSip_SDPTypes all; +// // LibMsrp +// import from LibMsrp_TypesAndValues all; +// import from LibMsrp_Functions all; +// import from LibMsrp_Templates all; +// // AtsImsIot +// import from AtsImsIot_TestSystem all; +// import from AtsImsIot_Templates_MW all; +// import from AtsImsIot_Templates all; +// import from AtsImsIot_TypesAndValues all; +// import from AtsImsIot_Functions all; + +// group imsInvite { + +// /** +// * @desc Verify that the E-CSCF successfully processes an initial INVITE (Originating Leg).. +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the PSAP entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the PSAP entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives an INVITE containing +// * From indicating value PX_UE_A_SIP_URI, +// * To indicating value PX_PSAP_SIP_URI, +// * CallId indicating value PX_UE_A_CALLID, +// * Via indicating value PX_UE_A_VIA, +// * Route indicating value PX_UE_A_SERVICE_ROUTE, +// * PAccessNetworkInfo, +// * MessageBody containing +// * SDP containing +// * Version indicating value "0" +// * ; +// * ;; +// * from the IMS_P_CSCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends an INVITE containing +// * From indicating value PX_UE_A_SIP_URI, +// * To indicating value PX_PSAP_SIP_URI, +// * CallId indicating value PX_UE_A_CALLID, +// * Via indicating value PX_UE_A_VIA, +// * Route indicating value PX_UE_A_SERVICE_ROUTE, +// * PAccessNetworkInfo, +// * MessageBody containing +// * SDP containing +// * Version indicating value "0" +// * ; +// * ;; +// * to the IMS_IBCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_INVITE_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// var charstring v_EUT_A_Addr := f_GetEUTScscfAddress_1();//f_GetEUTScscfAddress(PX_EUT_A); +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { +// mw_SipRequest( +// mdw_TP_MW_IBCF_INVITE_01( +// ( +// mw_SipUrl_Host(v_EUT_A_Addr) //f_GetEUTScscfIpAddress(PX_EUT_A) +// ) +// )) +// }, +// { mw_SipRequest(mw_INVITE_Request_Base) }, +// {0, omit}, +// "TP_MW_IBCF_INVITE_01 - Request", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_INVITE_01 + +// function f_mtc_check_TP_MW_IBCF_INVITE_02( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// var charstring v_EUT_A_Addr := f_GetEUTScscfAddress_1();//f_GetEUTScscfAddress(PX_EUT_A); +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { +// mw_SipRequest( +// mdw_TP_MW_IBCF_INVITE_01( +// ( +// mw_SipUrl_Host(v_EUT_A_Addr) //f_GetEUTScscfIpAddress(PX_EUT_A) +// ) +// )) +// }, +// { mw_SipRequest(mw_INVITE_Request_Base) }, +// {0, omit}, +// "TP_MW_IBCF_INVITE_01 - Request", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_INVITE_02 + +// } // End of group imsInvite + +// group ims100Trying { + +// /** +// * @desc Verify that the E-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Originating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the PSAP entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the PSAP entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives a 100_Trying +// * from the IMS_IBCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a 100_Trying +// * to the IMS_P_CSCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBSCF_100Trying_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 100 TRYING +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_TP_MW_IBCF_100Trying_01( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipResponse(mw_100Trying_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_100Trying_01", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBSCF_100Trying_01 + +// } // End of group ims100Trying + +// group ims180Ringing { + +// /** +// * @desc Verify that the E-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Originating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the PSAP entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the PSAP entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives a 180_Ringing containing +// * From indicating value PX_PSAP_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_PSAP_CALLID, +// * Via indicating value PX_PSAP_VIA, +// * Route indicating value PX_PSAP_SERVICE_ROUTE +// * ; +// * from the IMS_IBCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a 180_Ringing containing +// * From indicating value PX_PSAP_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_PSAP_CALLID, +// * Via indicating value PX_PSAP_VIA, +// * Route indicating value PX_PSAP_SERVICE_ROUTE +// * ; +// * to the IMS_P_CSCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_180RINGING_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 180 RINGING +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_TP_MW_IBCF_180Ringing_01( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.fromField, +// mw_To_NameAddr_TelUrl( +// -, +// p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber +// ))) +// }, +// { mw_SipResponse(mw_180Ringing_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_180RINGING_01", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_180RINGING_01 + +// } // End of group ims180Ringing + +// group ims183SessionProgress { + +// /** +// * @desc Verify that the E-CSCF successfully processes a 183 (Ringing) provisional response on initial INVITE (Originating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the PSAP entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the PSAP entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives a 183_SessionProgress containing +// * From indicating value PX_SAP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_SAP_CALLID, +// * Via indicating value PX_PSAP_VIA, +// * Route indicating value PX_PSAP_SERVICE_ROUTE +// * ; +// * from the IMS_IBCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a 183_SessionProgress containing +// * From indicating value PX_PSAP_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_PSAP_CALLID, +// * Via indicating value PX_PSAP_VIA, +// * Route indicating value PX_PSAP_SERVICE_ROUTE +// * ; +// * to the IMS_P_CSCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_183SESSION_PROGRESS_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 183 SESSION_PROGRESS +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_TP_MW_IBCF_183SessionProgress_01( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipResponse(mw_183SessionProgress_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_183SESSION_PROGRESS_01", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_183SESSION_PROGRESS_01 + +// } // End of group ims183SessionProgress + +// group ims200Ok { + +// /** +// * @desc Verify that the E-CSCF successfully processes a 200 (OK) provisional response on initial INVITE (Originating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the PSAP entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the PSAP entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives a 200_Ok containing +// * From indicating value PX_PSAP_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_PSAP_CALLID, +// * Via indicating value PX_PSAP_VIA, +// * Route indicating value PX_PSAP_SERVICE_ROUTE, +// * not PChargingVector, +// * not PChargingFunctionAddresses, +// * not PPreferredIdentity +// * ; +// * from the IMS_IBCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a 200_Ok containing +// * From indicating value PX_PSAP_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_PSAP_CALLID, +// * Via indicating value PX_PSAP_VIA, +// * Route indicating value PX_PSAP_SERVICE_ROUTE, +// * PChargingVector, +// * PChargingFunctionAddresses, +// * PPreferredIdentity +// * ; +// * to the IMS_P_CSCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_200OK_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 200 OK +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_200OK( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.callId, +// p_sip.request.msgHeader.fromField, +// ( +// mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), +// mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), +// p_sip.request.msgHeader.toField +// ) +// )) +// }, +// { mw_SipResponse(mw_200OK_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_200OK_01", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; + +// } +// } // End of function f_mtc_check_TP_MW_IBCF_200OK_01 + +// function f_mtc_check_TP_MW_IBCF_ECO_200OK_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 200 OK +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_200OK( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.callId, +// p_sip.request.msgHeader.fromField, +// ( +// mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_PSAP).publicId}), +// mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_PSAP).publicId), +// p_sip.request.msgHeader.toField +// ) +// )) +// }, +// { mw_SipResponse(mw_200OK_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_200OK_01", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; + +// } +// } // End of function f_mtc_check_TP_MW_IBCF_ECO_200OK_01 + +// /** +// * @desc Verify that the E-CSCF successfully processes a 200 (Ok) provisional response on initial INVITE (Terminating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the UE_B entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the UE_B entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives a 200_Ok containing +// * From indicating value PX_UE_B_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_UE_B_CALLID, +// * Via indicating value PX_UE_B_VIA, +// * Route indicating value PX_UE_B_SERVICE_ROUTE, +// * PChargingVector, +// * PChargingFunctionAddresses, +// * PPreferredIdentity +// * ; +// * from the UE_B entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a 200_Ok containing +// * From indicating value PX_UE_B_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_UE_B_CALLID, +// * Via indicating value PX_UE_B_VIA, +// * Route indicating value PX_UE_B_SERVICE_ROUTE, +// * not PChargingVector, +// * not PChargingFunctionAddresses, +// * not PPreferredIdentity +// * ; +// * from the IMS_P_CSCF_B entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_200OK_02( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 200 OK +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_200OK( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.callId, +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipResponse(mw_200OK_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_200OK_02", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_200OK_02 + +// } // End of group ims200Ok + +// group imsAck { + +// /** +// * @desc Verify that the E-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the PSAP entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the PSAP entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives an ACK containing +// * From indicating value PX_UE_A_SIP_URI, +// * To indicating value PX_PSAP_SIP_URI, +// * CallId indicating value PX_UE_A_CALLID, +// * Via indicating value PX_UE_A_VIA, +// * Route indicating value PX_UE_A_SERVICE_ROUTE +// * ; +// * from the IMS_P_CSCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends an ACK containing +// * From indicating value PX_UE_A_SIP_URI, +// * To indicating value PX_PSAP_SIP_URI, +// * CallId indicating value PX_UE_A_CALLID, +// * Via indicating value PX_UE_A_VIA, +// * Route indicating value PX_UE_A_SERVICE_ROUTE +// * ; +// * from the IMS_IBCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_ACK_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the ACK +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipRequest(mw_TP_MW_IBCF_ACK_01( +// p_sip.request.msgHeader.callId, +// p_sip.request.msgHeader.cSeq, +// -, // FIXME To be set +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipRequest(mw_ACK_Request_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_ACK_01 - Request", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_ACK_01 + +// function f_mtc_check_TP_MW_IBCF_ECO_ACK_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the ACK +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipRequest(mw_TP_MW_IBCF_ACK_01( +// p_sip.request.msgHeader.callId, +// p_sip.request.msgHeader.cSeq, +// -, // FIXME To be set +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipRequest(mw_ACK_Request_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_ACK_01 - Request", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_ACK_01 + +// } // End of group imsAck + +// group imsBye { + +// /** +// * @desc Verify that the E-CSCF successfully processes a BYE (Terminating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the UE_B entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the UE_B entity isRegisteredTo the IMS_B and +// * the UE_A entity previouslyEstablishedCallWith the UE_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity receives a BYE containing +// * From indicating value PX_UE_B_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_UE_B_CALLID, +// * Via indicating value PX_UE_B_VIA, +// * Route indicating value PX_UE_B_SERVICE_ROUTE +// * ; +// * from the IMS_P_CSCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a BYE containing +// * From indicating value PX_UE_B_SIP_URI, +// * To indicating value PX_UE_A_SIP_URI, +// * CallId indicating value PX_UE_B_CALLID, +// * Via indicating value PX_UE_B_VIA, +// * Route indicating value PX_UE_B_SERVICE_ROUTE +// * ; +// * from the IMS_IBCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_BYE_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// inout SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the BYE +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipRequest(mw_TP_MW_IBCF_BYE_01( +// p_sip.request.msgHeader.callId, +// -, // New CSeq, +// -, // FIXME To be set +// { +// fieldName := FROM_E, +// addressField := p_sip.request.msgHeader.toField.addressField, +// fromParams := * +// }, //p_sip.request.msgHeader.fromField, +// { +// fieldName := TO_E, +// addressField := p_sip.request.msgHeader.fromField.addressField, +// toParams := * +// } //p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipRequest(mw_BYE_Request_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_BYE_01 - Request", +// true, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// // Retrieve messge +// f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); +// } +// } // End of function f_mtc_check_TP_MW_IBCF_BYE_01 + +// function f_mtc_check_TP_MW_IBCF_ECO_BYE_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// inout SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the BYE +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipRequest(mw_TP_MW_IBCF_BYE_01( +// p_sip.request.msgHeader.callId, +// -, // New CSeq, +// -, // FIXME To be set +// { +// fieldName := FROM_E, +// addressField := p_sip.request.msgHeader.toField.addressField, +// fromParams := * +// }, //p_sip.request.msgHeader.fromField, +// { +// fieldName := TO_E, +// addressField := p_sip.request.msgHeader.fromField.addressField, +// toParams := * +// } //p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipRequest(mw_BYE_Request_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_BYE_01 - Request", +// true, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// // Retrieve messge +// f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); +// } +// } // End of function f_mtc_check_TP_MW_IBCF_ECO_BYE_01 + +// } // End of group imsBye + +// group ims200OkBye { + +// /** +// * @desc Verify that the E-CSCF successfully processes a 200 (OK) BYE (Originating Leg). +// * Initial conditions with { +// * the UE_A entity isAttachedTo the EPC_A and +// * the UE_B entity isAttachedTo the EPC_B and +// * the UE_A entity isRegisteredTo the IMS_A and +// * the UE_B entity isRegisteredTo the IMS_B +// * } +// * +// * Expected behaviour +// * ensure that { +// * when { +// * the IMS_E_CSCF_A entity sends a 200_Ok containing +// * From indicating value PX_UE_A_SIP_URI, +// * To indicating value PX_UE_B_SIP_URI, +// * CallId indicating value PX_UE_A_CALLID, +// * Via indicating value PX_UE_A_VIA, +// * Route indicating value PX_UE_A_SERVICE_ROUTE, +// * not PChargingVector, +// * not PChargingFunctionAddresses, +// * not PPreferredIdentity +// * to the IMS_IBCF_A entity +// * } +// * then { +// * the IMS_E_CSCF_A entity sends a 200_Ok containing +// * From indicating value PX_UE_A_SIP_URI, +// * To indicating value PX_UE_B_SIP_URI, +// * CallId indicating value PX_UE_A_CALLID, +// * Via indicating value PX_UE_A_VIA, +// * Route indicating value PX_UE_A_SERVICE_ROUTE, +// * not PChargingVector, +// * not PChargingFunctionAddresses, +// * not PPreferredIdentity +// * to the IMS_P_CSCF_A entity +// * } +// * } +// */ +// function f_mtc_check_TP_MW_IBCF_200OK_BYE_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// in SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the 200 OK BYE +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipResponse(mw_200OK( +// p_sip.request.msgHeader.cSeq, +// p_sip.request.msgHeader.callId, +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipResponse(mw_200OK_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_200OK_BYE_01", +// false, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_200OK_BYE_01 + +// } // End of group ims200OkBye + +// group imsCancel { + +// function f_mtc_check_TP_MW_IBCF_ECO_CANCEL_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// inout SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// // Check the CANCEL +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { mw_SipRequest(mw_TP_MW_IBCF_CANCEL_01( +// p_sip.request.msgHeader.callId, +// -, // New CSeq, +// -, // FIXME To be set +// { +// fieldName := FROM_E, +// addressField := p_sip.request.msgHeader.toField.addressField, +// fromParams := * +// }, //p_sip.request.msgHeader.fromField, +// { +// fieldName := TO_E, +// addressField := p_sip.request.msgHeader.fromField.addressField, +// toParams := * +// } //p_sip.request.msgHeader.toField +// )) +// }, +// { mw_SipRequest(mw_CANCEL_Request_Base) }, +// { 0, omit }, +// "TP_MW_IBCF_CANCEL_01 - Request", +// true, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// // Retrieve messge +// f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); +// } +// } // End of function f_mtc_check_TP_MW_IBCF_ECO_CANCEL_01 + +// } // End of group imsCancel + +// group ims487Invite { + +// function f_mtc_check_TP_MW_IBCF_ECO_487INVITE_01( +// in SipInterfaceMonitor p_monitorCompRef, +// in boolean p_checkMessage := false, +// inout SipMessage p_sip +// ) runs on ImsTestCoordinator { +// if (isvalue(p_monitorCompRef)) { +// var charstring v_EUT_A_Addr := f_GetEUTScscfAddress_1();//f_GetEUTScscfAddress(PX_EUT_A); +// p_monitorCompRef.start( +// f_Iot_Sip_receive( +// { +// mw_SipResponse( +// mw_487RequestTerminated( // TODO Enforce template +// p_sip.request.msgHeader.callId, +// -, // New CSeq +// p_sip.request.msgHeader.fromField, +// p_sip.request.msgHeader.toField, +// omit +// ) +// ) +// }, +// { +// mw_SipResponse(mdw_4XX_Base) +// }, +// { 0, omit }, +// "TP_MW_IBCF_487INVITE_01", +// true, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; +// } +// } // End of function f_mtc_check_TP_MW_IBCF_ECO_487INVITE_01 + +// } // End of group ims487Invite + +// } // End of module AtsImsIot_TP_behavior_MW_EB \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..df2e55cfcc09c2f2c078b665a6387fba8c557df3 --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn @@ -0,0 +1,33 @@ +// /** +// * @author TTF T010 +// * @version $Id$ +// * @desc This module provides the TP behaviour functions at Mw interface at P-CSCF/E-CSCF +// */ + +// module AtsImsIot_TP_behavior_MW_EC { // TODO: To be removed + +// // LibIms +// import from LibIms_Templates all; +// import from LibIms_UpperTester all; +// // LibIot +// import from LibIot_TypesAndValues all; +// import from LibIot_Functions all; +// import from LibIot_TestInterface all; +// import from LibIot_PIXITS all; +// // LibSip +// import from LibSip_SIPTypesAndValues all; +// import from LibSip_Templates all; +// import from LibSip_Common all; +// import from LibSip_SDPTypes all; +// // LibMsrp +// import from LibMsrp_TypesAndValues all; +// import from LibMsrp_Functions all; +// import from LibMsrp_Templates all; +// // AtsImsIot +// import from AtsImsIot_TestSystem all; +// import from AtsImsIot_Templates_MW all; +// import from AtsImsIot_Templates all; +// import from AtsImsIot_TypesAndValues all; +// import from AtsImsIot_Functions all; + +// } // End of module AtsImsIot_TP_behavior_MW_EC \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_IS.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_IS.ttcn index 21076ef9a2207c352d39fc2ae51efc3189860372..d9ae0d3af695e01068250e92fa2826406a9b1cd4 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_IS.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_IS.ttcn @@ -190,6 +190,106 @@ module AtsImsIot_TP_behavior_MW_IS { } } // End of function f_mtc_check_TP_MW_ICSCF_REGISTER_01 + /** + * @desc Verify that the I-CSCF successfully processes a first registration (Successful). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_I_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Contact indicating value "sos"; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_I_CSCF_A entity sends an 401_Unauthorized containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Path, + * Warning, + * PAccessNetworkInfo, + * WwwAuthenticate containing + * Digest, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth" + * ;, + * Contact indicating value "sos" + * ; + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_ICSCF_ECO_REGISTER_01( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other,/*(mw_credentialIntegrityYes)*/ + -, -, -, + mw_contact(mw_ContactAddress) + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_ICSCF_REGISTER_01 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 401 Unauthorized response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_401Unauthorized_Base), + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_MW_ICSCF_ECO_REGISTER_01 - 401 Unauthorized", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_01 + /** * @desc Verify that the I-CSCF successfully processes a full registration (Successful). * Initial conditions with { @@ -299,6 +399,112 @@ module AtsImsIot_TP_behavior_MW_IS { } } // End of function f_mtc_check_TP_MW_ICSCF_REGISTER_02 + /** + * @desc Verify that the I-CSCF successfully processes a full registration (Successful). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A and + * the UE_A entity hasAchievedFirstREGISTER + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_I_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Scheme indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth";, + * Contact indicating value "sos"; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_I_CSCF_A entity sends an 401_Unauthorized containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * AuthenticationInfo, + * PAccessNetworkInfo, + * PAssociatedURI indicating value PX_UE_A_SIP_URI, + * PChargingVector, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA" , + * term_ioi_parameter + * indicating value "Operator Identifier Of ImsB";, + * Path, + * ServiceRoute; + * to the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_ICSCF_REGISTER_02( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_ICSCF_REGISTER_02 - Second request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 200 OK response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_Response_200onREGISTER_IMS( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq, + ?, // UE URI + mw_contact(mw_ContactAddress), + ? //FIXME ? + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_MW_ICSCF_REGISTER_02 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_02 + /** * @desc Verify that the I-CSCF successfully processes a invalid first registration (Unsuccessful). * Initial conditions with { @@ -395,6 +601,265 @@ module AtsImsIot_TP_behavior_MW_IS { } } // End of function f_mtc_check_TP_MW_ICSCF_REGISTER_03 + /** + * @desc Verify that the I-CSCF successfully processes a invalid first registration (Unsuccessful). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_A and + * the UE_A entity hasAchievedFirstREGISTER + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_I_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value "invalid credentials"; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_I_CSCF_A entity sends an 403_Forbiden containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID + * ; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := true + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); // User removed from HSS + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_ICSCF_ECO_REGISTER_03( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other/*(mw_credentialIntegrityYes)*/ // FIXME indicating value "Invalid credentials" + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_ICSCF_ECO_REGISTER_03 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 403 Forbidden response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_403Forbidden(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_MW_ICSCF_REGISTER_04 - 403 Firbidden", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_03 + + /** + * @desc Verify that the I-CSCF processes an invalid first registration in visited network and sends 403 response (Unsuccessful). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_I_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value "invalid credentials"; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_I_CSCF_A entity sends an 403_Forbiden containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID + * ; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_04( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := true + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); // User removed from HSS + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_ICSCF_ECO_REGISTER_03( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other/*(mw_credentialIntegrityYes)*/ // FIXME indicating value "Invalid credentials" + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_ICSCF_ECO_REGISTER_04 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 402 Forbidden response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_403Forbidden(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_MW_ICSCF_REGISTER_04 - 403 Firbidden", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_04 + + /** + * @desc Verify that the I-CSCF processes an invalid first registration without SecurityClient header in visited network(GIBA supported) and sends 420 response (Unsuccessful). + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isNotRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_I_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value "invalid credentials"; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_I_CSCF_A entity sends an 420_BadExtension containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID + * ; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_05( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := true + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); // User removed from HSS + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_ICSCF_ECO_REGISTER_03( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other/*(mw_credentialIntegrityYes)*/ // FIXME indicating value "Invalid credentials" + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_ICSCF_ECO_REGISTER_05 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 420 Bad Extension response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_420BadExtension(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_MW_ICSCF_REGISTER_04 - 403 Firbidden", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_ICSCF_ECO_REGISTER_05 + function f_mtc_check_TP_MW_ICSCF_REGISTER_04( // FIXME RMI To be reviewed in SipInterfaceMonitor p_monitorCompRef, in boolean p_checkMessage := true @@ -581,7 +1046,10 @@ module AtsImsIot_TP_behavior_MW_IS { { mw_SipResponse(mw_Response_200onREGISTER_IMS( v_sip.request.msgHeader.callId, - v_sip.request.msgHeader.cSeq + v_sip.request.msgHeader.cSeq, + ?, // UE URI + mw_contact(mw_ContactAddress), + ? //FIXME ? )) }, { diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_PS.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_PS.ttcn index c6aaded8d4ba8de6bfaf61368c3f3fd0f97b9ff4..45dab74b0347a0ac5d6a9e58fe39f428706c6d6c 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_PS.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_PS.ttcn @@ -29,6 +29,7 @@ module AtsImsIot_TP_behavior_MW_PS { import from AtsImsIot_Templates all; import from AtsImsIot_TypesAndValues all; import from AtsImsIot_Functions all; + import from AtsImsIot_PIXITS all; group imsMessages { @@ -215,6 +216,116 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_REGISTER_01 + /** + * @desc Verify that the P-CSCF successfully processes a first emergency registration (Successful) + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Contact indicating value "sos";; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Path, + * PChargingVector containing + * icid indicating value PX_TO_BE_DEFINED, + * PVisitedNetworkID indicating value PX_TO_BE_DEFINED, + * Require indicating value "path", + * Supported indicating value "path", + * Contact indicating value "sos";; + * to the IMS_I_CSCF_A entity + * and the IMS_P_CSCF_A entity sends an 401_Unauthorized containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Path, + * Warning, + * PAccessNetworkInfo, + * WwwAuthenticate containing + * Digest, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth";; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; + + // Check first REGISTER request + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_PCSCF_ECO_REGISTER_01( // FIXME Add CallId... + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other,/*(mw_credentialIntegrityYes)*/ + -, -, + mw_contact(mw_ContactAddress) + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_PCSCF_ECO_REGISTER_01 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 401 Unauthorized response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_401Unauthorized(v_sip.request.msgHeader.cSeq, mw_WwwAuthenticate)) + }, + { + mw_SipResponse(mw_401Unauthorized_Base), + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_MW_PCSCF_REGISTER_01 - 401 Unauthorized", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_01 + /** * @desc Verify that the P-CSCF successfully processes a full registration (Successful). * Initial conditions with { @@ -340,6 +451,128 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_REGISTER_02 + /** + * @desc Verify that the P-CSCF successfully processes a full emergency registration (Successful) + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A and + * the UE_A entity hasAchievedFirstREGISTER + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Scheme indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Username indicating value PX_UE_A_USERNAME, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth", + * Contact indicating value "sos";; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization containing + * Authentication_Scheme indicating value PX_TO_BE_DEFINED, + * Authentication_URI indicating value PX_TO_BE_DEFINED, + * Username indicating value PX_UE_A_USERNAME, + * Realm indicating value PX_UE_A_REALM, + * Algorithm indicating value PX_UE_A_AUTH_ALG, + * Nonce indicating value "not empty", + * qop indicating value "auth", + * PChargingVector, + * Contact indicating value "sos";; + * to the IMS_I_CSCF_A entity + * and the IMS_P_CSCF_A entity sends an 200_Ok containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * AuthenticationInfo, + * PAccessNetworkInfo, + * PAssociatedURI indicating value PX_UE_A_SIP_URI, + * PChargingVector, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA" , + * term_ioi_parameter + * indicating value "Operator Identifier Of ImsB" + * Path, + * ServiceRoute; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var SipMessage v_sip; + + // Check the second REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_PCSCF_ECO_REGISTER_02( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other + ) + ) + }, + { + mw_SipRequest(mw_REGISTER_Request_Base) + }, + {0, omit}, + "TP_MW_PCSCF_ECO_REGISTER_02 - Second request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check the second REGISTER response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_200OK( + v_sip.request.msgHeader.cSeq, + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.fromField, + v_sip.request.msgHeader.toField + )) + }, + { + mw_SipResponse(mw_Response_2xx_Base) + }, + {0, omit}, + "TP_MW_PCSCF_REGISTER_02 - 200 OK", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_02 + /** * @desc Verify that the P-CSCF successfully processes a invalid first registration (Unsuccessful). * Initial conditions with { @@ -447,6 +680,102 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_REGISTER_03 + /** + * @desc Verify that the P-CSCF rejects invalid credentials within registration (Unsuccessful). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_B and + * the UE_A entity isNotRegisteredTo the IMS_B and + * the UE_B entity isNotRegisteredTo the IMS_B and + * the UE_A entity hasAchievedFirstREGISTER + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_B entity receives a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value "invalid credentials"; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_B entity sends a REGISTER containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Authorization indicating value "invalid credentials", + * PChargingVector, + * PVisitedNetwork; + * to the IMS_I_CSCF_B entity + * and the IMS_P_CSCF_B entity sends an 403_Forbidden containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_A_CALLID; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); // User removed from HSS + var SipMessage v_sip; + + // Check the first REGISTER + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest( + mw_TP_MW_PCSCF_ECO_REGISTER_01( + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_Authorization_other, // FIXME indicating value "invalid credentials" + -, -, + mw_contact(mw_ContactAddress) + ) + ) + }, + { mw_SipRequest(mw_REGISTER_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_ECO_REGISTER_03 - First request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, v_sip); + if (not(isbound(v_sip))) { + return; + } + // Check REGISTER 403 Forbidden response + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_403Forbidden(v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)), + mw_SipResponse(mw_480TemporaryUnavailable(-, v_sip.request.msgHeader.cSeq/*, mw_WwwAuthenticate*/)) + }, + { + mw_SipResponse(mw_Response_4xx_Base( + v_sip.request.msgHeader.callId, + v_sip.request.msgHeader.cSeq + )) + }, + {0, omit}, + "TP_MW_PCSCF_REGISTER_03 - 404 Not Found", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_REGISTER_03 + function f_mtc_check_TP_MW_PCSCF_REGISTER_04( // FIXME RMI To be reviewed in SipInterfaceMonitor p_monitorCompRef, in boolean p_checkMessage := true @@ -1137,8 +1466,8 @@ module AtsImsIot_TP_behavior_MW_PS { // Check the INVITE p_monitorCompRef.start( f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_MW_PCSCF_INVITE_01( - -, // FIXME Set expected value + { mw_SipRequest(mw_TP_MW_PCSCF_INVITE_01(PX_URN_SERVICE_SOS, +// -, // FIXME Set expected value mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId mw_To_AddrUnion_TelUrl(-) // v_userInfoB.publicId )) @@ -1157,6 +1486,73 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_01 + /** + * @desc "Verify that the P-CSCF successfully processes an initial INVITE from an unregistered UE." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.2.10.2 and 5.2.6.3.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity not isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * MessageBody; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, + * MessageBody; + * to the IMS_E_CSCF entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getTelUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MW_PCSCF_ECO_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(mw_SipUrl_Anonymous.components.sip.userInfo.userOrTelephoneSubscriber), + mw_To_AddrUnion_TelUrl(v_psap.publicId) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_ECO_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_01 + /** * @desc Verify that the P-CSCF successfully processes an initial INVITE (Terminating Leg). * Initial conditions with { @@ -1226,7 +1622,217 @@ module AtsImsIot_TP_behavior_MW_PS { }, { mw_SipRequest(mw_INVITE_Request_Base) }, {0, omit}, - "TP_MW_PCSCF_INVITE_02 - Request", + "TP_MW_PCSCF_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_02 + + /** + * @desc "Verify that the P-CSCF successfully processes an initial INVITE from an emergency registered UE." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.2.10.2 and 5.2.6.3.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * to the IMS_E_CSCF entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MW_PCSCF_ECO_INVITE_02( + -, // FIXME Set expected value + ( + mw_From_NameAddr_SipUrl({quotedString:=v_psap.publicId}, v_psap.publicId, v_psap.domain), + mw_From_AddrUnion_TelUrl(v_psap.publicId) + ), + ( + mw_To_NameAddr_SipUrl({quotedString:=v_userInfoA.publicId}, v_userInfoA.publicId/*, v_userInfoA.domain*/), + mw_To_AddrUnion_TelUrl(-)//v_userInfoA.publicId + ) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_ECO_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_02 + + function f_mtc_check_TP_MW_PCSCF_INVITE_03( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MW_PCSCF_INVITE_03( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_INVITE_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_03 + + /** + * @desc "Verify that the P-CSCF successfully processes an initial INVITE from a registered but not emergency registered UE." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.2.10.2 and 5.2.6.3.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * to the IMS_E_CSCF entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_03( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MW_PCSCF_ECO_INVITE_03( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_INVITE_ECO_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_03 + + function f_mtc_check_TP_MW_PCSCF_INVITE_04( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MW_PCSCF_INVITE_04( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), + mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_INVITE_04 - Request", true, p_checkMessage ) @@ -1236,30 +1842,76 @@ module AtsImsIot_TP_behavior_MW_PS { f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); log("##### p_sip: ", p_sip); } - } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_02 + } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_04 - function f_mtc_check_TP_MW_PCSCF_INVITE_03( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - out SipMessage p_sip - ) runs on ImsTestCoordinator { + /** + * @desc "Verify that the P-CSCF rejects an initial INVITE from a not emergency registered UE + * if the IM CN subsystem of the P-CSCF is not capable to handle emergency sessions." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.2.10.2 and 5.2.6.3.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_A entity not isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * MessageBody; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody containing + * XML containing + * Version indicating value "1", + * Type_child indicating value "emergency", + * Reason_child, + * Action_child;;; + * to the IMS_E_CSCF entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_04( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)) { - var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); // Check the INVITE p_monitorCompRef.start( f_Iot_Sip_receive( { - mw_SipRequest(mw_TP_MW_PCSCF_INVITE_03( - -, // FIXME Set expected value - mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), - mw_To_AddrUnion_SipUrl(omit, v_userInfoB.publicId, v_userInfoB.domain) - )) + mw_SipRequest(mw_TP_MW_PCSCF_ECO_INVITE_04( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + mw_MBody_MIME_Ims3gpp( + *, + mw_Ims_Eco_3gpp_CW + ))) }, { mw_SipRequest(mw_INVITE_Request_Base) }, {0, omit}, - "TP_MW_PCSCF_INVITE_03 - Request", + "TP_MW_PCSCF_INVITE_ECO_04 - Request", true, p_checkMessage ) @@ -1269,30 +1921,66 @@ module AtsImsIot_TP_behavior_MW_PS { f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); log("##### p_sip: ", p_sip); } - } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_03 + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_04 - function f_mtc_check_TP_MW_PCSCF_INVITE_04( // FIXME RMI To be reviewed - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - out SipMessage p_sip - ) runs on ImsTestCoordinator { + /** + * @desc "Verify that the E-CSCF successfully processes a callback INVITE from PSAP towards P-CSCF." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.2.10.2 and 5.2.6.3.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends an INVITE containing + * From indicating value "Anonymous", + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, + * PPreferredIdentity, // one or two instances + * MessageBody; + * to the IMS_E_CSCF entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_05( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)) { - var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); - var ImsUserInfo v_userInfoB := f_getTelUserId(PX_EUT_B); + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); // Check the INVITE p_monitorCompRef.start( f_Iot_Sip_receive( { - mw_SipRequest(mw_TP_MW_PCSCF_INVITE_04( - -, // FIXME Set expected value - mw_From_AddrUnion_TelUrl(v_userInfoA.publicId), - mw_To_AddrUnion_TelUrl(v_userInfoB.publicId) - )) + mw_SipRequest(mw_TP_MW_PCSCF_ECO_INVITE_05( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain) + )) }, { mw_SipRequest(mw_INVITE_Request_Base) }, {0, omit}, - "TP_MW_PCSCF_INVITE_04 - Request", + "TP_MW_PCSCF_INVITE_ECO_05 - Request", true, p_checkMessage ) @@ -1302,7 +1990,7 @@ module AtsImsIot_TP_behavior_MW_PS { f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); log("##### p_sip: ", p_sip); } - } // End of function f_mtc_check_TP_MW_PCSCF_INVITE_04 + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_INVITE_05 /** * @desc Verify that the P-CSCF successfully processes an initial RE-INVITE (Originating Leg). @@ -1517,6 +2205,77 @@ module AtsImsIot_TP_behavior_MW_PS { } // End of function TP_MW_PCSCF_RE_INVITE_04 + /** + * @desc Verify that the P-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_NGC_INVITE_01( // FIXME RMI To be reviewed + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MW_PCSCF_NGC_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_NGC_INVITE_01 + } // End of group imsInvite group ims100Trying { @@ -1568,6 +2327,32 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_100Trying_01 + function f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MW_ECSCF_100Trying_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_100Trying_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_100Trying_01 + /** * @desc Verify that the P-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Terminating Leg). * Initial conditions with { @@ -1732,6 +2517,34 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_180RINGING_01 + function f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MW_ECSCF_180Ringing_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + mw_To_NameAddr_TelUrl( + -, + p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber + ))) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_180RINGING_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_180RINGING_01 + /** * @desc Verify that the P-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Terminating Leg).. * Initial conditions with { @@ -1910,6 +2723,32 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_183SESSION_PROGRESS_01 + function f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MW_ECSCF_183SessionProgress_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_183SESSION_PROGRESS_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_183SESSION_PROGRESS_01 + /** * @desc Verify that the P-CSCF successfully processes a 183 (Ringing) provisional response on initial INVITE (Terminating Leg).. * Initial conditions with { @@ -2102,6 +2941,40 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_200OK_01 + function f_mtc_check_TP_MW_PCSCF_ECO_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=v_psapInfo.publicId}), + mw_To_AddrUnion_TelUrl(v_psapInfo.publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_200OK_01 + /** * @desc Verify that the P-CSCF successfully processes a 200 (Ok) provisional response on initial INVITE (Terminating Leg). * Initial conditions with { @@ -2287,6 +3160,34 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_ACK_01 + function f_mtc_check_TP_MW_PCSCF_ECO_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MW_ECSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_ACK_01 + /** * @desc Verify that the P-CSCF successfully processes a ACK provisional response on initial INVITE (Terminating Leg). * Initial conditions with { @@ -2393,29 +3294,92 @@ module AtsImsIot_TP_behavior_MW_PS { p_sip.request.msgHeader.toField )) }, - { mw_SipRequest(mw_ACK_Request_Base) }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_MW_PCSCF_ACK_04 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ACK_04 + + } // End of group imsAck + + group imsBye { + + /** + * @desc Verify that the P-CSCF successfully processes a BYE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B and + * the UE_A entity previouslyEstablishedCallWith the UE_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MW_PCSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, { 0, omit }, - "TP_MW_PCSCF_ACK_04 - Request", - false, + "TP_MW_PCSCF_BYE_01 - Request", + true, p_checkMessage ) ); p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); } - } // End of function f_mtc_check_TP_MW_PCSCF_ACK_04 - - } // End of group imsAck - - group imsBye { + } // End of function f_mtc_check_TP_MW_PCSCF_BYE_01 /** - * @desc Verify that the P-CSCF successfully processes a BYE (Originating Leg). + * @desc Verify that the P-CSCF successfully processes a BYE for an emergency call. * Initial conditions with { * the UE_A entity isAttachedTo the EPC_A and - * the UE_B entity isAttachedTo the EPC_B and * the UE_A entity isRegisteredTo the IMS_A and - * the UE_B entity isRegisteredTo the IMS_B and - * the UE_A entity previouslyEstablishedCallWith the UE_B + * the UE_A entity not isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP * } * * Expected behaviour @@ -2423,35 +3387,34 @@ module AtsImsIot_TP_behavior_MW_PS { * when { * the IMS_P_CSCF_A entity receives a BYE containing * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, * CallId indicating value PX_UE_A_CALLID, * Via indicating value PX_UE_A_VIA, - * Route indicating value PX_UE_A_SERVICE_ROUTE - * ; + * Route indicating value PX_UE_A_SERVICE_ROUTE; * from the UE_A entity * } * then { * the IMS_P_CSCF_A entity sends a BYE containing * From indicating value PX_UE_A_SIP_URI, - * To indicating value PX_UE_B_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, * CallId indicating value PX_UE_A_CALLID, * Via indicating value PX_UE_A_VIA, * Route indicating value PX_UE_A_SERVICE_ROUTE * ; - * from the IMS_S_CSCF_A entity + * from the IMS_E_CSCF_A entity * } * } */ - function f_mtc_check_TP_MW_PCSCF_BYE_01( - in SipInterfaceMonitor p_monitorCompRef, - in boolean p_checkMessage := false, - inout SipMessage p_sip - ) runs on ImsTestCoordinator { + function f_mtc_check_TP_MW_PCSCF_ECO_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)) { // Check the BYE p_monitorCompRef.start( f_Iot_Sip_receive( - { mw_SipRequest(mw_TP_MW_PCSCF_BYE_01( + { mw_SipRequest(mw_TP_MW_ECSCF_BYE_01( p_sip.request.msgHeader.callId, -, // New CSeq -, // FIXME To be set @@ -2461,7 +3424,7 @@ module AtsImsIot_TP_behavior_MW_PS { }, { mw_SipRequest(mw_BYE_Request_Base) }, { 0, omit }, - "TP_MW_PCSCF_BYE_01 - Request", + "TP_MW_ECSCF_ECO_BYE_01 - Request", true, p_checkMessage ) @@ -2470,8 +3433,38 @@ module AtsImsIot_TP_behavior_MW_PS { // Retrieve messge f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); } - } // End of function f_mtc_check_TP_MW_PCSCF_BYE_01 - + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_BYE_01 + + function f_mtc_check_TP_MW_PCSCF_ECO_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MW_ECSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_BYE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_BYE_02 + /** * @desc Verify that the P-CSCF successfully processes a BYE (Terminating Leg). * Initial conditions with { @@ -2750,6 +3743,60 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_200OK_BYE_01 + function f_mtc_check_TP_MW_PCSCF_ECO_200OK_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_200OK_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_200OK_BYE_01 + + function f_mtc_check_TP_MW_PCSCF_ECO_200OK_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MW_ECSCF_ECO_200OK_BYE_02", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_200OK_BYE_02 + /** * @desc Verify that the P-CSCF successfully processes a 200 (OK) BYE (Terminating Leg). * Initial conditions with { @@ -2963,8 +4010,65 @@ module AtsImsIot_TP_behavior_MW_PS { p_monitorCompRef.start( f_Iot_Sip_receive( { mw_SipRequest(mw_TP_MW_PCSCF_CANCEL_01( + p_sip.request.msgHeader.callId + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_MW_PCSCF_CANCEL_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_CANCEL_01 + + /** + * @desc Verify that the P-CSCF successfully processes a CANCEL during Emergency Call establishment. + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity hasAchievedInitialEmergencyINVITE and + * the UE_A entity isRequestedToSend a CANCEL + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the UE_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_S_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_EMC_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MW_ECSCF_CANCEL_01( p_sip.request.msgHeader.callId, - p_sip.request.msgHeader.cSeq, + -, // New CSeq -, // FIXME To be set p_sip.request.msgHeader.fromField, p_sip.request.msgHeader.toField @@ -2972,7 +4076,7 @@ module AtsImsIot_TP_behavior_MW_PS { }, { mw_SipRequest(mw_CANCEL_Request_Base) }, { 0, omit }, - "TP_MW_PCSCF_CANCEL_01", + "TP_MW_PCSCF_EMC_CANCEL_01 - Request", true, p_checkMessage ) @@ -2981,8 +4085,8 @@ module AtsImsIot_TP_behavior_MW_PS { // Retrieve messge f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); } - } // End of function f_mtc_check_TP_MW_PCSCF_CANCEL_01 - + } // End of function f_mtc_check_TP_MW_PCSCF_EMC_CANCEL_01 + /** * @desc Verify that the P-CSCF successfully processes a CANCEL (Terminating Leg). * Initial conditions with { @@ -3168,6 +4272,33 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_200OK_CANCEL_01 + function f_mtc_check_TP_MW_PCSCF_ECO_200OK_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_ECO_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MW_PCSCF_ECO_200OK_CANCEL_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_200OK_CANCEL_01 + /** * @desc Verify that the P-CSCF successfully processes a 200 (OK) CANCEL (Terminating Leg). * Initial conditions with { @@ -3587,6 +4718,71 @@ module AtsImsIot_TP_behavior_MW_PS { } } // End of function f_mtc_check_TP_MW_PCSCF_487INVITE_01 + /** + * @desc Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) to reject call (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_A entity isRequestedToSend a CANCEL + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_P_CSCF_A entity receives a 487_INVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE; + * from the IMS_E_CSCF_A entity + * } + * then { + * the IMS_P_CSCF_A entity sends a 487_INVITE containing + * From indicating value PX_UE_B_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_UE_B_CALLID, + * Via indicating value PX_UE_B_VIA, + * Route indicating value PX_UE_B_SERVICE_ROUTE; + * to the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_EMC_487INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MW_PCSCF_487INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_EMC_487INVITE_01 + /** * @desc Verify that the P-CSCF successfully processes a 487 INVITE (Request Terminated) to reject call (Terminating Leg). * Initial conditions with { @@ -3701,12 +4897,12 @@ module AtsImsIot_TP_behavior_MW_PS { f_Iot_Sip_receive( { mw_SipResponse( - mw_487RequestTerminated( // TODO Enforce template - p_sip.request.msgHeader.callId, - -, // New CSeq - p_sip.request.msgHeader.fromField, - p_sip.request.msgHeader.toField - ) + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + ) ) }, { @@ -3726,4 +4922,188 @@ module AtsImsIot_TP_behavior_MW_PS { } // End of group imsRequestTermination + group imsTemporaryUnavailable { + + function f_mtc_check_TP_MW_PCSCF_ECO_480INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MW_PCSCF_ECO_480INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_ECO_480INVITE_01 + + } // End of group imsTemporaryUnavailable + + group imsINFO{ + + /** + * @desc Verify that the P-CSCF sends an INFO request demanding a transfer of updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VoLTE_INT_ES + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + when { + the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD"; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a INFO containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml + request containing + action indicating value "send-data", + datatype indicating value "eCall.MSD";, + ContentDisposition indicating value "By-Reference";; + to the UE_A entity + } + } + + */ + function f_mtc_check_TP_MW_PCSCF_NGC_INFO_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MW_PCSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + -, -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_NGC_INFO_01 + + /** + * @desc Verify that the P-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MW_PCSCF_NGC_INFO_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MW_PCSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.MSD")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MW_PCSCF_NGC_INFO_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MW_PCSCF_NGC_INFO_02 + + }// End of group imsINFO + } // End of module AtsImsIot_TP_behavior_MW_PS diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_SI.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_SI.ttcn index 9ccf70c563b167d1ea1a52d4523d73dd46a54878..0136fc32ad9fcf70dee0568f6a5ecdf6df7bd4a5 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_SI.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_SI.ttcn @@ -1249,7 +1249,7 @@ module AtsImsIot_TP_behavior_MW_SI { }} // End of function f_mtc_check_TP_MW_SCSCF_200OK_02 } // End of group ims200Ok - + group imsAck { /** diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MX.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MX.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..4db51395fd728c24b4c1aa7bc75c2b0028cd970f --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MX.ttcn @@ -0,0 +1,980 @@ +/** + * @author STF 574 + * @version $Id$ + * @desc This module provides the TP behaviour functions at Mw interface at S-CSCF/IBCF + */ + +module AtsImsIot_TP_behavior_MX { + + // LibIms + import from LibIms_Templates all; + import from LibIms_UpperTester all; + // LibIot + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; + import from LibIot_TestInterface all; + import from LibIot_PIXITS all; + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Common all; + import from LibSip_SDPTypes all; + // LibMsrp + import from LibMsrp_TypesAndValues all; + import from LibMsrp_Functions all; + import from LibMsrp_Templates all; + // AtsImsIot + import from AtsImsIot_TestSystem all; + import from AtsImsIot_Templates all; + import from AtsImsIot_Templates_MX all; + import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_Functions all; + + group imsInvite { + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the IBCF for a PSAP in another network." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_IBCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_ECO_INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_INVITE_01( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MX_ECSCF_ECO_INVITE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_INVITE_01 + + /** + * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the IBCF for a PSAP in another network and includes the LRF provided URI in the Route header." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_LRF and + * the IMS_E_CSCF entity hasSentINVITETo the IMS_LRF and + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an r_3xx_Any containing + * Contact indicating value LRF_provided_SIP_URI; + * from the IMS_LRF entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_IBCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_ECO_INVITE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_INVITE_02( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MX_ECSCF_ECO_INVITE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_INVITE_02 + + /** + * @desc "Verify that the E-CSCF successfully processes a callback INVITE from the PSAP in another network over the IBCF and routes the request to the P-CSCF." + * Reference + * "ETSI TS 124 229 [1], Clauses 5.11.2" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A + * } + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_P_CSCF_A_VIA, + * Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed + * PAssertedIdentity, + * MessageBody; + * from the IMS_IBCF_A entity + * } + * then { + * the IMS_E_CSCF entity sends an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_E_CSCF_VIA, + * Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN, + * RecordRoute PX_E_CSCF_SERVICE_ROUTE, + * PChargingVector containing + * not term_ioi_parameter, + * orig_ioi_parameter + * indicating value "Operator Identifier Of ImsA";, + * MessageBody; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_ECO_INVITE_03( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psapInfo := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_INVITE_03( + -, // FIXME Set expected value + mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId + mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId + )) + }, + { mw_SipRequest(mw_INVITE_Request_Base) }, + {0, omit}, + "TP_MX_ECSCF_ECO_INVITE_03 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + log("##### p_sip: ", p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_INVITE_03 + + } // End of group imsInvite + + group ims100Trying { + + function f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 100 TRYING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MX_ECSCF_100Trying_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_100Trying_Base) }, + { 0, omit }, + "TP_MX_ECSCF_100Trying_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_100Trying_01 + + + } // End of group ims100Trying + + group ims180Ringing { + + function f_mtc_check_TP_MX_ECSCF_ECO_180RINGING_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 180 RINGING + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MX_ECSCF_180Ringing_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + mw_To_NameAddr_TelUrl( + -, + p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber + ))) + }, + { mw_SipResponse(mw_180Ringing_Base) }, + { 0, omit }, + "TP_MX_ECSCF_180RINGING_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_180RINGING_01 + + } // End of group ims180Ringing + + group ims183SessionProgress { + + function f_mtc_check_TP_MX_ECSCF_ECO_183SESSION_PROGRESS_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 183 SESSION_PROGRESS + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_TP_MX_ECSCF_183SessionProgress_01( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_183SessionProgress_Base) }, + { 0, omit }, + "TP_MX_ECSCF_183SESSION_PROGRESS_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_183SESSION_PROGRESS_01 + + } // End of group ims183SessionProgress + + group ims200Ok { + + function f_mtc_check_TP_MX_ECSCF_ECO_200OK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B); + + // Check the 200 OK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + ( + mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}), + mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId), + p_sip.request.msgHeader.toField + ) + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MX_ECSCF_200OK_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_200OK_01 + + } // End of group ims200Ok + + group imsAck { + + function f_mtc_check_TP_MX_ECSCF_ECO_ACK_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the ACK + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_ACK_01( + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.cSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_ACK_Request_Base) }, + { 0, omit }, + "TP_MX_ECSCF_ECO_ACK_01 - Request", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_ACK_01 + + } // End of group imsAck + + group imsBye { + + /** + * @desc Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the IBCF for a PSAP in another network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE + * ; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a BYE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IMS_IBCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_ECO_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_BYE_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MX_ECSCF_ECO_BYE_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_BYE_01 + + /** + * @desc Verify that the E-CSCF successfully processes a BYE from the IBCF for a PSAP in another network for an Emergency Call and routes the request to the P-CSCF + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IM_CN and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a BYE containing + * From indicating value PX_PSAP_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_PSAP_SIP_URI, + * Via indicating value PX_PSAP_VIA; + * from the IMS_IBCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a BYE containing + * From indicating value PX_PSAP_SIP_URI, + * To indicating value PX_UE_A_SIP_URI, + * CallId indicating value PX_PSAP_SIP_URI, + * Via indicating value PX_PSAP_VIA; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_ECO_BYE_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_BYE_02( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + { + fieldName := FROM_E, + addressField := p_sip.request.msgHeader.toField.addressField, + fromParams := * + }, //p_sip.request.msgHeader.fromField, + { + fieldName := TO_E, + addressField := p_sip.request.msgHeader.fromField.addressField, + toParams := * + } //p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_BYE_Request_Base) }, + { 0, omit }, + "TP_MX_ECSCF_ECO_BYE_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_BYE_02 + + } // End of group imsBye + + group ims200OkBye { + + function f_mtc_check_TP_MX_ECSCF_ECO_200OK_BYE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 200 OK BYE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_ECO_200OK( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.callId, + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipResponse(mw_200OK_Base) }, + { 0, omit }, + "TP_MX_ECSCF_200OK_BYE_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_200OK_BYE_01 + + } // End of group ims200OkBye + + group imsCancel { + + /** + * @desc Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the IBCF for a PSAP in another network + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + * the UE_A entity hasAchievedInitialEmergencyINVITE via the IMS_IBCF_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_P_CSCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a CANCEL containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IM_CN entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_EMC_CANCEL_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the CANCEL + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipRequest(mw_TP_MX_ECSCF_CANCEL_01( + p_sip.request.msgHeader.callId, + -, // New CSeq, + -, // FIXME To be set + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField + )) + }, + { mw_SipRequest(mw_CANCEL_Request_Base) }, + { 0, omit }, + "TP_MX_ECSCF_EMC_CANCEL_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_EMC_CANCEL_01 + + } // End of group imsCancel + + group imsRequestTermination { + + /** + * @desc Verify that the E-CSCF successfully processes a 487 response from the IBCF for a PSAP in another network for an Emergency Call and routes the response to the P-CSCF + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a 487INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_IBCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_EMC_487INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse( + mw_487RequestTerminated( // TODO Enforce template + p_sip.request.msgHeader.callId, + -, // New CSeq + p_sip.request.msgHeader.fromField, + p_sip.request.msgHeader.toField, + omit + ) + ) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MX_ECSCF_EMC_487INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_EMC_487INVITE_01 + + } // End of group imsRequestTermination + + group imsTemporaryUnavailable { + + /** + * @desc Verify that the E-CSCF successfully processes a 480 response from the IBCF for a PSAP in another network for an Emergency Call and routes the response to the P-CSCF + * Initial conditions with { + * the IMS_E_CSCF entity supportsRoutingTo the IMS_IBCF_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP via IMS_IBCF_A + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_E_CSCF_A entity receives a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * from the IMS_IBCF_A entity + * } + * then { + * the IMS_E_CSCF_A entity sends a 480INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_EMERGENCY_SERVICE_URN, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE; + * to the IMS_P_CSCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_ECO_480INVITE_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + inout SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 487 Request Terminated + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq)) + }, + { + mw_SipResponse(mdw_4XX_Base) + }, + { 0, omit }, + "TP_MX_ECSCF_ECO_480INVITE_01", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_ECO_480INVITE_01 + + } // End of group imsTemporaryUnavailable + + group ims3xxAny { + + /** + * @desc Verify that the LRF successfully processes a 3xx Any response on initial INVITE (Originating Leg). + * Initial conditions with { + * the UE_A entity isAttachedTo the EPC_A and + * the UE_B entity isAttachedTo the EPC_B and + * the UE_A entity isRegisteredTo the IMS_A and + * the UE_B entity isRegisteredTo the IMS_B + * } + * + * Expected behaviour + * ensure that { + * when { + * the IMS_LRF_A entity receives an INVITE containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * Contact indicating value V_CONTACT + * ; + * from the IMS_EBCF_A entity + * } + * then { + * the IMS_LRF_A entity sends a 3xx Any containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_UE_B_SIP_URI, + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * Contact indicating value V_CONTACT + * ; + * to the IMS_EBCF_A entity + * } + * } + */ + function f_mtc_check_TP_MX_LRF_3xxAny_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)) { + // Check the 3xx Any + p_monitorCompRef.start( + f_Iot_Sip_receive( + { mw_SipResponse(mw_3xxContact( + p_sip.request.msgHeader.cSeq, + p_sip.request.msgHeader.accept + )) + }, + { mw_SipResponse(mdw_3XX_Base) }, + { 0, omit }, + "TP_MX_3xxAny_01", + false, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_MX_LRF_3xxAny_01 + + } // End of group ims3xxAny + + + group imsINFO{ + + /** + * @desc Verify that the E-CSCF sends an INFO request demanding a transfer of updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VoLTE_INT_ES + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + when { + the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD"; + from the IMS_E_CSCF entity + } + then { + the IMS_P_CSCF_A entity sends a INFO containing + From indicating value PX_PSAP_SIP_URI, + To indicating value PX_UE_A_SIP_URI, + CallId indicating value PX_PSAP_CALLID, + Via indicating value PX_PSAP_VIA, + Route indicating value PX_PSAP_SERVICE_ROUTE, + InfoPackage indicating value "EmergencyCallData.eCall.MSD", + ContentDisposition indicating value "Info-Package", + MessageBody containing + MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml + request containing + action indicating value "send-data", + datatype indicating value "eCall.MSD";, + ContentDisposition indicating value "By-Reference";; + to the UE_A entity + } + } + + */ + function f_mtc_check_TP_MX_ECSCF_NGC_INFO_01( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MX_ECSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + -, -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MX_ECSCF_NGC_INFO_01 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_NGC_INFO_01 + + /** + * @desc Verify that the E-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD. + * + * Reference + * "ETSI TS 124 229 [1], Clauses 5.1.6.11.3" + * Config Id CF_VxLTE_INT + * PICS Selection NONE + * Initial conditions with { + * the UE_A entity isEmergencyAttachedTo the EPC_A and + * the UE_A entity isEmergencyRegisteredTo the IMS_A and + * the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP + * } + * Expected behaviour + * ensure that { + * when { + * the UE_A entity isRequestedToTransferUpdatedMSD + * // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01 + * } + * then { + * the IMS_P_CSCF_A entity receives an INFO containing + * From indicating value PX_UE_A_SIP_URI, + * To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic" + * CallId indicating value PX_UE_A_CALLID, + * Via indicating value PX_UE_A_VIA, + * Route indicating value PX_UE_A_SERVICE_ROUTE, + * InfoPackage indicating value "EmergencyCallData.eCall.MSD", + * ContentDisposition indicating value "Info-Package", + * MessageBody containing + * MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml + * // MSD not exceeding 140 bytes and encoded in binary ASN.1 + * ContentDisposition indicating value "By-Reference";; + * from the UE_A entity + * } + * } + */ + function f_mtc_check_TP_MX_ECSCF_NGC_INFO_02( + in SipInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + out SipMessage p_sip + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY); + var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP); + + // Check the INVITE + p_monitorCompRef.start( + f_Iot_Sip_receive( + { + mw_SipRequest(mw_TP_MX_ECSCF_NGC_INFO_01( + -, + -, // FIXME Set expected value + mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain), + mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain), + -, + -, + mw_PPreferredID, + mw_accept({mw_acceptBody("application/EmergencyCallData.MSD")}), + mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")}) + )) + }, + { mw_SipRequest(mw_INFO_Request_Base) }, + {0, omit}, + "TP_MX_ECSCF_NGC_INFO_02 - Request", + true, + p_checkMessage + ) + ); + p_monitorCompRef.done; + // Retrieve messge + f_getSipMsgFromMonitor(p_monitorCompRef, p_sip); + } + } // End of function f_mtc_check_TP_MX_ECSCF_NGC_INFO_02 + + }// End of group imsINFO + + + +} // End of module AtsImsIot_TP_behavior_MX diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_RX.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_RX.ttcn index 606a44dae44cdab2468f4bb427ffc6c0f43a858f..ed1b71ddf678061119842e8572a381fbbce364ef 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_RX.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_RX.ttcn @@ -8,23 +8,23 @@ module AtsImsIot_TP_behavior_RX { // LibIot - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT, PX_EUT_A, PX_EUT_B;} - import from LibIot_VxLTE_PIXITS {modulepar PX_SIP_GMA_UE_IPADDR;} - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from LibIot_PIXITS all; + import from LibIot_VxLTE_PIXITS all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; // AtsImsIot - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; import from AtsImsIot_Functions all; import from AtsImsIot_Diameter_Templates all; - import from AtsImsIot_TestSystem { type DiameterInterfaceMonitor, ImsTestCoordinator; } + import from AtsImsIot_TestSystem all; // LibDiameter import from LibDiameter_Templates all; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;}; - import from LibDiameter_Steps {function f_IPV4_Address2oct;}; + import from LibDiameter_TypesAndValues all; + import from LibDiameter_Steps all; group g_PCRF { @@ -70,13 +70,15 @@ group g_PCRF_ASA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aSR_MSG := mw_ASR_abortCause(BEARER_RELEASED_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aSR_MSG := mw_ASR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aSR_MSG := mw_ASR_abortCause(BEARER_RELEASED_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aSR_MSG := mw_ASR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_ASA_01 - ASR", @@ -86,13 +88,15 @@ group g_PCRF_ASA { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { aSA_MSG := mw_ASA_resultCode }; + mw_diameter_msg_fail := { aSA_MSG := mw_ASA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aSA_MSG := mw_ASA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aSA_MSG := mw_ASA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_ASA_01 - ASA", @@ -152,13 +156,15 @@ group g_PCRF_AAA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_AAA_01 - AAR", @@ -168,13 +174,15 @@ group g_PCRF_AAA { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { aAA_MSG := mw_AAA_resultCode/*mw_AAA_AcceptableService*/ }; + mw_diameter_msg_fail := { aAA_MSG := mw_AAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_resultCode/*mw_AAA_AcceptableService*/ } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_AAA_01 - AAA", @@ -186,6 +194,111 @@ group g_PCRF_AAA { } } // End of function f_mtc_check_TP_RX_PCRF_AAA_01 + /** + * Starts monitor component behavior for TP_RX_PCRF_ECO_AAA_01 + * @param p_monitorCompRef Reference to monitor component + *
+     * Test objective  "Verify that IUT after AA-Request is received due to provisioning of AF Signalling flow sends AA-Answer."
+     * ensure that {
+     *     when {
+     *         the IMS_P_CSCF_A entity sends an AAR
+     *         to the EPC_PCRF_A entity
+     *     }
+     *     then {
+     *         the EPC_PCRF_A entity sends the AAA containing
+     *             Result_Code_AVP
+     *                 indicating value DIAMETER_SUCCESS,
+     *             Acceptable_Service_Info_AVP containing
+     *                 "one or more" Media_Component_Description_AVP containing
+     *                     Media_Component_Number_AVP
+     *                         indicating value 0,
+     *                     Media_Sub_Component_AVP containing
+     *                         Flow_Description_AVP
+     *                         Flow_Usage_AVP
+     *                             indicating value AF_SIGNALING,
+     *                         Flow_Status_AVP
+     *                             indicating value ENABLED,
+     *                         AF_Signalling_Protocol_AVP
+     *                             indicating value SIP
+     *                     ;
+     *                 ;
+     *             ;,
+     *             IP_CAN_AVP
+     *             RAT_Type_AVP
+     *         ;
+     *         to the IMS_P_CSCF_A entity
+     *         }
+     *     }
+     *     
+     * ensure that {
+     *     when {
+     *         the IMS_P_CSCF_A entity sends an AAR
+     *         to the EPC_PCRF_A entity
+     *     }
+     *     then {
+     *         the EPC_PCRF_A entity sends the AAA containing
+     *             Result_Code_AVP
+     *                 indicating value DIAMETER_SUCCESS
+     *             Subscription_Id_AVP containing
+     *                 Subscription_Id_Type_AVP
+     *                     indicating value END_USER_IMSI;, //or END_USERE_164   
+     *             "and/or" 
+     *             User_Equipment_Info_AVP containing
+     *                 User_Equipment_Info_Type
+     *                     indicating value IMEISV,
+     *                 User_Equipment_Info_Value;;  
+     *         to the IMS_P_CSCF_A entity
+     *     }
+     * 
+ * @see TS 103 653-1 clause 7.6 + */ + function f_mtc_check_TP_RX_PCRF_ECO_AAA_01( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_dummy }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_AAA_01 - AAR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + + mw_diameter_msg_pass := { aAA_MSG := (mw_AAA_resultCode_subscriptionId_userEquipmentInfo, + mw_AAA_resultCode_userEquipmentInfo, + mw_AAA_resultCode_subscriptionId) + }; + mw_diameter_msg_fail := { aAA_MSG := mw_AAA_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCRF_ECO_AAA_01 - AAA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_RX_PCRF_ECO_AAA_01 + /** * Starts monitor component behavior for TP_RX_PCRF_AAA_02 * @param p_monitorCompRef Reference to monitor component @@ -213,13 +326,15 @@ group g_PCRF_AAA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAA_MSG := mw_AAA_resultCode }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAA_MSG := mw_AAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_AAA_02 - AAA", @@ -265,13 +380,15 @@ group g_PCRF_AAA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAA_MSG := mw_AAA_resultCode }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAA_MSG := mw_AAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_AAA_03 - AAA", @@ -324,13 +441,15 @@ group g_PCRF_STA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTA_MSG := mw_STA_diamSuccess }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTA_MSG := mw_STA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTA_MSG := mw_STA_diamSuccess } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTA_MSG := mw_STA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_STA_01 - STA", @@ -378,13 +497,15 @@ group g_PCRF_STA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_STA_02 - STR", @@ -394,13 +515,15 @@ group g_PCRF_STA { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { sTA_MSG := mw_STA_diamSuccess }; + mw_diameter_msg_fail := { sTA_MSG := mw_STA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTA_MSG := mw_STA_diamSuccess } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTA_MSG := mw_STA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCRF_STA_02 - STA", @@ -462,13 +585,15 @@ group g_PCSCF_ASR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aSR_MSG := mw_ASR_abortCause(BEARER_RELEASED_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aSR_MSG := mw_ASR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aSR_MSG := mw_ASR_abortCause(BEARER_RELEASED_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aSR_MSG := mw_ASR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_ASR_01 - ASR", @@ -541,13 +666,15 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_MediaComponent_specificActionLossOfBearer }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_MediaComponent_specificActionLossOfBearer } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_01 - AAR", @@ -559,6 +686,70 @@ group g_PCSCF_AAR { } } // End of function f_mtc_check_TP_RX_PCSCF_AAR_01 + /** + * Starts monitor component behavior for TP_RX_PCSCF_ECO_AAR_01 + * @param p_monitorCompRef Reference to monitor component + * @param p_checkMessage indicate if the incomming message should only be checked (port.check) or consumed (port.receive). + * The check operation allows read access to the top element of incoming port queues without removing the top element from the queue. + *
+     * Test objective  "Verify that IUT after 2XX_Response on REGISTER sends an AA-Request due to provisioning of AF Signalling flow."
+     *
+     * 
+     * 
+     * Config Id CF_VxLTE_INT
+     * 
+     * Initial conditions with {
+     *     the UE_A entity isNotAttachedTo the EPC_A and
+     *     the UE_A entity not isEmergencyRegisteredTo the IMS_A
+     * }
+     * 
+     * ensure that {
+     *     when {
+     *         the IMS_S_CSCF_A entity sends a 200_Response_REGISTER
+     *         to the IMS_P_CSCF_A entity
+     *     }
+     *     then {
+     *         the IMS_P_CSCF_A entity sends an AAR containing
+     *             Framed_IPv4_Address_AVP 
+     *                 indicating value "IPv4_Address of UE_A",
+     *             "or" Framed_IPv6_Address_AVP 
+     *                 indicating value "IPv6_Address of UE_A",
+     *             AF_Requested_Data_AVP
+     *                 indicating value "EPC-level identities required",
+     *             Service_URN_AVP
+     *                 indicating value "sos*";
+     *         to the EPC_PCRF_A entity
+     *     }
+     * }  
+     * 
+ * @see TS 103 795-1 clause 7.6 + */ + function f_mtc_check_TP_RX_PCSCF_ECO_AAR_01( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_AfRequestedData_ServiceUrn }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCSCF_ECO_AAR_01 - AAR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_RX_PCSCF_ECO_AAR_01 + /** * Starts monitor component behavior for TP_RX_PCSCF_AAR_02 * @param p_monitorCompRef Reference to monitor component @@ -596,13 +787,14 @@ group g_PCSCF_AAR { ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ var boolean v_noDiameterMessageExpected := true; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { //check if nothing received }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } //Fail criteria: check if AAR is sent + mw_diameter_msg_fail //Fail criteria: check if AAR is sent }, {0, omit}, "TP_RX_PCSCF_AAR_02 - AAR", @@ -615,6 +807,68 @@ group g_PCSCF_AAR { } } // End of function f_mtc_check_TP_RX_PCSCF_AAR_02 + /** + * Starts monitor component behavior for TP_RX_PCSCF_ECO_AAR_02 + * @param p_monitorCompRef Reference to monitor component + * @param p_checkMessage indicate if the incomming message should only be checked (port.check) or consumed (port.receive). + * The check operation allows read access to the top element of incoming port queues without removing the top element from the queue. + *
+     * Test objective  "Verify that IUT send AA-Request in case of emergency session establishment for originating side after INVITE is received."
+     *
+     * 
+     * 
+     * Config Id CF_VoLTE_INT_ES
+     * 
+     * Initial conditions with {
+     *     the UE_A entity isNotAttachedTo the EPC_A and
+     *     the UE_A entity not isEmergencyRegisteredTo the IMS_A
+     * }
+     * 
+     * ensure that {
+     *     when {
+     *         the IMS_S_CSCF_A entity sends a 200_Response_REGISTER
+     *         to the IMS_P_CSCF_A entity
+     *     }
+     *     then {
+     *         the IMS_P_CSCF_A entity sends an AAR containing
+     *             Framed_IPv4_Address_AVP 
+     *                 indicating value "IPv4_Address of UE_A",
+     *             "or" Framed_IPv6_Address_AVP 
+     *                 indicating value "IPv6_Address of UE_A",
+     *             Service_URN_AVP
+     *                 indicating value "sos*";
+     *         to the EPC_PCRF_A entity
+     *     }
+     * }  
+     * 
+ * @see TS 103 795-1 clause 7.6 + */ + function f_mtc_check_TP_RX_PCSCF_ECO_AAR_02( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_ServiceUrn }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_RX_PCSCF_ECO_AAR_02 - AAR", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_RX_PCSCF_ECO_AAR_02 + /** * Starts monitor component behavior for TP_RX_PCSCF_AAR_03 * @param p_monitorCompRef Reference to monitor component @@ -668,17 +922,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(INITIAL_REQUEST_E), + mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(INITIAL_REQUEST_E), - mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_03 - AAR", @@ -745,17 +1000,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(UPDATE_REQUEST_E), + mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(UPDATE_REQUEST_E), - mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_04 - AAR", @@ -823,17 +1079,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(UPDATE_REQUEST_E), + mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(UPDATE_REQUEST_E), - mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_05 - AAR", @@ -899,17 +1156,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(INITIAL_REQUEST_E), + mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(INITIAL_REQUEST_E), - mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_06 - AAR", @@ -977,17 +1235,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(UPDATE_REQUEST_E), + mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(UPDATE_REQUEST_E), - mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_07 - AAR", @@ -1055,17 +1314,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(UPDATE_REQUEST_E), + mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(UPDATE_REQUEST_E), - mw_serviceInfoStatus(PRELIMINARY_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_08 - AAR", @@ -1133,17 +1393,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(UPDATE_REQUEST_E), + mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(UPDATE_REQUEST_E), - mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_09 - AAR", @@ -1210,17 +1471,18 @@ group g_PCSCF_AAR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( + mw_rxRequestType(UPDATE_REQUEST_E), + mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), + mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_RequestType_ServiceInfoStatus_FramedIPv4( - mw_rxRequestType(UPDATE_REQUEST_E), - mw_serviceInfoStatus(FINAL_SERVICE_INFORMATION_E), - mw_framedIPAddress(f_IPV4_Address2oct(PX_SIP_GMA_UE_IPADDR))) - } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_AAR_10 - AAR", @@ -1293,13 +1555,15 @@ group g_PCSCF_RAA { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { rAR_MSG := mw_RAR_SpecificAction }; + var template DIAMETER_MSG mw_diameter_msg_fail := { rAR_MSG := mw_RAR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_SpecificAction } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAR_MSG := mw_RAR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_RAA_01 - RAR", @@ -1309,13 +1573,15 @@ group g_PCSCF_RAA { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { rAA_MSG := mw_RAA_Rx_resultCode }; + mw_diameter_msg_fail := { rAA_MSG := mw_RAA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_Rx_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ rAA_MSG := mw_RAA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_RAA_01 - RAA", @@ -1368,13 +1634,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_01 - STR", @@ -1424,13 +1692,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_02 - STR", @@ -1479,13 +1749,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_03 - STR", @@ -1534,13 +1806,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_04 - STR", @@ -1589,13 +1863,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_05 - STR", @@ -1644,13 +1920,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_06 - STR", @@ -1699,13 +1977,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_07 - STR", @@ -1754,13 +2034,15 @@ group g_PCSCF_STR { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_RX_PCSCF_STR_08 - STR", @@ -1777,4 +2059,4 @@ group g_PCSCF_STR { } // end group g_PCSCF -} // end module AtsImsIot_TP_behavior_RX \ No newline at end of file +} // end module AtsImsIot_TP_behavior_RX diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S6A.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S6A.ttcn index ebfc870fb79f194fc152f096f38f60e1d81dd008..b9a70560b705813408aa8ae1e1af3ca1ffd51073 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S6A.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S6A.ttcn @@ -7,21 +7,21 @@ module AtsImsIot_TP_behavior_S6A { - import from AtsImsIot_TestSystem { type DiameterInterfaceMonitor, ImsTestCoordinator; } - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from AtsImsIot_TestSystem all; + import from LibIot_PIXITS all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; import from AtsImsIot_Functions all; - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from LibIot_PIXITS all; import from AtsImsIot_Diameter_Templates all; // LibDiameter import from LibDiameter_Templates all; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;}; + import from LibDiameter_TypesAndValues all; @@ -65,13 +65,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aIR_MSG := mw_AIR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aIR_MSG := mw_AIR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aIR_MSG := mw_AIR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aIR_MSG := mw_AIR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_AIA_01 - AIR", @@ -81,13 +83,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { aIA_MSG := mw_AIA_resultCode }; + mw_diameter_msg_fail := { aIA_MSG := mw_AIA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aIA_MSG := mw_AIA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aIA_MSG := mw_AIA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_AIA_01 - AIA", @@ -97,6 +101,8 @@ group g_HSS { ); p_monitorCompRef.done; } + + } // End of function f_mtc_check_TP_S6A_HSS_AIA_01 /** @@ -138,13 +144,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cLR_MSG := mw_CLR_cancelation }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cLR_MSG := mw_CLR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cLR_MSG := mw_CLR_cancelation } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cLR_MSG := mw_CLR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_CLR_01 - CLR", @@ -193,13 +201,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { pUER_MSG := mw_PUER_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { pUER_MSG := mw_PUER_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ pUER_MSG := mw_PUER_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ pUER_MSG := mw_PUER_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_PUA_01 - PUR", @@ -209,13 +219,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { pUEA_MSG := mw_PUEA_resultCode }; + mw_diameter_msg_fail := { pUEA_MSG := mw_PUEA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ pUEA_MSG := mw_PUEA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ pUEA_MSG := mw_PUEA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_PUA_01 - PUA", @@ -265,13 +277,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { uLR_MSG := mw_ULR_userName }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uLR_MSG := mw_ULR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_userName } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_ULA_01 - ULR", @@ -281,13 +295,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uLA_MSG := mw_ULA_resultCode_flags }; + mw_diameter_msg_fail := { uLA_MSG := mw_ULA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ uLA_MSG := mw_ULA_resultCode_flags } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ uLA_MSG := mw_ULA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_ULA_01 - ULA", @@ -337,13 +353,15 @@ group g_HSS { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { uLR_MSG := mw_ULR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uLR_MSG := mw_ULR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_ULA_02 - ULR", @@ -353,13 +371,15 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uLA_MSG := mw_ULA_resultCode_flags }; + mw_diameter_msg_fail := { uLA_MSG := mw_ULA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ uLA_MSG := mw_ULA_resultCode_flags } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ uLA_MSG := mw_ULA_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_HSS_ULA_02 - ULA", @@ -371,7 +391,88 @@ group g_HSS { } } // End of function f_mtc_check_TP_S6A_HSS_ULA_02 - + group ES{ + /** + * Starts monitor component behavior for TP_S6A_HSS_ECO_ULA_01 + * @param p_monitorCompRef Reference to monitor component + *
+         *Test objective  "Verify that IUT after receipt of UL-Request sends UL-Answer containing Emergency-Info AVP."
+         *
+         *Reference 
+         *   "TS 129 272 [10], clause 5.2.1.1.2"
+        
+         *Config Id CF_VxLTE_INT_ES
+        
+         *PICS Selection NONE
+        
+         *Initial conditions with {
+         *   the UE_A entity isNotAttachedTo the EPC_A and
+         *   the UE_A entity isNotRegisteredTo the IMS_A
+         *}
+         *
+         *Expected behaviour
+         *   ensure that {
+         *       when {
+         *           the EPC_MME_A entity sends a ULR
+         *           to the IMS_HSS_A entity
+         *       }
+         *       then {
+         *           the IMS_HSS_A entity sends the ULA containing
+         *               Subscription_Data_AVP containing
+         *                   Emergency_Info_AVP indicating value PDN_GW;,
+         *               Result_Code_AVP
+         *                   indicating value DIAMETER_SUCCESS
+         *               ULA_Flags_AVP;
+         *           to the EPC_MME_A entity
+         *       }
+         *   } 
+         * 
+ */ + function f_mtc_check_TP_S6A_HSS_ECO_ULA_01( + DiameterInterfaceMonitor p_monitorCompRef, + in boolean p_checkMessage := false, + in boolean p_forward_to_mtc := false + ) runs on ImsTestCoordinator { + if (isvalue(p_monitorCompRef)){ +// var template DIAMETER_MSG mw_diameter_msg_pass := { uLR_MSG := mw_ULR_userName }; +// var template DIAMETER_MSG mw_diameter_msg_fail := { uLR_MSG := mw_ULR_basic }; +// p_monitorCompRef.start ( +// f_Iot_Diameter_receive( +// { +// mw_diameter_msg_pass +// }, +// { +// mw_diameter_msg_fail +// }, +// {0, omit}, +// "TP_S6A_HSS_ULA_01 - ULR", +// p_forward_to_mtc, +// p_checkMessage +// ) +// ); +// p_monitorCompRef.done; + + var template DIAMETER_MSG mw_diameter_msg_pass := { uLA_MSG := mw_ULA_subsdata_flags }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uLA_MSG := mw_ULA_basic }; + p_monitorCompRef.start ( + f_Iot_Diameter_receive( + { + mw_diameter_msg_pass + }, + { + mw_diameter_msg_fail + }, + {0, omit}, + "TP_S6A_HSS_ECO_ULA_01 - ULA", + p_forward_to_mtc, + p_checkMessage + ) + ); + p_monitorCompRef.done; + } + } // End of function f_mtc_check_TP_S6A_HSS_ECO_ULA_01 + + }// end group ES } // end group g_HSS group g_MME { @@ -415,13 +516,15 @@ group g_MME { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ - p_monitorCompRef.start ( + var template DIAMETER_MSG mw_diameter_msg_pass := { aIR_MSG := mw_AIR }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aIR_MSG := mw_AIR_basic }; + p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aIR_MSG := mw_AIR } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aIR_MSG := mw_AIR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_MME_AIR_01 - AIR", @@ -470,13 +573,15 @@ group g_MME { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cLR_MSG := mw_CLR_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cLR_MSG := mw_CLR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cLR_MSG := mw_CLR_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cLR_MSG := mw_CLR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_MME_CLA_01 - CLR", @@ -486,13 +591,15 @@ group g_MME { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { cLA_MSG := mw_CLA_resultCode }; + mw_diameter_msg_fail := { cLA_MSG := mw_CLA_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cLA_MSG := mw_CLA_resultCode } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cLA_MSG := mw_CLA_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_MME_CLA_01 - CLA", @@ -541,13 +648,15 @@ group g_MME { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { pUER_MSG := mw_PUER_userName }; + var template DIAMETER_MSG mw_diameter_msg_fail := { pUER_MSG := mw_PUER_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ pUER_MSG := mw_PUER_userName } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ pUER_MSG := mw_PUER_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_MME_PUR_01 - PUR", @@ -599,13 +708,15 @@ group g_MME { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { uLR_MSG := mw_ULR_userName }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uLR_MSG := mw_ULR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_userName } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_basic} + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_MME_ULR_01 - ULR", @@ -657,13 +768,15 @@ group g_MME { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { uLR_MSG := mw_ULR_userName }; + var template DIAMETER_MSG mw_diameter_msg_fail := { uLR_MSG := mw_ULR_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_userName } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ uLR_MSG := mw_ULR_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S6A_MME_ULR_02 - ULR", @@ -675,7 +788,10 @@ group g_MME { } } // End of function f_mtc_check_TP_S6A_MME_ULR_02 + group ES{ + + }// end group ES } // end group g_MME -} // end module AtsImsIot_TP_behavior_S6A \ No newline at end of file +} // end module AtsImsIot_TP_behavior_S6A diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S9.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S9.ttcn index a0bdc8be2e313011d1f3249921559f3264a7a0c1..72aabfd57b8870c6b96c2e52174549d1be242d44 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S9.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_S9.ttcn @@ -7,21 +7,21 @@ module AtsImsIot_TP_behavior_S9 { - import from AtsImsIot_TestSystem { type DiameterInterfaceMonitor, ImsTestCoordinator; } - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from AtsImsIot_TestSystem all; + import from LibIot_PIXITS all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; import from AtsImsIot_Functions all; - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from LibIot_PIXITS all; import from AtsImsIot_Diameter_Templates all; // LibDiameter import from LibDiameter_Templates all; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;}; + import from LibDiameter_TypesAndValues all; group g_PCRF { @@ -61,13 +61,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAR_MSG := mw_AAR_S9_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAR_MSG := mw_AAR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_S9_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAR_MSG := mw_AAR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_AAR_01 - AAR", @@ -134,13 +136,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAA_MSG := mw_AAA_S9_resultCode /*mw_AAA_S9_AcceptableService*/ }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAA_MSG := mw_AAA_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_S9_resultCode /*mw_AAA_S9_AcceptableService*/ } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_AAA_01 - AAA", @@ -192,13 +196,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aAA_MSG := mw_AAA_S9_resultCode_mediaCopmonentDescription }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aAA_MSG := mw_AAA_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_S9_resultCode_mediaCopmonentDescription } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aAA_MSG := mw_AAA_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_AAA_02 - AAA", @@ -247,14 +253,16 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aSR_MSG := mw_ASR_S9_abortCause(BEARER_RELEASED_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aSR_MSG := mw_ASR_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aSR_MSG := mw_ASR_S9_abortCause(BEARER_RELEASED_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aSR_MSG := mw_ASR_S9_basic } - }, + mw_diameter_msg_fail + }, {0, omit}, "TP_S9_PCRF_ASR_01 - ASR", p_forward_to_mtc, @@ -299,13 +307,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { aSA_MSG := mw_ASA_S9_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { aSA_MSG := mw_ASA_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ aSA_MSG := mw_ASA_S9_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ aSA_MSG := mw_ASA_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_ASA_01 - ASA", @@ -384,13 +394,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_S9_Establishment(INITIAL_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_S9_Establishment(INITIAL_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_CCR_01 - CCR", @@ -444,13 +456,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCR_MSG := mw_CCR_S9_Termination(TERMINATION_REQUEST_E) }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCR_MSG := mw_CCR_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_S9_Termination(TERMINATION_REQUEST_E) } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCR_MSG := mw_CCR_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_CCR_02 - CCR", @@ -515,13 +529,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCA_MSG := mw_CCA_S9_subsessionDecision_qosInfoAndDefaultEpsBearer }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCA_MSG := mw_CCA_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_S9_subsessionDecision_qosInfoAndDefaultEpsBearer } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_CCA_01 - CCA", @@ -573,13 +589,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { cCA_MSG := mw_CCA_S9_subsessionDecisionAny }; + var template DIAMETER_MSG mw_diameter_msg_fail := { cCA_MSG := mw_CCA_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_S9_subsessionDecisionAny } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ cCA_MSG := mw_CCA_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_CCA_02 - CCA", @@ -625,13 +643,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTR_MSG := mw_STR_S9_basic }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTR_MSG := mw_STR_dummy }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTR_MSG := mw_STR_S9_basic } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTR_MSG := mw_STR_dummy } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_STR_01 - STR", @@ -680,13 +700,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTA_MSG := mw_STA_S9_diamSuccess }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTA_MSG := mw_STA_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTA_MSG := mw_STA_S9_diamSuccess } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTA_MSG := mw_STA_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_STA_01 - STA", @@ -735,13 +757,15 @@ group g_PCRF { in boolean p_forward_to_mtc := false ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ + var template DIAMETER_MSG mw_diameter_msg_pass := { sTA_MSG := mw_STA_S9_diamSuccess }; + var template DIAMETER_MSG mw_diameter_msg_fail := { sTA_MSG := mw_STA_S9_basic }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{ sTA_MSG := mw_STA_S9_diamSuccess } + mw_diameter_msg_pass }, { - DIAMETER_MSG:{ sTA_MSG := mw_STA_S9_basic } + mw_diameter_msg_fail }, {0, omit}, "TP_S9_PCRF_STA_02 - STA", diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_SH.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_SH.ttcn index 92729988708498b921818b0aee493b941c3e3199..c7e19d2cec566fbdf4e218ce9f1f81129e175444 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_SH.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_SH.ttcn @@ -9,21 +9,21 @@ module AtsImsIot_TP_behavior_SH // LibIms import from LibIms_UpperTester all; - import from AtsImsIot_TestSystem { type DiameterInterfaceMonitor, ImsTestCoordinator; } - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} - import from AtsImsIot_Templates {template all;} - import from AtsImsIot_TypesAndValues { type SipMessage, SipMessageList, NAPTRmessage, EnumResponse, EnumQuery, SkipType; } - import from LibIot_TestInterface { type EquipmentUser, IotEquipmentUser }; - import from LibIot_TypesAndValues {type SetFilterReq, SetFilterRsp;} - import from LibIot_Functions { function f_setConformanceVerdict, f_setIotVerdictFAIL; } + import from AtsImsIot_TestSystem all; + import from LibIot_PIXITS all; + import from AtsImsIot_Templates all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibIot_Functions all; import from AtsImsIot_Functions all; - import from LibIot_PIXITS {modulepar PX_EUT_A, PX_EUT_B;} + import from LibIot_PIXITS all; import from AtsImsIot_Diameter_Templates all; // LibDiameter import from LibDiameter_Templates all; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;}; + import from LibDiameter_TypesAndValues all; @@ -84,10 +84,11 @@ group g_HSS { ) runs on ImsTestCoordinator { if (isvalue(p_monitorCompRef)){ var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A); + var template DIAMETER_MSG mw_diameter_msg_pass := { uDR_MSG := mw_UDR_userData_publicIdentity("tel:"&v_userInfoA.publicId) }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uDR_MSG := mw_UDR_userData_publicIdentity("tel:"&v_userInfoA.publicId)} + mw_diameter_msg_pass }, {}, {0, omit}, @@ -98,10 +99,11 @@ group g_HSS { ); p_monitorCompRef.done; + mw_diameter_msg_pass := { uDA_MSG := mw_UDA_diamSuccess }; p_monitorCompRef.start ( f_Iot_Diameter_receive( { - DIAMETER_MSG:{uDA_MSG := mw_UDA_diamSuccess} + mw_diameter_msg_pass }, {}, {0, omit}, diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn index eb1a9bcf0ce0ffdd6be705c7ffd0b3acfd2db830..f7ad97b2bf752af22b1f2b02110df221ef5fd47c 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Templates.ttcn @@ -6,54 +6,25 @@ module AtsImsIot_Templates { - import from LibCommon_BasicTypesAndValues {type UInt16;} - import from LibCommon_VerdictControl {type FncRetCode;} - import from LibIot_TypesAndValues { - type - InterfaceInfoList, - ProtocolFilter, - GeneralConfigurationReq, - GeneralConfigurationRsp, - SetFilterReq, - SetFilterRsp, - StartTrafficCaptureReq, - StartTrafficCaptureRsp, - StopTrafficCaptureReq, - StopTrafficCaptureRsp, - IpAddress, - Status; - } - import from AtsImsIot_TypesAndValues { - type - SipMessage, NAPTRmessage - }; + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_VerdictControl all; + import from LibIot_TypesAndValues all; + import from AtsImsIot_TypesAndValues all; import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; + import from LibSip_XMLTypes all; import from LibSip_Templates all; - import from LibSip_Common { - type - GenericParam, - SemicolonParam_List - } - import from LibMsrp_TypesAndValues { - type - SEND_request, - RECEIVE_response - }; - import from LibIot_PIXITS { - modulepar - PX_IOT_TIMESTAMP_OFFSET, - PX_IOT_PCAP_SESSIONS_PATH, - PX_IOT_RECORD_MODE, - PX_IOT_EUTs_IFACE_INFO_LIST, - PX_IOT_FILE_MERGE_LIST, - PX_IOT_FILE_MERGE_PATH, - PX_IOT_MERGE_TOOL_PATH, - PX_IOT_IFACES; - } - import from AtsImsIot_PIXITS { - modulepar - PX_IMS_SUT_CONF_FACTORY_NAME, PX_IMS_SUT_CONF_HOME_DOMAIN - }; + import from LibSip_Common all; + import from LibMsrp_TypesAndValues all; + import from LibIms_Templates all; + import from LibIot_PIXITS all; + import from AtsImsIot_PIXITS all; + + import from XSD all; + import from NoTargetNamespace language "XSD" all + with { + extension "File:../xsd/Ims3gpp.xsd"; + } group adapterMsgTemplates { template SetFilterReq m_SetFilterReq(ProtocolFilter p_protocol, InterfaceInfoList p_iterfaces) := { @@ -1920,6 +1891,13 @@ module AtsImsIot_Templates { messageBody := *, payload := * } + template Response mdw_3XX_Base modifies m_Response_Dummy := + { + statusLine := {c_sipNameVersion, (300..399), ?}, + msgHeader := ?, + messageBody := *, + payload := * + } template Response mw_401Unauthorized_Base modifies m_Response_Dummy := { statusLine := {c_sipNameVersion, 401, ?}, @@ -1951,6 +1929,14 @@ module AtsImsIot_Templates { payload := * } + template Response mw_420BadExtension_Base modifies m_Response_Dummy := + { + statusLine := {c_sipNameVersion, 420, ?}, + msgHeader := ?, + messageBody := *, + payload := * + } + template Response mw_480TemporaryUnavailable_Base modifies m_Response_Dummy := { statusLine := c_statusLine480, @@ -2180,30 +2166,30 @@ module AtsImsIot_Templates { template UPDATE_Request mdw_TP_IMS_5106_02_f_ic( template CallId p_callId, template SipUrl p_SCSCF_URI - ) modifies mw_UPDATE_Request_Base := { - msgHeader := { - route := { - fieldName := ROUTE_E, - routeBody := { - mw_routeBody(p_SCSCF_URI), - * - } - } - } - } + ) modifies mw_UPDATE_Request_Base := { + msgHeader := { + route := { + fieldName := ROUTE_E, + routeBody := { + mw_routeBody(p_SCSCF_URI), + * + } + } + } + } /** * @desc OPTIONS Request checking TP_IMS_CONTENT_SHARE_01 */ template OPTIONS_Request mdw_TP_IMS_CONTENT_SHARE_01_ic( - template CallId p_callId - ) modifies mw_OPTIONS_Request_Base := { - msgHeader := { - acceptContact := mw_AcceptContact_share, - contact := mw_Contact_share + template CallId p_callId + ) modifies mw_OPTIONS_Request_Base := { + msgHeader := { + acceptContact := mw_AcceptContact_share, + contact := mw_Contact_share + } } - } /** @@ -2217,6 +2203,228 @@ module AtsImsIot_Templates { } } + template NameAddr mw_NameAddr_DispName_Tel( + template DisplayName p_displayName := *, + template(present) charstring p_number := ? + ) := { + displayName := p_displayName, + addrSpec := { + scheme := c_telScheme, //* contains "tel" + components := { + tel := { + subscriber := p_number + } + }, + urlParameters := *, + headers := * + } + } // End of template mw_NameAddr_DispName_Tel + + template(present) From mw_From_AddrUnion_SipUrl( + template DisplayName p_dn, + template(present) charstring p_user := ?, + template charstring p_host + ) := { + fieldName := FROM_E, + addressField := mw_AddrUnion_SipUrl(p_user, p_host), + fromParams := * + } // End of template mw_From_AddrUnion_SipUrl + + template(present) From mw_From_AddrUnion_TelUrl( + template(present) charstring p_number := ? + ) := { + fieldName := FROM_E, + addressField := mw_AddrUnion_TelUrl(p_number), + fromParams := * + } // End of template mw_From_AddrUnion_TelUrl + + template From mw_From_NameAddr_TelUrl( + template DisplayName p_displayName := *, + template(present) charstring p_number := ? + ) := { + fieldName := FROM_E, + addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, + fromParams := * + } // End of template mw_From_NameAddr_TelUrl + + template(present) To mw_To_AddrUnion_SipUrl( + template DisplayName p_dn, + template(present) charstring p_user := ?, + template charstring p_host + ) := { + fieldName := TO_E, + addressField := mw_AddrUnion_SipUrl(p_user, p_host), + toParams := * + } // End of template mw_To_AddrUnion_SipUrl + + template(present) To mw_To_AddrUnion_TelUrl( + template(present) charstring p_number := ? + ) := { + fieldName := TO_E, + addressField := mw_AddrUnion_TelUrl(p_number), + toParams := * + } // End of template mw_To_AddrUnion_TelUrl + + template To mw_To_NameAddr_TelUrl( + template DisplayName p_displayName := *, + template(present) charstring p_number := ? + ) := { + fieldName := TO_E, + addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, + toParams := * + } // End of template mw_To_NameAddr_TelUrl + + template (present) Contact mw_contact( + template (present) ContactAddress p_contactAddresses := ? + ) := { + fieldName := CONTACT_E, + contactBody := { contactAddresses := { p_contactAddresses } } + } // End of template mw_Contact + + template (present) Response mw_200OK( + template (present) CSeq p_cSeq := ?, + template (present) CallId p_callId := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_200OK_Base := { + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_200OK + + template (present) Response mw_ECO_200OK( + template (present) CSeq p_cSeq := ?, + template (present) CallId p_callId := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_200OK := { + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + pChargingVector := omit, + pChargingFunctionAddresses := omit, + pPreferredID := omit + } + } // End of template mw_200OK + + template Response mw_380AlternateService( + template (present) CSeq p_cSeq := ?, + template (present) CallId p_callId := ?, + template WwwAuthenticate p_wwwAuthenticate := * + ) modifies mdw_3XX_Base := { + msgHeader := { + cSeq := p_cSeq, + callId := p_callId, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_380AlternateService + + template Response mw_401Unauthorized( + template (present) CSeq p_cSeq := ?, + template (present) WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_401Unauthorized_Base := { + msgHeader := { + cSeq := p_cSeq, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_401Unauthorized + + template Response mw_403Forbidden( + template (present) CSeq p_cSeq := ?, + template (present) WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_403Forbidden_Base := { + msgHeader := { + cSeq := p_cSeq, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_403Forbidden + + template Response mw_404NotFound( + template (present) CSeq p_cSeq := ?, + template (present) WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_404NotFound_Base := { + msgHeader := { + cSeq := p_cSeq, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_404NotFound + + template Response mw_420BadExtension( + template (present) CSeq p_cSeq := ?, + template (present) WwwAuthenticate p_wwwAuthenticate := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_420BadExtension_Base := { + msgHeader := { + cSeq := p_cSeq, + wwwAuthenticate := p_wwwAuthenticate + }, + messageBody := p_messageBody + } // End of template mw_420BadExtension + + template Response mw_480TemporaryUnavailable( + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template WwwAuthenticate p_wwwAuthenticate := * + ) modifies mw_480TemporaryUnavailable_Base := { + msgHeader := { + cSeq := p_cSeq, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_480TemporaryUnavailable + + template (present) Response mw_486Busy( + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_486Busy_Base := { + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_486Busy + + template (present) Response mw_600BusyEverywhere( + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_600BusyEverywhere_Base := { + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_600BusyEverywhere + + template (present) Response mw_487RequestTerminated( + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_487RequestTerminated_Base := { + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + wwwAuthenticate := p_wwwAuthenticate + } + } // End of template mw_487RequestTerminated + } // End of group modifiedSIPBaseTemplates group EmergencySIPTemplates { @@ -2355,7 +2563,27 @@ module AtsImsIot_Templates { } } - + template (present) Accept mw_accept( + template (present) AcceptBody_List p_acceptArgs := ? + ) := { + fieldName := ACCEPT_E, + acceptArgs := p_acceptArgs + } + + template (present) RecvInfo mw_recvInfo( + template InfoPackage_List p_infoPackageList := ? + ) := { + fieldName := RECV_INFO_E, + infoPackageList := p_infoPackageList + } + + template(present) PPreferredID mw_PPreferredID( + template(present) PPreferredIDValue_List p_pPreferredIDValue_List := ? + ) := { + fieldName := P_PREFERRED_ID_E, + pPreferredIDValueList := p_pPreferredIDValue_List + } + } // end group HeaderTemplates group AuxiliaryInformationElementTemplates { @@ -2427,8 +2655,39 @@ module AtsImsIot_Templates { } } } + template (present) AcceptBody mw_acceptBody( + template (present) charstring p_mediaRange := ?, + template SemicolonParam_List p_acceptParam := * + ) :={ + mediaRange := p_mediaRange, + acceptParam := p_acceptParam + } + + template (present) InfoPackage_Type mw_infoPackage_Type( + template (present) charstring p_infoPackageName := ?, + template SemicolonParam_List p_infoPackageParams := * + ) := { + infoPackageName := p_infoPackageName, + infoPackageParams := p_infoPackageParams + } + } // End of group AuxiliaryInformationElementTemplates + group messageBody_XML { + + template(present) TIMS3GPP mw_Ims_Eco_3gpp_CW modifies mw_Ims_3gpp_CW := { + choice := { + alternative_service := { + type_ := { + attr := { "emergency" }, + elem_list := ? + } + } + } + } + + } // End of group messageBody_XML + group adapterTemplates { template GeneralConfigurationReq m_generalConfigurationReq_offline := { diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_GM.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_GM.ttcn index ce18a371d79cd7c25531969f7ede57b2761eff34..dd17d90448ff2557679263977e9f21fc423295c2 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Templates_GM.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_GM.ttcn @@ -11,6 +11,7 @@ module AtsImsIot_Templates_GM { // libSip import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; import from LibSip_Templates all; import from LibSip_Common all; @@ -47,152 +48,143 @@ module AtsImsIot_Templates_GM { } } // End of template mw_NameAddr_DispName_Tel - template(present) From mw_From_AddrUnion_SipUrl( - template DisplayName p_dn, - template(present) charstring p_user := ?, - template charstring p_host - ) := { - fieldName := FROM_E, - addressField := mw_AddrUnion_SipUrl(p_user, p_host), - fromParams := * - } // End of template mw_From_AddrUnion_SipUrl - - template(present) From mw_From_AddrUnion_TelUrl( - template(present) charstring p_number := ? - ) := { - fieldName := FROM_E, - addressField := mw_AddrUnion_TelUrl(p_number), - fromParams := * - } // End of template mw_From_AddrUnion_TelUrl - - template From mw_From_NameAddr_TelUrl( - template DisplayName p_displayName := *, - template(present) charstring p_number := ? - ) := { - fieldName := FROM_E, - addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, - fromParams := * - } // End of template mw_From_NameAddr_TelUrl - - template(present) To mw_To_AddrUnion_SipUrl( - template DisplayName p_dn, - template(present) charstring p_user := ?, - template charstring p_host - ) := { - fieldName := TO_E, - addressField := mw_AddrUnion_SipUrl(p_user, p_host), - toParams := * - } // End of template mw_To_AddrUnion_SipUrl - - template(present) To mw_To_AddrUnion_TelUrl( - template(present) charstring p_number := ? - ) := { - fieldName := TO_E, - addressField := mw_AddrUnion_TelUrl(p_number), - toParams := * - } // End of template mw_To_AddrUnion_TelUrl - - template To mw_To_NameAddr_TelUrl( - template DisplayName p_displayName := *, - template(present) charstring p_number := ? - ) := { - fieldName := TO_E, - addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, - toParams := * - } // End of template mw_To_NameAddr_TelUrl - - template (present) Response mw_200OK( - template (present) CSeq p_cSeq := ?, - template (present) CallId p_callId := ?, - template (present) From p_from := ?, - template (present) To p_to := ? - ) modifies mw_200OK_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to - } - } // End of template mw_200OK - - template (present) Response mw_401Unauthorized( - template (present) CSeq p_cSeq := ?, - template (present) WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_401Unauthorized_Base := { - msgHeader := { - cSeq := p_cSeq, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_401Unauthorized - - template (present) Response mw_404NotFound( - template (present) CSeq p_cSeq := ?, - template (present) WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_404NotFound_Base := { - msgHeader := { - cSeq := p_cSeq, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_404NotFound - - template Response mw_480TemporaryUnavailable( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template WwwAuthenticate p_wwwAuthenticate := * - ) modifies mw_480TemporaryUnavailable_Base := { - msgHeader := { - cSeq := p_cSeq, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_480TemporaryUnavailable - - template (present) Response mw_486Busy( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ?, - template WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_486Busy_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_486Busy - - template (present) Response mw_600BusyEverywhere( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ?, - template WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_600BusyEverywhere_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_600BusyEverywhere - - template (present) Response mw_487RequestTerminated( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ?, - template WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_487RequestTerminated_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_487RequestTerminated + // template(present) From mw_From_AddrUnion_SipUrl( + // template DisplayName p_dn, + // template(present) charstring p_user := ?, + // template charstring p_host + // ) := { + // fieldName := FROM_E, + // addressField := mw_AddrUnion_SipUrl(p_user, p_host), + // fromParams := * + // } // End of template mw_From_AddrUnion_SipUrl + + // template(present) From mw_From_AddrUnion_TelUrl( + // template(present) charstring p_number := ? + // ) := { + // fieldName := FROM_E, + // addressField := mw_AddrUnion_TelUrl(p_number), + // fromParams := * + // } // End of template mw_From_AddrUnion_TelUrl + + // template From mw_From_NameAddr_TelUrl( + // template DisplayName p_displayName := *, + // template(present) charstring p_number := ? + // ) := { + // fieldName := FROM_E, + // addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, + // fromParams := * + // } // End of template mw_From_NameAddr_TelUrl + + // template(present) To mw_To_AddrUnion_SipUrl( + // template DisplayName p_dn, + // template(present) charstring p_user := ?, + // template charstring p_host + // ) := { + // fieldName := TO_E, + // addressField := mw_AddrUnion_SipUrl(p_user, p_host), + // toParams := * + // } // End of template mw_To_AddrUnion_SipUrl + + // template(present) To mw_To_AddrUnion_TelUrl( + // template(present) charstring p_number := ? + // ) := { + // fieldName := TO_E, + // addressField := mw_AddrUnion_TelUrl(p_number), + // toParams := * + // } // End of template mw_To_AddrUnion_TelUrl + + // template To mw_To_NameAddr_TelUrl( + // template DisplayName p_displayName := *, + // template(present) charstring p_number := ? + // ) := { + // fieldName := TO_E, + // addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, + // toParams := * + // } // End of template mw_To_NameAddr_TelUrl + + // template (present) Contact mw_contact( + // template (present) ContactAddress p_contactAddresses := ? + // ) := { + // fieldName := CONTACT_E, + // contactBody := { contactAddresses := { p_contactAddresses } } + // } // End of template mw_Contact + + // template (present) Response mw_200OK( + // template (present) CSeq p_cSeq := ?, + // template (present) CallId p_callId := ?, + // template (present) From p_from := ?, + // template (present) To p_to := ? + // ) modifies mw_200OK_Base := { + // msgHeader := { + // callId := p_callId, + // cSeq := p_cSeq, + // fromField := p_from, + // toField := p_to + // } + // } // End of template mw_200OK + + // template (present) Response mw_401Unauthorized( + // template (present) CSeq p_cSeq := ?, + // template (present) WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_401Unauthorized_Base := { + // msgHeader := { + // cSeq := p_cSeq, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_401Unauthorized + + // template (present) Response mw_404NotFound( + // template (present) CSeq p_cSeq := ?, + // template (present) WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_404NotFound_Base := { + // msgHeader := { + // cSeq := p_cSeq, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_404NotFound + + // template Response mw_480TemporaryUnavailable( + // template (present) CallId p_callId := ?, + // template (present) CSeq p_cSeq := ?, + // template WwwAuthenticate p_wwwAuthenticate := * + // ) modifies mw_480TemporaryUnavailable_Base := { + // msgHeader := { + // cSeq := p_cSeq, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_480TemporaryUnavailable + + // template (present) Response mw_486Busy( + // template (present) CallId p_callId := ?, + // template (present) CSeq p_cSeq := ?, + // template (present) From p_from := ?, + // template (present) To p_to := ?, + // template WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_486Busy_Base := { + // msgHeader := { + // callId := p_callId, + // cSeq := p_cSeq, + // fromField := p_from, + // toField := p_to, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_486Busy + + // template (present) Response mw_600BusyEverywhere( + // template (present) CallId p_callId := ?, + // template (present) CSeq p_cSeq := ?, + // template (present) From p_from := ?, + // template (present) To p_to := ?, + // template WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_600BusyEverywhere_Base := { + // msgHeader := { + // callId := p_callId, + // cSeq := p_cSeq, + // fromField := p_from, + // toField := p_to, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_600BusyEverywhere } // End of group sip_templates @@ -215,6 +207,23 @@ module AtsImsIot_Templates_GM { } } // End of template mw_TP_GM_PCSCF_REGISTER_01 + template(present) REGISTER_Request mw_TP_GM_PCSCF_ECO_REGISTER_01( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_GM_PCSCF_REGISTER_01 := { + msgHeader := { + contact := p_contact, + path := p_path, + warning := p_warning + } + } // End of template mw_TP_GM_PCSCF_ECO_REGISTER_01 + template(present) REGISTER_Request mw_TP_GM_PCSCF_REGISTER_02( template (present) From p_from := ?, template (present) To p_to := ?, @@ -224,6 +233,18 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_REGISTER_01 := { } // End of template mw_TP_GM_PCSCF_REGISTER_02 + template(present) REGISTER_Request mw_TP_GM_PCSCF_ECO_REGISTER_02( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_GM_PCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_GM_PCSCF_REGISTER_02 + template(present) REGISTER_Request mw_TP_GM_PCSCF_REGISTER_03( template (present) From p_from := ?, template (present) To p_to := ?, @@ -233,6 +254,18 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_REGISTER_01 := { } // End of template mw_TP_GM_PCSCF_REGISTER_03 + template(present) REGISTER_Request mw_TP_GM_PCSCF_ECO_REGISTER_03( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_GM_PCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_GM_PCSCF_ECO_REGISTER_03 + template(present) REGISTER_Request mw_TP_GM_PCSCF_REGISTER_04( template (present) From p_from := ?, template (present) To p_to := ?, @@ -242,6 +275,18 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_REGISTER_01 := { } // End of template mw_TP_GM_PCSCF_REGISTER_04 + template(present) REGISTER_Request mw_TP_GM_PCSCF_ECO_REGISTER_04( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_GM_PCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_GM_PCSCF_ECO_REGISTER_04 + template(present) REGISTER_Request mw_TP_GM_PCSCF_REGISTER_05( template (present) From p_from := ?, template (present) To p_to := ?, @@ -251,6 +296,18 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_REGISTER_01 := { } // End of template mw_TP_GM_PCSCF_REGISTER_04 + template(present) REGISTER_Request mw_TP_GM_PCSCF_ECO_REGISTER_05( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_GM_PCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_GM_PCSCF_ECO_REGISTER_05 + template(present) REGISTER_Request mw_TP_GM_PCSCF_REGISTER_07( template (present) From p_from := ?, template (present) To p_to := ?, @@ -358,12 +415,34 @@ module AtsImsIot_Templates_GM { } } // End of template mw_TP_GM_PCSCF_INVITE_01 + template (present) INVITE_Request mw_TP_GM_PCSCF_ECO_INVITE_01( + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_GM_PCSCF_INVITE_01 := { + msgHeader := { + contact := p_contact + }, + messageBody := p_messageBody + } // End of template mw_TP_GM_PCSCF_ECO_INVITE_01 + template (present) INVITE_Request mw_TP_GM_PCSCF_INVITE_02( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, template (present) From p_from := ?, template (present) To p_to := ? ) modifies mw_TP_GM_PCSCF_INVITE_01 := { - } // End of template mw_TP_GM_PCSCF_INVITE_03 + } // End of template mw_TP_GM_PCSCF_INVITE_02 + + template (present) INVITE_Request mw_TP_GM_PCSCF_ECO_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_GM_PCSCF_ECO_INVITE_01 := { + } // End of template mw_TP_GM_PCSCF_ECO_INVITE_02 template (present) INVITE_Request mw_TP_GM_PCSCF_INVITE_03( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, @@ -372,6 +451,15 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_INVITE_01 := { } // End of template mw_TP_GM_PCSCF_INVITE_03 + template (present) INVITE_Request mw_TP_GM_PCSCF_ECO_INVITE_03( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_GM_PCSCF_ECO_INVITE_01 := { + } // End of template mw_TP_GM_PCSCF_ECO_INVITE_03 + template (present) INVITE_Request mw_TP_GM_PCSCF_INVITE_04( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, template (present) From p_from := ?, @@ -379,6 +467,40 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_INVITE_01 := { } // End of template mw_TP_GM_PCSCF_INVITE_04 + template (present) INVITE_Request mw_TP_GM_PCSCF_ECO_INVITE_04( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) modifies mw_TP_GM_PCSCF_ECO_INVITE_01 := { + msgHeader := { + accept := p_accept, + recvInfo := p_recvInfo, + pPreferredID := p_pPreferredID + } + } // End of template mw_TP_GM_PCSCF_ECO_INVITE_04 + + template (present) INVITE_Request mw_TP_GM_PCSCF_ECO_INVITE_05( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) modifies mw_TP_GM_PCSCF_ECO_INVITE_01 := { + msgHeader := { + accept := p_accept, + recvInfo := p_recvInfo, + pPreferredID := p_pPreferredID + } + } // End of template mw_TP_GM_PCSCF_ECO_INVITE_05 + template (present) INVITE_Request mw_TP_GM_PCSCF_RE_INVITE_01( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, template (present) From p_from := ?, @@ -407,6 +529,47 @@ module AtsImsIot_Templates_GM { ) modifies mw_TP_GM_PCSCF_INVITE_01 := { } // End of template mw_TP_GM_PCSCF_RE_INVITE_014 + template (present) INVITE_Request mw_TP_GM_PCSCF_NGC_INVITE_01( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) modifies mw_TP_GM_PCSCF_INVITE_01 := { + } // End of template mw_TP_GM_PCSCF_NGC_INVITE_01 + + template (present) INFO_Request mw_TP_GM_PCSCF_NGC_INFO_01( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) modifies mw_INFO_Dummy := { + requestLine := { + requestUri := p_invite_uri // @TODO + }, + msgHeader := { + accept := p_accept, + callId := p_callId, + contact := p_contact, + fromField := p_from, + pPreferredID := p_pPreferredID, + recvInfo := p_recvInfo, + toField := p_to + }, + messageBody := p_messageBody + } + + // End of template mw_TP_GM_PCSCF_NGC_INFO_01 + // End of template mw_TP_GM_PCSCF_NGC_INFO_01 + template (present) Response mw_TP_GM_PCSCF_100Trying_01( template (present) CSeq p_cSeq := ?, template (present) From p_from := ?, diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_IC.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_IC.ttcn index 4624eff87d242859548fb3da05c8adfacc9bd069..3d86c740821949fcbcb8cf9208f2bed61722602e 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Templates_IC.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_IC.ttcn @@ -6,46 +6,16 @@ module AtsImsIot_Templates_IC { - import from LibCommon_BasicTypesAndValues {type UInt16;} - import from LibCommon_VerdictControl {type FncRetCode;} - import from LibIot_TypesAndValues { - type - InterfaceInfoList, - ProtocolFilter, - GeneralConfigurationReq, - GeneralConfigurationRsp, - SetFilterReq, - SetFilterRsp, - StartTrafficCaptureReq, - StartTrafficCaptureRsp, - StopTrafficCaptureReq, - StopTrafficCaptureRsp, - IpAddress, - Status; - } - import from AtsImsIot_TypesAndValues {type SipMessage, NAPTRmessage;} + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_VerdictControl all; + import from LibIot_TypesAndValues all; + import from AtsImsIot_TypesAndValues all; import from LibSip_SIPTypesAndValues all; import from LibSip_Templates all; - import from LibSip_Common {type GenericParam, SemicolonParam_List;} - import from LibMsrp_TypesAndValues {type SEND_request, RECEIVE_response;} - import from LibIot_PIXITS { - modulepar - PX_IOT_TIMESTAMP_OFFSET, - PX_IOT_PCAP_SESSIONS_PATH, - PX_IOT_RECORD_MODE, - PX_IOT_EUTs_IFACE_INFO_LIST, - PX_IOT_FILE_MERGE_LIST, - PX_IOT_FILE_MERGE_PATH, - PX_IOT_MERGE_TOOL_PATH, - PX_IOT_IFACES; - } - import from AtsImsIot_PIXITS { - modulepar - PX_IMS_SUT_CONF_FACTORY_NAME, - PX_IMS_SUT_CONF_HOME_DOMAIN, - PX_IMS_A_ICID; - } - + import from LibSip_Common all; + import from LibMsrp_TypesAndValues all; + import from LibIot_PIXITS all; + import from AtsImsIot_PIXITS all; import from AtsImsIot_Templates all; group g_IBCF { diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_ISC.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_ISC.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..71b619f14c3d9fb18a155980f6cb8c6481ef1197 --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_ISC.ttcn @@ -0,0 +1,816 @@ +/* + * @author TTF 010 + * @version $Id$ + * @desc This module provides TP related templates used at MW interface + */ +module AtsImsIot_Templates_ISC { + + // LibCommon + //import from LibCommon_BasicTypesAndValues all; + //import from LibCommon_VerdictControl all; + + // libSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Templates all; + import from LibSip_Common all; + + // LibIms + import from LibIms_Templates all; + + //import from LibMsrp_TypesAndValues all; + + // LibIot + //import from LibIot_TypesAndValues all; + import from LibIot_PIXITS all; + + // AtsImsIot + //import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_PIXITS all; + import from AtsImsIot_Templates all; + + group sip_templates { + + template NameAddr mw_NameAddr_DispName_Tel( + template DisplayName p_displayName := *, + template(present) charstring p_number := ? + ) := { + displayName := p_displayName, + addrSpec := { + scheme := c_telScheme, //* contains "tel" + components := { + tel := { + subscriber := p_number + } + }, + urlParameters := *, + headers := * + } + } // End of template mw_NameAddr_DispName_Tel + + // template(present) From mw_From_AddrUnion_SipUrl( + // template DisplayName p_dn, + // template(present) charstring p_user := ?, + // template charstring p_host + // ) := { + // fieldName := FROM_E, + // addressField := mw_AddrUnion_SipUrl(p_user, p_host), + // fromParams := * + // } // End of template mw_From_AddrUnion_SipUrl + + // template(present) From mw_From_AddrUnion_TelUrl( + // template(present) charstring p_number := ? + // ) := { + // fieldName := FROM_E, + // addressField := mw_AddrUnion_TelUrl(p_number), + // fromParams := * + // } // End of template mw_From_AddrUnion_TelUrl + + // template From mw_From_NameAddr_TelUrl( + // template DisplayName p_displayName := *, + // template(present) charstring p_number := ? + // ) := { + // fieldName := FROM_E, + // addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, + // fromParams := * + // } // End of template mw_From_NameAddr_TelUrl + + // template(present) To mw_To_AddrUnion_SipUrl( + // template DisplayName p_dn, + // template(present) charstring p_user := ?, + // template charstring p_host + // ) := { + // fieldName := TO_E, + // addressField := mw_AddrUnion_SipUrl(p_user, p_host), + // toParams := * + // } // End of template mw_To_AddrUnion_SipUrl + + // template(present) To mw_To_AddrUnion_TelUrl( + // template(present) charstring p_number := ? + // ) := { + // fieldName := TO_E, + // addressField := mw_AddrUnion_TelUrl(p_number), + // toParams := * + // } // End of template mw_To_AddrUnion_TelUrl + + // template To mw_To_NameAddr_TelUrl( + // template DisplayName p_displayName := *, + // template(present) charstring p_number := ? + // ) := { + // fieldName := TO_E, + // addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, + // toParams := * + // } // End of template mw_To_NameAddr_TelUrl + + // template (present) Contact mw_contact( + // template (present) ContactAddress p_contactAddresses := ? + // ) := { + // fieldName := CONTACT_E, + // contactBody := { contactAddresses := { p_contactAddresses } } + // } // End of template mw_Contact + + // template (present) Response mw_200OK( + // template (present) CSeq p_cSeq := ?, + // template (present) CallId p_callId := ?, + // template (present) From p_from := ?, + // template (present) To p_to := ? + // ) modifies mw_200OK_Base := { + // msgHeader := { + // callId := p_callId, + // cSeq := p_cSeq, + // fromField := p_from, + // toField := p_to + // } + // } // End of template mw_200OK + + // template (present) Response mw_401Unauthorized( + // template (present) CSeq p_cSeq := ?, + // template (present) WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_401Unauthorized_Base := { + // msgHeader := { + // cSeq := p_cSeq, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_401Unauthorized + + // template (present) Response mw_404NotFound( + // template (present) CSeq p_cSeq := ?, + // template (present) WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_404NotFound_Base := { + // msgHeader := { + // cSeq := p_cSeq, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_404NotFound + + // template Response mw_480TemporaryUnavailable( + // template (present) CallId p_callId := ?, + // template (present) CSeq p_cSeq := ?, + // template WwwAuthenticate p_wwwAuthenticate := * + // ) modifies mw_480TemporaryUnavailable_Base := { + // msgHeader := { + // cSeq := p_cSeq, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_480TemporaryUnavailable + + // template (present) Response mw_486Busy( + // template (present) CallId p_callId := ?, + // template (present) CSeq p_cSeq := ?, + // template (present) From p_from := ?, + // template (present) To p_to := ?, + // template WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_486Busy_Base := { + // msgHeader := { + // callId := p_callId, + // cSeq := p_cSeq, + // fromField := p_from, + // toField := p_to, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_486Busy + + // template (present) Response mw_600BusyEverywhere( + // template (present) CallId p_callId := ?, + // template (present) CSeq p_cSeq := ?, + // template (present) From p_from := ?, + // template (present) To p_to := ?, + // template WwwAuthenticate p_wwwAuthenticate := ? + // ) modifies mw_600BusyEverywhere_Base := { + // msgHeader := { + // callId := p_callId, + // cSeq := p_cSeq, + // fromField := p_from, + // toField := p_to, + // wwwAuthenticate := p_wwwAuthenticate + // } + // } // End of template mw_600BusyEverywhere + + } // End of group sip_templates + + group g_gmA { + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_REGISTER_01( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := * + ) modifies mw_REGISTER_authorizedRequest_wo_securityheaders_IMS := { + msgHeader := { + fromField := p_from, + toField := p_to, + authorization := ?, + pChargingVector := p_pChargingVector, + pVisitedNetworkID := p_pVisitedNetworkID + //require := mw_require_path + } + } // End of template mw_TP_ISC_SCSCF_REGISTER_01 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_ECO_REGISTER_01( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_ISC_SCSCF_REGISTER_01 := { + msgHeader := { + contact := p_contact, + path := p_path, + warning := p_warning + } + } // End of template mw_TP_ISC_SCSCF_ECO_REGISTER_01 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_REGISTER_02( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := * + ) modifies mw_TP_ISC_SCSCF_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_REGISTER_02 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_ECO_REGISTER_02( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_ISC_SCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_REGISTER_02 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_REGISTER_03( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := * + ) modifies mw_TP_ISC_SCSCF_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_REGISTER_03 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_ECO_REGISTER_03( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_ISC_SCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_ECO_REGISTER_03 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_REGISTER_04( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := * + ) modifies mw_TP_ISC_SCSCF_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_REGISTER_04 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_ECO_REGISTER_04( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_ISC_SCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_ECO_REGISTER_04 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_REGISTER_05( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := * + ) modifies mw_TP_ISC_SCSCF_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_REGISTER_04 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_ECO_REGISTER_05( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template Path p_path := ?, + template Warning p_warning := ? + ) modifies mw_TP_ISC_SCSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_ISC_SCSCF_ECO_REGISTER_05 + + template(present) REGISTER_Request mw_TP_ISC_SCSCF_REGISTER_07( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) charstring p_expires := "0" + ) modifies mw_TP_ISC_SCSCF_REGISTER_01 := { + msgHeader := { + expires := mw_Expires(p_expires) + } + } // End of template mw_TP_ISC_SCSCF_REGISTER_07 + + template (present) SUBSCRIBE_Request mw_TP_ISC_SCSCF_SUBSCRIBE_01( + template (present) SipUrl p_subscribe_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_SUBSCRIBE_Request_Base := { + requestLine := { + method := SUBSCRIBE_E, + requestUri := p_subscribe_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + fromField := p_from, + toField := p_to, + event := m_Event_reg, + expires := ?, // checked outside the template + //pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(-)), // FIXME Set expected value + //pChargingVector := mw_PChargingVector({ + // {id := "icid-value", paramValue := *}, + // * + // }), + route := ? + } + } // End of template mw_TP_ISC_SCSCF_SUBSCRIBE_01 + + template (present) SUBSCRIBE_Request mw_TP_ISC_SCSCF_SUBSCRIBE_02( + template (present) SipUrl p_subscribe_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_SUBSCRIBE_01 := { + } // End of template mw_TP_ISC_SCSCF_SUBSCRIBE_02 + + template (present) NOTIFY_Request mw_TP_ISC_SCSCF_NOTIFY_01( + template (present) CallId p_callId := ?, + template (present) SipUrl p_notify_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_NOTIFY_Request_Base := { + requestLine := { + method := NOTIFY_E, + requestUri := p_notify_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + fromField := p_from, + toField := p_to, + event := m_Event_reg + //pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(-)), // FIXME Set expected value + //pChargingVector := mw_PChargingVector({ + // {id := "icid-value", paramValue := *}, + // * + // }), + } + } // End of template mw_TP_ISC_SCSCF_NOTIFY_01 + + template (present) PRACK_Request mw_TP_ISC_SCSCF_PRACK_01( + template (present) CallId p_callId := ?, + template (present) SipUrl p_notify_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_PRACK_Request_Base := { + requestLine := { + method := PRACK_E, + requestUri := p_notify_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + fromField := p_from, + toField := p_to, + // TODO Check if it is required for PRACK event := m_Event_reg, + //pAssertedID := mw_PAssertedID(mw_PAssertedIDValue(-)), // FIXME Set expected value + //pChargingVector := mw_PChargingVector({ + // {id := "icid-value", paramValue := *}, + // * + // }), + route := ? + } + } // End of template mw_TP_ISC_SCSCF_PRACK_01 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_INVITE_01( + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_INVITE_Request_Base := { + requestLine := { + method := INVITE_E, + requestUri := p_invite_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_ISC_SCSCF_INVITE_01 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_ECO_INVITE_01( + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + msgHeader := { + contact := p_contact + }, + messageBody := p_messageBody + } // End of template mw_TP_ISC_SCSCF_ECO_INVITE_01 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_INVITE_02 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_ECO_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_ISC_SCSCF_ECO_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_ECO_INVITE_02 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_INVITE_03( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_INVITE_03 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_ECO_INVITE_03( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_ISC_SCSCF_ECO_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_ECO_INVITE_03 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_INVITE_04( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_INVITE_04 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_ECO_INVITE_04( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) modifies mw_TP_ISC_SCSCF_ECO_INVITE_01 := { + msgHeader := { + accept := p_accept, + recvInfo := p_recvInfo, + pPreferredID := p_pPreferredID + } + } // End of template mw_TP_ISC_SCSCF_ECO_INVITE_04 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_ECO_INVITE_05( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) modifies mw_TP_ISC_SCSCF_ECO_INVITE_01 := { + msgHeader := { + accept := p_accept, + recvInfo := p_recvInfo, + pPreferredID := p_pPreferredID + } + } // End of template mw_TP_ISC_SCSCF_ECO_INVITE_05 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_RE_INVITE_01( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_RE_INVITE_01 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_RE_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_RE_INVITE_02 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_RE_INVITE_03( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_RE_INVITE_03 + + template (present) INVITE_Request mw_TP_ISC_SCSCF_RE_INVITE_04( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_INVITE_01 := { + } // End of template mw_TP_ISC_SCSCF_RE_INVITE_014 + + template (present) Response mw_TP_ISC_SCSCF_100Trying_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_100Trying_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_ISC_SCSCF_100Trying_01 + + template (present) Response mw_TP_ISC_SCSCF_100Trying_02( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_100Trying_01 := { + } // End of template mw_TP_ISC_SCSCF_100Trying_02 + + template (present) Response mw_TP_ISC_SCSCF_100Trying_03( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_100Trying_01 := { + } // End of template mw_TP_ISC_SCSCF_100Trying_03 + + template (present) Response mw_TP_ISC_SCSCF_100Trying_04( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_100Trying_01 := { + } // End of template mw_TP_ISC_SCSCF_100Trying_04 + + template (present) Response mw_TP_ISC_SCSCF_180Ringing_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_180Ringing_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_ISC_SCSCF_180Ringing_01 + + template (present) Response mw_TP_ISC_SCSCF_180Ringing_02( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_180Ringing_01 := { + } // End of template mw_TP_ISC_SCSCF_180Ringing_02 + + template (present) Response mw_TP_ISC_SCSCF_180Ringing_03( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_180Ringing_01 := { + } // End of template mw_TP_ISC_SCSCF_180Ringing_03 + + template (present) Response mw_TP_ISC_SCSCF_180Ringing_04( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_180Ringing_01 := { + } // End of template mw_TP_ISC_SCSCF_180Ringing_04 + + template (present) Response mw_TP_ISC_SCSCF_183SessionProgress_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_ISC_SCSCF_183SessionProgress_01 + + template (present) Response mw_TP_ISC_SCSCF_183SessionProgress_02( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_183SessionProgress_01 := { + } // End of template mw_TP_ISC_SCSCF_183SessionProgress_02 + + template (present) Response mw_TP_ISC_SCSCF_183SessionProgress_03( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_183SessionProgress_01 := { + } // End of template mw_TP_ISC_SCSCF_183SessionProgress_03 + + template (present) Response mw_TP_ISC_SCSCF_183SessionProgress_04( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_183SessionProgress_01 := { + } // End of template mw_TP_ISC_SCSCF_183SessionProgress_04 + + template (present) ACK_Request mw_TP_ISC_SCSCF_ACK_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_ACK_Request_Base := { + requestLine := { + method := ACK_E, + requestUri := p_ack_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + cSeq := p_cSeq, + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_ISC_SCSCF_ACK_01 + + template (present) ACK_Request mw_TP_ISC_SCSCF_ACK_02( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_ACK_01 := { + } // End of template mw_TP_ISC_SCSCF_ACK_02 + + template (present) ACK_Request mw_TP_ISC_SCSCF_ACK_03( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_ACK_01 := { + } // End of template mw_TP_ISC_SCSCF_ACK_03 + + template (present) ACK_Request mw_TP_ISC_SCSCF_ACK_04( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_ACK_01 := { + } // End of template mw_TP_ISC_SCSCF_ACK_04 + + template (present) BYE_Request mw_TP_ISC_SCSCF_BYE_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_BYE_Request_Base := { + requestLine := { + method := BYE_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + cSeq := p_cSeq, + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_ISC_SCSCF_BYE_01 + + template (present) BYE_Request mw_TP_ISC_SCSCF_BYE_02( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_BYE_01 := { + } // End of template mw_TP_ISC_SCSCF_BYE_02 + + template (present) BYE_Request mw_TP_ISC_SCSCF_BYE_03( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_BYE_01 := { + } // End of template mw_TP_ISC_SCSCF_BYE_03 + + template (present) BYE_Request mw_TP_ISC_SCSCF_BYE_04( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_BYE_01 := { + } // End of template mw_TP_ISC_SCSCF_BYE_04 + + template (present) BYE_Request mw_TP_ISC_SCSCF_BYE_05( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_BYE_01 := { + } // End of template mw_TP_ISC_SCSCF_BYE_05 + + template (present) BYE_Request mw_TP_ISC_SCSCF_BYE_06( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_BYE_01 := { + } // End of template mw_TP_ISC_SCSCF_BYE_06 + + template (present) CANCEL_Request mw_TP_ISC_SCSCF_CANCEL_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_cancel_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_CANCEL_Request_Base := { + requestLine := { + method := CANCEL_E, + requestUri := p_cancel_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + cSeq := p_cSeq, + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_ISC_SCSCF_CANCEL_01 + + template (present) CANCEL_Request mw_TP_ISC_SCSCF_CANCEL_02( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_cancel_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_CANCEL_01 := { + } // End of template mw_TP_ISC_SCSCF_CANCEL_02 + + template (present) CANCEL_Request mw_TP_ISC_SCSCF_CANCEL_03( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_cancel_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_CANCEL_01 := { + } // End of template mw_TP_ISC_SCSCF_CANCEL_03 + + template (present) CANCEL_Request mw_TP_ISC_SCSCF_CANCEL_04( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_cancel_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_ISC_SCSCF_CANCEL_01 := { + } // End of template mw_TP_ISC_SCSCF_CANCEL_04 + + } // End of group g_gmA + +} // End of module AtsImsIot_Templates_GM \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_MI.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_MI.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..b80c9695f34da23290f0f3855a48bc2e772a37bb --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_MI.ttcn @@ -0,0 +1,245 @@ +/* + * @author STF 574 + * @version $Id$ + * @desc This module provides TP related templates used at MI interface + */ +module AtsImsIot_Templates_MI { + + // LibCommon + //import from LibCommon_BasicTypesAndValues all; + //import from LibCommon_VerdictControl all; + + // libSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Templates all; + import from LibSip_Common all; + + // LibIms + import from LibIms_Templates all; + + //import from LibMsrp_TypesAndValues all; + + // LibIot + //import from LibIot_TypesAndValues all; + import from LibIot_PIXITS all; + + // AtsImsIot + //import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_PIXITS all; + import from AtsImsIot_Templates all; + + /** + * @desc INVITE Request checking TP_MI_ECSCF_INVITE_01 + */ + template(present) INVITE_Request mw_TP_MI_ECSCF_INVITE_01 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?) + modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + complement(mw_routeBody(p_invite_uri)), + * + } + } ifpresent, + recordRoute := { + fieldName := RECORD_ROUTE_E, + routeBody := {mw_routeBody(p_invite_uri), *} + }, + pChargingVector := { + fieldName := P_CHARGING_VECTOR_E, + chargeParams := { + *, +// {id := "icid-value", paramValue := ?}, + *, + {id := "orig-ioi", paramValue := ?}, + *, +// complement({id := "term-ioi", paramValue := ?}), + *, + complement({id := "access-network-charging-info", paramValue := ?}), + * + } + }, + pAccessNetworkInfo := omit + } + } + + template(present) INVITE_Request mw_TP_MI_ECSCF_INVITE_02 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?) + modifies mw_TP_MI_ECSCF_INVITE_01 := { + } + + template(present) INVITE_Request mw_TP_MI_ECSCF_INVITE_03 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?) + modifies mw_TP_MI_ECSCF_INVITE_01 := { + msgHeader := { + recordRoute := { + fieldName := RECORD_ROUTE_E, + routeBody := {mw_routeBody(p_invite_uri), *} + } + } + } + + template (present) Response mw_TP_MI_ECSCF_100Trying_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_100Trying_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MI_ECSCF_100Trying_01 + + template (present) Response mw_TP_MI_ECSCF_180Ringing_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_180Ringing_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MI_ECSCF_180Ringing_01 + + template (present) Response mw_TP_MI_ECSCF_183SessionProgress_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MI_ECSCF_183SessionProgress_01 + + template (present) ACK_Request mw_TP_MI_ECSCF_ACK_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_ACK_Request_Base := { + requestLine := { + method := ACK_E, + requestUri := p_ack_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MI_ECSCF_ACK_01 + + template (present) BYE_Request mw_TP_MI_ECSCF_BYE_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_BYE_Request_Base := { + requestLine := { + method := BYE_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_PCSCF_BYE_01 + + template(present) INFO_Request mw_TP_MI_ECSCF_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + )modifies mw_INFO_Dummy := { + + requestLine := { + requestUri := p_invite_uri // @TODO + }, + msgHeader := { + callId := p_callId, + contact := p_contact, + fromField := p_from, + pAssertedID := p_pAssertedID, + toField := p_to + }, + messageBody := p_messageBody + } + + template(present) INFO_Request mw_TP_MI_ECSCF_NGC_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) + modifies mw_TP_MI_ECSCF_INFO_01 := { + } + + template (present) CANCEL_Request mw_TP_MI_ECSCF_CANCEL_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_CANCEL_Request_Base := { + requestLine := { + method := CANCEL_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MI_ECSCF_CANCEL_01 + +} // End of module AtsImsIot_Templates_MI diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_ML.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_ML.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..073ab4aaebbc8e28f8614bfd66b0fa4d730b54fe --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_ML.ttcn @@ -0,0 +1,83 @@ +/* + * @author STF 574 + * @version $Id$ + * @desc This module provides TP related templates used at ML interface + */ +module AtsImsIot_Templates_ML { + + // LibCommon + //import from LibCommon_BasicTypesAndValues all; + //import from LibCommon_VerdictControl all; + + // libSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Common all; + + // LibIms + import from LibIms_Templates all; + + //import from LibMsrp_TypesAndValues all; + + // LibIot + //import from LibIot_TypesAndValues all; + import from LibIot_PIXITS all; + + // AtsImsIot + //import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_PIXITS all; + import from AtsImsIot_Templates all; + + /** + * @desc INVITE Request checking TP_ML_PSAP_INVITE_01 + */ + template(present) INVITE_Request mw_TP_ML_ECSCF_INVITE_01 (template (present) SipUrl p_IBCF_SIP_URI := ?, + template (present) From p_from := ?, + template (present) To p_to := ?) + modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + toField := p_to, + route := ({ + fieldName := ROUTE_E, + routeBody := { + *, + complement(mw_routeBody(p_IBCF_SIP_URI)), + * + } + }, omit), + recordRoute := { + fieldName := RECORD_ROUTE_E, + routeBody := {mw_routeBody(p_IBCF_SIP_URI), *} + }, + pChargingVector := { + fieldName := P_CHARGING_VECTOR_E, + chargeParams := { + *, +// {id := "icid-value", paramValue := ?}, + *, + {id := "orig-ioi", paramValue := ?}, + *, +// complement({id := "term-ioi", paramValue := ?}), + *, + complement({id := "access-network-charging-info", paramValue := ?}), + * + } + }, + pAccessNetworkInfo := omit + } + } + + template (present) Response mw_TP_ML_ECSCF_3XX_Base_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mdw_3XX_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_ML_ECSCF_3XX_Base_01 + +} // End of module AtsImsIot_Templates_ML diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_MM.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_MM.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..8f9a17b9d0f0aa7011254bde46196bbe897beb4e --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_MM.ttcn @@ -0,0 +1,271 @@ +/* + * @author STF 574 + * @version $Id$ + * @desc This module provides TP related templates used at MM interface + */ +module AtsImsIot_Templates_MM { + + // LibCommon + //import from LibCommon_BasicTypesAndValues all; + //import from LibCommon_VerdictControl all; + + // libSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Templates all; + import from LibSip_Common all; + + // LibIms + import from LibIms_Templates all; + + //import from LibMsrp_TypesAndValues all; + + // LibIot + //import from LibIot_TypesAndValues all; + import from LibIot_PIXITS all; + + // AtsImsIot + //import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_PIXITS all; + import from AtsImsIot_Templates all; + + /** + * @desc INVITE Request checking TP_MM_ECSCF_INVITE_01 + */ + template(present) INVITE_Request mw_TP_MM_ECSCF_INVITE_01 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + toField := p_to, + route := ({ + fieldName := ROUTE_E, + routeBody := { + *, + complement(mw_routeBody(p_invite_uri)), + * + } + }, omit), + recordRoute := { + fieldName := RECORD_ROUTE_E, + routeBody := {mw_routeBody(p_invite_uri), *} + }, + contact := p_contact, + pAssertedID := p_pAssertedID + }, + messageBody := p_messageBody + } + + template(present) INVITE_Request mw_TP_MM_ECSCF_INVITE_02 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_TP_MM_ECSCF_INVITE_01 := { + msgHeader := { + pChargingFunctionAddresses := omit + } + } + + template(present) INVITE_Request mw_TP_MM_ECSCF_INVITE_03 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_TP_MM_ECSCF_INVITE_02 := { + } + + template(present) INVITE_Request mw_TP_MM_ECSCF_NGC_INVITE_01 ( + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) + modifies mw_TP_MM_ECSCF_INVITE_02 := { + } + + + template(present) INFO_Request mw_TP_MM_ECSCF_NGC_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) + modifies mw_TP_MM_ECSCF_INFO_01 := { + } + + template (present) Response mw_TP_MM_ECSCF_100Trying_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_100Trying_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MM_ECSCF_100Trying_01 + + template (present) Response mw_TP_MM_ECSCF_180Ringing_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_180Ringing_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MM_ECSCF_180Ringing_01 + + template (present) Response mw_TP_MM_ECSCF_183SessionProgress_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MM_ECSCF_183SessionProgress_01 + + template (present) ACK_Request mw_TP_MM_ECSCF_ACK_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_ACK_Request_Base := { + requestLine := { + method := ACK_E, + requestUri := p_ack_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MM_ECSCF_ACK_01 + + template (present) BYE_Request mw_TP_MM_ECSCF_BYE_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_BYE_Request_Base := { + requestLine := { + method := BYE_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MM_ECSCF_BYE_01 + + template (present) BYE_Request mw_TP_MM_ECSCF_BYE_02( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MM_ECSCF_BYE_01 := { + msgHeader := { + route := * + } + } // End of template mw_TP_MM_ECSCF_BYE_02 + + template (present) CANCEL_Request mw_TP_MM_ECSCF_CANCEL_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_CANCEL_Request_Base := { + requestLine := { + method := CANCEL_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MM_ECSCF_CANCEL_01 + + + template(present) INFO_Request mw_TP_MM_ECSCF_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + )modifies mw_INFO_Dummy := { + + requestLine := { + requestUri := p_invite_uri // @TODO + }, + msgHeader := { + callId := p_callId, + contact := p_contact, + fromField := p_from, + pAssertedID := p_pAssertedID, + toField := p_to + }, + messageBody := p_messageBody + } + + +} // End of module AtsImsIot_Templates_MM diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn index 4d82cc0f3b7e301dfd2aed15b89766799e34931a..9369014d7fa97e6a7998a7eb12fc32fd658e451c 100644 --- a/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn @@ -11,6 +11,7 @@ module AtsImsIot_Templates_MW { // libSip import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; import from LibSip_Templates all; import from LibSip_Common all; @@ -28,181 +29,6 @@ module AtsImsIot_Templates_MW { import from AtsImsIot_PIXITS all; import from AtsImsIot_Templates all; - group sip_templates { - - template NameAddr mw_NameAddr_DispName_Tel( - template DisplayName p_displayName := *, - template(present) charstring p_number := ? - ) := { - displayName := p_displayName, - addrSpec := { - scheme := c_telScheme, //* contains "tel" - components := { - tel := { - subscriber := p_number - } - }, - urlParameters := *, - headers := * - } - } // End of template mw_NameAddr_DispName_Tel - - template(present) From mw_From_AddrUnion_SipUrl( - template DisplayName p_dn, - template(present) charstring p_user := ?, - template charstring p_host - ) := { - fieldName := FROM_E, - addressField := mw_AddrUnion_SipUrl(p_user, p_host), - fromParams := * - } // End of template mw_From_AddrUnion_SipUrl - - template(present) From mw_From_AddrUnion_TelUrl( - template(present) charstring p_number := ? - ) := { - fieldName := FROM_E, - addressField := mw_AddrUnion_TelUrl(p_number), - fromParams := * - } // End of template mw_From_AddrUnion_TelUrl - - template From mw_From_NameAddr_TelUrl( - template DisplayName p_displayName := *, - template(present) charstring p_number := ? - ) := { - fieldName := FROM_E, - addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, - fromParams := * - } // End of template mw_From_NameAddr_TelUrl - - template(present) To mw_To_AddrUnion_SipUrl( - template DisplayName p_dn, - template(present) charstring p_user := ?, - template charstring p_host - ) := { - fieldName := TO_E, - addressField := mw_AddrUnion_SipUrl(p_user, p_host), - toParams := * - } // End of template mw_To_AddrUnion_SipUrl - - template(present) To mw_To_AddrUnion_TelUrl( - template(present) charstring p_number := ? - ) := { - fieldName := TO_E, - addressField := mw_AddrUnion_TelUrl(p_number), - toParams := * - } // End of template mw_To_AddrUnion_TelUrl - - template To mw_To_NameAddr_TelUrl( - template DisplayName p_displayName := *, - template(present) charstring p_number := ? - ) := { - fieldName := TO_E, - addressField := { nameAddr := mw_NameAddr_DispName_Tel(p_displayName, p_number) }, - toParams := * - } // End of template mw_To_NameAddr_TelUrl - - template (present) Contact mw_contact( - template (present) ContactAddress p_contactAddresses := ? - ) := { - fieldName := CONTACT_E, - contactBody := { contactAddresses := { p_contactAddresses } } - } // End of template mw_Contact - - template (present) Response mw_200OK( - template (present) CSeq p_cSeq := ?, - template (present) CallId p_callId := ?, - template (present) From p_from := ?, - template (present) To p_to := ? - ) modifies mw_200OK_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to - } - } // End of template mw_200OK - - template Response mw_401Unauthorized( - template (present) CSeq p_cSeq := ?, - template (present) WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_401Unauthorized_Base := { - msgHeader := { - cSeq := p_cSeq, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_401Unauthorized - - template Response mw_404NotFound( - template (present) CSeq p_cSeq := ?, - template (present) WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_404NotFound_Base := { - msgHeader := { - cSeq := p_cSeq, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_404NotFound - - template Response mw_480TemporaryUnavailable( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template WwwAuthenticate p_wwwAuthenticate := * - ) modifies mw_480TemporaryUnavailable_Base := { - msgHeader := { - cSeq := p_cSeq, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_480TemporaryUnavailable - - template (present) Response mw_486Busy( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ?, - template WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_486Busy_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_486Busy - - template (present) Response mw_600BusyEverywhere( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ?, - template WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_600BusyEverywhere_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_600BusyEverywhere - - template (present) Response mw_487RequestTerminated( - template (present) CallId p_callId := ?, - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ?, - template WwwAuthenticate p_wwwAuthenticate := ? - ) modifies mw_487RequestTerminated_Base := { - msgHeader := { - callId := p_callId, - cSeq := p_cSeq, - fromField := p_from, - toField := p_to, - wwwAuthenticate := p_wwwAuthenticate - } - } // End of template mw_487RequestTerminated - - } // End of group sip_templates - group g_pcscf { template(present) REGISTER_Request mw_TP_MW_PCSCF_REGISTER_01( @@ -223,6 +49,25 @@ module AtsImsIot_Templates_MW { } } // End of template mw_TP_MW_PCSCF_REGISTER_01 + template(present) REGISTER_Request mw_TP_MW_PCSCF_ECO_REGISTER_01( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template (present) Path p_path := ?, + template (present) Warning p_warning := ?, + template (present) PAccessNetworkInfo p_pAccessNetworkInfo := ? + ) modifies mw_REGISTER_authorizedRequest_wo_securityheaders_IMS := { + msgHeader := { + contact := p_contact, + path := p_path, + warning := p_warning, + pAccessNetworkInfo := p_pAccessNetworkInfo + } + } // End of template mw_TP_MW_PCSCF_ECO_REGISTER_01 + template(present) REGISTER_Request mw_TP_MW_PCSCF_REGISTER_02( template (present) From p_from := ?, template (present) To p_to := ?, @@ -232,6 +77,23 @@ module AtsImsIot_Templates_MW { ) modifies mw_TP_MW_PCSCF_REGISTER_01 := { } // End of template mw_TP_MW_PCSCF_REGISTER_02 + template(present) REGISTER_Request mw_TP_MW_PCSCF_ECO_REGISTER_02( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template PChargingVector p_pChargingVector := *, + template PVisitedNetworkID p_pVisitedNetworkID := *, + template (present) Contact p_contact := ?, + template (present) Path p_path := ?, + template (present) Warning p_warning := ?, + template (present) PAccessNetworkInfo p_pAccessNetworkInfo := ?, + template (present) ServiceRoute p_serviceRoute := ? + ) modifies mw_TP_MW_PCSCF_ECO_REGISTER_01 := { + msgHeader := { + serviceRoute := p_serviceRoute + } + } // End of template mw_TP_MW_PCSCF_ECO_REGISTER_02 + template(present) REGISTER_Request mw_TP_MW_PCSCF_REGISTER_04( template (present) From p_from := ?, template (present) To p_to := ?, @@ -390,12 +252,38 @@ module AtsImsIot_Templates_MW { } } // End of template mw_TP_MW_PCSCF_INVITE_01 + template (present) INVITE_Request mw_TP_MW_PCSCF_ECO_INVITE_01( + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ? + ) modifies mw_TP_MW_PCSCF_INVITE_01 := { + msgHeader := { + contact := p_contact + }, + messageBody := p_messageBody + } + template (present) INVITE_Request mw_TP_MW_PCSCF_INVITE_02( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, template (present) From p_from := ?, template (present) To p_to := ? ) modifies mw_TP_MW_PCSCF_INVITE_01 := { - } // End of template mw_TP_MW_PCSCF_INVITE_03 + } // End of template mw_TP_MW_PCSCF_INVITE_02 + + template (present) INVITE_Request mw_TP_MW_PCSCF_ECO_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) modifies mw_TP_MW_PCSCF_ECO_INVITE_01 := { + msgHeader := { + pAssertedID := p_pAssertedID + } + } // End of template mw_TP_MW_PCSCF_ECO_INVITE_02 template (present) INVITE_Request mw_TP_MW_PCSCF_INVITE_03( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, @@ -404,6 +292,16 @@ module AtsImsIot_Templates_MW { ) modifies mw_TP_MW_PCSCF_INVITE_01 := { } // End of template mw_TP_MW_PCSCF_INVITE_03 + template (present) INVITE_Request mw_TP_MW_PCSCF_ECO_INVITE_03( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) modifies mw_TP_MW_PCSCF_ECO_INVITE_02 := { + } // End of template mw_TP_MW_PCSCF_ECO_INVITE_03 + template (present) INVITE_Request mw_TP_MW_PCSCF_INVITE_04( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, template (present) From p_from := ?, @@ -411,6 +309,29 @@ module AtsImsIot_Templates_MW { ) modifies mw_TP_MW_PCSCF_INVITE_01 := { } // End of template mw_TP_MW_PCSCF_INVITE_04 + template (present) INVITE_Request mw_TP_MW_PCSCF_ECO_INVITE_04( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) modifies mw_TP_MW_PCSCF_ECO_INVITE_02 := { + } // End of template mw_TP_MW_PCSCF_ECO_INVITE_04 + + template (present) INVITE_Request mw_TP_MW_PCSCF_ECO_INVITE_05( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ? + ) modifies mw_TP_MW_PCSCF_ECO_INVITE_01 := { + msgHeader := { + pPreferredID := p_pPreferredID + } + } // End of template mw_TP_MW_PCSCF_ECO_INVITE_04 + template (present) INVITE_Request mw_TP_MW_PCSCF_RE_INVITE_01( // TODO To be enforced template (present) SipUrl p_invite_uri := ?, template (present) From p_from := ?, @@ -506,10 +427,10 @@ module AtsImsIot_Templates_MW { } // End of template mw_TP_MW_PCSCF_180Ringing_04 template (present) Response mw_TP_MW_PCSCF_183SessionProgress_01( - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ? - ) modifies mw_183SessionProgress_Base := { + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { msgHeader := { cSeq := p_cSeq, fromField := p_from, @@ -518,24 +439,24 @@ module AtsImsIot_Templates_MW { } // End of template mw_TP_MW_PCSCF_183SessionProgress_01 template (present) Response mw_TP_MW_PCSCF_183SessionProgress_02( - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ? - ) modifies mw_TP_MW_PCSCF_183SessionProgress_01 := { + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_PCSCF_183SessionProgress_01 := { } // End of template mw_TP_MW_PCSCF_183SessionProgress_02 template (present) Response mw_TP_MW_PCSCF_183SessionProgress_03( - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ? - ) modifies mw_TP_MW_PCSCF_183SessionProgress_01 := { + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_PCSCF_183SessionProgress_01 := { } // End of template mw_TP_MW_PCSCF_183SessionProgress_03 template (present) Response mw_TP_MW_PCSCF_183SessionProgress_04( - template (present) CSeq p_cSeq := ?, - template (present) From p_from := ?, - template (present) To p_to := ? - ) modifies mw_TP_MW_PCSCF_183SessionProgress_01 := { + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_PCSCF_183SessionProgress_01 := { } // End of template mw_TP_MW_PCSCF_183SessionProgress_04 template (present) ACK_Request mw_TP_MW_PCSCF_ACK_01( // TODO To be enforced @@ -789,6 +710,20 @@ module AtsImsIot_Templates_MW { } } // End of template mw_TP_MW_ICSCF_REGISTER_01 + template(present) REGISTER_Request mw_TP_MW_ICSCF_ECO_REGISTER_01( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template (present) Path p_Path := ?, + template (present) PChargingVector p_pChargingVector := ?, + template (present) PVisitedNetworkID p_pVisitedNetworkID := ?, + template (present) Contact p_contact := ? + ) modifies mw_TP_MW_ICSCF_REGISTER_01 := { + msgHeader := { + contact := p_contact + } + } // End of template mw_TP_MW_ICSCF_ECO_REGISTER_01 + template(present) REGISTER_Request mw_TP_MW_ICSCF_REGISTER_02( template (present) From p_from := ?, template (present) To p_to := ?, @@ -829,7 +764,18 @@ module AtsImsIot_Templates_MW { } } // End of template mw_TP_MW_ICSCF_REGISTER_03 - template(present) REGISTER_Request mw_TP_MW_ICSCF_REGISTER_04( + template(present) REGISTER_Request mw_TP_MW_ICSCF_ECO_REGISTER_03( + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Authorization p_authorization := ?, + template (present) Path p_Path := ?, + template (present) PChargingVector p_pChargingVector := ?, + template (present) PVisitedNetworkID p_pVisitedNetworkID := ?, + template (present) Contact p_contact := ? + ) modifies mw_TP_MW_ICSCF_ECO_REGISTER_01 := { + } // End of template mw_TP_MW_ICSCF_ECO_REGISTER_03 + + template(present) REGISTER_Request mw_TP_MW_ICSCF_REGISTER_04( template (present) From p_from := ?, template (present) To p_to := ?, template (present) Authorization p_authorization := ?, @@ -891,4 +837,396 @@ module AtsImsIot_Templates_MW { } // End of group g_icscf + group g_ecscf { + + template (present) INVITE_Request mw_TP_MW_ECSCF_INVITE_01( + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_INVITE_Request_Base := { + requestLine := { + method := INVITE_E, + requestUri := p_invite_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_ECSCF_INVITE_01 + + template (present) INVITE_Request mw_TP_MW_ECSCF_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_INVITE_01 := { + } // End of template mw_TP_MW_ECSCF_INVITE_02 + + + template (present) INVITE_Request mw_TP_MW_ECSCF_RE_INVITE_01( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_INVITE_01 := { + } // End of template mw_TP_MW_ECSCF_RE_INVITE_01 + + template (present) INVITE_Request mw_TP_MW_ECSCF_RE_INVITE_02( // TODO To be enforced + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_INVITE_01 := { + } // End of template mw_TP_MW_ECSCF_RE_INVITE_02 + + template(present) INVITE_Request mw_TP_MW_PCSCF_NGC_INVITE_01 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) + modifies mw_TP_MW_ECSCF_INVITE_02 := { + } + + template(present) INFO_Request mw_TP_MW_PCSCF_NGC_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) + modifies mw_INFO_Dummy := { + requestLine := { + requestUri := p_invite_uri // @TODO + }, + msgHeader := { + accept := p_accept, + callId := p_callId, + contact := p_contact, + fromField := p_from, + pPreferredID := p_pPreferredID, + recvInfo := p_recvInfo, + toField := p_to + }, + messageBody := p_messageBody + } + + template (present) Response mw_TP_MW_ECSCF_100Trying_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_100Trying_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_ECSCF_100Trying_01 + + template (present) Response mw_TP_MW_ECSCF_100Trying_02( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_100Trying_01 := { + } // End of template mw_TP_MW_ECSCF_100Trying_02 + + template (present) Response mw_TP_MW_ECSCF_180Ringing_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_180Ringing_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_ECSCF_180Ringing_01 + + template (present) Response mw_TP_MW_ECSCF_180Ringing_02( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_180Ringing_01 := { + } // End of template mw_TP_MW_ECSCF_180Ringing_02 + + template (present) Response mw_TP_MW_ECSCF_183SessionProgress_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_ECSCF_183SessionProgress_01 + + template (present) Response mw_TP_MW_ECSCF_183SessionProgress_02( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_183SessionProgress_01 := { + } // End of template mw_TP_MW_ECSCF_183SessionProgress_02 + + template (present) ACK_Request mw_TP_MW_ECSCF_ACK_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_ACK_Request_Base := { + requestLine := { + method := ACK_E, + requestUri := p_ack_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_ECSCF_ACK_01 + + template (present) ACK_Request mw_TP_MW_ECSCF_ACK_02( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MW_ECSCF_ACK_01 := { + msgHeader := { + route := omit + } + } // End of template mw_TP_MW_ECSCF_ACK_02 + + template (present) BYE_Request mw_TP_MW_ECSCF_BYE_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_BYE_Request_Base := { + requestLine := { + method := BYE_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_PCSCF_BYE_01 + + template (present) CANCEL_Request mw_TP_MW_ECSCF_CANCEL_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_CANCEL_Request_Base := { + requestLine := { + method := CANCEL_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_PCSCF_CANCEL_01 + + } + + group g_ibcf { + + /** + * @desc INVITE Request checking TP_MW_IBCF_INVITE_01 + */ + template(present) INVITE_Request mdw_TP_MW_IBCF_INVITE_01 (template (present) SipUrl p_ECSCF_SIP_URI := ?, + template (present) From p_from := ?, + template (present) To p_to := ?) + modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + toField := p_to, + route := ({ + fieldName := ROUTE_E, + routeBody := { + *, + complement(mw_routeBody(p_ECSCF_SIP_URI)), + * + } + }, omit), + recordRoute := { + fieldName := RECORD_ROUTE_E, + routeBody := {mw_routeBody(p_ECSCF_SIP_URI), *} + }, + pChargingVector := { + fieldName := P_CHARGING_VECTOR_E, + chargeParams := { + *, +// {id := "icid-value", paramValue := ?}, + *, + {id := "orig-ioi", paramValue := ?}, + *, +// complement({id := "term-ioi", paramValue := ?}), + *, + complement({id := "access-network-charging-info", paramValue := ?}), + * + } + }, + pAccessNetworkInfo := omit + } + } + + template (present) Response mw_TP_MW_IBCF_100Trying_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_100Trying_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_IBCF_100Trying_01 + + template (present) Response mw_TP_MW_IBCF_180Ringing_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_180Ringing_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_IBCF_180Ringing_01 + + template (present) Response mw_TP_MW_IBCF_183SessionProgress_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MW_IBCF_183SessionProgress_01 + + template (present) ACK_Request mw_TP_MW_IBCF_ACK_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_ACK_Request_Base := { + requestLine := { + method := ACK_E, + requestUri := p_ack_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_IBCF_ACK_01 + + template (present) BYE_Request mw_TP_MW_IBCF_BYE_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_BYE_Request_Base := { + requestLine := { + method := BYE_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_IBCF_BYE_01 + + template (present) CANCEL_Request mw_TP_MW_IBCF_CANCEL_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_CANCEL_Request_Base := { + requestLine := { + method := CANCEL_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MW_IBCF_CANCEL_01 + + } + } // End of module AtsImsIot_Templates_MW \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_MX.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_MX.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..06d9a2805367789c31e755836a7f96546394c95a --- /dev/null +++ b/ttcn/AtsImsIot/AtsImsIot_Templates_MX.ttcn @@ -0,0 +1,262 @@ +/* + * @author STF 574 + * @version $Id$ + * @desc This module provides TP related templates used at MM interface + */ +module AtsImsIot_Templates_MX { + + // LibCommon + //import from LibCommon_BasicTypesAndValues all; + //import from LibCommon_VerdictControl all; + + // libSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Templates all; + import from LibSip_Common all; + + // LibIms + import from LibIms_Templates all; + + //import from LibMsrp_TypesAndValues all; + + // LibIot + //import from LibIot_TypesAndValues all; + import from LibIot_PIXITS all; + + // AtsImsIot + //import from AtsImsIot_TypesAndValues all; + import from AtsImsIot_PIXITS all; + import from AtsImsIot_Templates all; + + /** + * @desc INVITE Request checking TP_MX_ECSCF_INVITE_01 + */ + template(present) INVITE_Request mw_TP_MX_ECSCF_INVITE_01 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + toField := p_to, + route := ({ + fieldName := ROUTE_E, + routeBody := { + *, + complement(mw_routeBody(p_invite_uri)), + * + } + }, omit), + recordRoute := { + fieldName := RECORD_ROUTE_E, + routeBody := {mw_routeBody(p_invite_uri), *} + }, + contact := p_contact, + pAssertedID := p_pAssertedID + }, + messageBody := p_messageBody + } + + template(present) INVITE_Request mw_TP_MX_ECSCF_INVITE_02 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_TP_MX_ECSCF_INVITE_01 := { + msgHeader := { + pChargingFunctionAddresses := omit + } + } + + template(present) INVITE_Request mw_TP_MX_ECSCF_INVITE_03 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_TP_MX_ECSCF_INVITE_02 := { + } + + template(present) INVITE_Request mw_TP_MX_PCSCF_NGC_INVITE_01 (template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PAssertedID p_pAssertedID := ? + ) + modifies mw_TP_MX_ECSCF_INVITE_02 := { + } + + template(present) INFO_Request mw_TP_MX_ECSCF_NGC_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ?, + template (present) Contact p_contact := ?, + template (present) MessageBody p_messageBody := ?, + template (present) PPreferredID p_pPreferredID := ?, + template (present) Accept p_accept := ?, + template (present) RecvInfo p_recvInfo := ? + ) + modifies mw_TP_MX_ECSCF_INFO_01 := { + } + + template (present) Response mw_TP_MX_ECSCF_100Trying_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_100Trying_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MX_ECSCF_100Trying_01 + + template (present) Response mw_TP_MX_ECSCF_180Ringing_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_180Ringing_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MX_ECSCF_180Ringing_01 + + template (present) Response mw_TP_MX_ECSCF_183SessionProgress_01( + template (present) CSeq p_cSeq := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_183SessionProgress_Base := { + msgHeader := { + cSeq := p_cSeq, + fromField := p_from, + toField := p_to + } + } // End of template mw_TP_MX_ECSCF_183SessionProgress_01 + + template (present) ACK_Request mw_TP_MX_ECSCF_ACK_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_ack_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_ACK_Request_Base := { + requestLine := { + method := ACK_E, + requestUri := p_ack_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MX_ECSCF_ACK_01 + + template(present) INFO_Request mw_TP_MX_ECSCF_INFO_01 ( + template CallId p_callId := omit, + template (present) SipUrl p_invite_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + )modifies mw_INFO_Request_Base := { + msgHeader := { + fromField := p_from, + toField := p_to, + callId := p_callId + } + } + + template (present) BYE_Request mw_TP_MX_ECSCF_BYE_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_BYE_Request_Base := { + requestLine := { + method := BYE_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MX_ECSCF_BYE_01 + + template (present) BYE_Request mw_TP_MX_ECSCF_BYE_02( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_TP_MX_ECSCF_BYE_01 := { + msgHeader := { + route := * + } + } // End of template mw_TP_MX_ECSCF_BYE_02 + + template (present) CANCEL_Request mw_TP_MX_ECSCF_CANCEL_01( // TODO To be enforced + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ?, + template (present) SipUrl p_bye_uri := ?, + template (present) From p_from := ?, + template (present) To p_to := ? + ) modifies mw_CANCEL_Request_Base := { + requestLine := { + method := CANCEL_E, + requestUri := p_bye_uri, // @TODO + sipVersion := c_sipNameVersion + }, + msgHeader := { + callId := p_callId, + fromField := p_from, + toField := p_to, + route := { + fieldName := ROUTE_E, + routeBody := { + *, + ?, + * + } + } + } + } // End of template mw_TP_MX_ECSCF_CANCEL_01 + + template (present) Response mw_3xxContact( + template (present) CSeq p_cSeq := ?, + Accept p_accept) modifies mdw_3XX_Base := { + msgHeader := { + cSeq := p_cSeq, + accept := p_accept + } + } // End of template mw_3xxContact + +} // End of module AtsImsIot_Templates_MX diff --git a/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn b/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn index 237f8314eb96c7170ec3a1d73c4f41194252ff51..d24a9e41f1c62e415a0039693612e12115c13d3c 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TestConfiguration.ttcn @@ -9,25 +9,19 @@ module AtsImsIot_TestConfiguration { - import from LibCommon_VerdictControl { type FncRetCode; } + import from LibCommon_VerdictControl all; /*language "TTCN-3:2008 Amendment 1" - FSCOM/YGA*/ - import from LibIms_UpperTester { modulepar PX_IMS_USER_DATA; } - import from LibIot_PIXITS { modulepar PX_EUT_A, PX_EUT_B, PX_PRODUCTS, PX_MAX_MSG_WAIT; } - import from LibIot_TypesAndValues { - type StartTrafficCaptureRsp, StopTrafficCaptureRsp, MonitorInterfaceInfo, InterfaceInfo, InterfaceInfoList, Product, - ProtocolFilter, StartTrafficCaptureRsp, StopTrafficCaptureRsp, SetFilterReq, SetFilterRsp, Status; } + import from LibIms_UpperTester all; + import from LibIot_PIXITS all; + import from LibIot_TypesAndValues all; /*language "TTCN-3:2008 Amendment 1" - FSCOM/YGA*/ - import from LibIot_Functions { altstep a_receiveIOTVerdict; function f_setConformanceVerdict, f_setE2EVerdict; } - import from LibIot_TestConfiguration { function f_cf_oracle_up, f_cf_oracle_down; } - import from LibIot_TestInterface {type IotEquipmentUser;} - import from AtsImsIot_TestSystem {type ImsInterfaceMonitor, SipInterfaceMonitor, DiameterInterfaceMonitor, NaptrInterfaceMonitor, SgiInterfaceMonitor, ImsTestCoordinator, CF_INT_CALL, CF_INT_AS, CF_ROAM_AS, CF_EPC_CALL, CF_ATT, CF_ATT_old;} - import from LibIot_TestInterface {type InterfaceMonitor;} - import from AtsImsIot_Templates { - template m_generalConfigurationReq_offline, m_generalConfigurationReq_online, m_generalConfigurationReq_merge, - m_generalConfigurationRsp_success, m_generalConfigurationRsp_error, m_generalConfigurationRsp_timeout, - m_SetFilterReq, mw_SetFilterRsp, m_startTrafficCaptureReq, m_stopTrafficCaptureReq, - m_startTrafficCaptureRsp_any, m_stopTrafficCaptureRsp_any; } - import from AtsImsIot_Functions {function f_setInterfaceNameOnComponent, f_setInterfaceInfoComponent;} + import from LibIot_Functions all; + import from LibIot_TestConfiguration all; + import from LibIot_TestInterface all; + import from AtsImsIot_TestSystem all; + import from LibIot_TestInterface all; + import from AtsImsIot_Templates all; + import from AtsImsIot_Functions all; group constantDefinitions { //* interface monitor name Gm A @@ -52,9 +46,11 @@ module AtsImsIot_TestConfiguration { const charstring c_trigger_B := "User B"; //* eut trigger name User A const charstring c_userUE_A := "User A"; + const charstring c_userUE_A_emergency := "User A Emergency"; const charstring c_userUE_A2 := "User A2"; //* eut trigger name User B const charstring c_userUE_B := "User B"; + const charstring c_userUE_B_emergency := "User B Emergency"; const charstring c_userUE_B2 := "User B2"; //* eut trigger name User C const charstring c_userUE_C := "User C"; @@ -76,6 +72,8 @@ module AtsImsIot_TestConfiguration { const charstring c_s6a := "S6a"; //* interface monitor name Rx const charstring c_gx := "Gx"; + //* interface monitor name Mm/Mx/Mw + const charstring c_psap := "Psap"; } group mappingFunctions { @@ -1806,6 +1804,6 @@ module AtsImsIot_TestConfiguration { } // end of function f_cf_epc_call_rel15_down - } // end group g_release15 + } // end group g_release15 } \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn b/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn index a86c23287c338cafa4992b3fcedb4749b1d85e30..a9c5d39c90f651300d32e813cc0dab547da77f4e 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TestSystem.ttcn @@ -1,12 +1,12 @@ module AtsImsIot_TestSystem { - import from LibSip_SIPTypesAndValues {type Request, Response;} - import from LibMsrp_TypesAndValues {type SEND_request, RECEIVE_response;} - import from AtsImsIot_TypesAndValues {type SipMessage, NAPTRmessage;} - import from LibIot_TestInterface {type EquipmentAccessPort;} + import from LibSip_SIPTypesAndValues all; + import from LibMsrp_TypesAndValues all; + import from AtsImsIot_TypesAndValues all; import from LibIot_TestInterface all; - import from LibIot_TypesAndValues {type VxLTEMonitorInterfaceList;} - import from LibDiameter_TypesAndValues {type DIAMETER_MSG;} + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibDiameter_TypesAndValues all; /** * @desc interfaces to the SUT @@ -64,6 +64,8 @@ module AtsImsIot_TestSystem { group portDefinitions { type port ImsCoordinationPort message { inout SipMessage, DIAMETER_MSG; + } with { + extension "internal" } type port DataPort message { in Request, Response, SEND_request, RECEIVE_response; // SIP @@ -122,20 +124,26 @@ module AtsImsIot_TestSystem { type record CF_VXLTE_Interfaces{ SipInterfaceMonitor gmA optional, SipInterfaceMonitor gmB optional, - SipInterfaceMonitor ic optional, - SipInterfaceMonitor mwPI optional,// Mw interface at P-CSCF/I-CSCF or P-CSCF/S-CSCF if I-CSCF not used - SipInterfaceMonitor mwPS optional, - SipInterfaceMonitor mwIS optional,// Mw interface at I-CSCF/S-CSCF - SipInterfaceMonitor mwPB optional,// Mw interface at P-CSCF/IBCF - SipInterfaceMonitor mwIB optional,// Mw interface at I-CSCF/IBCF - SipInterfaceMonitor isc optional, - DiameterInterfaceMonitor cxIH optional, - DiameterInterfaceMonitor cxSH optional, - DiameterInterfaceMonitor gx optional, - DiameterInterfaceMonitor rx optional, - DiameterInterfaceMonitor s6a optional, - DiameterInterfaceMonitor s9 optional, - DiameterInterfaceMonitor sh optional + SipInterfaceMonitor mmB_PSAP optional,// MmMx interface at IBCF to PSAP + SipInterfaceMonitor mwEB optional,// Mw interface at E-CSCF/IBCF or E-CSCF/BGCF + SipInterfaceMonitor mlE_LRF optional,// Ml interface at E-CSCF/LRF + SipInterfaceMonitor mwS_PSAP optional,// MwMmMx interface at E,SCSCF to PSAP + SipInterfaceMonitor ic optional, + SipInterfaceMonitor mwPI optional,// Mw interface at P-CSCF/I-CSCF or P-CSCF/S-CSCF if I-CSCF not used + SipInterfaceMonitor mwPS optional, + SipInterfaceMonitor mwPE optional,// Mw interface at P-CSCF to E-CSCF + SipInterfaceMonitor mwIS optional,// Mw interface at I-CSCF/S-CSCF + SipInterfaceMonitor mwIE optional,// Mw interface at I-CSCF/S-CSCF to E-CSCF + SipInterfaceMonitor mwPB optional,// Mw interface at P-CSCF/IBCF + SipInterfaceMonitor mwIB optional,// Mw interface at I-CSCF/IBCF + SipInterfaceMonitor isc optional,// ISC interface at AS to S-CSCF + DiameterInterfaceMonitor cxIH optional, + DiameterInterfaceMonitor cxSH optional, + DiameterInterfaceMonitor gx optional, + DiameterInterfaceMonitor rx optional, + DiameterInterfaceMonitor s6a optional, + DiameterInterfaceMonitor s9 optional, + DiameterInterfaceMonitor sh optional } type record CF_ATT_old { @@ -162,4 +170,5 @@ module AtsImsIot_TestSystem { SipInterfaceMonitor gmB } } // end of g_release15 + } \ No newline at end of file diff --git a/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn b/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn index 61a232b5d73119e38c4ba6877068aee442e13f8f..7c0384e670c578fcaf42692d0ab06024a4ba1097 100644 --- a/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn +++ b/ttcn/AtsImsIot/AtsImsIot_TypesAndValues.ttcn @@ -7,14 +7,10 @@ module AtsImsIot_TypesAndValues { import from LibCommon_BasicTypesAndValues all; - import from LibSip_SIPTypesAndValues {type Request, SipUrl, Response;} - import from LibMsrp_TypesAndValues { - type - SEND_request, - RECEIVE_response - }; - import from LibDiameter_TypesAndValues {type DIAMETER_MSG} - import from LibCommon_DataStrings {type Bit1, Bit3}; + import from LibSip_SIPTypesAndValues all; + import from LibMsrp_TypesAndValues all; + import from LibDiameter_TypesAndValues all; + import from LibCommon_DataStrings all; group SIPmessageTypes { /** diff --git a/ttcn/AtsImsIot/module.mk b/ttcn/AtsImsIot/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..dceae2f4daaef07cd0fb7acbf6511c0c8e65554f --- /dev/null +++ b/ttcn/AtsImsIot/module.mk @@ -0,0 +1,76 @@ +suite := AtsImsIot + +sources := \ + AtsImsIot_TypesAndValues.ttcn \ + AtsImsIot_Diameter_Templates.ttcn \ + AtsImsIot_Templates.ttcn \ + AtsImsIot_Templates_GM.ttcn \ + AtsImsIot_Templates_IC.ttcn \ + AtsImsIot_Templates_MW.ttcn \ + AtsImsIot_Templates_MI.ttcn \ + AtsImsIot_Templates_MM.ttcn \ + AtsImsIot_Templates_MX.ttcn \ + AtsImsIot_Templates_ML.ttcn \ + AtsImsIot_Templates_ISC.ttcn \ + AtsImsIot_TestConfiguration.ttcn \ + AtsImsIot_TP_behavior_CX.ttcn \ + AtsImsIot_TP_behavior_ISC.ttcn \ + AtsImsIot_TP_behavior_SH.ttcn \ + AtsImsIot_TP_behavior_GM.ttcn \ + AtsImsIot_TP_behavior_MW_IS.ttcn \ + AtsImsIot_TP_behavior_RX.ttcn \ + AtsImsIot_TP_behavior_GX.ttcn \ + AtsImsIot_TP_behavior_MW_PS.ttcn \ + AtsImsIot_TP_behavior_MM.ttcn \ + AtsImsIot_TP_behavior_ML.ttcn \ + AtsImsIot_TP_behavior_MI.ttcn \ + AtsImsIot_TP_behavior_MX.ttcn \ + AtsImsIot_TP_behavior_S6A.ttcn \ + AtsImsIot_TD_ATT.ttcn \ + AtsImsIot_TD_REG.ttcn \ + AtsImsIot_Functions.ttcn \ + AtsImsIot_Emergency.ttcn \ + AtsImsIot_TD_DRG.ttcn \ + AtsImsIot_TD_DTC.ttcn \ + AtsImsIot_TestControl.ttcn \ + AtsImsIot_PIXITS.ttcn \ + AtsImsIot_TD_INI.ttcn \ + ../patch_ats_ims_iot/ttcn/AtsImsIot_TestSystem.ttcn \ + AtsImsIot_TP_behavior_IC.ttcn \ + AtsImsIot_TP_behavior_MW_SI.ttcn \ + AtsImsIot_TP_behavior_S9.ttcn \ + + +modules := ../LibCommon \ + ../LibIms \ + ../LibIot \ + ../LibMsrp \ + ../LibUpperTester \ + ../LibIms_ConfigAndTrigger \ + ../LibSip \ + ../LibDiameter \ + ../../titan-test-system-framework/ttcn/LibHelpers \ + ../../titan-test-system-framework/ccsrc/Framework \ + ../../titan-test-system-framework/ccsrc/Helpers \ + ../../titan-test-system-framework/ccsrc/loggers \ + ../../titan-test-system-framework/ccsrc/Protocols/ETH \ + ../../titan-test-system-framework/ccsrc/Protocols/Tcp \ + ../../titan-test-system-framework/ccsrc/Protocols/UDP \ + ../../titan-test-system-framework/ccsrc/Protocols/Xml \ + ../../ccsrc/Ports/LibSip \ + ../../ccsrc/Ports/ImsMonitorSipPort \ + ../../ccsrc/Ports/LibDiameter \ + ../../ccsrc/Ports/ImsMonitorDiameterPort \ + ../../ccsrc/Ports/Naptr \ + ../../ccsrc/Ports/Data \ + ../../ccsrc/Ports/Sgi \ + ../../ccsrc/Ports/LibIot \ + ../../ccsrc/EncDec/LibDiameter \ + ../../ccsrc/EncDec/LibSip \ + ../../ccsrc/EncDec/LibMsrp \ + ../../ccsrc/Protocols/Diameter \ + ../../ccsrc/Protocols/LowerLayerPPort \ + ../../ccsrc/Protocols/Sip \ + ../../ccsrc/Protocols/Naptr \ + ../../ccsrc/Protocols/UpperTester \ + ../modules/titan.TestPorts.Common_Components.Abstract_Socket \ diff --git a/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn b/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn index 15598fb3d2f9ca7b5fd2bb3e2c7c77b10b7d4bd0..055a4a317e45bc98212922503568188f877e937e 100644 --- a/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn +++ b/ttcn/LibIms_ConfigAndTrigger/LibIms_UpperTester.ttcn @@ -6,14 +6,9 @@ module LibIms_UpperTester { - import from LibIot_Functions {function f_sendEquipmentCmd;} - - import from LibUpperTester { - template m_EQ_Request; - type EquipmentCommand; - } - - import from LibIot_TestInterface {type TestCoordinator, EquipmentUser;} + import from LibIot_Functions all; + import from LibUpperTester all; + import from LibIot_TestInterface all; group ue { group ueTypes { diff --git a/ttcn/LibIms_ConfigAndTrigger/module.mk b/ttcn/LibIms_ConfigAndTrigger/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..55ba6b146ce786aee068ca85652a3db50168cdbd --- /dev/null +++ b/ttcn/LibIms_ConfigAndTrigger/module.mk @@ -0,0 +1 @@ +sources := LibIms_UpperTester.ttcn \ No newline at end of file diff --git a/ttcn/LibIot/LibIot_Functions.ttcn b/ttcn/LibIot/LibIot_Functions.ttcn index 076c9af5047f9829d82208480e47328783c970fa..decda9f5a94aedeb078a7e1ec6f1ecb38ddd2bad 100644 --- a/ttcn/LibIot/LibIot_Functions.ttcn +++ b/ttcn/LibIot/LibIot_Functions.ttcn @@ -5,7 +5,7 @@ */ module LibIot_Functions { - import from LibCommon_VerdictControl {type FncRetCode;} + import from LibCommon_VerdictControl all; import from LibUpperTester { template mw_EO_Response; diff --git a/ttcn/LibIot/LibIot_PIXITS.ttcn b/ttcn/LibIot/LibIot_PIXITS.ttcn index f5112acae965a54a4794989e0d5f28431df23cd2..f4e20f7af1a3734b0aacfc242e281288d0afaa11 100644 --- a/ttcn/LibIot/LibIot_PIXITS.ttcn +++ b/ttcn/LibIot/LibIot_PIXITS.ttcn @@ -256,11 +256,24 @@ module LibIot_PIXITS { */ modulepar integer PX_EUT_A := 0; + /** + * + * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_A + * + */ + modulepar integer PX_EUT_A_EMERGENCY := 1; + + /** + * + * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_B + */ + modulepar integer PX_EUT_B := 2; + /** * * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_B */ - modulepar integer PX_EUT_B := 1; + modulepar integer PX_EUT_B_EMERGENCY := 3; /** * @@ -278,8 +291,15 @@ module LibIot_PIXITS { * * @desc Selects product based on index in PX_PRODCUTS vendor list for EUT_B_B2 */ - modulepar integer PX_EUT_B_B2 := 2; + modulepar integer PX_EUT_B_B2 := 3; + + /** + * + * @desc Selects product based on index in PX_PRODCUTS vendor list for PSAP + * + */ + modulepar integer PX_PSAP := 12; /** * @@ -339,7 +359,7 @@ module LibIot_PIXITS { * @desc * Defines the location of the files to merge. */ - modulepar charstring PX_IOT_MERGE_TOOL_PATH := "C:\Program Files\WireShark"; + modulepar charstring PX_IOT_MERGE_TOOL_PATH := "C:\\Program Files\\WireShark"; /** * @desc @@ -356,7 +376,7 @@ module LibIot_PIXITS { * List of the network interfaces to monitor. * Use ';' to separate the interfaces */ - modulepar charstring PX_IOT_IFACES := "rpcap://\Device\NPF_{60DAA80A-2AC6-4592-B3A7-80FC0FF08908}"; + modulepar charstring PX_IOT_IFACES := "rpcap://\\Device\\NPF_{60DAA80A-2AC6-4592-B3A7-80FC0FF08908}"; modulepar EutInterfaceInfoList PX_IOT_EUTs_IFACE_INFO_LIST := { diff --git a/ttcn/LibIot/LibIot_TestInterface.ttcn b/ttcn/LibIot/LibIot_TestInterface.ttcn index 6baefb05c86d42054e94210995f6a29d9967f65f..275d435b25129bc9ec81d5ac487d2ed7373d9b2f 100644 --- a/ttcn/LibIot/LibIot_TestInterface.ttcn +++ b/ttcn/LibIot/LibIot_TestInterface.ttcn @@ -13,7 +13,7 @@ module LibIot_TestInterface { import from LibIot_TypesAndValues all; - import from LibIot_PIXITS {modulepar PX_MAX_MSG_WAIT;} + import from LibIot_PIXITS all; import from LibCommon_Sync all; import from LibSip_SIPTypesAndValues all; @@ -101,6 +101,8 @@ module LibIot_TestInterface { } type port VerdictPort message { inout IotVerdict; + } with { + extension "internal" } type port AdapterConfigPort message { diff --git a/ttcn/LibIot/LibIot_TypesAndValues.ttcn b/ttcn/LibIot/LibIot_TypesAndValues.ttcn index 8a97ca9c9100f9b50ec6e86e56d3c0bf15324ba9..26f64808f6b63e0a6aa4b30e7929617b8bf56b2c 100644 --- a/ttcn/LibIot/LibIot_TypesAndValues.ttcn +++ b/ttcn/LibIot/LibIot_TypesAndValues.ttcn @@ -1,143 +1,149 @@ /* - * @author STF 370 + * @author STF 370 * @version $Id: LibIot_TypesAndValues.ttcn 16 2009-06-16 15:06:42Z pintar $ - * @desc This module provides the (message) types and constants used by the test component + * @desc This module provides the (message) types and constants used by the test component * for Iot tests. */ module LibIot_TypesAndValues { - - import from LibCommon_BasicTypesAndValues {type UInt32, UInt16;} + + import from LibCommon_BasicTypesAndValues {type UInt32, UInt16;} - import from LibCommon_VerdictControl {type FncRetCode;} + import from LibCommon_VerdictControl all; - group commonTypes { - type enumerated IOTExecMode { e_realtime, e_offline } + group commonTypes { + type enumerated IOTExecMode { e_realtime, e_offline } - type record Status { - FncRetCode code, - charstring reason optional - } - - } - - group interfaceInformationrelatedTypes { - - /** - * - * @desc IP address type e.g. "127.0.0.1" - */ - type charstring IpAddress; - - /** - * - * @desc Type for port number, e.g. "5060" - */ - type UInt16 PortNumber; - - /** - * - * @desc List of port numbers - */ - type record of PortNumber PortNumberList; - - type record InterfaceAvailable { - charstring interfaceName, - boolean available - } - - type set of InterfaceAvailable InterfaceAvailableList; - - /** - * - * @desc Required information for IP interfaces - * @member domainName the domain name - * @member IpAddress the ip address - * @member portNumbers the list of port numbers where message are received - */ - type record IpInterfaceInfo { - charstring domainName optional, - IpAddress IpAddress, - PortNumberList portNumbers - } - - /** - * - * @desc List of IP interfacees - */ - type record of IpInterfaceInfo IpInterfaceInfoList; - - /** - * - * @desc Collection of different interface types, e.g for IP communications - * This type can be extended with new alternative for other interface types - */ - type union InterfaceInfo { - IpInterfaceInfoList IpInterfaceInfo - } - - /** - * - * @desc Type for representing EUT interface information for monitored logical interfaces - * @member interfaceName Name of logical interface - * @member interfaceInfo Interface information specific to this logical interface - */ - type record MonitorInterfaceInfo { - charstring interfaceName, - InterfaceInfo interfaceInfo - } - - /** - * - * @desc List of monitored interfaces - */ - type record of MonitorInterfaceInfo MonitorInterfaceInfoList; - - /** - * - * @desc List of VxLTE Monitor interfaces - */ + type record Status { + FncRetCode code, + charstring reason optional + } + + } + + group interfaceInformationrelatedTypes { + + /** + * + * @desc IP address type e.g. "127.0.0.1" + */ + type charstring IpAddress; + + /** + * + * @desc Type for port number, e.g. "5060" + */ + type UInt16 PortNumber; + + /** + * + * @desc List of port numbers + */ + type record of PortNumber PortNumberList; + + type record InterfaceAvailable { + charstring interfaceName, + boolean available + } + + type set of InterfaceAvailable InterfaceAvailableList; + + /** + * + * @desc Required information for IP interfaces + * @member domainName the domain name + * @member IpAddress the ip address + * @member portNumbers the list of port numbers where message are received + */ + type record IpInterfaceInfo { + charstring domainName optional, + IpAddress IpAddress, + PortNumberList portNumbers + } + + /** + * + * @desc List of IP interfacees + */ + type record of IpInterfaceInfo IpInterfaceInfoList; + + /** + * + * @desc Collection of different interface types, e.g for IP communications + * This type can be extended with new alternative for other interface types + */ + type union InterfaceInfo { + IpInterfaceInfoList IpInterfaceInfo + } + + /** + * + * @desc Type for representing EUT interface information for monitored logical interfaces + * @member interfaceName Name of logical interface + * @member interfaceInfo Interface information specific to this logical interface + */ + type record MonitorInterfaceInfo { + charstring interfaceName, + InterfaceInfo interfaceInfo + } + + /** + * + * @desc List of monitored interfaces + */ + type record of MonitorInterfaceInfo MonitorInterfaceInfoList; + + /** + * + * @desc List of VxLTE Monitor interfaces + */ type record VxLTEMonitorInterfaceList{ - MonitorInterfaceInfo gmA optional, - MonitorInterfaceInfo gmB optional, - MonitorInterfaceInfo ic optional, - MonitorInterfaceInfo mwPI optional,// Mw interface at P-CSCF/I-CSCF or P-CSCF/S-CSCF if I-CSCF not used - MonitorInterfaceInfo mwPS optional, - MonitorInterfaceInfo mwIS optional,// Mw interface at I-CSCF/S-CSCF - MonitorInterfaceInfo mwPB optional,// Mw interface at P-CSCF/IBCF - MonitorInterfaceInfo mwIB optional,// Mw interface at I-CSCF/IBCF - MonitorInterfaceInfo isc optional, - MonitorInterfaceInfo cxIH optional, - MonitorInterfaceInfo cxSH optional, - MonitorInterfaceInfo gx optional, - MonitorInterfaceInfo rx optional, - MonitorInterfaceInfo s6a optional, - MonitorInterfaceInfo s9 optional, - MonitorInterfaceInfo sh optional + MonitorInterfaceInfo gmA optional, + MonitorInterfaceInfo gmB optional, + MonitorInterfaceInfo mmB_PSAP optional,// Mm interface at IBCF to PSAP + MonitorInterfaceInfo mwEB optional,// Mw interface at ECSCF to IBCF + MonitorInterfaceInfo mlE_LRF optional, //Ml interface at ECSCF to LRF + MonitorInterfaceInfo mwS_PSAP optional,// Mw interface at SCSCF to PSAP + MonitorInterfaceInfo ic optional, + MonitorInterfaceInfo mwPI optional,// Mw interface at P-CSCF/I-CSCF or P-CSCF/S-CSCF if I-CSCF not used + MonitorInterfaceInfo mwPS optional, + MonitorInterfaceInfo mwPE optional,// Mw interface at P-CSCF to E-CSCF + MonitorInterfaceInfo mwIS optional,// Mw interface at I-CSCF/S-CSCF + MonitorInterfaceInfo mwPB optional,// Mw interface at P-CSCF/IBCF + MonitorInterfaceInfo mwIB optional,// Mw interface at I-CSCF/IBCF + MonitorInterfaceInfo mwIE optional,// Mw interface at I-CSCF/S-CSCF to E-CSCF + MonitorInterfaceInfo isc optional, + MonitorInterfaceInfo cxIH optional, + MonitorInterfaceInfo cxSH optional, + MonitorInterfaceInfo gx optional, + MonitorInterfaceInfo rx optional, + MonitorInterfaceInfo s6a optional, + MonitorInterfaceInfo s9 optional, + MonitorInterfaceInfo sh optional } - /** - * - * @desc Product specific EUT interface information - * @member name the name of the vendor - * @member monitorInterfaces monitor interface configuration - */ - type record Product { - charstring productName, - MonitorInterfaceInfoList monitorInterfaces - } - - /** - * - * @desc List of product specificr EUT interface information - */ - type record of Product ProductList; - } - + /** + * + * @desc Product specific EUT interface information + * @member name the name of the vendor + * @member monitorInterfaces monitor interface configuration + */ + type record Product { + charstring productName, + MonitorInterfaceInfoList monitorInterfaces + } + + /** + * + * @desc List of product specificr EUT interface information + */ + type record of Product ProductList; + } + - group adapterConfigurationTypes { - + group adapterConfigurationTypes { + type union CaptureMode { LiveCapture liveCpature, OfflineCapture offlineCapture @@ -147,7 +153,7 @@ module LibIot_TypesAndValues { type record of charstring PhysicalInterfaceList; type record LiveCapture { - PhysicalInterfaceList physicalInterfaces, // TODO document example syntax + PhysicalInterfaceList physicalInterfaces, // TODO document example syntax RecordMode recordMode } @@ -165,8 +171,8 @@ module LibIot_TypesAndValues { } type record CaptureSource { - charstring sessionsPath, // e.g., the path where session's PCAP files are located like /tmp/19 - MergeFileList mergeFileList + charstring sessionsPath, // e.g., the path where session's PCAP files are located like /tmp/19 + MergeFileList mergeFileList } type record TimeOffset @@ -218,9 +224,9 @@ module LibIot_TypesAndValues { type enumerated ProtocolFilter { e_ip, - e_sip, - e_dns, - e_diameter + e_sip, + e_dns, + e_diameter } type record SetFilterReq { @@ -250,35 +256,35 @@ module LibIot_TypesAndValues { Status status } - } - with{ - encode "IOTCodec"; - } + } + with{ + encode "IOTCodec"; + } - group oracleRelatedTypes { - // used for PIXIT definition - type enumerated IotVerdictType { e_e2e, e_conformance } - - // used for verdict handling - type record VerdictType { - verdicttype verdict, - charstring reason optional - } - - type union IotVerdict { - VerdictType e2e, - VerdictType conformance - } - } - /** + group oracleRelatedTypes { + // used for PIXIT definition + type enumerated IotVerdictType { e_e2e, e_conformance } + + // used for verdict handling + type record VerdictType { + verdicttype verdict, + charstring reason optional + } + + type union IotVerdict { + VerdictType e2e, + VerdictType conformance + } + } + /** * @desc Default record */ - type record of default DefaultList; + type record of default DefaultList; - type record ComponentId { - charstring name, - integer index // explain more - } + type record ComponentId { + charstring name, + integer index // explain more + } - type set of ComponentId ComponentIdList; + type set of ComponentId ComponentIdList; } \ No newline at end of file diff --git a/ttcn/LibIot/LibIot_VxLTE_Functions.ttcn b/ttcn/LibIot/LibIot_VxLTE_Functions.ttcn index 77bbff2d37ed6207c64d66a059670464145b44e0..7e504091ce58995af26fe806c6ddeecdb0b41ee7 100644 --- a/ttcn/LibIot/LibIot_VxLTE_Functions.ttcn +++ b/ttcn/LibIot/LibIot_VxLTE_Functions.ttcn @@ -1,24 +1,14 @@ /* - * @author STF 574 - * @version $Id: LibIot_VxLTE_Functions.ttcn 1 2020-05-29 15:06:42Z pintar $ - * @desc This module provides Functions parameters which need to be - * changeable within validation + * @author STF 574 + * @version $Id: LibIot_VxLTE_Functions.ttcn 1 2020-05-29 15:06:42Z pintar $ + * @desc This module provides Functions parameters which need to be + * changeable within validation */ -module LibIot_VxLTE_Functions { +module LibIot_VxLTE_Functions { - import from LibIot_TypesAndValues - { - type IOTExecMode, IotVerdictType, CaptureMode, RecordMode, FileList, TimeOffset, EutInterfaceInfoList, - ProtocolFilter, IpAddress, PortNumber, ProductList, InterfaceAvailable, InterfaceAvailableList,MonitorInterfaceInfo, - VxLTEMonitorInterfaceList; - } - import from AtsImsIot_Templates { - template /*m_generalConfigurationReq_offline, m_generalConfigurationReq_online, m_generalConfigurationReq_merge, - m_generalConfigurationRsp_success, m_generalConfigurationRsp_error, m_generalConfigurationRsp_timeout,*/ - m_SetFilterReq/*, mw_SetFilterRsp, m_startTrafficCaptureReq, m_stopTrafficCaptureReq, - m_startTrafficCaptureRsp_any, m_stopTrafficCaptureRsp_any*/; - } + import from LibIot_TypesAndValues all; + import from AtsImsIot_Templates all; import from LibIot_VxLTE_PIXITS all; import from LibIot_VxLTE_Templates all; @@ -28,9 +18,9 @@ module LibIot_VxLTE_Functions { type record of charstring InterfaceNamesList; group ConfigurationFunctions{ /** - * @desc Check and create a list of monitor interfaces based on PIXITS - * @param - * @return the created monitor component list in vc_MonIntfList + * @desc Check and create a list of monitor interfaces based on PIXITS + * @param + * @return the created monitor component list in vc_MonIntfList */ function f_setVxLteMonIterfacesAvailability(/*inout VxLTEMonitorInterfaceList p_vxlteMonIntfList*/)runs on ImsTestCoordinator{ @@ -42,6 +32,18 @@ module LibIot_VxLTE_Functions { if (PX_SIP_GMB_MONITORENABLED == true){ vc_MonIntfList.gmB := valueof(m_MonIntf_Sip_Gm_B); } + if (PX_SIP_MM_B_PSAP_MONITORENABLED == true){ + vc_MonIntfList.mmB_PSAP := valueof(m_MonIntf_Sip_MmB_PSAP); + } + if (PX_SIP_MW_EB_MONITORENABLED == true){ + vc_MonIntfList.mwEB := valueof(m_MonIntf_Sip_Mw_EB); + } + if (PX_SIP_ML_E_LRF_MONITORENABLED == true){ + vc_MonIntfList.mlE_LRF := valueof(m_MonIntf_Sip_Ml_E_LRF); + } + if (PX_SIP_MW_S_PSAP_MONITORENABLED == true){ + vc_MonIntfList.mwS_PSAP := valueof(m_MonIntf_Sip_MwS_PSAP); + } if (PX_SIP_IC_MONITORENABLED == true){ vc_MonIntfList.ic := valueof(m_MonIntf_Sip_Ic); } @@ -51,6 +53,9 @@ module LibIot_VxLTE_Functions { if (PX_SIP_MW_PS_MONITORENABLED == true){ vc_MonIntfList.mwPS := valueof(m_MonIntf_Sip_Mw_PS); } + if (PX_SIP_MW_PE_MONITORENABLED == true){ + vc_MonIntfList.mwPE := valueof(m_MonIntf_Sip_Mw_PE); + } if (PX_SIP_MW_IS_MONITORENABLED == true){ vc_MonIntfList.mwIS := valueof(m_MonIntf_Sip_Mw_IS); } @@ -60,12 +65,14 @@ module LibIot_VxLTE_Functions { if (PX_SIP_MW_IB_MONITORENABLED == true){ vc_MonIntfList.mwIB := valueof(m_MonIntf_Sip_Mw_IB); } + if (PX_SIP_MW_IE_MONITORENABLED == true){ + vc_MonIntfList.mwIE := valueof(m_MonIntf_Sip_Mw_IE); + } if (PX_SIP_ISC_MONITORENABLED == true){ vc_MonIntfList.isc := valueof(m_MonIntf_Sip_ISC); } - if (PX_DIAMETER_CX_IH_MONITORENABLED == true){ vc_MonIntfList.cxIH := valueof(m_MonIntf_Diameter_Cx_IH); } @@ -86,14 +93,14 @@ module LibIot_VxLTE_Functions { } if (PX_DIAMETER_SH_MONITORENABLED == true){ vc_MonIntfList.sh := valueof(m_MonIntf_Diameter_Sh); - } + } } /** - * @desc Create monitor components based on vc_MonIntfList - * @param - * @return the created monitor components in vc_vxlte_monitor_components + * @desc Create monitor components based on vc_MonIntfList + * @param + * @return the created monitor components in vc_vxlte_monitor_components */ function f_cf_createVxLteMonitor() runs on ImsTestCoordinator{ @@ -104,6 +111,18 @@ module LibIot_VxLTE_Functions { vc_vxlte_monitor_components.gmB := f_cf_create_monitor_sip ( vc_MonIntfList.gmB); } + if (isvalue(vc_MonIntfList.mmB_PSAP)){ + vc_vxlte_monitor_components.mmB_PSAP := f_cf_create_monitor_sip ( vc_MonIntfList.mmB_PSAP); + } + if (isvalue(vc_MonIntfList.mwEB)){ + vc_vxlte_monitor_components.mwEB := f_cf_create_monitor_sip ( vc_MonIntfList.mwEB); + } + if (isvalue(vc_MonIntfList.mlE_LRF)){ + vc_vxlte_monitor_components.mlE_LRF := f_cf_create_monitor_sip ( vc_MonIntfList.mlE_LRF); + } + if (isvalue(vc_MonIntfList.mwS_PSAP)){ + vc_vxlte_monitor_components.mwS_PSAP := f_cf_create_monitor_sip ( vc_MonIntfList.mwS_PSAP); + } if (isvalue(vc_MonIntfList.ic)){ vc_vxlte_monitor_components.ic := f_cf_create_monitor_sip ( vc_MonIntfList.ic); } @@ -114,6 +133,9 @@ module LibIot_VxLTE_Functions { if (isvalue(vc_MonIntfList.mwPS)){ vc_vxlte_monitor_components.mwPS := f_cf_create_monitor_sip ( vc_MonIntfList.mwPS); } + if (isvalue(vc_MonIntfList.mwPE)){ + vc_vxlte_monitor_components.mwPE := f_cf_create_monitor_sip ( vc_MonIntfList.mwPE); + } if (isvalue(vc_MonIntfList.mwIS)){ vc_vxlte_monitor_components.mwIS := f_cf_create_monitor_sip ( vc_MonIntfList.mwIS); } @@ -123,6 +145,9 @@ module LibIot_VxLTE_Functions { if (isvalue(vc_MonIntfList.mwIB)){ vc_vxlte_monitor_components.mwIB := f_cf_create_monitor_sip ( vc_MonIntfList.mwIB); } + if (isvalue(vc_MonIntfList.mwIE)){ + vc_vxlte_monitor_components.mwIE := f_cf_create_monitor_sip ( vc_MonIntfList.mwIE); + } if (isvalue(vc_MonIntfList.isc)){ vc_vxlte_monitor_components.isc := f_cf_create_monitor_sip ( vc_MonIntfList.isc); @@ -154,23 +179,23 @@ module LibIot_VxLTE_Functions { } /** - * @desc Start monitor components based on vc_MonIntfList - * @param - * @return Created monitor components in vc_vxlte_monitor_components are connected/mapped + * @desc Start monitor components based on vc_MonIntfList + * @param + * @return Created monitor components in vc_vxlte_monitor_components are connected/mapped */ function f_cf_VxLteMonitor_Up() runs on ImsTestCoordinator{ - //Initialize the Adapter (including the TrafficCapture process). + //Initialize the Adapter (including the TrafficCapture process). timer tc_noAct; f_cf_initCapture(); if (isvalue(vc_MonIntfList.gmA)){ f_cf_monitor_up_sip(vc_vxlte_monitor_components.gmA); vc_vxlte_monitor_components.gmA.start(f_cf_setFilter( - valueof (m_SetFilterReq( + valueof (m_SetFilterReq( e_sip, {vc_MonIntfList.gmA.interfaceInfo} - ) - ))); + ) + ))); } if (isvalue(vc_MonIntfList.gmB)){ f_cf_monitor_up_sip(vc_vxlte_monitor_components.gmB); @@ -182,6 +207,42 @@ module LibIot_VxLTE_Functions { ))); } + if (isvalue(vc_MonIntfList.mmB_PSAP)){ + f_cf_monitor_up_sip(vc_vxlte_monitor_components.mmB_PSAP); + vc_vxlte_monitor_components.mmB_PSAP.start(f_cf_setFilter( + valueof (m_SetFilterReq( + e_sip, + {vc_MonIntfList.mmB_PSAP.interfaceInfo} + ) + ))); + } + if (isvalue(vc_MonIntfList.mwEB)){ + f_cf_monitor_up_sip(vc_vxlte_monitor_components.mwEB); + vc_vxlte_monitor_components.mwEB.start(f_cf_setFilter( + valueof (m_SetFilterReq( + e_sip, + {vc_MonIntfList.mwEB.interfaceInfo} + ) + ))); + } + if (isvalue(vc_MonIntfList.mlE_LRF)){ + f_cf_monitor_up_sip(vc_vxlte_monitor_components.mlE_LRF); + vc_vxlte_monitor_components.mlE_LRF.start(f_cf_setFilter( + valueof (m_SetFilterReq( + e_sip, + {vc_MonIntfList.mlE_LRF.interfaceInfo} + ) + ))); + } + if (isvalue(vc_MonIntfList.mwS_PSAP)){ + f_cf_monitor_up_sip(vc_vxlte_monitor_components.mwS_PSAP); + vc_vxlte_monitor_components.mwS_PSAP.start(f_cf_setFilter( + valueof (m_SetFilterReq( + e_sip, + {vc_MonIntfList.mwS_PSAP.interfaceInfo} + ) + ))); + } if (isvalue(vc_MonIntfList.ic)){ f_cf_monitor_up_sip(vc_vxlte_monitor_components.ic); vc_vxlte_monitor_components.ic.start(f_cf_setFilter( @@ -210,6 +271,15 @@ module LibIot_VxLTE_Functions { ) ))); } + if (isvalue(vc_MonIntfList.mwPE)){ + f_cf_monitor_up_sip(vc_vxlte_monitor_components.mwPE); + vc_vxlte_monitor_components.mwPS.start(f_cf_setFilter( + valueof (m_SetFilterReq( + e_sip, + {vc_MonIntfList.mwPE.interfaceInfo} + ) + ))); + } if (isvalue(vc_MonIntfList.mwIS)){ f_cf_monitor_up_sip(vc_vxlte_monitor_components.mwIS); vc_vxlte_monitor_components.mwIS.start(f_cf_setFilter( @@ -237,6 +307,15 @@ module LibIot_VxLTE_Functions { ) ))); } + if (isvalue(vc_MonIntfList.mwIE)){ + f_cf_monitor_up_sip(vc_vxlte_monitor_components.mwIE); + vc_vxlte_monitor_components.mwPS.start(f_cf_setFilter( + valueof (m_SetFilterReq( + e_sip, + {vc_MonIntfList.mwIE.interfaceInfo} + ) + ))); + } if (isvalue(vc_MonIntfList.isc)){ f_cf_monitor_up_sip(vc_vxlte_monitor_components.isc); @@ -323,9 +402,9 @@ module LibIot_VxLTE_Functions { } /** - * @desc Stops monitor components based on vc_MonIntfList - * @param - * @return Created monitor components in vc_vxlte_monitor_components are disconnected/unmapped + * @desc Stops monitor components based on vc_MonIntfList + * @param + * @return Created monitor components in vc_vxlte_monitor_components are disconnected/unmapped */ function f_cf_VxLteMonitor_Down() runs on ImsTestCoordinator{ //Stop traffic capture processing. @@ -337,7 +416,18 @@ module LibIot_VxLTE_Functions { if (isvalue(vc_MonIntfList.gmB)){ f_cf_monitor_down_sip(vc_vxlte_monitor_components.gmB); } - + if (isvalue(vc_MonIntfList.mmB_PSAP)){ + f_cf_monitor_down_sip(vc_vxlte_monitor_components.mmB_PSAP); + } + if (isvalue(vc_MonIntfList.mwEB)){ + f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwEB); + } + if (isvalue(vc_MonIntfList.mlE_LRF)){ + f_cf_monitor_down_sip(vc_vxlte_monitor_components.mlE_LRF); + } + if (isvalue(vc_MonIntfList.mwS_PSAP)){ + f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwS_PSAP); + } if (isvalue(vc_MonIntfList.ic)){ f_cf_monitor_down_sip(vc_vxlte_monitor_components.ic); } @@ -348,6 +438,9 @@ module LibIot_VxLTE_Functions { if (isvalue(vc_MonIntfList.mwPS)){ f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwPS); } + if (isvalue(vc_MonIntfList.mwPE)){ + f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwPE); + } if (isvalue(vc_MonIntfList.mwIS)){ f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwIS); } @@ -357,6 +450,9 @@ module LibIot_VxLTE_Functions { if (isvalue(vc_MonIntfList.mwIB)){ f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwIB); } + if (isvalue(vc_MonIntfList.mwIE)){ + f_cf_monitor_down_sip(vc_vxlte_monitor_components.mwIE); + } if (isvalue(vc_MonIntfList.isc)){ f_cf_monitor_down_sip(vc_vxlte_monitor_components.isc); @@ -413,8 +509,8 @@ module LibIot_VxLTE_Functions { /** * @desc Check monitor component based on interface name - * @param - * @return true - Monitorinteface available/active + * @param + * @return true - Monitorinteface available/active * false - Monitorinteface not exists or not available/active */ function f_SipMonitorInterface_available(charstring p_interfaceName) runs on ImsTestCoordinator return boolean{ @@ -423,13 +519,19 @@ module LibIot_VxLTE_Functions { if ((isvalue(vc_MonIntfList.gmA)) and (vc_MonIntfList.gmA.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.gmB)) and (vc_MonIntfList.gmB.interfaceName==p_interfaceName)){ return true;} + if ((isvalue(vc_MonIntfList.mmB_PSAP)) and (vc_MonIntfList.mmB_PSAP.interfaceName==p_interfaceName)){ return true;} + if ((isvalue(vc_MonIntfList.mwEB)) and (vc_MonIntfList.mwEB.interfaceName==p_interfaceName)){ return true;} + if ((isvalue(vc_MonIntfList.mlE_LRF)) and (vc_MonIntfList.mlE_LRF.interfaceName==p_interfaceName)){ return true;} + if ((isvalue(vc_MonIntfList.mwS_PSAP)) and (vc_MonIntfList.mwS_PSAP.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.ic)) and (vc_MonIntfList.ic.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.mwPI)) and (vc_MonIntfList.mwPI.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.mwPS)) and (vc_MonIntfList.mwPS.interfaceName==p_interfaceName)){ return true;} + if ((isvalue(vc_MonIntfList.mwPE)) and (vc_MonIntfList.mwPE.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.mwIS)) and (vc_MonIntfList.mwIS.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.mwPB)) and (vc_MonIntfList.mwPB.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.mwIB)) and (vc_MonIntfList.mwIB.interfaceName==p_interfaceName)){ return true;} + if ((isvalue(vc_MonIntfList.mwIE)) and (vc_MonIntfList.mwIE.interfaceName==p_interfaceName)){ return true;} if ((isvalue(vc_MonIntfList.isc)) and (vc_MonIntfList.isc.interfaceName==p_interfaceName)){ return true;} @@ -437,9 +539,9 @@ module LibIot_VxLTE_Functions { } /** - * @desc Check monitor component based on interface name - * @param - * @return true - Monitorinteface available/active + * @desc Check monitor component based on interface name + * @param + * @return true - Monitorinteface available/active * false - Monitorinteface not exists or not available/active */ function f_DiameterMonitorInterface_available(charstring p_interfaceName) runs on ImsTestCoordinator return boolean{ @@ -463,7 +565,7 @@ module LibIot_VxLTE_Functions { var InterfaceAvailableList v_VxLTE_MonIntf_Available; var InterfaceAvailable v_InterfaceAvailable; - var SipInterfaceMonitor v_gmA, v_gmB, v_ic, v_mwPI, v_mwPS, v_mwSI, v_mwPB, v_mwIB, v_isc; + var SipInterfaceMonitor v_gmA, v_gmB, v_mmBPSAP, v_mwEB, v_mlE_LRF, v_mwSPSAP, v_ic, v_mwPI, v_mwPS, v_mwPE, v_mwSI, v_mwPB, v_mwIB, v_mwIE, v_isc; var DiameterInterfaceMonitor v_cxIH, v_cxSH, v_gx, v_rx, v_s6a, v_s9, v_sh; if (PX_SIP_GMA_MONITORENABLED == true){ @@ -477,9 +579,41 @@ module LibIot_VxLTE_Functions { v_InterfaceAvailable.interfaceName := PX_SIP_GMB_INTERFACENAME; v_InterfaceAvailable.available := PX_SIP_GMB_MONITORENABLED; v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); - v_gmB := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Gm_B)/*PX_SIP_GMB_INTERFACENAME*/ ); + v_gmB := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Gm_B)/*PX_SIP_GMB_INTERFACENAME*/); f_cf_monitor_up_sip(v_gmB); } + if (PX_SIP_MM_B_PSAP_MONITORENABLED == true){ + + v_InterfaceAvailable.interfaceName := PX_SIP_MM_B_PSAP_INTERFACENAME; + v_InterfaceAvailable.available := PX_SIP_MM_B_PSAP_MONITORENABLED; + v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); + v_mmBPSAP := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_MmB_PSAP)/*PX_SIP_MW_PSAP_INTERFACENAME*/ ); + f_cf_monitor_up_sip(v_mmBPSAP); + } + if (PX_SIP_MW_EB_MONITORENABLED == true){ + + v_InterfaceAvailable.interfaceName := PX_SIP_MW_EB_INTERFACENAME; + v_InterfaceAvailable.available := PX_SIP_MW_EB_MONITORENABLED; + v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); + v_mwEB := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Mw_EB)/*PX_SIP_MW_PI_INTERFACENAME*/ ); + f_cf_monitor_up_sip(v_mwEB); + } + if (PX_SIP_ML_E_LRF_MONITORENABLED == true){ + + v_InterfaceAvailable.interfaceName := PX_SIP_ML_E_LRF_INTERFACENAME; + v_InterfaceAvailable.available := PX_SIP_ML_E_LRF_MONITORENABLED; + v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); + v_mlE_LRF := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Ml_E_LRF)/*PX_SIP_MW_PI_INTERFACENAME*/ ); + f_cf_monitor_up_sip(v_mlE_LRF); + } + if (PX_SIP_MW_S_PSAP_MONITORENABLED == true){ + + v_InterfaceAvailable.interfaceName := PX_SIP_MW_S_PSAP_INTERFACENAME; + v_InterfaceAvailable.available := PX_SIP_MW_S_PSAP_MONITORENABLED; + v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); + v_mwSPSAP := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_MwS_PSAP)/*PX_SIP_MW_PSAP_INTERFACENAME*/ ); + f_cf_monitor_up_sip(v_mwSPSAP); + } if (PX_SIP_IC_MONITORENABLED == true){ v_InterfaceAvailable.interfaceName := PX_SIP_IC_INTERFACENAME; v_InterfaceAvailable.available := PX_SIP_IC_MONITORENABLED; @@ -502,6 +636,13 @@ module LibIot_VxLTE_Functions { v_mwPS := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Mw_PS)/*PX_SIP_MW_PS_INTERFACENAME*/ ); f_cf_monitor_up_sip(v_mwPS); } + if (PX_SIP_MW_PE_MONITORENABLED == true){ + v_InterfaceAvailable.interfaceName := PX_SIP_MW_PE_INTERFACENAME; + v_InterfaceAvailable.available := PX_SIP_MW_PE_MONITORENABLED; + v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); + v_mwPE := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Mw_PE)/*PX_SIP_MW_PE_INTERFACENAME*/ ); + f_cf_monitor_up_sip(v_mwPE); + } if (PX_SIP_MW_IS_MONITORENABLED == true){ v_InterfaceAvailable.interfaceName := PX_SIP_MW_IS_INTERFACENAME; v_InterfaceAvailable.available := PX_SIP_MW_IS_MONITORENABLED; @@ -530,8 +671,13 @@ module LibIot_VxLTE_Functions { v_isc := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_ISC)/*PX_SIP_ISC_INTERFACENAME*/ ); f_cf_monitor_up_sip(v_isc); } - - + if (PX_SIP_MW_IE_MONITORENABLED == true){ + v_InterfaceAvailable.interfaceName := PX_SIP_MW_IE_INTERFACENAME; + v_InterfaceAvailable.available := PX_SIP_MW_IE_MONITORENABLED; + v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); + v_mwIE := f_cf_create_monitor_sip ( valueof(m_MonIntf_Sip_Mw_IE)/*PX_SIP_MW_IE_INTERFACENAME*/ ); + f_cf_monitor_up_sip(v_mwIE); + } if (PX_DIAMETER_CX_IH_MONITORENABLED == true){ v_InterfaceAvailable.interfaceName := PX_DIAMETER_CX_IH_INTERFACENAME; @@ -581,7 +727,7 @@ module LibIot_VxLTE_Functions { v_VxLTE_MonIntf_Available := f_update_MonitorInterfaceList(v_VxLTE_MonIntf_Available,v_InterfaceAvailable); v_sh := f_cf_create_monitor_diameter ( valueof(m_MonIntf_Diameter_Sh)/*PX_DIAMETER_SH_INTERFACENAME*/ ); f_cf_monitor_up_diameter(v_sh); - } + } } function f_update_MonitorInterfaceList( diff --git a/ttcn/LibIot/LibIot_VxLTE_PIXITS.ttcn b/ttcn/LibIot/LibIot_VxLTE_PIXITS.ttcn index edf4938f2154e1d3a6aac331ef31010507de6992..ea0a694ceea36bb718afcbbddbc625169e1738ac 100644 --- a/ttcn/LibIot/LibIot_VxLTE_PIXITS.ttcn +++ b/ttcn/LibIot/LibIot_VxLTE_PIXITS.ttcn @@ -1,17 +1,13 @@ /* * @author STF574, TTF006 - * @version $Id: LibIot_VxLTE_PIXITS.ttcn 1 2020-05-29 15:06:42Z pintar $ + * @version $Id: LibIot_VxLTE_PIXITS.ttcn 1 2020-05-29 15:06:42Z pintar $ * @desc This module provides PIXIT parameters which need to be * changeable within validation */ -module LibIot_VxLTE_PIXITS { +module LibIot_VxLTE_PIXITS { - import from LibIot_TypesAndValues - { - type IOTExecMode, IotVerdictType, CaptureMode, RecordMode, FileList, TimeOffset, EutInterfaceInfoList, - ProtocolFilter, IpAddress, PortNumber, ProductList, InterfaceAvailableList,MonitorInterfaceInfo; - } + import from LibIot_TypesAndValues all; group VxLTEMonitorInterfaces_PIXITS{ @@ -49,48 +45,67 @@ module LibIot_VxLTE_PIXITS { modulepar boolean PX_SIP_IC_MONITORENABLED := true; }//end group Ic - //A.8.4 PIXIT items for the Mw Interface + //A.8.4 PIXIT items for the Mw Interface //The Mw interface connects an x-CSCF with another x-CSCF or an IBCF using the SIP and SDP protocols as defined in ETSI TS 124 229 [1]. group Mw{ + modulepar charstring PX_SIP_MM_B_PSAP_INTERFACENAME := "Mm IBCF PSAP"; //Mm interface between IBCF and PSAP + modulepar charstring PX_SIP_MW_EB_INTERFACENAME := "Mw ECSCF IBCF"; //Mw interface between ECSCF and IBCF + modulepar charstring PX_SIP_MI_EB_INTERFACENAME := "Mi ECSCF BCF"; //Mw interface between ECSCF and BGCF + modulepar charstring PX_SIP_ML_E_LRF_INTERFACENAME := "Ml ECSCF LRF"; //Ml interface between ECSCF and LRF + modulepar charstring PX_SIP_MW_S_PSAP_INTERFACENAME := "Mw SCSCF PSAP"; //Mw interface between S-CSCF and PSAP modulepar charstring PX_SIP_MW_PI_INTERFACENAME := "Mw PI"; //Mw interface between P-CSCF and I-CSCF modulepar charstring PX_SIP_MW_PS_INTERFACENAME := "Mw PS"; //Mw interface between P-CSCF and S-CSCF + modulepar charstring PX_SIP_MW_PE_INTERFACENAME := "Mw PE"; //Mw interface between P-CSCF and E-CSCF modulepar charstring PX_SIP_MW_IS_INTERFACENAME := "Mw SI"; //Mw interface between S-CSCF and I-CSCF modulepar charstring PX_SIP_MW_PB_INTERFACENAME := "Mw PB"; //Mw interface between P-CSCF and IBCF modulepar charstring PX_SIP_MW_IB_INTERFACENAME := "Mw IB"; //Mw interface between I-CSCF and IBCF + modulepar charstring PX_SIP_MW_IE_INTERFACENAME := "Mw IE"; //Mw interface between I/S-CSCF and E-CSCF + modulepar charstring PX_SIP_MW_PSAP_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of PSAP + modulepar integer PX_SIP_MW_PSAP_PORT := 5060; //Mw Port number of PSAP modulepar charstring PX_SIP_MW_P_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of P-CSCF modulepar integer PX_SIP_MW_P_CSCF_PORT := 5060; //Mw Port number of P-CSCF modulepar charstring PX_SIP_MW_I_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of I-CSCF modulepar integer PX_SIP_MW_I_CSCF_PORT := 5080; //Mw Port number of I-CSCF modulepar charstring PX_SIP_MW_S_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of S-CSCF modulepar integer PX_SIP_MW_S_CSCF_PORT := 5090; //Mw Port number of S-CSCF + modulepar charstring PX_SIP_MW_E_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of E-CSCF + modulepar integer PX_SIP_MW_E_CSCF_PORT := 5095; //Mw Port number of E-CSCF + modulepar charstring PX_SIP_ML_LRF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of E-CSCF + modulepar integer PX_SIP_ML_LRF_PORT := 5095; //Mw Port number of E-CSCF modulepar charstring PX_SIP_MW_IBCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Mw IP address of IBCF modulepar integer PX_SIP_MW_IBCF_PORT := 5050; //Mw Port number of IBCF + modulepar boolean PX_SIP_MM_B_PSAP_MONITORENABLED := true; //true - Monitor enabled for PSAP connection only + modulepar boolean PX_SIP_MW_EB_MONITORENABLED := true; //true - Monitor enabled for EB connection only + modulepar boolean PX_SIP_ML_E_LRF_MONITORENABLED := true; //true - Monitor enabled for E-LRF connection only + modulepar boolean PX_SIP_MW_S_PSAP_MONITORENABLED := true; //true - Monitor enabled for PSAP connection only modulepar boolean PX_SIP_MW_PI_MONITORENABLED := true; //true - Monitor enabled for PI connection only modulepar boolean PX_SIP_MW_PS_MONITORENABLED := true; //true - Monitor enabled for PS connection only + modulepar boolean PX_SIP_MW_PE_MONITORENABLED := true; //true - Monitor enabled for PE connection only modulepar boolean PX_SIP_MW_IS_MONITORENABLED := true; //true - Monitor enabled for IS connection only modulepar boolean PX_SIP_MW_PB_MONITORENABLED := true; //true - Monitor enabled for PB connection only modulepar boolean PX_SIP_MW_IB_MONITORENABLED := true; //true - Monitor enabled for IB connection only + modulepar boolean PX_SIP_MW_IE_MONITORENABLED := true; //true - Monitor enabled for IE connection only }//end group Mw - //A.8.* PIXIT items for the Isc Interface + //A.8.* PIXIT items for the Isc Interface //The Isc interface connects an S-CSCF with AS using the SIP and SDP protocols as defined in ETSI TS 124 229 [1]. group Isc{ - modulepar charstring PX_SIP_ISC_INTERFACENAME := "Isc"; //Isc interface between S-CSCF and AS - modulepar charstring PX_SIP_ISC_S_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98";// Isc IP address of S-CSCF - modulepar integer PX_SIP_ISC_S_CSCF_PORT := 5090;// Isc Port number of S-CSCF - modulepar charstring PX_SIP_ISC_AS_IPADDR := "fe80::21a:a0ff:fe07:98";// Isc IP address of AS - modulepar integer PX_SIP_ISC_AS_PORT := 5100;// Isc Port number of AS - modulepar boolean PX_SIP_ISC_MONITORENABLED := true; + modulepar charstring PX_SIP_ISC_INTERFACENAME := "Isc"; //Isc interface between S-CSCF and AS + modulepar charstring PX_SIP_ISC_S_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98";// Isc IP address of S-CSCF + modulepar integer PX_SIP_ISC_S_CSCF_PORT := 5090;// Isc Port number of S-CSCF + modulepar charstring PX_SIP_ISC_AS_IPADDR := "fe80::21a:a0ff:fe07:98";// Isc IP address of AS + modulepar integer PX_SIP_ISC_AS_PORT := 5100;// Isc Port number of AS + modulepar boolean PX_SIP_ISC_MONITORENABLED := true; }//end group Isc }//end group SIp group Diameter{ - //A.8.5 PIXIT items for the Cx Interface + //A.8.5 PIXIT items for the Cx Interface //The Cx interface connects an I- or S-CSCF with an HSS using the Diameter protocol as defined ETSI TS 129 228 [3] and ETSI TS 129 229 [4]. group Cx{ modulepar charstring PX_DIAMETER_CX_IH_INTERFACENAME := "Cx IH"; //Cx interface between I-CSCF and HSS modulepar charstring PX_DIAMETER_CX_SH_INTERFACENAME := "Cx SH"; //Cx interface between S-CSCF and HSS - modulepar charstring PX_DIAMETER_CX_I_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Charstring Cx IP address of I-CSCF + modulepar charstring PX_DIAMETER_CX_I_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Charstring Cx IP address of I-CSCF modulepar integer PX_DIAMETER_CX_I_CSCF_PORT := 3868; //Cx Port number of I-CSCF modulepar charstring PX_DIAMETER_CX_S_CSCF_IPADDR := "fe80::21a:a0ff:fe07:98"; //Cx IP address of S-CSCF modulepar integer PX_DIAMETER_CX_S_CSCF_PORT := 3868; //Cx Port number of S-CSCF @@ -101,7 +116,7 @@ module LibIot_VxLTE_PIXITS { modulepar boolean PX_DIAMETER_CX_IH_MONITORENABLED := true; //true - Monitor enabled for IH connection only }//end group Cx - //A.8.6 PIXIT items for the Gx Interface + //A.8.6 PIXIT items for the Gx Interface //The Gx interface connects a PCRF with a PGW using the Diameter protocol as defined in ETSI TS 129 212 [8]. group Gx{ modulepar charstring PX_DIAMETER_GX_INTERFACENAME := "Gx"; //Gx interface between PCRF and PGW diff --git a/ttcn/LibIot/LibIot_VxLTE_Templates.ttcn b/ttcn/LibIot/LibIot_VxLTE_Templates.ttcn index 99439e259243a4414e29fbddd53f09bf231f41e7..357cc67540409fddc75ce1da4b93571db84c9dca 100644 --- a/ttcn/LibIot/LibIot_VxLTE_Templates.ttcn +++ b/ttcn/LibIot/LibIot_VxLTE_Templates.ttcn @@ -1,337 +1,451 @@ /* - * @author STF 574 - * @version $Id: LibIot_VxLTE_Templates.ttcn 1 2020-05-29 15:06:42Z pintar $ - * @desc This module provides Templates parameters which need to be - * changeable within validation + * @author STF 574 + * @version $Id: LibIot_VxLTE_Templates.ttcn 1 2020-05-29 15:06:42Z pintar $ + * @desc This module provides Templates parameters which need to be + * changeable within validation */ -module LibIot_VxLTE_Templates { +module LibIot_VxLTE_Templates { - import from LibIot_TypesAndValues - { - type IOTExecMode, IotVerdictType, CaptureMode, RecordMode, FileList, TimeOffset, EutInterfaceInfoList, - ProtocolFilter, IpAddress, PortNumber, ProductList, InterfaceAvailableList,MonitorInterfaceInfo; - } - import from LibIot_VxLTE_PIXITS all; - - group VxLTEMonitorInterfaces_Templates{ - group EPC{ - group Diameter{ - template MonitorInterfaceInfo m_MonIntf_Diameter_S6a := + import from LibIot_TypesAndValues + { + type IOTExecMode, IotVerdictType, CaptureMode, RecordMode, FileList, TimeOffset, EutInterfaceInfoList, + ProtocolFilter, IpAddress, PortNumber, ProductList, InterfaceAvailableList,MonitorInterfaceInfo; + } + import from LibIot_VxLTE_PIXITS all; + + group VxLTEMonitorInterfaces_Templates{ + group EPC{ + group Diameter{ + template MonitorInterfaceInfo m_MonIntf_Diameter_S6a := + { + interfaceName := PX_DIAMETER_S6A_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "mme.epc.domain",//TODO: define as PIXIT + IpAddress := PX_DIAMETER_S6A_MME_IPADDR, + portNumbers := {PX_DIAMETER_S6A_MME_PORT} + }, + { + domainName := "hss.epc.domain", + IpAddress := PX_DIAMETER_S6A_HSS_IPADDR, + portNumbers := {PX_DIAMETER_S6A_HSS_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Diameter_S9 := + { + interfaceName := PX_DIAMETER_S9_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "hpcrf.epc.domain", + IpAddress := PX_DIAMETER_S9_H_PCRF_IPADDR, + portNumbers := {PX_DIAMETER_S9_H_PCRF_PORT} + }, + { + domainName := "vpcrf.epc.domain", + IpAddress := PX_DIAMETER_S9_V_PCRF_IPADDR, + portNumbers := {PX_DIAMETER_S9_V_PCRF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Diameter_Gx := + { + interfaceName := PX_DIAMETER_GX_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcrf.epc.domain", + IpAddress := PX_DIAMETER_GX_PCRF_IPADDR, + portNumbers := {PX_DIAMETER_GX_PCRF_PORT} + }, + { + domainName := "pgw.epc.domain", + IpAddress := PX_DIAMETER_GX_PGW_IPADDR, + portNumbers := {PX_DIAMETER_GX_PGW_PORT} + } + } + } + }; + }//end group Diameter + + }//end group EPC + + group IMS{ + + group Sip{ + template MonitorInterfaceInfo m_MonIntf_Sip_Gm_A := + { + interfaceName := PX_SIP_GMA_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_SIP_GMA_PCSCF_IPADDR, + portNumbers := {PX_SIP_GMA_PCSCF_PORT} + }, + { + domainName := omit, + IpAddress := PX_SIP_GMA_UE_IPADDR, + portNumbers := {PX_SIP_GMA_UE_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Gm_B := + { + interfaceName := PX_SIP_GMB_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_SIP_GMB_PCSCF_IPADDR, + portNumbers := {PX_SIP_GMB_PCSCF_PORT} + }, + { + domainName := omit, + IpAddress := PX_SIP_GMB_UE_IPADDR, + portNumbers := {PX_SIP_GMB_UE_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_MmB_PSAP:= + { + interfaceName := PX_SIP_MM_B_PSAP_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "ibcf.ims.domain", + IpAddress := PX_SIP_MW_IBCF_IPADDR, + portNumbers := {PX_SIP_MW_IBCF_PORT} + }, + { + domainName := "psap.ims.domain", + IpAddress := PX_SIP_MW_PSAP_IPADDR, + portNumbers := {PX_SIP_MW_PSAP_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_EB:= { - interfaceName := PX_DIAMETER_S6A_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { + interfaceName := PX_SIP_MW_EB_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { { - domainName := "mme.epc.domain",//TODO: define as PIXIT - IpAddress := PX_DIAMETER_S6A_MME_IPADDR, - portNumbers := {PX_DIAMETER_S6A_MME_PORT} + domainName := "ecscf.ims.domain", + IpAddress := PX_SIP_MW_E_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_E_CSCF_PORT} }, { - domainName := "hss.epc.domain", - IpAddress := PX_DIAMETER_S6A_HSS_IPADDR, - portNumbers := {PX_DIAMETER_S6A_HSS_PORT} + domainName := "ibcf.ims.domain", + IpAddress := PX_SIP_MW_IBCF_IPADDR, + portNumbers := {PX_SIP_MW_IBCF_PORT} } } } }; - - template MonitorInterfaceInfo m_MonIntf_Diameter_S9 := + + template MonitorInterfaceInfo m_MonIntf_Sip_Ml_E_LRF:= { - interfaceName := PX_DIAMETER_S9_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { + interfaceName := PX_SIP_ML_E_LRF_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { { - domainName := "hpcrf.epc.domain", - IpAddress := PX_DIAMETER_S9_H_PCRF_IPADDR, - portNumbers := {PX_DIAMETER_S9_H_PCRF_PORT} + domainName := "ecscf.ims.domain", + IpAddress := PX_SIP_MW_E_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_E_CSCF_PORT} }, { - domainName := "vpcrf.epc.domain", - IpAddress := PX_DIAMETER_S9_V_PCRF_IPADDR, - portNumbers := {PX_DIAMETER_S9_V_PCRF_PORT} + domainName := "lrf.ims.domain", + IpAddress := PX_SIP_ML_LRF_IPADDR, + portNumbers := {PX_SIP_ML_LRF_PORT} } } } }; - - template MonitorInterfaceInfo m_MonIntf_Diameter_Gx := - { - interfaceName := PX_DIAMETER_GX_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcrf.epc.domain", - IpAddress := PX_DIAMETER_GX_PCRF_IPADDR, - portNumbers := {PX_DIAMETER_GX_PCRF_PORT} - }, - { - domainName := "pgw.epc.domain", - IpAddress := PX_DIAMETER_GX_PGW_IPADDR, - portNumbers := {PX_DIAMETER_GX_PGW_PORT} - } - } - } - }; - }//end group Diameter - - }//end group EPC - - group IMS{ - - group Sip{ - template MonitorInterfaceInfo m_MonIntf_Sip_Gm_A := - { - interfaceName := PX_SIP_GMA_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcscf.ims.domain", - IpAddress := PX_SIP_GMA_PCSCF_IPADDR, - portNumbers := {PX_SIP_GMA_PCSCF_PORT} - }, - { - domainName := omit, - IpAddress := PX_SIP_GMA_UE_IPADDR, - portNumbers := {PX_SIP_GMA_UE_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Gm_B := - { - interfaceName := PX_SIP_GMB_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcscf.ims.domain", - IpAddress := PX_SIP_GMB_PCSCF_IPADDR, - portNumbers := {PX_SIP_GMB_PCSCF_PORT} - }, - { - domainName := omit, - IpAddress := PX_SIP_GMB_UE_IPADDR, - portNumbers := {PX_SIP_GMB_UE_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Ic := - { - interfaceName := PX_SIP_IC_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "ibcfa.ims.domain", - IpAddress := PX_SIP_IC_IBCF_A_IPADDR, - portNumbers := {PX_SIP_IC_IBCF_A_PORT} - }, - { - domainName := "ibcfb.ims.domain", - IpAddress := PX_SIP_IC_IBCF_B_IPADDR, - portNumbers := {PX_SIP_IC_IBCF_B_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PI:= - { - interfaceName := PX_SIP_MW_PI_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcscf.ims.domain", - IpAddress := PX_SIP_MW_P_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_P_CSCF_PORT} - }, - { - domainName := "icscf.ims.domain", - IpAddress := PX_SIP_MW_I_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_I_CSCF_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PS:= - { - interfaceName := PX_SIP_MW_PS_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcscf.ims.domain", - IpAddress := PX_SIP_MW_P_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_P_CSCF_PORT} - }, - { - domainName := "scscf.ims.domain", - IpAddress := PX_SIP_MW_S_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_S_CSCF_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Mw_IS:= - { - interfaceName := PX_SIP_MW_IS_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "scscf.ims.domain", - IpAddress := PX_SIP_MW_I_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_I_CSCF_PORT} - }, - { - domainName := "icscf.ims.domain", - IpAddress := PX_SIP_MW_S_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_S_CSCF_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_ISC:= - { - interfaceName := PX_SIP_ISC_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "scscf.ims.domain", - IpAddress := PX_SIP_ISC_S_CSCF_IPADDR, - portNumbers := {PX_SIP_ISC_S_CSCF_PORT} - }, - { - domainName := "as.ims.domain", - IpAddress := PX_SIP_ISC_AS_IPADDR, - portNumbers := {PX_SIP_ISC_AS_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PB:= - { - interfaceName := PX_SIP_MW_PB_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcscf.ims.domain", - IpAddress := PX_SIP_MW_P_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_P_CSCF_PORT} - }, - { - domainName := "ibcf.ims.domain", - IpAddress := PX_SIP_MW_IBCF_IPADDR, - portNumbers := {PX_SIP_MW_IBCF_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Sip_Mw_IB:= - { - interfaceName := PX_SIP_MW_IB_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "icscf.ims.domain", - IpAddress := PX_SIP_MW_I_CSCF_IPADDR, - portNumbers := {PX_SIP_MW_I_CSCF_PORT} - }, - { - domainName := "ibcf.ims.domain", - IpAddress := PX_SIP_MW_IBCF_IPADDR, - portNumbers := {PX_SIP_MW_IBCF_PORT} - } - } - } - }; - }//end group Sip - group Diameter{ - template MonitorInterfaceInfo m_MonIntf_Diameter_Rx := - { - interfaceName := PX_DIAMETER_RX_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "pcscf.ims.domain", - IpAddress := PX_DIAMETER_RX_P_CSCF_IPADDR, - portNumbers := {PX_DIAMETER_RX_P_CSCF_PORT} - }, - { - domainName := "pcrf.ims.domain", - IpAddress := PX_DIAMETER_RX_PCRF_IPADDR, - portNumbers := {PX_DIAMETER_RX_PCRF_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Diameter_Cx_IH := - { - interfaceName := PX_DIAMETER_CX_IH_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "icscf.ims.domain", - IpAddress := PX_DIAMETER_CX_I_CSCF_IPADDR, - portNumbers := {PX_DIAMETER_CX_I_CSCF_PORT} - }, - { - domainName := "hss.ims.domain", - IpAddress := PX_DIAMETER_CX_HSS_IPADDR, - portNumbers := {PX_DIAMETER_CX_HSS_PORT} - } - } - } - }; - - template MonitorInterfaceInfo m_MonIntf_Diameter_Cx_SH := + template MonitorInterfaceInfo m_MonIntf_Sip_MwS_PSAP:= { - interfaceName := PX_DIAMETER_CX_SH_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { + interfaceName := PX_SIP_MW_S_PSAP_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { { - domainName := "scscf.ims.domain", - IpAddress := PX_DIAMETER_CX_S_CSCF_IPADDR, - portNumbers := {PX_DIAMETER_CX_S_CSCF_PORT} + domainName := "scscf.ims.domain", + IpAddress := PX_SIP_MW_S_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_S_CSCF_PORT} }, { - domainName := "hss.ims.domain", - IpAddress := PX_DIAMETER_CX_HSS_IPADDR, - portNumbers := {PX_DIAMETER_CX_HSS_PORT} + domainName := "psap.ims.domain", + IpAddress := PX_SIP_MW_PSAP_IPADDR, + portNumbers := {PX_SIP_MW_PSAP_PORT} } } } }; - - template MonitorInterfaceInfo m_MonIntf_Diameter_Sh := - { - interfaceName := PX_DIAMETER_SH_INTERFACENAME, - interfaceInfo := { - IpInterfaceInfo := { - { - domainName := "as.ims.domain", - IpAddress := PX_DIAMETER_SH_AS_IPADDR, - portNumbers := {PX_DIAMETER_SH_AS_PORT} - }, - { - domainName := "hss.ims.domain", - IpAddress := PX_DIAMETER_SH_HSS_IPADDR, - portNumbers := {PX_DIAMETER_SH_HSS_PORT} - } - } - } - }; - - }//end group Diameter - - }//end group IMS - - }//end group VxLTEMonitorInterfaces_Templates + + template MonitorInterfaceInfo m_MonIntf_Sip_Ic := + { + interfaceName := PX_SIP_IC_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "ibcfa.ims.domain", + IpAddress := PX_SIP_IC_IBCF_A_IPADDR, + portNumbers := {PX_SIP_IC_IBCF_A_PORT} + }, + { + domainName := "ibcfb.ims.domain", + IpAddress := PX_SIP_IC_IBCF_B_IPADDR, + portNumbers := {PX_SIP_IC_IBCF_B_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PI:= + { + interfaceName := PX_SIP_MW_PI_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_SIP_MW_P_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_P_CSCF_PORT} + }, + { + domainName := "icscf.ims.domain", + IpAddress := PX_SIP_MW_I_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_I_CSCF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PS:= + { + interfaceName := PX_SIP_MW_PS_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_SIP_MW_P_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_P_CSCF_PORT} + }, + { + domainName := "scscf.ims.domain", + IpAddress := PX_SIP_MW_S_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_S_CSCF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PE:= + { + interfaceName := PX_SIP_MW_PE_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_SIP_MW_P_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_P_CSCF_PORT} + }, + { + domainName := "ecscf.ims.domain", + IpAddress := PX_SIP_MW_E_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_E_CSCF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_IS:= + { + interfaceName := PX_SIP_MW_IS_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "scscf.ims.domain", + IpAddress := PX_SIP_MW_I_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_I_CSCF_PORT} + }, + { + domainName := "icscf.ims.domain", + IpAddress := PX_SIP_MW_S_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_S_CSCF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_IE:= + { + interfaceName := PX_SIP_MW_IS_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "scscf.ims.domain", + IpAddress := PX_SIP_MW_I_CSCF_IPADDR,//or PX_SIP_MW_S-CSCF_IPADDR//TODO:extend IPaddress to recordof + portNumbers := {PX_SIP_MW_I_CSCF_PORT,PX_SIP_MW_S_CSCF_PORT} + }, + { + domainName := "ecscf.ims.domain", + IpAddress := PX_SIP_MW_E_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_E_CSCF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_ISC:= + { + interfaceName := PX_SIP_ISC_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "scscf.ims.domain", + IpAddress := PX_SIP_ISC_S_CSCF_IPADDR, + portNumbers := {PX_SIP_ISC_S_CSCF_PORT} + }, + { + domainName := "as.ims.domain", + IpAddress := PX_SIP_ISC_AS_IPADDR, + portNumbers := {PX_SIP_ISC_AS_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_PB:= + { + interfaceName := PX_SIP_MW_PB_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_SIP_MW_P_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_P_CSCF_PORT} + }, + { + domainName := "ibcf.ims.domain", + IpAddress := PX_SIP_MW_IBCF_IPADDR, + portNumbers := {PX_SIP_MW_IBCF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Sip_Mw_IB:= + { + interfaceName := PX_SIP_MW_IB_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "icscf.ims.domain", + IpAddress := PX_SIP_MW_I_CSCF_IPADDR, + portNumbers := {PX_SIP_MW_I_CSCF_PORT} + }, + { + domainName := "ibcf.ims.domain", + IpAddress := PX_SIP_MW_IBCF_IPADDR, + portNumbers := {PX_SIP_MW_IBCF_PORT} + } + } + } + }; + }//end group Sip + + group Diameter{ + template MonitorInterfaceInfo m_MonIntf_Diameter_Rx := + { + interfaceName := PX_DIAMETER_RX_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "pcscf.ims.domain", + IpAddress := PX_DIAMETER_RX_P_CSCF_IPADDR, + portNumbers := {PX_DIAMETER_RX_P_CSCF_PORT} + }, + { + domainName := "pcrf.ims.domain", + IpAddress := PX_DIAMETER_RX_PCRF_IPADDR, + portNumbers := {PX_DIAMETER_RX_PCRF_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Diameter_Cx_IH := + { + interfaceName := PX_DIAMETER_CX_IH_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "icscf.ims.domain", + IpAddress := PX_DIAMETER_CX_I_CSCF_IPADDR, + portNumbers := {PX_DIAMETER_CX_I_CSCF_PORT} + }, + { + domainName := "hss.ims.domain", + IpAddress := PX_DIAMETER_CX_HSS_IPADDR, + portNumbers := {PX_DIAMETER_CX_HSS_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Diameter_Cx_SH := + { + interfaceName := PX_DIAMETER_CX_SH_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "scscf.ims.domain", + IpAddress := PX_DIAMETER_CX_S_CSCF_IPADDR, + portNumbers := {PX_DIAMETER_CX_S_CSCF_PORT} + }, + { + domainName := "hss.ims.domain", + IpAddress := PX_DIAMETER_CX_HSS_IPADDR, + portNumbers := {PX_DIAMETER_CX_HSS_PORT} + } + } + } + }; + + template MonitorInterfaceInfo m_MonIntf_Diameter_Sh := + { + interfaceName := PX_DIAMETER_SH_INTERFACENAME, + interfaceInfo := { + IpInterfaceInfo := { + { + domainName := "as.ims.domain", + IpAddress := PX_DIAMETER_SH_AS_IPADDR, + portNumbers := {PX_DIAMETER_SH_AS_PORT} + }, + { + domainName := "hss.ims.domain", + IpAddress := PX_DIAMETER_SH_HSS_IPADDR, + portNumbers := {PX_DIAMETER_SH_HSS_PORT} + } + } + } + }; + + }//end group Diameter + + }//end group IMS + + }//end group VxLTEMonitorInterfaces_Templates } \ No newline at end of file diff --git a/ttcn/LibIot/module.mk b/ttcn/LibIot/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..bcb2f7d1517fad0b0ed87055a1f46185e38b28c0 --- /dev/null +++ b/ttcn/LibIot/module.mk @@ -0,0 +1,10 @@ +sources := \ + LibIot_Functions.ttcn \ + LibIot_TestConfiguration.ttcn \ + LibIot_TypesAndValues.ttcn \ + LibIot_VxLTE_PIXITS.ttcn \ + LibIot_PIXITS.ttcn \ + LibIot_TestInterface.ttcn \ + LibIot_VxLTE_Functions.ttcn \ + LibIot_VxLTE_Templates.ttcn \ + diff --git a/ttcn/LibMsrp/LibMsrp_Functions.ttcn b/ttcn/LibMsrp/LibMsrp_Functions.ttcn index fe4fba4fc7994964a4427b19c4d688c23003ecbc..a70266ad5b2cd665e17e5266160d361829f1ffd0 100644 --- a/ttcn/LibMsrp/LibMsrp_Functions.ttcn +++ b/ttcn/LibMsrp/LibMsrp_Functions.ttcn @@ -6,15 +6,13 @@ module LibMsrp_Functions { // LibMsrp - import from LibMsrp_TypesAndValues { - type - MsrpURI - }; + import from LibMsrp_TypesAndValues all; - function f_str2msrpUri(in charstring p_uri, out template MsrpURI p_msrpUri) + function f_str2msrpUri(in charstring p_uri, out MsrpURI p_msrpUri) return boolean { var integer v_res := 0; - v_res := decvalue(oct2bit(char2oct(p_uri)), p_msrpUri); + var bitstring v_oct2bit := oct2bit(char2oct(p_uri)); + v_res := decvalue(v_oct2bit, p_msrpUri); return v_res == 0; } // End of function f_str2msrpUri diff --git a/ttcn/LibMsrp/LibMsrp_Templates.ttcn b/ttcn/LibMsrp/LibMsrp_Templates.ttcn index 29743779dbf95acb9bc91338bd59006b7788ff3d..5f275312fa6ae8283b13135748177add140499e2 100644 --- a/ttcn/LibMsrp/LibMsrp_Templates.ttcn +++ b/ttcn/LibMsrp/LibMsrp_Templates.ttcn @@ -422,19 +422,19 @@ module LibMsrp_Templates { toPath := m_msrpToPath_Dummy, fromPath := m_msrpFromPath_Dummy, headers := { - authenticationInfo := omit, - authorization := omit, + messageID := m_msrpMessageID_Dummy, + successReport := omit, + failureReport := omit, byteRange := m_msrpByteRange_Dummy, + status := omit, expires := omit, - extHeaders := omit, - failureReport := omit, - maxExpires := omit, - messageID := m_msrpMessageID_Dummy, minExpires := omit, - status := omit, - successReport := omit, + maxExpires := omit, usePath := omit, - wwwAuthenticate := omit + wwwAuthenticate := omit, + authorization := omit, + authenticationInfo := omit, + extHeaders := omit } }, // End of 'headers' field contentStuff := m_msrpContentStuff_Dummy, @@ -539,19 +539,19 @@ module LibMsrp_Templates { toPath := m_msrpToPath_Dummy, fromPath := m_msrpFromPath_Dummy, headers := { - authenticationInfo := omit, - authorization := omit, + messageID := m_msrpMessageID_Dummy, + successReport := omit, + failureReport := omit, byteRange := omit, + status := omit, expires := omit, - extHeaders := omit, - failureReport := omit, - maxExpires := omit, - messageID := m_msrpMessageID_Dummy, minExpires := omit, - status := omit, - successReport := omit, + maxExpires := omit, usePath := omit, - wwwAuthenticate := omit + wwwAuthenticate := omit, + authorization := omit, + authenticationInfo := omit, + extHeaders := omit } }, // End of 'headers' field endLine := { @@ -587,15 +587,7 @@ module LibMsrp_Templates { ) modifies mw_msrpResponse_toPath_fromPath := { headers := { headers := { - authenticationInfo := *, - authorization := *, - byteRange := *, - expires := *, - extHeaders := *, - maxExpires := *, messageID := *, - minExpires := *, - status := *, successReport := { headerName := SUCCESS_REPORT_E, reportStatus := e_YES @@ -604,8 +596,16 @@ module LibMsrp_Templates { headerName := FAILURE_REPORT_E, reportStatus := e_NO }, + byteRange := *, + status := *, + expires := *, + minExpires := *, + maxExpires := *, usePath := *, - wwwAuthenticate := * + wwwAuthenticate := *, + authorization := *, + authenticationInfo := *, + extHeaders := * } // End of 'header' field } // End of 'headers' field } // // End of template mw_msrpResponse_toPath_fromPath_with_transferReports diff --git a/ttcn/LibMsrp/module.mk b/ttcn/LibMsrp/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..d0428b335e44fe24ae55294fd715b5a5785b6352 --- /dev/null +++ b/ttcn/LibMsrp/module.mk @@ -0,0 +1,7 @@ +sources := \ + LibMsrp_Functions.ttcn \ + LibMsrp_PIXITS.ttcn \ + LibMsrp_Templates.ttcn \ + LibMsrp_TypesAndValues.ttcn \ + ../patch_lib_msrp_titan/ttcn/LibMsrp_EncDecDeclarations.ttcn \ + diff --git a/ttcn/LibSip b/ttcn/LibSip index a227e9fca956475c5b481fb6042ecfcc9d632502..44122c6589a3fa7f42825d2475511d08da499ff0 160000 --- a/ttcn/LibSip +++ b/ttcn/LibSip @@ -1 +1 @@ -Subproject commit a227e9fca956475c5b481fb6042ecfcc9d632502 +Subproject commit 44122c6589a3fa7f42825d2475511d08da499ff0 diff --git a/ttcn/LibUpperTester/LibUpperTester.ttcn b/ttcn/LibUpperTester/LibUpperTester.ttcn index 0c01624e9903de43aa0e66191144ecfccc93cd95..da13c12a16b6138dd3f104df6eeff5d96234268a 100644 --- a/ttcn/LibUpperTester/LibUpperTester.ttcn +++ b/ttcn/LibUpperTester/LibUpperTester.ttcn @@ -4,7 +4,7 @@ * @desc xxx */ module LibUpperTester { - import from LibCommon_VerdictControl {type FncRetCode;} + import from LibCommon_VerdictControl all; import from LibIot_TypesAndValues {type Status;} // TODO - move to common lib diff --git a/ttcn/LibUpperTester/module.mk b/ttcn/LibUpperTester/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..15c373323b546cd6ad01e05333deb6ea14614414 --- /dev/null +++ b/ttcn/LibUpperTester/module.mk @@ -0,0 +1 @@ +sources := LibUpperTester.ttcn \ No newline at end of file diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module.mk b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..9b0b530e68349c8056d17bf0cfc676adf70adcb8 --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module.mk @@ -0,0 +1,2 @@ +sources := module/src/Abstract_Socket.cc +includes := module/src \ No newline at end of file diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/Abstract_Socket_CNL113384.tpd b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/Abstract_Socket_CNL113384.tpd new file mode 100644 index 0000000000000000000000000000000000000000..5b05592ed70013a8ba19f5b596965ad71b82536a --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/Abstract_Socket_CNL113384.tpd @@ -0,0 +1,61 @@ + + + + Abstract_Socket_CNL113384 + + + + + SSL + + + + + true + bin/Abstract_Socket_CNL113384 + + + bin + + + + + + + true + true + bin_ssl/Abstract_Socket_CNL113384 + + AS_USE_SSL + + + [OPENSSL_DIR]/include + + + ssl + + + [OPENSSL_DIR]/lib + + + + bin_ssl + + + + + diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/LICENSE b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..3534f2ff9d512c471aab17543d08c32a1110b32d --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/LICENSE @@ -0,0 +1,277 @@ +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. \ No newline at end of file diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/README.md b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d3dd011c02ad8e7befdf874e5c9c38fa3b5f55cf --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/README.md @@ -0,0 +1,14 @@ +# !!! IMPORTANT !!! +### This repository has moved under https://gitlab.eclipse.org/eclipse/titan/ on 2021.04.20 and will not be updated further. Please check out the new location for updates! + +# + +# titan.TestPorts.Common_Components.Abstract_Socket + +Main project page: + +https://projects.eclipse.org/projects/tools.titan + +The source code of the TTCN-3 compiler and executor: + +https://github.com/eclipse/titan.core diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_1551.adoc b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_1551.adoc new file mode 100644 index 0000000000000000000000000000000000000000..e3d359dc91f8a332076f95a9c4fc63e77f513dda --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_1551.adoc @@ -0,0 +1,1125 @@ +--- +Author: Gábor Szalai +Version: 1551-CNL 113 384, Rev. A +Date: 2015-01-20 + +--- += Abstract Socket Test Port for TTCN-3 Toolset with TITAN, Description +:author: Gábor Szalai +:revnumber: 1551-CNL 113 384, Rev. A +:revdate: 2015-01-20 +:toc: + +== About This Document + +=== How to Read This Document + +This is the User Guide for the Abstract Socket test port. The Abstract Socket test port is developed for the TTCN-3 Toolset. + +=== Presumed Knowledge + +To use this protocol module the knowledge of the TTCN-3 language <<_1, [1]>> is essential. + += Functionality + +== System Requirements +In order to use the Abstract Socket test port the following system requirements must be satisfied: + +* Platform: any platform supported by TITAN RTE and OpenSSL +* TITAN TTCN-3 Test Executor version R8A (1.8.pl0) or higher installed. + +NOTE: This Abstract Socket version is not compatible with TITAN releases earlier than R8A. + +If SSL is used, the same OpenSSL must be installed as used in TITAN. For an OpenSSL installation guide see <<_3, [3]>>. + +== Fundamental Concepts + +The test port establishes connection between the TTCN-3 test executor and SUT and transmits/receives messages. The transport channel can be TCP or SSL. The connect and listen operations can be initiated from the test suite using the `use_connection_ASPs` test port parameter. + +=== Module Structure + +The Abstract Socket common component is implemented in the following files: + +* __Abstract_Socket.hh__ +* __Abstract_Socket.cc__ + +== Start Procedure + +=== Connection ASPs + +When choosing to use connection ASPs, the Abstract Socket is able to open a server listening port (acting like a server) or client connections at the same time. + +=== Server Mode + +When the test port is mapped by TITAN RTE, the server creates a TCP socket and starts listening on it. Depending on the transport channel specified in the runtime configuration file, it will accept either TCP or SSL connections. + +=== Client Mode + +When the test port is mapped by TITAN RTE, the client creates a TCP socket and tries to connect to the server. If the transport channel is SSL, the client starts an SSL handshake after the TCP connection is established. If the SSL handshake is successful, the SSL connection is established and the `map` operation is finished. + +The SSL handshake may fail due to several reasons (e.g. no shared ciphers, verification failure, etc.). + +[[sending-receiving-messages]] +== Sending/Receiving Messages + +Only basic octetstring sending and receiving is handled by the Abstract Socket. This functionality probably must be extended in order to build a test port for the desired protocol. First the TTCN-3 mapping of the target protocol messages must be elaborated and then the message processing functions can be developed. + +== Logging + +The type of information that will be logged can be categorized into two groups. The first one consists of information that shows the flow of the internal execution of the test port, e.g. important events, which function that is currently executing etc. The second group deals with presenting valuable data, e.g. presenting the content of a PDU. The logging printouts will be directed to the RTE log file. The user is able to decide whether logging is to take place or not by setting appropriate configuration data. + +== Error Handling + +Erroneous behavior detected during runtime is directed into the RTE log file. The following two types of messages are taken care of: + +* Errors: information about errors detected is provided. If an error occurs the execution of the test case will stop immediately. The test ports will be unmapped. +* Warnings: information about warnings detected is provided. The execution continues after the warning is shown. + +== Closing Down + +The connection can be shut down either performing the `unmap` operation on the port or if connection ASPs are used with the appropriate ASP. + +== IPv6 Support + +It is possible to select the address family used for server socket and client connections in the configuration file or during runtime. The following address families are supported: IPv4, IPv6 and UNSPEC. + +== SSL Functionality + +The Abstract Socket can use SSL or TCP as the transport channel. The same version of OpenSSL library must be used as in TITAN. + +The supported SSL/TLS versions are determined by the used OpenSSL library. It is possible to disable a specific TLS/SSL version in the run time configuration file. + +=== Compilation + +The usage of SSL and even the compilation of the SSL related code parts are optional. This is because SSL related code parts cannot be compiled without the OpenSSL installed. + +The compilation of SSL related code parts can be disabled by not defining the `AS_USE_SSL` macro in the _Makefile_ during the compilation. If the macro is defined in the _Makefile_, the SSL code parts are compiled to the executable test code. The usage of the SSL then can be enabled/disabled in the runtime configuration file. Naturally, the test port parameter will be ignored if the `AS_USE_SSL` macro is not defined during compilation. + +=== Authentication + +The Abstract Socket provides both server side and client side authentication. When authenticating the other side, a certificate is requested and the own trusted certificate authorities’ list is sent. The received certificate is verified whether it is a valid certificate or not (the public and private keys are matching). No further authentication is performed (e.g. whether hostname is present in the certificate). The verification can be enabled/disabled in the runtime configuration file. + +In server mode the test port will always send its certificate and trusted certificate authorities’ list to its clients. If verification is enabled in the runtime configuration file, the server will request for a client’s certificate. In this case, if the client does not send a valid certificate or does not send a certificate at all, the connection will be refused. If the verification is disabled, the connection will never be refused due to verification failure. + +In client mode the test port will send its certificate to the server on the server’s request. If verification is enabled in the runtime configuration file, the client will send its own trusted certificate authorities’ list to the server and will verify the server’s certificate as well. If the server’s certificate is not valid, the SSL connection will not be established. If verification is disabled, the connection will never be refused due to verification failure. + +The own certificate(s), the own private key file, the optional password protecting the own private key file and the trusted certificate authorities’ list file can be specified in the runtime configuration file. + +The test port will check the consistency between its own private key and the public key (based on the own certificate) automatically. If the check fails, a warning is issued and execution continues. + +=== Other Features + +The usage of SSL session resumption can be enabled/disabled in the runtime configuration file. + +The allowed ciphering suites can be restricted in the runtime configuration file, see. + +The SSL re-handshaking requests are accepted and processed, however re-handshaking cannot be initiated from the test port. + +=== Limitations + +* SSL re-handshaking cannot be initiated from the test port. +* The own certificate file(s), the own private key file and the trusted certificate authorities’ list file must be in PEM format. Other formats are not supported. + += The Test Port + +== Overview + +The Abstract Socket is a common component that can serve as a basis for test ports that need TCP connections with or without SSL on the top. The TCP socket can be used either with blocking or non-blocking socket. The Abstract Socket implements basic sending, receiving and socket handling routines, furthermore it supports the development of test ports that can work as a client or as a server. By extending the Abstract Socket component with additional functionality the desired test port can be built. + +See the functioning of the Abstract Socket below: + +image:images/Abstract socket.png[alt] + +== Installation + +Since the Abstract Socket test port is used as a part of the TTCN-3 test environment this requires TTCN-3 Test Executor to be installed before any operation of the Abstract Socket test port. + +The compilation of SSL related code parts can be disabled by not defining the `AS_USE_SSL` macro in the _Makefile_ during the compilation. + +When building the executable test suite the libraries compiled for the OpenSSL toolkit (if the `AS_USE_SSL` macro is defined) should also be linked into the executable along with the TTCN-3 Test Executor, i.e. the OpenSSL libraries should be added to the __Makefile__ generated by the TITAN executor (see example in section <>). To compile the source files you will also need the OpenSSL developer toolkit which contains the header files used by the source. If Share Objects (_.so_) are used in the OpenSSL toolkit, to run the executable, the path of the OpenSSL libraries must be added to the `LD_LIBRARY_PATH` environment variable. + +NOTE: If you are using the test port on Solaris, you have to set the `PLATFORM` macro to the proper value. It shall be `_SOLARIS_` in case of Solaris 6 (SunOS 5.6) and `_SOLARIS8_` in case of Solaris 8 (SunOS 5.8). + +== Configuration + +The executable test program behavior is determined via the run-time configuration file. This is a simple text file, which contains various sections (for example, `[TESTPORT_PARAMETERS]`) after each other. The usual suffix of configuration files is _.cfg._ For further information on the configuration file see <<_2, [2]>>. + +The listed port parameters (<>) are managed by default by the Abstract Socket. They have to be defined only in the TTCN configuration files. Though, if Abstract Socket's parameter handling is not appropriate for your application, you can ignore it completely and handle the variables directly from your port. It is recommended to implement your own test port parameter name passing functions so that your test port will not depend on the test port parameter names in the Abstract Socket. + +[[Abstract_Socket_Test_Port_Parameters_in_the_Test_Port_Configuration_File]] +=== Abstract Socket Test Port Parameters in the Test Port Configuration File + +In the `[TESTPORT_PARAMETERS]` section the following parameters can be set for the Abstract Socket based test port. The parameter names are case-sensitive; the parameter values are not case-sensitive (i.e. `_"YES"_`, `_"yes"_`, `_"Yes"_` values are identical). + +[[abstract-socket-test-port-parameters-in-the-test-port-configuration-file-if-the-transport-channel-is-tcp-ip]] +==== Abstract Socket Test Port Parameters in the Test Port Configuration File if the Transport Channel is TCP/IP + +* `use_connection_ASPs` ++ +The parameter is optional, and can be used to specify whether the Abstract Socket is controlled by connection ASPs. The default value is `_"no"_`. ++ +If the value is `_"yes"_`, the functionalities of the Abstract Socket have to be controlled by calling its `open_client_connection`, `open_listen_port`, `remove_client`, `remove_all_clients` and `close_listen_port` functions. The Abstract Socket will not create any connection or listening port when calling the `map_user` function. Using this parameter, more than one connection can be opened in client mode operation. The Abstract Socket will call the `listen_port_opened`, `client_connection_opened`, `peer_connected` and `peer_disconnected` functions of the test port implementing it when corresponding events happen. This allows test ports and TTCN code to directly handle TCP connection initiations and events. + +* `server_mode` ++ +The parameter is optional, and can be used to specify whether the test port shall act as a server or a client. If the value is `_"yes"_`, the test port will act as a server. If the value is `_"no"_`, the test port will act as a client. The default value is `_"no"_` . The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_` because the `open_listen_port` initiates the listening on a server port. + +* `socket_debugging` ++ +The parameter is optional, and can be used to enable debug logging related to the transport channel (TCP socket and SSL operations) in the test port. The default value is `_"no"_`. + +* `halt_on_connection_reset` ++ +The parameter is optional, and can be used to specify whether the test port shall stop on errors occurred during connection setup (including connection refusing), sending and receiving, disconnection (including the detection of the disconnection). The value `_"yes"_` means the test port will stop, the value `_"no"_` means that it will not stop on such errors. The default value is `_"no"_` in server mode and `_"yes"_` in client mode. ++ +The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_`, because the `peer_disconnected` function of the test port is called on the event. + +* `nagling` ++ +The parameter is optional, and can be used to specify whether concatenation occurs on TCP layer. If value is `_"yes"_`, concatenation is enabled. If value is `_"no"_`, it is disabled. ++ +NOTE: The `nagling` setting is valid only for the outgoing messages. The `nagling` for the incoming messages shall be set by the sending party. The default value is `_"no"_`. + +* `remote_address` ++ +The parameter can be used to specify the server's IP address. Mandatory in client mode and not used in server mode. ++ +The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_`, because the `open_client_connection` function receives the remote and optionally the local address. + +* `remote_port` ++ +The parameter can be used to specify the server's listening port. Mandatory in client mode and not used in server mode. ++ +The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_`, because the `open_client_connection` function receives the remote and optionally the local address. + +* `local_port` ++ +The parameter can be used to specify the port where the server is listening for connections. Mandatory in server mode and optional in client mode. ++ +The parameter serves as a default if `use_connection_ASPs` is set to `_"yes"_`. + +* `ai_family` ++ +The parameter can be used to specify the address family to use when opening listening ports or creating client connections. If its value is set to `_"IPv4"_` or `_"AF_INET"_` only IPv4 addresses are used. If it is set to `_"IPv6"_` or `_"AF_INET6"_` only IPv6 connections are allowed. The values `_`"UNSPEC"`_` and `"AF_UNSPEC"` can be used if the address family is not specified. The `_"UNSPEC"_` value allows using IPv4 and IPv6 addresses at the same time. The selection is made automatically depending on the actual value of the local and remote addresses. ++ +This parameter is optional. The default value is `_"AF_UNSPEC"_`. + +* `server_backlog` ++ +The parameter can be used to specify the number of allowed pending (queued) connection requests on the port the server listens. It is optional in server mode and not used in client mode. The default value is `_"1"_`. + +* `TCP_reconnect_attempts` ++ +This parameter can be used to specify the maximum number of times the connection is attempted to be established in TCP reconnect mode. The default value is `_"5"_`. ++ +The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_`, because the `peer_disconnected` function is called when the event happens, and it’s up to the test port or TTCN code how to continue. + +* `TCP_reconnect_delay` ++ +This parameter can be used to specify the time (in seconds) the test port waits between to TCP reconnection attempt. The default value is `_"1"_`. ++ +The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_`, because the `peer_disconnected` function is called when the event happens, and it’s up to the test port or TTCN code how to continue. + +* `client_TCP_reconnect` ++ +If the test port is in client mode and the connection was interrupted by the other side, it tries to reconnect again. The default value is ``no''. ++ +The parameter has no meaning if `use_connection_ASPs` is set to `_"yes"_`, because the `peer_disconnected` function is called when the event happens, and it’s up to the test port or TTCN code how to continue. + +* `use_non_blocking_socket` ++ +This parameter can be used to specify whether the Test Port shall use blocking or non-blocking TCP socket. Using this parameter, the `send` TTCN-3 operation will block until the data is sent, but an algorithm is implemented to avoid TCP deadlock. ++ +The parameter is optional, the default value is `_"no"_`. + +==== Additional Abstract Socket Test Port Parameters in the Test Port Configuration File if the Transport Channel is SSL + +These parameters available only if `AS_USE_SSL` macro is defined during compilation. + +* `ssl_use_ssl` ++ +The parameter is optional, and can be used to specify whether to use SSL on the top of the TCP connection or not. The default value is `_"no"_`. + +* `ssl_verify_certificate` ++ +The parameter is optional, and can be used to tell the test port whether to check the certificate of the other side. If it is defined `_"yes"_`, the test port will query and check the certificate. If the certificate is not valid (i.e. the public and private keys do not match), it will exit with a corresponding error message. If it is defined `_"no"_`, the test port will not check the validity of the certificate. The default value is `_"no"_`. + +* `ssl_use_session_resumption` ++ +The parameter is optional, and can be used to specify whether to use/support SSL session resumptions or not. The default value is `_"yes"_`. + +* `ssl_certificate_chain_file` ++ +It specifies a PEM encoded file’s path on the file system containing the certificate chain. Mandatory in server mode and optional in client mode. Note that the server may require client authentication. In this case no connection can be established without a client certificate. + +* `ssl_private_key_file` ++ +It specifies a PEM encoded file’s path on the file system containing the server’s RSA private key. Mandatory in server mode and optional in client mode. + +* `ssl_private_key_password` ++ +The parameter is optional, and can be used to specify the password protecting the private key file. If not defined, the SSL toolkit will ask for it. + +* `ssl_trustedCAlist_file` ++ +It specifies a PEM encoded file’s path on the file system containing the certificates of the trusted CA authorities to use. Mandatory in server mode, and mandatory in client mode if `ssl_verify_certificate="yes"`. + +* `ssl_allowed_ciphers_list` ++ +The parameter is optional, and can be used to specify the allowed cipher list. The value is passed directly to the SSL toolkit. + +* `ssl_disable_SSLv2` + +`ssl_disable_SSLv3` + +`ssl_disable_TLSv1` + +`ssl_disable_TLSv1_1` + +`ssl_disable_TLSv1_2` ++ +The usage of a specific SSL/TLS version can be disabled by setting the parameter to `_"yes"_`. Please note that the available SSL/TLS versions are depends of the used OpenSSL library. + +== The `AbstractSocket` API + +In the derived test port the following functions can be used: + +[[map-unmap-the-test-port]] +=== Map/Unmap the Test Port + +In the `user_map` and `user_unmap` functions of the derived test port these functions should be called: + +[source] +---- +void map_user(); + +void unmap_user(); +---- + +=== Setting Test Port Parameters + +[source] +---- +bool parameter_set(const char __parameter_name, const char __parameter_value); +---- + +Call this function in the `set_parameter` function of the derived test port to set the test port parameters of AbstractSocket. + +=== Open a Listening Port + +To open a server socket call the following function: + +[source] +---- +int open_listen_port(const char* localHostname, const char* localService); +---- + +This function supports both IPv4 and IPv6 addresses. The parameter `localHostname` should specify the local hostname. It can be the name of the host or an IP address. The parameter `localService` should be a string containing the port number. One of the two parameters can be `_NULL_`, meaning `_ANY_` for that parameter. The address family used is specified either by the `ai_family_name()` testport parameter or set by the function `set_ai_family(int)`. + +The following function only supports IPv4: + +`int open_listen_port(const struct sockaddr_in & localAddr);` + +NOTE: This function is deprecated. It is kept for compatibility with previous versions of test ports that use `AbstractSocket` + +After calling the `open_listen_port` function, the function virtual void `listen_port_opened(int port_number)` is called automatically with the listening port number, or `_-1_` if the opening of the listening port failed. This function can be overridden in the derived test port to implement specific behavior depending on the listen result. This can, for example, call `incoming_message` to generate an incoming `ListenResult` message in the test port. + +Subsequent calls of the function `open_listen_port` results in closing the previous listening port and opening a new one. This means that only one server port is supported by `AbstractSocket`. + +When a client connects to the listening port the following functions are called to notify the derived test port about the new client connection: + +[source] +---- +virtual void peer_connected(int client_id, const char * host, const int port) +virtual void peer_connected(int client_id, sockaddr_in& remote_addr); +---- + +Only one of these functions should be overridden in the derived test port. Note, that the second is obsolete. It is kept for backward compatibility only. + +Similar functions for client disconnects: + +[source] +---- +virtual void peer_disconnected(int client_id); +virtual void peer_half_closed(int client_id); +---- + +The `client_id` parameter specifies which client has disconnected/half closed. The `peer_half_closed` function is called when the client closes the socket for writing, while `peer_disconnected` is called when the client is disconnected. Both functions can be overridden in the derived test port. + +=== Close the Listening Port + +`void close_listen_port()` + +This function closes the listening port. + +=== Open a Client Connection + +[source] +---- +int open_client_connection(const char* remoteHostname, const char* remoteService, const char* localHostname, const char* localService); +---- + +This function creates an IPv4 or IPv6 connection from the local address `localHostname/localService` to the remote address `remoteHostname/remoteService`. + +If `localHostname` or `localService` is `_NULL_`, it will be assigned automatically. + +The parameters for the remote address cannot be `_NULL_`. The local or remote service parameters should be numbers in string format, while the addresses should be names or IP addresses in IPv4 or IPv6 format. + +The `open_client_connection` function above makes the following function obsolete: + +[source] +---- +int open_client_connection(const struct sockaddr_in & new_remote_addr, const struct sockaddr_in & new_local_addr) +---- + +It is kept for backward compatibility for derived test ports that were not adapted to the IPv6 supporting function. + +After calling the `open_client_connection` function, AbstractSocket calls automatically the function `virtual void client_connection_opened(int client_id)` to inform the test port about the result. The `client_id` parameter is set to the id of the client, or `_-1_` if the connection could not be established to the remote address. This function can be overridden in the derived test port. + +=== Send Message + +[source] + +void send_outgoing(const unsigned char* message_buffer, int length, int client_id = -1); + +With this function a message can be sent to the specified client. + +==== To Receive a Message + +When a message is received, the following function is called automatically: + +[source] +---- +virtual void message_incoming(const unsigned char* message_buffer, int length, int client_id = -1) +---- + +This function must be overridden in the derived test port. To generate an incoming TTCN3 message, the test port shall call the `incoming_message` function of the Titan API within this function. + +In order that this function could be called automatically, the derived test port shall define these functions: + +[source] +---- +virtual void Handler_Install(const fd_set* read_fds, const fd_set* write_fds, const fd_set* error_fds, double call_interval); +virtual void Handler_Uninstall(); +---- + +In `Handler_Install` the `Install_Handler` Titan API function is called. + +Also in the `Event_Handler` Titan API function, the function + +[source] +---- +void Handle_Event(const fd_set *read_fds, const fd_set __write_fds, const fd_set __error_fds, double time_since_last_call) +---- +is called. + +=== Close a Client Connection + +[source] +---- +virtual void remove_client(int client_id); +virtual void remove_all_clients(); +---- + +The first closes the connection for a given client the second function closes the connection of all clients. + +=== Test Port Parameter Names + +The default AbstractSocket test port parameter names can be redefined in the derived test port by overriding the appropriate function below: + +[source] +---- +virtual const char* local_port_name(); +virtual const char* remote_address_name(); +virtual const char* local_address_name(); +virtual const char* remote_port_name(); +virtual const char* ai_family_name(); +virtual const char* use_connection_ASPs_name(); +virtual const char* halt_on_connection_reset_name(); +virtual const char* client_TCP_reconnect_name(); +virtual const char* TCP_reconnect_attempts_name(); +virtual const char* TCP_reconnect_delay_name(); +virtual const char* server_mode_name(); +virtual const char* socket_debugging_name(); +virtual const char* nagling_name(); +virtual const char* use_non_blocking_socket_name(); +virtual const char* server_backlog_name(); +virtual const char* ssl_disable_SSLv2(); +virtual const char* ssl_disable_SSLv3(); +virtual const char* ssl_disable_TLSv1(); +virtual const char* ssl_disable_TLSv1_1(); +virtual const char* ssl_disable_TLSv1_2(); +---- + +=== Parameter Accessor Functions + +The following functions can be use to get/set the AbstractSocket parameters: + +[source] +---- +bool get_nagling() const +bool get_use_non_blocking_socket() const +bool get_server_mode() const +bool get_socket_debugging() const +bool get_halt_on_connection_reset() const +bool get_use_connection_ASPs() const +bool get_handle_half_close() const +int set_non_block_mode(int fd, bool enable_nonblock); +bool increase_send_buffer(int fd, int &old_size, int& new_size); +const char* get_local_host_name() +const unsigned int get_local_port_number() +const char* get_remote_host_name() +const unsigned int get_remote_port_number() +const int& get_ai_family() const +void set_ai_family(int parameter_value) +bool get_ttcn_buffer_usercontrol() const +void set_nagling(bool parameter_value) +void set_server_mode(bool parameter_value) +void set_handle_half_close(bool parameter_value) +void set_socket_debugging(bool parameter_value) +void set_halt_on_connection_reset(bool parameter_value) +void set_ttcn_buffer_usercontrol(bool parameter_value) +---- + +=== Logging Functions + +The following functions log a given message in different ways: + +[source] +---- +void log_debug(const char *fmt, …) const +void log_warning(const char *fmt, …) const +void log_error(const char *fmt, …) const +void log_hex(const char __prompt, const unsigned char __msg, size_t length) const; +---- + +=== Error Reporting + +[source] +---- +virtual void report_error(int client_id, int msg_length, int sent_length, const unsigned char* msg, const char* error_text); +---- + +This function is called automatically if an error occurs during send operation in `AbstractSocket`. This function can be overridden in the derived test port to override the default error reporting behavior of `AbstractSocket`, which is calling the `log_error` function. This function can also be called by the derived test port to initiate the error reporting mechanism. + += Tips and Tricks + +== Usage + +In order to build a test port based on `Abstract_Socket` the following steps must be completed: + +1. Deriving the test port class (see <>) +2. Implementation of the logger functions if needed (see <>) +3. Function translations (see <>) +4. Installing the handlers (see <>) +5. Final steps (see <>) + +These steps are discussed in detail in the following subsections. + +[[deriving_the_test_port_class]] +=== Deriving the Test Port Class + +Inherit your test port class beside the test port base also from the `Abstract_Socket` class, if you do not want to use SSL at all. If you plan to use SSL, inherit the test port from the `SSL_Socket` class. In case your SSL implementation is just optional, you have to make sure that it is possible to disable SSL related code parts at compile time. In the AS if the `AS_USE_SSL` macro is defined, then SSL is enabled, otherwise disabled. + +Example: + +[source] +---- +#ifdef AS_USE_SSL +class myport__PT : public SSL_Socket, public myport__PT_BASE { +#else +class myport__PT : public Abstract_Socket, public myport__PT_BASE { +#endif +---- + +[[implementation_of_the_logger_functions]] +=== Implementation of the Logger Functions + +Implement the `log_debug`, `log_error`, `log_warning` and `log_hex` virtual functions if you need other implementation than the default. (they can be empty implementations if logging is not needed) + +[width="100%",cols="20%,80%",options="header",] +|=============================================================== +|Function |Description +|`log_debug` |does the debug-logging +|`log_hex` |does the logging of the message content in hex format +|`log_warning` |does the logging of warning messages +|`log_error` |is expecting the test port to stop with a TTCN_ERROR +|=============================================================== + +You can use the logger functions implemented in the AS. In this case you have to call the AS constructor with your test port type and name. In this way the AS will log messages acting like your test port. + +[[function_translations]] +=== Function Translations + +Translate the port's functions to the socket's functions. By translating we mean a function call with unchanged parameters like this: + +[source] +---- +void myport__PT::set_parameter(const char *parameter_name, + const char* parameter_value) { + parameter_set(parameter_name ,parameter_value); +} +---- + +The list of functions to be translated: + +[cols=",",options="header",] +|==================================== +|Port functions: |Socket functions: +|`set_parameter` |`parameter_set` +|`Handle_Fd_Event` |`Handle_Socket_Event` +|`Handle_Timeout` |`Handle_Timeout_Event` +|`user_map` |`map_user` +|`user_unmap` |`unmap_user` +|==================================== + +If you might need other functions also to be performed during `map`, `unmap` or `set_parameter`, you can add them right after the socket's function calls. + +Example: + +[source] +---- +void myport__PT::set_parameter(const char *parameter_name, + const char *parameter_value) + { + parameter_set(parameter_name ,parameter_value); + if(strcmp(parameter_name,"dallas_addr") == 0){ + destHostId = getHostId(parameter_value); + destAddr.sin_family = AF_INET; + destAddr.sin_addr.s_addr = htonl(destHostId); + return; + } + } +---- + +The translation of the `outgoing_send` to `send_outgoing` function needs some parameter formatting since the `outgoing_send` has parameters inherited from your TTCN-3 structures, while `Abstract_Socket`'s `outgoing_send` has parameters as ``(char* message, int messageLength, int client_id)``. + +The same applies for the incoming function calls where you have to write your own `message_incoming` to `incoming_message` translation. + +Example: + +[source] +---- +void myport__PT::outgoing_send(const TTCN3__Structure& send_par) +{ + if(send_par.client__id().ispresent()) { + send_outgoing((char*)(const unsigned char*)send_par.data(), + send_par.data().lengthof(), send_par.client__id()()); + } else { + send_outgoing((char*)(const unsigned char*)send_par.data(), + send_par.data().lengthof()); + } +} +---- + +[[functions_for_manipulating_the_set_of_events_for_which_the_port_waits]] +=== Functions for Manipulating the Set of Events for Which the Port Waits + +Add the following (virtual) member functions to your port (class definition) unchanged: + +[source] +---- +void Add_Fd_Read_Handler(int fd) { Handler_Add_Fd_Read(fd); } +void Add_Fd_Write_Handler(int fd) { Handler_Add_Fd_Write(fd); } +void Remove_Fd_Read_Handler(int fd) { Handler_Remove_Fd_Read(fd); } +void Remove_Fd_Write_Handler(int fd) { Handler_Remove_Fd_Write(fd); } +void Remove_Fd_All_Handlers(int fd) { Handler_Remove_Fd(fd); } +void Handler_Uninstall() { Uninstall_Handler(); } +void Timer_Set_Handler(double call_interval, boolean is_timeout = TRUE, + boolean call_anyway = TRUE, boolean is_periodic = TRUE) { + Handler_Set_Timer(call_interval, is_timeout, call_anyway, is_periodic); +} +---- + +NOTE: These member functions are required and used by Abstract Socket. They are defined in Abstract Socket as virtual and are to be overridden in the descendant Test Port class. They are implemented in the (Test Port) class definition only for the sake of simplicity.) + +[[final_steps]] +=== Final Steps + +Finally, the function definitions must be added to the header file accordingly. Then, you are ready to go ahead and develop your test port. + +[[using-ttcn-buffer-in-test-ports]] +== Using `TTCN_Buffer` in Test Ports + +The Abstract Socket uses a `TTCN_Buffer` <<_2, [2]>> to store incoming message portions. If the test port also would like to store incoming messages, here is a description how to do that: + +The test port can access the `TTCN_Buffer` with `get_buffer`() and can operate on it. If the test port uses the buffer to store data, it must set the `ttcn_buffer_usercontrol` variable to `_true_`, so that the AS will not clear the buffer content. + +In this case the test port can use the buffer in the following ways: + +* `get_buffer`() to fetch the `TTCN_Buffer` associated with the client +* Optionally modify content; or wait for complete TLV +* Once a message portion is sent to the TTCN-3 test suite, cut the sent message from the buffer because the AS will not do that. In case the test port simply passed the message to the test suite and uses no storage of it (e.g. TCP Test Port), it can leave `ttcn_buffer_usercontrol` in false (which is the default value) so that the AS will take care of buffer cleanups. + +== Using SSL on Top of a TCP Connection + +SSL can be used on top of the TCP connection. The authentication mode can be configured via a test port parameter. + +=== Server Mode + +In server mode, first a TCP socket is created. The server starts to listen on this port (upon the `user_map`() operation or in case of connection ASPs, calling the `open_listen_port`() operation). Once a TCP connect request is received, the TCP connection is set up. After this the SSL handshake begins. The SSL is mapped to the file descriptor of the TCP socket. The BIO, which is an I/O abstraction that hides many of the underlying I/O details from an application, is automatically created by OpenSSL inheriting the characteristics of the socket (non-blocking mode). The BIO is completely transparent. The server always sends its certificate to the client. If configured so, the server will request the certificate of the client and check if it is a valid certificate. If not, the SSL connection is refused. If configured not to verify the certificate, the server will not request it from the client and the SSL connection is accepted. If usage of the SSL session resumption is enabled and the client refers to a previous SSL session, the server will accept it, unless it is not found in the SSL context cache. Once the connection is negotiated, data can be sent/received. The SSL connection is shut down using an `unmap`() operation. The shutdown process does not follow the standard: the server simply shuts down and does not expect any acknowledgement from the client. + +Clients connected to the server are distinguished with their file descriptor numbers. When a message is received, the file descriptor number is also passed, so the client can be identified. + +=== Client Mode + +In client mode, first a TCP connection is requested to the server (upon the `user_map`() operation or in case of connection ASPs, calling the `open_client_connection`() operation). Once it is accepted, the SSL endpoint is created. If configured so, the client tries to use the SSL session Id from the previous connection, if available (e.g. it is not the first connection). If no SSL session Id is available, or the server does not accept it, a full handshake is performed. If configured so, the certificate of the server is verified. If the verification fails, the SSL connection is interrupted by the client. If no verification required, the received certificate is still verified, however the result does not affect the connection even though it failed. + +=== Authentication Flow + +In summary, the authentication is done according to this flow: + +* ssl handshake begins (new client tries to connect) +* `virtual int ssl_verify_certificates_at_handshake(int preverify_ok, X509_STORE_CTX *ssl_ctx)` is called. During this handshake you can perform additional authentication. +* If the connection is accepted, the SSL handshake is finished and SSL is established. Now the function virtual `bool ssl_verify_certificates`() is called where you may perform other authentication if you want. + +`ssl_verify_certificates`() is a virtual function. It is called after the SSL connection is up. Test ports may use it to check other peer's certificate and do actions. If the return value is 0, then the SSL connection is closed. In case of client mode, the test port exits with an error (`*verification_error*`). In server mode the test port just removes client data, but keeps running. + +== Adapting Derived Test Ports to Support IPv6 + +Derived test ports should be updated in the following way to support IPv4 and IPv6: + +All calls of functions + +[source] +---- +const struct sockaddr_in & get_remote_addr() +const struct sockaddr_in & get_local_addr() +---- + +should be removed. They can be replaced by calling these functions: + +[source] +---- +virtual const char* local_port_name(); +virtual const char* local_address_name(); +virtual const char* remote_port_name(); +virtual const char* remote_address_name(); +---- + +The function `int open_listen_port(const struct sockaddr_in & localAddr);` does not support IPv6. The function below should be used instead: + +`int open_listen_port(const char* localHostname, const char* localServicename);` + +The same has to be done for the `open_client_connection` function. Replace any call of the function + +[source] +int open_client_connection(const struct sockaddr_in & new_remote_addr, const struct sockaddr_in & new_local_addr) + + +with the function: + +[source] +---- +int open_client_connection(const char* remoteHostname, const char* remoteService, const char* localHostname, const char* localService); +---- + +If the following callback function is overridden in the derived test port: + +[source] +---- +virtual void peer_connected(int client_id, sockaddr_in& remote_addr); +---- + +it should be removed and the following function should be overridden instead: + +[source] +---- +virtual void peer_connected(int client_id, const char * host, const int port) +---- + +The following function should not be used: + +`void get_host_id(const char* hostName, struct sockaddr_in *addr)` + +The socket API function `getaddrinfo` should be used instead. + += Error Messages + +== Error Messages In Case TCP Connections Are Used + +`*Parameter value not recognized for parameter *` + +The specified `` in the runtime configuration file is not recognized for the parameter . + +`*Invalid input as TCP_reconnect_attempts counter given: *` + +The specified `` in the runtime configuration file must be a positive whole number. + +`*TCP_reconnect_attempts must be greater than 0, is given*` + +The specified `` for `TCP_reconnect_attempts` in the runtime configuration file must be greater than `_0_`. + +`*Invalid input as TCP_reconnect_delay given: *` + +The specified `` for the `TCP_reconnect_delay` parameter in the runtime configuration file must be a whole number not less than `_0_`. + +`*TCP_reconnect_delay must not be less than 0, is given*` + +The specified `` for the `TCP_reconnect_delay` parameter in the runtime configuration file must be a whole number not less than `_0_`. + +`*Invalid input as port number given: *` + +The specified `` in the runtime configuration file is cannot be interpreted as a valid port number (e.g. string is given). + +`*Port number must be between 0 and 65535, is given*` + +The specified `` in the runtime configuration file is cannot be interpreted as a valid port number. Port numbers must be in the range 0..65535. + +`*Invalid input as server backlog given: *` + +The specified `` in the runtime configuration file is cannot be interpreted as a valid server backlog number (e.g. string is given). + +`*Cannot accept connection at port*` + +Connection could not be accepted on TCP socket. + +`*Error when reading the received TCP PDU*` + +System error occurred during reading from the TCP socket. + +`*Cannot open socket*` + +Creation of the listener socket failed. + +`*Setsockopt failed*` + +Setting of socket options failed. + +`*Cannot bind to port*` + +Binding of a socket to a port failed. + +`*Cannot listen at port*` + +Listen on the listener socket failed. + +`*getsockname() system call failed on the server socket*` + +The query of the listening port number failed. + +`*AbstractSocket: getnameinfo: *` + +The `getnameinfo` function returned an error. + +`*getaddrinfo: for host service *` + +The `getaddrinfo` function returned an error. + +`*Malformed message: invalid length: . The length should be at least .*` + +The message received contains invalid length information. + +`*Already tried times, giving up*` + +The deadlock counter exceeds the hard coded limit when trying to connect to a server in client mode. When connecting on a socket, sometimes it is unsuccessful. The next try usually solves the problem and the connection will be successfully accepted. The test port retries to connect as a workaround. The number of tries however limited to avoid hanging the test port. + +Different operating systems behave in a different way. This problem is rare on Solaris, Unix and Linux systems, but much more often on Cygwin. + +`*Cannot connect to server*` + +Connection to a server on TCP failed. + +`*Connection was interrupted by the other side*` + +The TCP or SSL connection was refused by the other peer, or broken. + +`*Client Id not specified although not only 1 client exists*` + +It should never show up. + +`*There is no connection alive, use the `ASP_TCP_Connect' before sending anything.*` + +An attempt was made by the test port to send data before setting up any connection. The `open_client_connection` function has to be called before sending any data. + +`*Send system call failed: There is no client connected to the TCP server*` + +A send operation is performed to a non-existing client. + +`*Send system call failed: bytes were sent instead of *` + +The send operation failed. + +`* is not defined in the configuration file*` + +The test port parameter is not defined in the runtime configuration file, although its presence is mandatory (or conditional and the condition is true). + +`*The host name is not valid in the configuration file*` + +The host name specified in the configuration file could not be resolved. + +`*Number of clients<>0 but cannot get first client, programming error*` + +It should never show up. + +`*Index exceeds length of peer list*` + +It should never show up. + +`*Abstract_Socket::get_peer: Client does not exist*` + +It should never show up. + +`*Invalid Client Id is given: *` + +It should never show up. + +`*Peer does not exist*` + +It should never show up. + +`*Set blocking mode failed.*` + +Test port could not set socket option: `O_NONBLOCK` + +== Additional Error Messages In Case SSL Connections Are Used + +Apart from the previously mentioned error messages, the following messages are used in case SSL is used: + +`*No SSL CTX found, SSL not initialized*` + +It should never show up. + +`*Creation of SSL object failed*` + +Creation of the SSL object is failed. + +`*Binding of SSL object to socket failed*` + +The SSL object could not be bound to the TCP socket. + +`*SSL error occurred*` + +A general SSL error occurred. Check the test port logs to see previous error messages showing the real problem. + +`* is not defined in the configuration file although =yes*` + +[source] +: ssl_trustedCAlist_file_name(), : ssl_verifycertificate_name() + +`*No SSL data available for client *` + +It should never show up. + +`*Could not read from /dev/urandom*` + +The read operation on the installed random device is failed. + +`*Could not read from /dev/random*` + +The read operation on the installed random device is failed. + +`*Could not seed the Pseudo Random Number Generator with enough data*` + +As no random devices found, a workaround is used to seed the SSL PRNG. The seeding failed. + +`*SSL method creation failed*` + +The creation of the SSL method object failed. + +`*SSL context creation failed*` + +The creation of the SSL context object failed. + +`*Can't read certificate file*` + +The specified certificate file could not be read. + +`*Can't read key file*` + +The specified private key file could not be read. + +`*Can't read trustedCAlist file*` + +The specified certificate of the trusted CAs file could not be read. + +`*Cipher list restriction failed for *` + +The specified cipher restriction list could not be set. + +`*Activation of SSL session resumption failed on server*` + +The activation of the SSL session resumption on the server failed. + +`*Unknown SSL error code *` + +It should never show up. + += Warning Messages + +== Warning Messages In Case TCP Connections Are Used + +`*Error when reading the received TCP PDU*` + +The received TCP PDU cannot be read. + +`*connect() returned error code EADDRINUSE. Perhaps this is a kernel bug. Trying to connect again.*` + +When connecting on a socket, sometimes it is unsuccessful. The next try usually solves the problem and the connection will be successfully accepted. The test port retries to connect as a workaround. The number of tries however limited to avoid hanging the test port. + +Different operating systems behave in a different way. This problem is rare on Solaris, Unix and Linux systems, but much more often on Cygwin. + +`*Connect() returned error code , trying to connect again (TCP reconnect mode)*` + +When connecting on a socket, sometimes it is unsuccessful and the given error code was returned. The next try usually solves the problem and the connection will be successfully accepted. The test port retries to connect as a workaround. + +`*TCP connection was interrupted by the other side, trying to reconnect again.*` + +The TCP or SSL connection was refused by the other peer, or it was broken. The test port tries to reconnect again. + +`*TCP reconnect successfully finished.*` + +This warning message is given if the reconnection was successful. + +`*Parameter has no meaning if use_connection_ASPs is used.*` + +There is no effect of setting this parameter when `use_connection_ASPs` is set to `_"yes"_`. + +`*Abstract_Socket::remove_client: is the server listening port, can not be removed!*` + +The `client_id` given in the `remove_client` function is currently used as the server’s listening port, it can not be removed. To close the server listening port, use the `close_listen_port` function. + +`*Client has not been removed, programming error*` + +It should never show up. + +`*Sending data on file descriptor .The sending operation would block execution. The size of the outgoing buffer was increased from to bytes.*` + +When the Abstract Socket is used with non-blocking socket, if the sending operation would block, first the size of the sending buffer is increased. This is the first step to avoid TCP deadlock. In the second step the Test Port will try to receive some data. + +`*Sending data on file descriptor .The sending operation would block execution and it is not possible to further increase the size of the outgoing buffer. Trying to process incoming data to avoid deadlock.*` + +When the Abstract Socket is used with non-blocking socket, if the sending operation would block, and the size of the outgoing buffer cannot be increased, the Test Port tries to receive some data to avoid deadlock. + +`*System call fcntl(F_GETFL) failed on file descriptor %d.*` + +`*System call fcntl(F_SETFL) failed on file descriptor %d.*` + +`*Setsockopt failed when trying to open the listen port: *` + +The `setsockopt` function failed. + +`*Cannot bind to port when trying to open the listen port: *` + +The bind system call failed. + +`*Cannot listen at port when trying to open the listen port: *` + +The listen system call failed. + +`*getsockname() system call failed on the server socket when trying to open the listen port: *` + +The getsockname system call failed. + +`*getaddrinfo: for host service *` + +The getaddrinfo system call failed. + +`*getnameinfo() system call failed on the server socket when trying to open the listen port: *` + +The getnameinfo system call failed. + +`*Cannot open socket when trying to open client connection: *` + +The socket system call failed. + +`*Setsockopt failed when trying to open client connection: *` + +The setsockopt system call failed. + +`*Cannot bind to port when trying to open client connection: *` + +The bind system call failed. + +`*Already tried times, giving up when trying to open client connection: *` + +The deadlock counter exceeds the hard coded limit when trying to connect to a server in client mode. When connecting on a socket, sometimes it is unsuccessful. The next try usually solves the problem and the connection will be successfully accepted. The test port retries to connect as a workaround. The number of tries however limited to avoid hanging the test port. + +Different operating systems behave in a different way. This problem is rare on Solaris, Unix and Linux systems, but much more often on Cygwin. + +[[warning_messages_in_case_SSL_connections_are_used]] +== Warning Messages In Case SSL Connections Are Used + +`*Warning: race condition while setting current client object pointer.*` + +The current client object pointer is already set. + +`*Connection from client is refused*` + +The connection from a client is refused in the server. + +`*Connection to server is refused*` + +The connection from the client is refused by the server. + +`*Server did not send a session ID*` + +The SSL server did not send a session ID. + +`*Verification failed*` + +The verification of the other side is failed. The connection will be shut down. + +`*SSL object not found for client *` + +It should never show up. + +`*SSL_Socket::receive_message_on_fd: SSL connection was interrupted by the other side*` + +The TLS/SSL connection has been closed. If the protocol version is SSL 3.0 or TLS 1.0, this warning appears only if a closure alert has occurred in the protocol, i.e. if the connection has been closed cleanly. Note that in this case it does not necessarily indicate that the underlying transport has been closed. + +`*Other side does not have certificate*` + +The other side of the SSL connection does not have a certificate. + +`*Solaris patches to provide random generation devices are not installed*` + +Solaris patches to provide random generation devices are not installed. A workaround will be used to seed the PRNG. + +`*Private key does not match the certificate public key*` + +The private key specified for the test port does not match with the public key. + += Terminology + +*Sockets:* + +The socket is a method for communication between a client program and a server program in a network. A socket is defined as "the endpoint in a connection". Sockets are created and used with a set of programming requests or "function calls" sometimes called the sockets application programming interface (API). The most common socket API is the Berkeley UNIX C language interface for sockets. Sockets can also be used for communication between processes within the same computer. + +*Blocking and non-blocking sockets:* + +Using a blocking socket, some socket operations (send, receive, connect, accept) will block until the operation is finished or an error occurs. Using a non-blocking socket, these operations will never block but return with an error and set `errno` to the appropriate value. + +*OpenSSL:* + +The OpenSSL Project is a collaborative effort to develop a robust, commercial-grade, full-featured, and open source toolkit implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) protocols as well as a full-strength general purpose cryptography library. For more information on the OpenSSL project see <<_3, [3]>> + += Abbreviations + +AS:: Abstract Socket + +ASP:: Abstract Service Primitive + +IPv4:: Internet Protocol version 4 + +IPv6:: Internet Protocol version 6 + +PEM:: Privacy Enhanced Mail + +RTE:: Run-Time Environment + +SSL:: Secure Sockets Layer + +SUT:: System Under Test + +TCP:: Transmission Control Protocol + +TLS:: Transport Layer Security + +TTCN-3:: Testing and Test Control Notation version 3 + += References + +[[_1]] +[1] ETSI ES 201 873-1 (2002) + +The Testing and Test Control Notation version 3. Part 1: Core Language + +[[_2]] +[2] User Guide for TITAN TTCN–3 Test Executor + +[[_3]] +[3] OpenSSL toolkit + + http://www.openssl.org diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_1551.pdf b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_1551.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d34138f4441545ce0db1c76eb49b886cd783eed6 --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_1551.pdf @@ -0,0 +1,25084 @@ +%PDF-1.3 +% +1 0 obj +<< /Title (Abstract Socket Test Port for TTCN-3 Toolset with TITAN, Description) +/Author +/Creator (Asciidoctor PDF 1.5.0.alpha.16, based on Prawn 2.2.2) +/Producer +/ModDate (D:20180803135149+02'00') +/CreationDate (D:20180803135149+02'00') +>> +endobj +2 0 obj +<< /Type /Catalog +/Pages 3 0 R +/Names 16 0 R +/Outlines 290 0 R +/PageLabels 353 0 R +/PageMode /UseOutlines +/OpenAction [7 0 R /FitH 842.89] +/ViewerPreferences << /DisplayDocTitle true +>> +>> +endobj +3 0 obj +<< /Type /Pages +/Count 31 +/Kids [7 0 R 10 0 R 12 0 R 14 0 R 32 0 R 40 0 R 47 0 R 56 0 R 64 0 R 68 0 R 70 0 R 73 0 R 78 0 R 81 0 R 87 0 R 92 0 R 95 0 R 109 0 R 113 0 R 117 0 R 123 0 R 129 0 R 132 0 R 137 0 R 139 0 R 142 0 R 144 0 R 148 0 R 150 0 R 153 0 R 158 0 R] +>> +endobj +4 0 obj +<< /Length 2 +>> +stream +q + +endstream +endobj +5 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 4 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +>> +endobj +6 0 obj +<< /Length 834 +>> +stream +q +/DeviceRGB cs +0.6 0.6 0.6 scn +/DeviceRGB CS +0.6 0.6 0.6 SCN + +BT +84.6338 361.6965 Td +/F1.0 27 Tf +[<4162737472> 20.0195 <61637420536f636b> 20.0195 <65742054> 29.7852 <65737420506f727420666f72205454> 20.0195 <434e2d33>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6 0.6 0.6 scn +0.6 0.6 0.6 SCN + +BT +139.9568 327.6765 Td +/F1.0 27 Tf +[<54> 29.7852 <6f6f6c736574207769746820544954> 60.0586 <414e2c204465736372697074696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.0941 0.0941 0.0941 scn +0.0941 0.0941 0.0941 SCN + +BT +469.014 293.2049 Td +/F1.0 13 Tf +<4787626f7220537a616c6169> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +323.2733 263.3914 Td +/F1.0 10.5 Tf +[<56> 60.0586 <657273696f6e20313535312d434e4c20313133203338342c20526576> 69.8242 <2e20412c20323031352d30312d3230>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q + +endstream +endobj +7 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 6 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +>> +>> +>> +endobj +8 0 obj +<< /Type /Font +/BaseFont /3a0e86+NotoSerif +/Subtype /TrueType +/FontDescriptor 355 0 R +/FirstChar 32 +/LastChar 255 +/Widths 357 0 R +/ToUnicode 356 0 R +>> +endobj +9 0 obj +<< /Length 27952 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 782.394 Td +/F2.0 22 Tf +[<54> 29.7852 <61626c65206f6620436f6e74656e7473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 751.856 Td +/F1.0 10.5 Tf +<41626f7574205468697320446f63756d656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +161.0311 751.856 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 751.856 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 751.856 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 733.376 Td +/F1.0 10.5 Tf +<486f7720746f2052656164205468697320446f63756d656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +203.7871 733.376 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 733.376 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 733.376 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 714.896 Td +/F1.0 10.5 Tf +<50726573756d6564204b6e6f776c65646765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +171.7201 714.896 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 714.896 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 714.896 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 696.416 Td +/F1.0 10.5 Tf +<46756e6374696f6e616c697479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +118.2751 696.416 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 696.416 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 696.416 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 677.936 Td +/F1.0 10.5 Tf +[<53> 20.0195 <797374656d20526571756972656d656e7473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +171.7201 677.936 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 677.936 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 677.936 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 659.456 Td +/F1.0 10.5 Tf +<46756e64616d656e74616c20436f6e6365707473> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +177.0646 659.456 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 659.456 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 659.456 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 640.976 Td +/F1.0 10.5 Tf +<4d6f64756c6520537472756374757265> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +161.0311 640.976 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 640.976 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 640.976 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 622.496 Td +/F1.0 10.5 Tf +<53746172742050726f636564757265> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +139.6531 622.496 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 622.496 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 622.496 Td +/F1.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 604.016 Td +/F1.0 10.5 Tf +<436f6e6e656374696f6e2041535073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +161.0311 604.016 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 604.016 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 604.016 Td +/F1.0 10.5 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 585.536 Td +/F1.0 10.5 Tf +<536572766572204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +139.6531 585.536 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 585.536 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 585.536 Td +/F1.0 10.5 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 567.056 Td +/F1.0 10.5 Tf +<436c69656e74204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +134.3086 567.056 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 567.056 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 567.056 Td +/F1.0 10.5 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 548.576 Td +/F1.0 10.5 Tf +<53656e64696e672f526563656976696e67204d65737361676573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +203.7871 548.576 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 548.576 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 548.576 Td +/F1.0 10.5 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 530.096 Td +/F1.0 10.5 Tf +<4c6f6767696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +102.2416 530.096 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 530.096 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 530.096 Td +/F1.0 10.5 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 511.616 Td +/F1.0 10.5 Tf +<4572726f722048616e646c696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +139.6531 511.616 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 511.616 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 511.616 Td +/F1.0 10.5 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 493.136 Td +/F1.0 10.5 Tf +<436c6f73696e6720446f776e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +128.9641 493.136 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 493.136 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 493.136 Td +/F1.0 10.5 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 474.656 Td +/F1.0 10.5 Tf +<4950763620537570706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +128.9641 474.656 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 474.656 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 474.656 Td +/F1.0 10.5 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 456.176 Td +/F1.0 10.5 Tf +<53534c2046756e6374696f6e616c697479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +150.3421 456.176 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 456.176 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 456.176 Td +/F1.0 10.5 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 437.696 Td +/F1.0 10.5 Tf +<436f6d70696c6174696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +134.3086 437.696 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 437.696 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 437.696 Td +/F1.0 10.5 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 419.216 Td +/F1.0 10.5 Tf +[<41> 20.0195 <757468656e7469636174696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +150.3421 419.216 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 419.216 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 419.216 Td +/F1.0 10.5 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 400.736 Td +/F1.0 10.5 Tf +[<4f746865722046> 40.0391 <65617475726573>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +150.3421 400.736 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 400.736 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 400.736 Td +/F1.0 10.5 Tf +<34> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 382.256 Td +/F1.0 10.5 Tf +<4c696d69746174696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +134.3086 382.256 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 382.256 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 382.256 Td +/F1.0 10.5 Tf +<34> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 363.776 Td +/F1.0 10.5 Tf +[<5468652054> 29.7852 <65737420506f7274>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +118.2751 363.776 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 363.776 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 363.776 Td +/F1.0 10.5 Tf +<34> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 345.296 Td +/F1.0 10.5 Tf +<4f76657276696577> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +112.9306 345.296 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 345.296 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 345.296 Td +/F1.0 10.5 Tf +<34> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 326.816 Td +/F1.0 10.5 Tf +<496e7374616c6c6174696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +118.2751 326.816 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 326.816 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 326.816 Td +/F1.0 10.5 Tf +<35> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 308.336 Td +/F1.0 10.5 Tf +[<436f6e6669677572> 20.0195 <6174696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +134.3086 308.336 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 308.336 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 308.336 Td +/F1.0 10.5 Tf +<35> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 289.856 Td +/F1.0 10.5 Tf +[<4162737472> 20.0195 <61637420536f636b> 20.0195 <65742054> 29.7852 <65737420506f727420506172> 20.0195 <616d657465727320696e207468652054> 29.7852 <65737420506f727420436f6e6669677572> 20.0195 <6174696f6e2046696c65>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +433.6006 289.856 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 289.856 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 289.856 Td +/F1.0 10.5 Tf +<36> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 271.376 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +81.66 271.376 Td +/F3.0 10.5 Tf +<4162737472616374536f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +155.16 271.376 Td +/F1.0 10.5 Tf +<20415049> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +177.0646 271.376 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 271.376 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 271.376 Td +/F1.0 10.5 Tf +<39> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 252.896 Td +/F1.0 10.5 Tf +[<4d61702f556e6d6170207468652054> 29.7852 <65737420506f7274>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +203.7871 252.896 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 252.896 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 252.896 Td +/F1.0 10.5 Tf +<39> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 234.416 Td +/F1.0 10.5 Tf +[<53657474696e672054> 29.7852 <65737420506f727420506172> 20.0195 <616d6574657273>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +214.4761 234.416 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +540.4906 234.416 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.1705 234.416 Td +/F1.0 10.5 Tf +<39> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 215.936 Td +/F1.0 10.5 Tf +<4f70656e2061204c697374656e696e6720506f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +181.8841 215.936 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 215.936 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 215.936 Td +/F1.0 10.5 Tf +<3130> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 197.456 Td +/F1.0 10.5 Tf +<436c6f736520746865204c697374656e696e6720506f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +192.5731 197.456 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 197.456 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 197.456 Td +/F1.0 10.5 Tf +<3131> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 178.976 Td +/F1.0 10.5 Tf +<4f70656e206120436c69656e7420436f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +203.2621 178.976 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 178.976 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 178.976 Td +/F1.0 10.5 Tf +<3131> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 160.496 Td +/F1.0 10.5 Tf +<53656e64204d657373616765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +144.4726 160.496 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 160.496 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 160.496 Td +/F1.0 10.5 Tf +<3131> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 142.016 Td +/F1.0 10.5 Tf +<436c6f7365206120436c69656e7420436f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +203.2621 142.016 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 142.016 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 142.016 Td +/F1.0 10.5 Tf +<3132> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 123.536 Td +/F1.0 10.5 Tf +[<54> 29.7852 <65737420506f727420506172> 20.0195 <616d65746572204e616d6573>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +213.9511 123.536 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 123.536 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 123.536 Td +/F1.0 10.5 Tf +<3132> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 105.056 Td +/F1.0 10.5 Tf +[<506172> 20.0195 <616d657465722041> 20.0195 <63636573736f722046756e6374696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +224.6401 105.056 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 105.056 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 105.056 Td +/F1.0 10.5 Tf +<3133> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 86.576 Td +/F1.0 10.5 Tf +<4c6f6767696e672046756e6374696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +165.8506 86.576 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 86.576 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 86.576 Td +/F1.0 10.5 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 68.096 Td +/F1.0 10.5 Tf +<4572726f72205265706f7274696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +155.1616 68.096 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 68.096 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 68.096 Td +/F1.0 10.5 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q + +endstream +endobj +10 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 9 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +>> +>> +/Annots [164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R] +>> +endobj +11 0 obj +<< /Length 15934 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 794.676 Td +/F1.0 10.5 Tf +<5469707320616e6420547269636b73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +128.4391 794.676 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 794.676 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 794.676 Td +/F1.0 10.5 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 776.196 Td +/F1.0 10.5 Tf +<5573616765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +91.0276 776.196 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 776.196 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 776.196 Td +/F1.0 10.5 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 757.716 Td +/F1.0 10.5 Tf +[<4465726976696e67207468652054> 29.7852 <65737420506f727420436c617373>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +213.9511 757.716 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 757.716 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 757.716 Td +/F1.0 10.5 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 739.236 Td +/F1.0 10.5 Tf +<496d706c656d656e746174696f6e206f6620746865204c6f676765722046756e6374696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +278.0851 739.236 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 739.236 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 739.236 Td +/F1.0 10.5 Tf +<3135> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 720.756 Td +/F1.0 10.5 Tf +[<46756e6374696f6e205472> 20.0195 <616e736c6174696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +187.2286 720.756 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 720.756 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 720.756 Td +/F1.0 10.5 Tf +<3135> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 702.276 Td +/F1.0 10.5 Tf +[<46756e6374696f6e7320666f72204d616e6970756c6174696e672074686520536574206f66204576656e747320666f722057686963682074686520506f72742057> 49.8047 <61697473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +422.3866 702.276 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 702.276 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 702.276 Td +/F1.0 10.5 Tf +<3136> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 683.796 Td +/F1.0 10.5 Tf +<46696e616c205374657073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +128.4391 683.796 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 683.796 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 683.796 Td +/F1.0 10.5 Tf +<3137> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 665.316 Td +/F1.0 10.5 Tf +<5573696e6720> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +90.984 665.316 Td +/F3.0 10.5 Tf +<5454434e5f427566666572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +148.734 665.316 Td +/F1.0 10.5 Tf +[<20696e2054> 29.7852 <65737420506f727473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +213.9511 665.316 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 665.316 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 665.316 Td +/F1.0 10.5 Tf +<3137> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 646.836 Td +/F1.0 10.5 Tf +[<5573696e672053534c206f6e2054> 29.7852 <6f70206f6620612054> 20.0195 <435020436f6e6e656374696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +251.3626 646.836 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 646.836 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 646.836 Td +/F1.0 10.5 Tf +<3137> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 628.356 Td +/F1.0 10.5 Tf +<536572766572204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +139.1281 628.356 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 628.356 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 628.356 Td +/F1.0 10.5 Tf +<3138> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 609.876 Td +/F1.0 10.5 Tf +<436c69656e74204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +133.7836 609.876 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 609.876 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 609.876 Td +/F1.0 10.5 Tf +<3138> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +72.24 591.396 Td +/F1.0 10.5 Tf +[<41> 20.0195 <757468656e7469636174696f6e20466c6f77>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +176.5396 591.396 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 591.396 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 591.396 Td +/F1.0 10.5 Tf +<3138> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 572.916 Td +/F1.0 10.5 Tf +[<41> 20.0195 <64617074696e6720446572697665642054> 29.7852 <65737420506f72747320746f20537570706f72742049507636>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +283.4296 572.916 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 572.916 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 572.916 Td +/F1.0 10.5 Tf +<3139> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 554.436 Td +/F1.0 10.5 Tf +<4572726f72204d65737361676573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +128.4391 554.436 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 554.436 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 554.436 Td +/F1.0 10.5 Tf +<3230> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 535.956 Td +/F1.0 10.5 Tf +[<4572726f72204d6573736167657320496e20436173652054> 20.0195 <435020436f6e6e656374696f6e73204172652055736564>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +310.1521 535.956 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 535.956 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 535.956 Td +/F1.0 10.5 Tf +<3230> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 517.476 Td +/F1.0 10.5 Tf +[<41> 20.0195 <64646974696f6e616c204572726f72204d6573736167657320496e20436173652053534c20436f6e6e656374696f6e73204172652055736564>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +368.9416 517.476 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 517.476 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 517.476 Td +/F1.0 10.5 Tf +<3232> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 498.996 Td +/F1.0 10.5 Tf +[<57> 49.8047 <61726e696e67204d65737361676573>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +144.4726 498.996 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 498.996 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 498.996 Td +/F1.0 10.5 Tf +<3234> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 480.516 Td +/F1.0 10.5 Tf +[<57> 49.8047 <61726e696e67204d6573736167657320496e20436173652054> 20.0195 <435020436f6e6e656374696f6e73204172652055736564>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +331.5301 480.516 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 480.516 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 480.516 Td +/F1.0 10.5 Tf +<3234> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.24 462.036 Td +/F1.0 10.5 Tf +[<57> 49.8047 <61726e696e67204d6573736167657320496e20436173652053534c20436f6e6e656374696f6e73204172652055736564>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +326.1856 462.036 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 462.036 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 462.036 Td +/F1.0 10.5 Tf +<3236> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 443.556 Td +/F1.0 10.5 Tf +[<54> 29.7852 <65726d696e6f6c6f6779>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +112.4056 443.556 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 443.556 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 443.556 Td +/F1.0 10.5 Tf +<3237> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 425.076 Td +/F1.0 10.5 Tf +<416262726576696174696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +123.0946 425.076 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 425.076 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 425.076 Td +/F1.0 10.5 Tf +<3237> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 406.596 Td +/F1.0 10.5 Tf +<5265666572656e636573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6627 0.6627 0.6627 scn +0.6627 0.6627 0.6627 SCN + +BT +107.0611 406.596 Td +/F1.0 10.5 Tf +<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +BT +534.6211 406.596 Td +/F1.0 2.625 Tf + Tj +ET + +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.301 406.596 Td +/F1.0 10.5 Tf +<3238> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q + +endstream +endobj +12 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 11 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +>> +>> +/Annots [242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R] +>> +endobj +13 0 obj +<< /Length 6942 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 782.394 Td +/F2.0 22 Tf +<41626f7574205468697320446f63756d656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 741.146 Td +/F2.0 18 Tf +<486f7720746f2052656164205468697320446f63756d656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.032 Tw + +BT +48.24 713.126 Td +/F1.0 10.5 Tf +[<5468697320697320746865205573657220477569646520666f7220746865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574207465737420706f72742e20546865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574207465737420706f727420697320646576656c6f706564>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 697.346 Td +/F1.0 10.5 Tf +[<666f7220746865205454> 20.0195 <434e2d332054> 29.7852 <6f6f6c7365742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 657.506 Td +/F2.0 18 Tf +<50726573756d6564204b6e6f776c65646765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 629.486 Td +/F1.0 10.5 Tf +[<54> 29.7852 <6f2075736520746869732070726f746f636f6c206d6f64756c6520746865206b6e6f776c65646765206f6620746865205454> 20.0195 <434e2d33206c616e677561676520>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +383.4546 629.486 Td +/F1.0 10.5 Tf +<5b315d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +396.8631 629.486 Td +/F1.0 10.5 Tf +<20697320657373656e7469616c2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 580.034 Td +/F2.0 27 Tf +<46756e6374696f6e616c697479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 533.054 Td +/F2.0 22 Tf +[<53> 20.0195 <797374656d20526571756972656d656e7473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 503.866 Td +/F1.0 10.5 Tf +[<496e206f7264657220746f2075736520746865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574207465737420706f72742074686520666f6c6c6f77696e672073797374656d20726571756972656d656e7473206d757374206265207361746973666965643a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 476.086 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 476.086 Td +/F1.0 10.5 Tf +[<506c6174666f726d3a20616e> 20.0195 <7920706c6174666f726d20737570706f727465642062> 20.0195 <7920544954> 60.0586 <414e2052> 20.0195 <544520616e64204f70656e53534c>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 454.306 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 454.306 Td +/F1.0 10.5 Tf +[<544954> 60.0586 <414e205454> 20.0195 <434e2d332054> 29.7852 <657374204578656375746f722076657273696f6e205238412028312e382e706c3029206f722068696768657220696e7374616c6c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.5 w +0.9333 0.9333 0.9333 SCN +102.4695 438.49 m +102.4695 414.71 l +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.3451 422.526 Td +/F2.0 10.5 Tf +[<4e4f> 20.0195 <5445>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +114.4695 422.526 Td +/F1.0 10.5 Tf +[<54686973204162737472> 20.0195 <61637420536f636b> 20.0195 <65742076657273696f6e206973206e6f7420636f6d70617469626c65207769746820544954> 60.0586 <414e2072656c6561736573206561726c696572207468616e205238412e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9943 Tw + +BT +48.24 390.746 Td +/F1.0 10.5 Tf +[<49662053534c20697320757365642c207468652073616d65204f70656e53534c206d75737420626520696e7374616c6c6564206173207573656420696e20544954> 60.0586 <414e2e2046> 40.0391 <6f7220616e204f70656e53534c20696e7374616c6c6174696f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 374.966 Td +/F1.0 10.5 Tf +<67756964652073656520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +97.359 374.966 Td +/F1.0 10.5 Tf +<5b335d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +110.7675 374.966 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 330.854 Td +/F2.0 22 Tf +<46756e64616d656e74616c20436f6e6365707473> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.9998 Tw + +BT +48.24 301.666 Td +/F1.0 10.5 Tf +[<546865207465737420706f72742065737461626c697368657320636f6e6e656374696f6e206265747765656e20746865205454> 20.0195 <434e2d332074657374206578656375746f7220616e642053555420616e64>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.4205 Tw + +BT +48.24 285.886 Td +/F1.0 10.5 Tf +[<7472> 20.0195 <616e736d6974732f7265636569766573206d657373616765732e20546865207472> 20.0195 <616e73706f7274206368616e6e656c2063616e2062652054> 20.0195 <4350206f722053534c2e2054686520636f6e6e65637420616e64206c697374656e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 270.106 Td +/F1.0 10.5 Tf +[<6f706572> 20.0195 <6174696f6e732063616e20626520696e697469617465642066726f6d207468652074657374207375697465207573696e672074686520>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +326.5528 270.106 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +426.3028 270.106 Td +/F1.0 10.5 Tf +[<207465737420706f727420706172> 20.0195 <616d657465722e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 230.266 Td +/F2.0 18 Tf +<4d6f64756c6520537472756374757265> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 202.246 Td +/F1.0 10.5 Tf +[<546865204162737472> 20.0195 <61637420536f636b> 20.0195 <657420636f6d6d6f6e20636f6d706f6e656e7420697320696d706c656d656e74656420696e2074686520666f6c6c6f77696e672066696c65733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 174.466 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 174.466 Td +/F4.0 10.5 Tf +[<4162737472> 20.0195 <6163745f536f636b> 20.0195 <65742e6868>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 152.686 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 152.686 Td +/F4.0 10.5 Tf +[<4162737472> 20.0195 <6163745f536f636b> 20.0195 <65742e6363>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 108.574 Td +/F2.0 22 Tf +<53746172742050726f636564757265> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.009 14.388 Td +/F1.0 9 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +14 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 13 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F4.0 29 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +/Annots [22 0 R 25 0 R] +>> +endobj +15 0 obj +[14 0 R /XYZ 0 841.89 null] +endobj +16 0 obj +<< /Type /Names +/Dests 17 0 R +>> +endobj +17 0 obj +<< /Kids [49 0 R 135 0 R 50 0 R 84 0 R 115 0 R] +>> +endobj +18 0 obj +[14 0 R /XYZ 0 841.89 null] +endobj +19 0 obj +<< /Type /Font +/BaseFont /ace878+NotoSerif-Bold +/Subtype /TrueType +/FontDescriptor 359 0 R +/FirstChar 32 +/LastChar 255 +/Widths 361 0 R +/ToUnicode 360 0 R +>> +endobj +20 0 obj +[14 0 R /XYZ 0 765.17 null] +endobj +21 0 obj +[14 0 R /XYZ 0 681.53 null] +endobj +22 0 obj +<< /Border [0 0 0] +/Dest (_1) +/Subtype /Link +/Rect [383.4546 626.42 396.8631 640.7] +/Type /Annot +>> +endobj +23 0 obj +[14 0 R /XYZ 0 613.67 null] +endobj +24 0 obj +[14 0 R /XYZ 0 561.35 null] +endobj +25 0 obj +<< /Border [0 0 0] +/Dest (_3) +/Subtype /Link +/Rect [97.359 371.9 110.7675 386.18] +/Type /Annot +>> +endobj +26 0 obj +[14 0 R /XYZ 0 359.15 null] +endobj +27 0 obj +<< /Type /Font +/BaseFont /121353+mplus1mn-regular +/Subtype /TrueType +/FontDescriptor 363 0 R +/FirstChar 32 +/LastChar 255 +/Widths 365 0 R +/ToUnicode 364 0 R +>> +endobj +28 0 obj +[14 0 R /XYZ 0 254.29 null] +endobj +29 0 obj +<< /Type /Font +/BaseFont /91a4c8+NotoSerif-Italic +/Subtype /TrueType +/FontDescriptor 367 0 R +/FirstChar 32 +/LastChar 255 +/Widths 369 0 R +/ToUnicode 368 0 R +>> +endobj +30 0 obj +[14 0 R /XYZ 0 136.87 null] +endobj +31 0 obj +<< /Length 9168 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 786.666 Td +/F2.0 18 Tf +<436f6e6e656374696f6e2041535073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9875 Tw + +BT +48.24 758.646 Td +/F1.0 10.5 Tf +[<5768656e2063686f6f73696e6720746f2075736520636f6e6e656374696f6e20415350732c20746865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742069732061626c6520746f206f70656e206120736572766572206c697374656e696e6720706f7274>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 742.866 Td +/F1.0 10.5 Tf +[<28616374696e67206c696b> 20.0195 <6520612073657276657229206f7220636c69656e7420636f6e6e656374696f6e73206174207468652073616d652074696d652e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 703.026 Td +/F2.0 18 Tf +<536572766572204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4287 Tw + +BT +48.24 675.006 Td +/F1.0 10.5 Tf +[<5768656e20746865207465737420706f7274206973206d61707065642062> 20.0195 <7920544954> 60.0586 <414e2052> 20.0195 <54452c2074686520736572766572206372656174657320612054> 20.0195 <435020736f636b> 20.0195 <657420616e6420737461727473206c697374656e696e67206f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7526 Tw + +BT +48.24 659.226 Td +/F1.0 10.5 Tf +[<69742e20446570656e64696e67206f6e20746865207472> 20.0195 <616e73706f7274206368616e6e656c2073706563696669656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652c2069742077696c6c20616363657074>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 643.446 Td +/F1.0 10.5 Tf +[<6569746865722054> 20.0195 <4350206f722053534c20636f6e6e656374696f6e732e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 603.606 Td +/F2.0 18 Tf +<436c69656e74204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6167 Tw + +BT +48.24 575.586 Td +/F1.0 10.5 Tf +[<5768656e20746865207465737420706f7274206973206d61707065642062> 20.0195 <7920544954> 60.0586 <414e2052> 20.0195 <54452c2074686520636c69656e74206372656174657320612054> 20.0195 <435020736f636b> 20.0195 <657420616e6420747269657320746f20636f6e6e65637420746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.0954 Tw + +BT +48.24 559.806 Td +/F1.0 10.5 Tf +[<746865207365727665722e20496620746865207472> 20.0195 <616e73706f7274206368616e6e656c2069732053534c2c2074686520636c69656e742073746172747320616e2053534c2068616e647368616b> 20.0195 <65206166746572207468652054> 20.0195 <4350>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5443 Tw + +BT +48.24 544.026 Td +/F1.0 10.5 Tf +[<636f6e6e656374696f6e2069732065737461626c69736865642e204966207468652053534c2068616e647368616b> 20.0195 <65206973207375636365737366756c2c207468652053534c20636f6e6e656374696f6e2069732065737461626c697368656420616e64>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 528.246 Td +/F1.0 10.5 Tf +<74686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.93 528.246 Td +/F3.0 10.5 Tf +<6d6170> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +82.68 528.246 Td +/F1.0 10.5 Tf +[<206f706572> 20.0195 <6174696f6e2069732066696e69736865642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 500.466 Td +/F1.0 10.5 Tf +[<5468652053534c2068616e647368616b> 20.0195 <65206d61> 20.0195 <79206661696c2064756520746f207365766572> 20.0195 <616c20726561736f6e732028652e672eca6e6f2073686172656420636970686572732c20766572696669636174696f6e206661696c7572652c206574632e292e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 456.354 Td +/F2.0 22 Tf +<53656e64696e672f526563656976696e67204d65737361676573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.2518 Tw + +BT +48.24 427.166 Td +/F1.0 10.5 Tf +[<4f6e6c79206261736963206f63746574737472696e672073656e64696e6720616e6420726563656976696e672069732068616e646c65642062> 20.0195 <7920746865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742e20546869732066756e6374696f6e616c697479>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.04 Tw + +BT +48.24 411.386 Td +/F1.0 10.5 Tf +[<70726f6261626c79206d75737420626520657874656e64656420696e206f7264657220746f206275696c642061207465737420706f727420666f722074686520646573697265642070726f746f636f6c2e20466972737420746865205454> 20.0195 <434e2d33>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.372 Tw + +BT +48.24 395.606 Td +/F1.0 10.5 Tf +[<6d617070696e67206f6620746865207461726765742070726f746f636f6c206d65737361676573206d75737420626520656c61626f72> 20.0195 <6174656420616e64207468656e20746865206d6573736167652070726f63657373696e67>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 379.826 Td +/F1.0 10.5 Tf +<66756e6374696f6e732063616e20626520646576656c6f7065642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 335.714 Td +/F2.0 22 Tf +<4c6f6767696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.4687 Tw + +BT +48.24 306.526 Td +/F1.0 10.5 Tf +<5468652074797065206f6620696e666f726d6174696f6e20746861742077696c6c206265206c6f676765642063616e2062652063617465676f72697a656420696e746f2074776f2067726f7570732e20546865206669727374206f6e65> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4086 Tw + +BT +48.24 290.746 Td +/F1.0 10.5 Tf +<636f6e7369737473206f6620696e666f726d6174696f6e20746861742073686f77732074686520666c6f77206f662074686520696e7465726e616c20657865637574696f6e206f6620746865207465737420706f72742c20652e672eca696d706f7274616e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.2202 Tw + +BT +48.24 274.966 Td +/F1.0 10.5 Tf +<6576656e74732c2077686963682066756e6374696f6e20746861742069732063757272656e746c7920657865637574696e67206574632e20546865207365636f6e642067726f7570206465616c7320776974682070726573656e74696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1305 Tw + +BT +48.24 259.186 Td +/F1.0 10.5 Tf +[<76616c7561626c6520646174612c20652e672eca70726573656e74696e672074686520636f6e74656e74206f662061205044552e20546865206c6f6767696e67207072696e746f7574732077696c6c20626520646972656374656420746f207468652052> 20.0195 <5445>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4973 Tw + +BT +48.24 243.406 Td +/F1.0 10.5 Tf +[<6c6f672066696c652e2054686520757365722069732061626c6520746f206465636964652077686574686572206c6f6767696e6720697320746f2074616b> 20.0195 <6520706c616365206f72206e6f742062> 20.0195 <792073657474696e6720617070726f707269617465>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 227.626 Td +/F1.0 10.5 Tf +[<636f6e6669677572> 20.0195 <6174696f6e20646174612e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 183.514 Td +/F2.0 22 Tf +<4572726f722048616e646c696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6416 Tw + +BT +48.24 154.326 Td +/F1.0 10.5 Tf +[<4572726f6e656f7573206265686176696f7220646574656374656420647572696e672072756e74696d6520697320646972656374656420696e746f207468652052> 20.0195 <5445206c6f672066696c652e2054686520666f6c6c6f77696e672074776f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 138.546 Td +/F1.0 10.5 Tf +[<7479706573206f66206d65737361676573206172652074616b> 20.0195 <656e2063617265206f663a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 110.766 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.2851 Tw + +BT +66.24 110.766 Td +/F1.0 10.5 Tf +<4572726f72733a20696e666f726d6174696f6e2061626f7574206572726f72732064657465637465642069732070726f76696465642e20496620616e206572726f72206f63637572732074686520657865637574696f6e206f6620746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 94.986 Td +/F1.0 10.5 Tf +[<7465737420636173652077696c6c2073746f7020696d6d6564696174656c79> 89.8438 <2e20546865207465737420706f7274732077696c6c20626520756e6d61707065642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 73.206 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7095 Tw + +BT +66.24 73.206 Td +/F1.0 10.5 Tf +[<57> 49.8047 <61726e696e67733a20696e666f726d6174696f6e2061626f7574207761726e696e67732064657465637465642069732070726f76696465642e2054686520657865637574696f6e20636f6e74696e75657320616674657220746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 57.426 Td +/F1.0 10.5 Tf +<7761726e696e672069732073686f776e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +32 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 31 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +33 0 obj +[32 0 R /XYZ 0 841.89 null] +endobj +34 0 obj +[32 0 R /XYZ 0 727.05 null] +endobj +35 0 obj +[32 0 R /XYZ 0 627.63 null] +endobj +36 0 obj +[32 0 R /XYZ 0 484.65 null] +endobj +37 0 obj +[32 0 R /XYZ 0 364.01 null] +endobj +38 0 obj +[32 0 R /XYZ 0 211.81 null] +endobj +39 0 obj +<< /Length 10742 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 782.394 Td +/F2.0 22 Tf +<436c6f73696e6720446f776e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.8316 Tw + +BT +48.24 753.206 Td +/F1.0 10.5 Tf +<54686520636f6e6e656374696f6e2063616e206265207368757420646f776e2065697468657220706572666f726d696e672074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +3.8316 Tw + +BT +364.6918 753.206 Td +/F3.0 10.5 Tf +<756e6d6170> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.8316 Tw + +BT +390.9418 753.206 Td +/F1.0 10.5 Tf +[<206f706572> 20.0195 <6174696f6e206f6e2074686520706f7274206f72206966>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 737.426 Td +/F1.0 10.5 Tf +[<636f6e6e656374696f6e204153507320617265207573656420776974682074686520617070726f70726961746520415350> 120.1172 <2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 693.314 Td +/F2.0 22 Tf +<4950763620537570706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.4693 Tw + +BT +48.24 664.126 Td +/F1.0 10.5 Tf +[<497420697320706f737369626c6520746f2073656c6563742074686520616464726573732066616d696c79207573656420666f722073657276657220736f636b> 20.0195 <657420616e6420636c69656e7420636f6e6e656374696f6e7320696e20746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7381 Tw + +BT +48.24 648.346 Td +/F1.0 10.5 Tf +[<636f6e6669677572> 20.0195 <6174696f6e2066696c65206f7220647572696e672072756e74696d652e2054686520666f6c6c6f77696e6720616464726573732066616d696c6965732061726520737570706f727465643a20495076342c204950763620616e64>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 632.566 Td +/F1.0 10.5 Tf +<554e535045432e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 588.454 Td +/F2.0 22 Tf +<53534c2046756e6374696f6e616c697479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6622 Tw + +BT +48.24 559.266 Td +/F1.0 10.5 Tf +[<546865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742063616e207573652053534c206f722054> 20.0195 <435020617320746865207472> 20.0195 <616e73706f7274206368616e6e656c2e205468652073616d652076657273696f6e206f66204f70656e53534c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 543.486 Td +/F1.0 10.5 Tf +[<6c696272> 20.0195 <617279206d757374206265207573656420617320696e20544954> 60.0586 <414e2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.5602 Tw + +BT +48.24 515.706 Td +/F1.0 10.5 Tf +[<54686520737570706f727465642053534c2f544c532076657273696f6e73206172652064657465726d696e65642062> 20.0195 <79207468652075736564204f70656e53534c206c696272> 20.0195 <617279> 89.8438 <2e20497420697320706f737369626c6520746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 499.926 Td +/F1.0 10.5 Tf +[<64697361626c65206120737065636966696320544c532f53534c2076657273696f6e20696e207468652072756e2074696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 460.086 Td +/F2.0 18 Tf +<436f6d70696c6174696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.3605 Tw + +BT +48.24 432.066 Td +/F1.0 10.5 Tf +<546865207573616765206f662053534c20616e64206576656e2074686520636f6d70696c6174696f6e206f66207468652053534c2072656c6174656420636f646520706172747320617265206f7074696f6e616c2e2054686973206973> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 416.286 Td +/F1.0 10.5 Tf +<626563617573652053534c2072656c6174656420636f64652070617274732063616e6e6f7420626520636f6d70696c656420776974686f757420746865204f70656e53534c20696e7374616c6c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6975 Tw + +BT +48.24 388.506 Td +/F1.0 10.5 Tf +[<54686520636f6d70696c6174696f6e206f662053534c2072656c6174656420636f64652070617274732063616e2062652064697361626c65642062> 20.0195 <79206e6f7420646566696e696e672074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.6975 Tw + +BT +445.6011 388.506 Td +/F3.0 10.5 Tf +<41535f5553455f53534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6975 Tw + +BT +498.1011 388.506 Td +/F1.0 10.5 Tf +<206d6163726f20696e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6354 Tw + +BT +48.24 372.726 Td +/F1.0 10.5 Tf +<74686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6354 Tw + +BT +67.5654 372.726 Td +/F4.0 10.5 Tf +[<4d616b> 20.0195 <6566696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6354 Tw + +BT +109.3027 372.726 Td +/F1.0 10.5 Tf +<20647572696e672074686520636f6d70696c6174696f6e2e20496620746865206d6163726f20697320646566696e656420696e2074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6354 Tw + +BT +386.531 372.726 Td +/F4.0 10.5 Tf +[<4d616b> 20.0195 <6566696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6354 Tw + +BT +428.2683 372.726 Td +/F1.0 10.5 Tf +<2c207468652053534c20636f646520706172747320617265> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9115 Tw + +BT +48.24 356.946 Td +/F1.0 10.5 Tf +<636f6d70696c656420746f207468652065786563757461626c65207465737420636f64652e20546865207573616765206f66207468652053534c207468656e2063616e20626520656e61626c65642f64697361626c656420696e20746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.5868 Tw + +BT +48.24 341.166 Td +/F1.0 10.5 Tf +[<72756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652e204e61747572> 20.0195 <616c6c79> 89.8438 <2c20746865207465737420706f727420706172> 20.0195 <616d657465722077696c6c2062652069676e6f7265642069662074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.5868 Tw + +BT +494.54 341.166 Td +/F3.0 10.5 Tf +<41535f5553455f53534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.5868 Tw + +BT +547.04 341.166 Td +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 325.386 Td +/F1.0 10.5 Tf +<6d6163726f206973206e6f7420646566696e656420647572696e6720636f6d70696c6174696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 285.546 Td +/F2.0 18 Tf +[<41> 20.0195 <757468656e7469636174696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7515 Tw + +BT +48.24 257.526 Td +/F1.0 10.5 Tf +[<546865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742070726f766964657320626f746820736572766572207369646520616e6420636c69656e7420736964652061757468656e7469636174696f6e2e205768656e2061757468656e7469636174696e67>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6115 Tw + +BT +48.24 241.746 Td +/F1.0 10.5 Tf +<746865206f7468657220736964652c20612063657274696669636174652069732072657175657374656420616e6420746865206f776e207472757374656420636572746966696361746520617574686f726974696573d5206c6973742069732073656e742e20546865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0653 Tw + +BT +48.24 225.966 Td +/F1.0 10.5 Tf +[<7265636569766564206365727469666963617465206973207665726966696564207768657468657220697420697320612076616c6964206365727469666963617465206f72206e6f742028746865207075626c696320616e642070726976617465206b> 20.0195 <65797320617265>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.9449 Tw + +BT +48.24 210.186 Td +/F1.0 10.5 Tf +<6d61746368696e67292e204e6f20667572746865722061757468656e7469636174696f6e20697320706572666f726d65642028652e672eca7768657468657220686f73746e616d652069732070726573656e7420696e20746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 194.406 Td +/F1.0 10.5 Tf +[<6365727469666963617465292e2054686520766572696669636174696f6e2063616e20626520656e61626c65642f64697361626c656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2079 Tw + +BT +48.24 166.626 Td +/F1.0 10.5 Tf +[<496e20736572766572206d6f646520746865207465737420706f72742077696c6c20616c7761> 20.0195 <79732073656e642069747320636572746966696361746520616e64207472757374656420636572746966696361746520617574686f726974696573d5206c69737420746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9488 Tw + +BT +48.24 150.846 Td +/F1.0 10.5 Tf +[<69747320636c69656e74732e20496620766572696669636174696f6e20697320656e61626c656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652c20746865207365727665722077696c6c207265717565737420666f722061>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.8549 Tw + +BT +48.24 135.066 Td +/F1.0 10.5 Tf +<636c69656e74d5732063657274696669636174652e20496e207468697320636173652c2069662074686520636c69656e7420646f6573206e6f742073656e6420612076616c6964206365727469666963617465206f7220646f6573206e6f742073656e642061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0064 Tw + +BT +48.24 119.286 Td +/F1.0 10.5 Tf +<636572746966696361746520617420616c6c2c2074686520636f6e6e656374696f6e2077696c6c20626520726566757365642e2049662074686520766572696669636174696f6e2069732064697361626c65642c2074686520636f6e6e656374696f6e2077696c6c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 103.506 Td +/F1.0 10.5 Tf +<6e6576657220626520726566757365642064756520746f20766572696669636174696f6e206661696c7572652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.0851 Tw + +BT +48.24 75.726 Td +/F1.0 10.5 Tf +[<496e20636c69656e74206d6f646520746865207465737420706f72742077696c6c2073656e642069747320636572746966696361746520746f2074686520736572766572206f6e2074686520736572766572> -29.7852 ] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2083 Tw + +BT +48.24 59.946 Td +/F1.0 10.5 Tf +[<766572696669636174696f6e20697320656e61626c656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652c2074686520636c69656e742077696c6c2073656e6420697473206f776e2074727573746564>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.009 14.388 Td +/F1.0 9 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +40 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 39 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F4.0 29 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +41 0 obj +[40 0 R /XYZ 0 841.89 null] +endobj +42 0 obj +[40 0 R /XYZ 0 721.61 null] +endobj +43 0 obj +[40 0 R /XYZ 0 616.75 null] +endobj +44 0 obj +[40 0 R /XYZ 0 484.11 null] +endobj +45 0 obj +[40 0 R /XYZ 0 309.57 null] +endobj +46 0 obj +<< /Length 7462 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +0.2134 Tw + +BT +48.24 794.676 Td +/F1.0 10.5 Tf +[<636572746966696361746520617574686f726974696573d5206c69737420746f207468652073657276657220616e642077696c6c207665726966792074686520736572766572> -29.7852 -29.7852 ] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6497 Tw + +BT +48.24 778.896 Td +/F1.0 10.5 Tf +<6365727469666963617465206973206e6f742076616c69642c207468652053534c20636f6e6e656374696f6e2077696c6c206e6f742062652065737461626c69736865642e20496620766572696669636174696f6e2069732064697361626c65642c20746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 763.116 Td +/F1.0 10.5 Tf +<636f6e6e656374696f6e2077696c6c206e6576657220626520726566757365642064756520746f20766572696669636174696f6e206661696c7572652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0041 Tw + +BT +48.24 735.336 Td +/F1.0 10.5 Tf +[<546865206f776e2063657274696669636174652873292c20746865206f776e2070726976617465206b> 20.0195 <65792066696c652c20746865206f7074696f6e616c2070617373776f72642070726f74656374696e6720746865206f776e2070726976617465>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3485 Tw + +BT +48.24 719.556 Td +/F1.0 10.5 Tf +[<6b> 20.0195 <65792066696c6520616e6420746865207472757374656420636572746966696361746520617574686f726974696573d5206c6973742066696c652063616e2062652073706563696669656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 703.776 Td +/F1.0 10.5 Tf +<66696c652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8244 Tw + +BT +48.24 675.996 Td +/F1.0 10.5 Tf +[<546865207465737420706f72742077696c6c20636865636b2074686520636f6e73697374656e6379206265747765656e20697473206f776e2070726976617465206b> 20.0195 <657920616e6420746865207075626c6963206b> 20.0195 <657920286261736564206f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 660.216 Td +/F1.0 10.5 Tf +[<746865206f776e20636572746966696361746529206175746f6d61746963616c6c79> 89.8438 <2e2049662074686520636865636b206661696c732c2061207761726e696e672069732069737375656420616e6420657865637574696f6e20636f6e74696e7565732e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 620.376 Td +/F2.0 18 Tf +[<4f746865722046> 40.0391 <65617475726573>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 592.356 Td +/F1.0 10.5 Tf +[<546865207573616765206f662053534c2073657373696f6e20726573756d7074696f6e2063616e20626520656e61626c65642f64697361626c656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 564.576 Td +/F1.0 10.5 Tf +[<54686520616c6c6f77656420636970686572696e67207375697465732063616e206265207265737472696374656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652c207365652e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8923 Tw + +BT +48.24 536.796 Td +/F1.0 10.5 Tf +<5468652053534c2072652d68616e647368616b696e672072657175657374732061726520616363657074656420616e642070726f6365737365642c20686f77657665722072652d68616e647368616b696e672063616e6e6f74206265> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 521.016 Td +/F1.0 10.5 Tf +<696e697469617465642066726f6d20746865207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 481.176 Td +/F2.0 18 Tf +<4c696d69746174696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 453.156 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 453.156 Td +/F1.0 10.5 Tf +<53534c2072652d68616e647368616b696e672063616e6e6f7420626520696e697469617465642066726f6d20746865207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 431.376 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0829 Tw + +BT +66.24 431.376 Td +/F1.0 10.5 Tf +[<546865206f776e2063657274696669636174652066696c652873292c20746865206f776e2070726976617465206b> 20.0195 <65792066696c6520616e6420746865207472757374656420636572746966696361746520617574686f726974696573d5206c6973742066696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 415.596 Td +/F1.0 10.5 Tf +<6d75737420626520696e2050454d20666f726d61742e204f7468657220666f726d61747320617265206e6f7420737570706f727465642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 366.144 Td +/F2.0 27 Tf +[<5468652054> 29.7852 <65737420506f7274>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 319.164 Td +/F2.0 22 Tf +<4f76657276696577> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8055 Tw + +BT +48.24 289.976 Td +/F1.0 10.5 Tf +[<546865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574206973206120636f6d6d6f6e20636f6d706f6e656e7420746861742063616e207365727665206173206120626173697320666f72207465737420706f7274732074686174206e6565642054> 20.0195 <4350>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4859 Tw + +BT +48.24 274.196 Td +/F1.0 10.5 Tf +[<636f6e6e656374696f6e732077697468206f7220776974686f75742053534c206f6e2074686520746f702e205468652054> 20.0195 <435020736f636b> 20.0195 <65742063616e206265207573656420656974686572207769746820626c6f636b696e67206f72>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7511 Tw + +BT +48.24 258.416 Td +/F1.0 10.5 Tf +[<6e6f6e2d626c6f636b696e6720736f636b> 20.0195 <65742e20546865204162737472> 20.0195 <61637420536f636b> 20.0195 <657420696d706c656d656e74732062617369632073656e64696e672c20726563656976696e6720616e6420736f636b> 20.0195 <65742068616e646c696e67>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3834 Tw + +BT +48.24 242.636 Td +/F1.0 10.5 Tf +<726f7574696e65732c20667572746865726d6f726520697420737570706f7274732074686520646576656c6f706d656e74206f66207465737420706f72747320746861742063616e20776f726b206173206120636c69656e74206f722061732061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.1198 Tw + +BT +48.24 226.856 Td +/F1.0 10.5 Tf +[<7365727665722e2042> 20.0195 <7920657874656e64696e6720746865204162737472> 20.0195 <61637420536f636b> 20.0195 <657420636f6d706f6e656e742077697468206164646974696f6e616c2066756e6374696f6e616c6974792074686520646573697265642074657374>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 211.076 Td +/F1.0 10.5 Tf +<706f72742063616e206265206275696c742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 183.296 Td +/F1.0 10.5 Tf +[<536565207468652066756e6374696f6e696e67206f6620746865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742062656c6f773a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +1.7537 Tc + +0.0 Tc + +1.7537 Tc + +0.0 Tc +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<34> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +47 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 46 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F2.0 19 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +48 0 obj +[47 0 R /XYZ 0 644.4 null] +endobj +49 0 obj +<< /Limits [(Abstract_Socket_Test_Port_Parameters_in_the_Test_Port_Configuration_File) (_close_a_client_connection)] +/Names [(Abstract_Socket_Test_Port_Parameters_in_the_Test_Port_Configuration_File) 65 0 R (_1) 160 0 R (_2) 161 0 R (_3) 162 0 R (__anchor-top) 15 0 R (_abbreviations) 156 0 R (_about_this_document) 18 0 R (_adapting_derived_test_ports_to_support_ipv6) 130 0 R (_additional_abstract_socket_test_port_parameters_in_the_test_port_configuration_file_if_the_transport_channel_is_ssl) 71 0 R (_additional_error_messages_in_case_ssl_connections_are_used) 140 0 R (_authentication) 45 0 R (_authentication_flow) 126 0 R (_client_mode) 35 0 R (_client_mode_2) 125 0 R (_close_a_client_connection) 89 0 R] +>> +endobj +50 0 obj +<< /Limits [(_how_to_read_this_document) (_overview)] +/Names [(_how_to_read_this_document) 20 0 R (_installation) 57 0 R (_ipv6_support) 42 0 R (_limitations) 51 0 R (_logging) 37 0 R (_logging_functions) 96 0 R (_module_structure) 28 0 R (_open_a_client_connection) 83 0 R (_open_a_listening_port) 79 0 R (_other_features) 48 0 R (_overview) 53 0 R] +>> +endobj +51 0 obj +[47 0 R /XYZ 0 505.2 null] +endobj +52 0 obj +[47 0 R /XYZ 0 399.78 null] +endobj +53 0 obj +[47 0 R /XYZ 0 347.46 null] +endobj +54 0 obj +<< /Type /XObject +/Subtype /Image +/Height 245 +/Width 379 +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Length 4940 +/Filter [/FlateDecode] +/DecodeParms [<< /Predictor 15 +/Colors 3 +/BitsPerComponent 8 +/Columns 379 +>>] +>> +stream +x흭ȵ 1z +2܀h4 + l #DiPcU?.Wϣ-}rwߪwťtq@q@q@q@q@q.Pҿ|x#jQ/3Ԣ6t_ +f4EmSE,Wò޲|.}=y!Ԣ;k)9%bWI&]jDkn8KN%K#ԢW;_8Y˒qVsHJTso+=2XNMjQ[GCUswkZ"N22cq@Zrlj&'x{)|o9zv4Em9'H<~lU9Wg=psqgnT15^q@ZԶG2P\^nmm/@858㜗Y}ӸʋkUݔŷD Wy8hR})yФR0I-jC`AZԆK̃& ݗMjQ/3Ԣ6t_ +f4Em--@ +Ip <H A`!Hut8!Mq6AxH8q $8@ +Ip<8)'yqR N@H8q $8@ +Ip<8)'Bx `^t8!{n!H2$BdH vq Zd]P/ވZԆK̃& ݗMjQ/3Ԣ6t_ +f4EmJ$ 99ZV?̋*9G4Em;<EVP֚8nlNVU8hRtGDg,`~B̲_t>koq@ZԦ{8ع fw8c%rS}a NFc7vMjQ/3Ԣ6t_ +f4EmgKp0ukvW'mBa+Gdg^nM+.e8?~V#,˶u[Yvjl"gY992;`Ǿf(iA mÙ>LXёT˹\*,t5[xLf?u`:J6¤泖ލB$"psAD~dC0M3Esұ9̱|tu{i돘138!Oν`9U^c/>[rZɦ֏qgO`H8LJ"ɝ\-R:g~]ګY] x}0|7}~u 1CeBLYU#OMb*+S|; 8A*?gEskm[-68Rvfߚ8AVᬆkȒ_;7QJ5]*+S|; yqFavڌP3[+GíȽN[+չlo|r +#;GdO|rji$:9kw{|sHUW؋w@ 2f Gp5lŹ27Ț?vGẌ́:;\0|{Z;r' 5[ۈD.$N]W؋w@Ėэo\j_l8˦wY^ /F]b.3M&Kv.hpknd}Zh%ںOc%zex$!X]7J۟W&Mw%%zex$8Ϋ4; +_9l؋w@q%՟u-EٲQI,;K[byG*@wң }}4\qYH~ 6wN$=V`yg!=YR1qoT= 8hBzqhb)6y:Sr噗S׫JH\*,qz3?:% ք~qnAqɮF7efN T!#`k;*8_=Ŋ솛79Xj9xpmSGf?2~%qS|*1>Gn㫛Y9˝⻎{G/Wm9VU0E+YM^0 +VU@Z//vljvX¥sLnmjl>rȃ>L;b-Pл{ϝ){a< ej!_ +#gvDtw^B͎c#cȸ[Yfp;n.Dɾ赪}8]uKS~W;d,XqhyWǫ'}Q~jv&2h)%ϭ¥oř@H{pmY&& (Bzs t=W8h9\8B $08BJs)s t=W8h9\8B $0> +stream +q + +1.7537 Tc + +0.0 Tc + +1.7537 Tc + +0.0 Tc +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +1.7537 Tc + +q +284.25 0.0 0.0 183.75 48.24 622.14 cm +/I1 Do +Q + +BT +48.24 625.206 Td +ET + + +0.0 Tc +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 581.094 Td +/F2.0 22 Tf +<496e7374616c6c6174696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.2902 Tw + +BT +48.24 551.906 Td +/F1.0 10.5 Tf +[<53696e636520746865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574207465737420706f7274206973207573656420617320612070617274206f6620746865205454> 20.0195 <434e2d33207465737420656e7669726f6e6d656e742074686973207265717569726573>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 536.126 Td +/F1.0 10.5 Tf +[<5454> 20.0195 <434e2d332054> 29.7852 <657374204578656375746f7220746f20626520696e7374616c6c6564206265666f726520616e> 20.0195 <79206f706572> 20.0195 <6174696f6e206f6620746865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574207465737420706f72742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6975 Tw + +BT +48.24 508.346 Td +/F1.0 10.5 Tf +[<54686520636f6d70696c6174696f6e206f662053534c2072656c6174656420636f64652070617274732063616e2062652064697361626c65642062> 20.0195 <79206e6f7420646566696e696e672074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.6975 Tw + +BT +445.6011 508.346 Td +/F3.0 10.5 Tf +<41535f5553455f53534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6975 Tw + +BT +498.1011 508.346 Td +/F1.0 10.5 Tf +<206d6163726f20696e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 492.566 Td +/F1.0 10.5 Tf +<74686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.93 492.566 Td +/F4.0 10.5 Tf +[<4d616b> 20.0195 <6566696c65>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +108.6673 492.566 Td +/F1.0 10.5 Tf +<20647572696e672074686520636f6d70696c6174696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.7126 Tw + +BT +48.24 464.786 Td +/F1.0 10.5 Tf +[<5768656e206275696c64696e67207468652065786563757461626c65207465737420737569746520746865206c696272> 20.0195 <617269657320636f6d70696c656420666f7220746865204f70656e53534c20746f6f6c6b69742028696620746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.9293 Tw + +BT +48.24 449.006 Td +/F3.0 10.5 Tf +<41535f5553455f53534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9293 Tw + +BT +100.74 449.006 Td +/F1.0 10.5 Tf +[<206d6163726f20697320646566696e6564292073686f756c6420616c736f206265206c696e6b> 20.0195 <656420696e746f207468652065786563757461626c6520616c6f6e67207769746820746865205454> 20.0195 <434e2d332054> 29.7852 <657374>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2678 Tw + +BT +48.24 433.226 Td +/F1.0 10.5 Tf +[<4578656375746f722c20692e652eca746865204f70656e53534c206c696272> 20.0195 <61726965732073686f756c6420626520616464656420746f2074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2678 Tw + +BT +371.7029 433.226 Td +/F4.0 10.5 Tf +[<4d616b> 20.0195 <6566696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2678 Tw + +BT +413.4402 433.226 Td +/F1.0 10.5 Tf +[<2067656e6572> 20.0195 <617465642062> 20.0195 <792074686520544954> 60.0586 <414e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4908 Tw + +BT +48.24 417.446 Td +/F1.0 10.5 Tf +<6578656375746f722028736565206578616d706c6520696e2073656374696f6e20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +0.4908 Tw + +BT +216.0478 417.446 Td +/F1.0 10.5 Tf +[<57> 49.8047 <61726e696e67204d6573736167657320696e20636173652053534c20436f6e6e656374696f6e73204172652055736564>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4908 Tw + +BT +482.3947 417.446 Td +/F1.0 10.5 Tf +[<292e2054> 29.7852 <6f20636f6d70696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.1968 Tw + +BT +48.24 401.666 Td +/F1.0 10.5 Tf +<74686520736f757263652066696c657320796f752077696c6c20616c736f206e65656420746865204f70656e53534c20646576656c6f70657220746f6f6c6b697420776869636820636f6e7461696e7320746865206865616465722066696c6573> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3557 Tw + +BT +48.24 385.886 Td +/F1.0 10.5 Tf +[<757365642062> 20.0195 <792074686520736f757263652e204966205368617265204f626a656374732028>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3557 Tw + +BT +233.9022 385.886 Td +/F4.0 10.5 Tf +<2e736f> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3557 Tw + +BT +247.4157 385.886 Td +/F1.0 10.5 Tf +<2920617265207573656420696e20746865204f70656e53534c20746f6f6c6b69742c20746f2072756e207468652065786563757461626c652c20746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 370.106 Td +/F1.0 10.5 Tf +[<70617468206f6620746865204f70656e53534c206c696272> 20.0195 <6172696573206d75737420626520616464656420746f2074686520>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +304.5238 370.106 Td +/F3.0 10.5 Tf +<4c445f4c4942524152595f50415448> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +383.2738 370.106 Td +/F1.0 10.5 Tf +<20656e7669726f6e6d656e74207661726961626c652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.5 w +0.9333 0.9333 0.9333 SCN +102.4695 354.29 m +102.4695 298.95 l +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.3451 322.546 Td +/F2.0 10.5 Tf +[<4e4f> 20.0195 <5445>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0422 Tw + +BT +114.4695 338.326 Td +/F1.0 10.5 Tf +<496620796f7520617265207573696e6720746865207465737420706f7274206f6e20536f6c617269732c20796f75206861766520746f207365742074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.0422 Tw + +BT +424.047 338.326 Td +/F3.0 10.5 Tf +<504c4154464f524d> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0422 Tw + +BT +466.047 338.326 Td +/F1.0 10.5 Tf +<206d6163726f20746f20746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2581 Tw + +BT +114.4695 322.546 Td +/F1.0 10.5 Tf +<70726f7065722076616c75652e204974207368616c6c20626520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2581 Tw + +BT +237.3396 322.546 Td +/F5.0 10.5 Tf +<534f4c41524953> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2581 Tw + +BT +274.0896 322.546 Td +/F1.0 10.5 Tf +<20696e2063617365206f6620536f6c617269732036202853756e4f5320352e362920616e6420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2581 Tw + +BT +455.5428 322.546 Td +/F5.0 10.5 Tf +<534f4c4152495338> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2581 Tw + +BT +497.5428 322.546 Td +/F1.0 10.5 Tf +<20696e2063617365> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +114.4695 306.766 Td +/F1.0 10.5 Tf +<6f6620536f6c617269732038202853756e4f5320352e38292e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 258.654 Td +/F2.0 22 Tf +[<436f6e6669677572> 20.0195 <6174696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.2614 Tw + +BT +48.24 229.466 Td +/F1.0 10.5 Tf +[<5468652065786563757461626c6520746573742070726f6772> 20.0195 <616d206265686176696f722069732064657465726d696e656420766961207468652072756e2d74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652e20546869732069732061>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9451 Tw + +BT +48.24 213.686 Td +/F1.0 10.5 Tf +<73696d706c6520746578742066696c652c20776869636820636f6e7461696e7320766172696f75732073656374696f6e732028666f72206578616d706c652c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9451 Tw + +BT +376.4517 213.686 Td +/F3.0 10.5 Tf +<5b54455354504f52545f504152414d45544552535d> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9451 Tw + +BT +486.7017 213.686 Td +/F1.0 10.5 Tf +<292061667465722065616368> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0496 Tw + +BT +48.24 197.906 Td +/F1.0 10.5 Tf +[<6f746865722e2054686520757375616c20737566666978206f6620636f6e6669677572> 20.0195 <6174696f6e2066696c657320697320>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0496 Tw + +BT +281.348 197.906 Td +/F4.0 10.5 Tf +<2e6366672e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0496 Tw + +BT +300.8675 197.906 Td +/F1.0 10.5 Tf +[<2046> 40.0391 <6f72206675727468657220696e666f726d6174696f6e206f6e2074686520636f6e6669677572> 20.0195 <6174696f6e2066696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 182.126 Td +/F1.0 10.5 Tf +<73656520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +66.93 182.126 Td +/F1.0 10.5 Tf +<5b325d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +80.3385 182.126 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1061 Tw + +BT +48.24 154.346 Td +/F1.0 10.5 Tf +[<546865206c697374656420706f727420706172> 20.0195 <616d65746572732028>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +0.1061 Tw + +BT +187.6001 154.346 Td +/F1.0 10.5 Tf +[<4162737472> 20.0195 <61637420536f636b> 20.0195 <65742054> 29.7852 <65737420506f727420506172> 20.0195 <616d657465727320696e207468652054> 29.7852 <65737420506f727420436f6e6669677572> 20.0195 <6174696f6e2046696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1061 Tw + +BT +543.407 154.346 Td +/F1.0 10.5 Tf +<29> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.5246 Tw + +BT +48.24 138.566 Td +/F1.0 10.5 Tf +[<617265206d616e616765642062> 20.0195 <792064656661756c742062> 20.0195 <7920746865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742e2054686579206861766520746f20626520646566696e6564206f6e6c7920696e20746865205454> 20.0195 <434e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0894 Tw + +BT +48.24 122.786 Td +/F1.0 10.5 Tf +[<636f6e6669677572> 20.0195 <6174696f6e2066696c65732e2054686f7567682c206966204162737472> 20.0195 <61637420536f636b> 20.0195 <6574d57320706172> 20.0195 <616d657465722068616e646c696e67206973206e6f7420617070726f70726961746520666f7220796f7572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7407 Tw + +BT +48.24 107.006 Td +/F1.0 10.5 Tf +<6170706c69636174696f6e2c20796f752063616e2069676e6f726520697420636f6d706c6574656c7920616e642068616e646c6520746865207661726961626c6573206469726563746c792066726f6d20796f757220706f72742e204974206973> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1341 Tw + +BT +48.24 91.226 Td +/F1.0 10.5 Tf +[<7265636f6d6d656e64656420746f20696d706c656d656e7420796f7572206f776e207465737420706f727420706172> 20.0195 <616d65746572206e616d652070617373696e672066756e6374696f6e7320736f207468617420796f75722074657374>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 75.446 Td +/F1.0 10.5 Tf +[<706f72742077696c6c206e6f7420646570656e64206f6e20746865207465737420706f727420706172> 20.0195 <616d65746572206e616d657320696e20746865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.009 14.388 Td +/F1.0 9 Tf +<35> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +56 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 55 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/XObject << /I1 54 0 R +/Stamp1 288 0 R +>> +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F4.0 29 0 R +/F5.0 59 0 R +>> +>> +/Annots [58 0 R 61 0 R 62 0 R] +>> +endobj +57 0 obj +[56 0 R /XYZ 0 609.39 null] +endobj +58 0 obj +<< /Border [0 0 0] +/Dest (warning_messages_in_case_SSL_connections_are_used) +/Subtype /Link +/Rect [216.0478 414.38 482.3947 428.66] +/Type /Annot +>> +endobj +59 0 obj +<< /Type /Font +/BaseFont /79e08b+mplus1mn-italic +/Subtype /TrueType +/FontDescriptor 371 0 R +/FirstChar 32 +/LastChar 255 +/Widths 373 0 R +/ToUnicode 372 0 R +>> +endobj +60 0 obj +[56 0 R /XYZ 0 286.95 null] +endobj +61 0 obj +<< /Border [0 0 0] +/Dest (_2) +/Subtype /Link +/Rect [66.93 179.06 80.3385 193.34] +/Type /Annot +>> +endobj +62 0 obj +<< /Border [0 0 0] +/Dest (Abstract_Socket_Test_Port_Parameters_in_the_Test_Port_Configuration_File) +/Subtype /Link +/Rect [187.6001 151.28 543.407 165.56] +/Type /Annot +>> +endobj +63 0 obj +<< /Length 18449 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 786.666 Td +/F2.0 18 Tf +[<4162737472> 20.0195 <61637420536f636b> 20.0195 <65742054> 29.7852 <65737420506f727420506172> 20.0195 <616d657465727320696e207468652054> 29.7852 <65737420506f7274>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 762.186 Td +/F2.0 18 Tf +[<436f6e6669677572> 20.0195 <6174696f6e2046696c65>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6694 Tw + +BT +48.24 734.166 Td +/F1.0 10.5 Tf +<496e2074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.6694 Tw + +BT +83.6142 734.166 Td +/F3.0 10.5 Tf +<5b54455354504f52545f504152414d45544552535d> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6694 Tw + +BT +193.8642 734.166 Td +/F1.0 10.5 Tf +[<2073656374696f6e2074686520666f6c6c6f77696e6720706172> 20.0195 <616d65746572732063616e2062652073657420666f7220746865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2056 Tw + +BT +48.24 718.386 Td +/F1.0 10.5 Tf +[<6261736564207465737420706f72742e2054686520706172> 20.0195 <616d65746572206e616d65732061726520636173652d73656e7369746976653b2074686520706172> 20.0195 <616d657465722076616c75657320617265206e6f7420636173652d>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 702.606 Td +/F1.0 10.5 Tf +<73656e7369746976652028692e652e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +115.482 702.606 Td +/F5.0 10.5 Tf +<2259455322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +141.732 702.606 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +147.0765 702.606 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +173.3265 702.606 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +178.671 702.606 Td +/F5.0 10.5 Tf +<2259657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +204.921 702.606 Td +/F1.0 10.5 Tf +<2076616c75657320617265206964656e746963616c292e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 668.106 Td +/F2.0 13 Tf +[<4162737472> 20.0195 <61637420536f636b> 20.0195 <65742054> 29.7852 <65737420506f727420506172> 20.0195 <616d657465727320696e207468652054> 29.7852 <65737420506f727420436f6e6669677572> 20.0195 <6174696f6e2046696c65206966>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 650.426 Td +/F2.0 13 Tf +[<746865205472> 20.0195 <616e73706f7274204368616e6e656c2069732054> 20.0195 <43502f4950>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 623.866 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 626.05 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5016 Tw + +BT +66.24 599.866 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207768657468657220746865204162737472> 20.0195 <61637420536f636b> 20.0195 <657420697320636f6e74726f6c6c6564>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 584.086 Td +/F1.0 10.5 Tf +[<62> 20.0195 <7920636f6e6e656374696f6e20415350732e205468652064656661756c742076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +269.3938 584.086 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +290.3938 584.086 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2202 Tw + +BT +66.24 556.306 Td +/F1.0 10.5 Tf +<4966207468652076616c756520697320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2202 Tw + +BT +137.2924 556.306 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2202 Tw + +BT +163.5424 556.306 Td +/F1.0 10.5 Tf +[<2c207468652066756e6374696f6e616c6974696573206f6620746865204162737472> 20.0195 <61637420536f636b> 20.0195 <6574206861766520746f20626520636f6e74726f6c6c65642062> 20.0195 <792063616c6c696e6720697473>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +20.1717 Tw + +BT +66.24 540.526 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +20.1717 Tw + +BT +181.74 540.526 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +20.1717 Tw + +BT +207.2563 540.526 Td +/F3.0 10.5 Tf +<6f70656e5f6c697374656e5f706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +20.1717 Tw + +BT +291.2563 540.526 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +20.1717 Tw + +BT +316.7725 540.526 Td +/F3.0 10.5 Tf +<72656d6f76655f636c69656e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +20.1717 Tw + +BT +385.0225 540.526 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +20.1717 Tw + +BT +410.5388 540.526 Td +/F3.0 10.5 Tf +<72656d6f76655f616c6c5f636c69656e7473> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +20.1717 Tw + +BT +505.0388 540.526 Td +/F1.0 10.5 Tf +<20616e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.088 Tw + +BT +66.24 524.746 Td +/F3.0 10.5 Tf +<636c6f73655f6c697374656e5f706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.088 Tw + +BT +155.49 524.746 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e732e20546865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742077696c6c206e6f742063726561746520616e> 20.0195 <7920636f6e6e656374696f6e206f72206c697374656e696e6720706f7274>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9914 Tw + +BT +66.24 508.966 Td +/F1.0 10.5 Tf +<7768656e2063616c6c696e672074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9914 Tw + +BT +157.7786 508.966 Td +/F3.0 10.5 Tf +<6d61705f75736572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9914 Tw + +BT +199.7786 508.966 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2e205573696e67207468697320706172> 20.0195 <616d657465722c206d6f7265207468616e206f6e6520636f6e6e656374696f6e2063616e206265>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.9536 Tw + +BT +66.24 493.186 Td +/F1.0 10.5 Tf +[<6f70656e656420696e20636c69656e74206d6f6465206f706572> 20.0195 <6174696f6e2e20546865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742077696c6c2063616c6c2074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.9536 Tw + +BT +449.915 493.186 Td +/F3.0 10.5 Tf +<6c697374656e5f706f72745f6f70656e6564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.9536 Tw + +BT +544.415 493.186 Td +/F1.0 10.5 Tf +<2c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.5865 Tw + +BT +66.24 477.406 Td +/F3.0 10.5 Tf +<636c69656e745f636f6e6e656374696f6e5f6f70656e6564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.5865 Tw + +BT +192.24 477.406 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.5865 Tw + +BT +202.171 477.406 Td +/F3.0 10.5 Tf +<706565725f636f6e6e6563746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.5865 Tw + +BT +275.671 477.406 Td +/F1.0 10.5 Tf +<20616e6420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.5865 Tw + +BT +309.393 477.406 Td +/F3.0 10.5 Tf +<706565725f646973636f6e6e6563746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.5865 Tw + +BT +398.643 477.406 Td +/F1.0 10.5 Tf +<2066756e6374696f6e73206f6620746865207465737420706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3694 Tw + +BT +66.24 461.626 Td +/F1.0 10.5 Tf +[<696d706c656d656e74696e67206974207768656e20636f72726573706f6e64696e67206576656e74732068617070656e2e205468697320616c6c6f7773207465737420706f72747320616e64205454> 20.0195 <434e20636f646520746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 445.846 Td +/F1.0 10.5 Tf +[<6469726563746c792068616e646c652054> 20.0195 <435020636f6e6e656374696f6e20696e6974696174696f6e7320616e64206576656e74732e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 418.066 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 420.25 Td +/F3.0 10.5 Tf +<7365727665725f6d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.373 Tw + +BT +66.24 394.066 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207768657468657220746865207465737420706f7274207368616c6c20616374206173206120736572766572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2308 Tw + +BT +66.24 378.286 Td +/F1.0 10.5 Tf +<6f72206120636c69656e742e204966207468652076616c756520697320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2308 Tw + +BT +193.5718 378.286 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2308 Tw + +BT +219.8218 378.286 Td +/F1.0 10.5 Tf +<2c20746865207465737420706f72742077696c6c206163742061732061207365727665722e204966207468652076616c756520697320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2308 Tw + +BT +459.7122 378.286 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2308 Tw + +BT +480.7122 378.286 Td +/F1.0 10.5 Tf +<2c20746865207465737420706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +5.6539 Tw + +BT +66.24 362.506 Td +/F1.0 10.5 Tf +<77696c6c20616374206173206120636c69656e742e205468652064656661756c742076616c756520697320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +5.6539 Tw + +BT +312.0158 362.506 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +5.6539 Tw + +BT +333.0158 362.506 Td +/F1.0 10.5 Tf +[<202e2054686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e67206966>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.6508 Tw + +BT +66.24 346.726 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.6508 Tw + +BT +165.99 346.726 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.6508 Tw + +BT +219.3597 346.726 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.6508 Tw + +BT +245.6097 346.726 Td +/F1.0 10.5 Tf +<20626563617573652074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.6508 Tw + +BT +317.822 346.726 Td +/F3.0 10.5 Tf +<6f70656e5f6c697374656e5f706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.6508 Tw + +BT +401.822 346.726 Td +/F1.0 10.5 Tf +<20696e6974696174657320746865206c697374656e696e67206f6e2061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 330.946 Td +/F1.0 10.5 Tf +<73657276657220706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 303.166 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 305.35 Td +/F3.0 10.5 Tf +<736f636b65745f646562756767696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6769 Tw + +BT +66.24 279.166 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f20656e61626c65206465627567206c6f6767696e672072656c6174656420746f20746865207472> 20.0195 <616e73706f7274>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 263.386 Td +/F1.0 10.5 Tf +[<6368616e6e656c202854> 20.0195 <435020736f636b> 20.0195 <657420616e642053534c206f706572> 20.0195 <6174696f6e732920696e20746865207465737420706f72742e205468652064656661756c742076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +449.6574 263.386 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +470.6574 263.386 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 235.606 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 237.79 Td +/F3.0 10.5 Tf +<68616c745f6f6e5f636f6e6e656374696f6e5f7265736574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4512 Tw + +BT +66.24 211.606 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207768657468657220746865207465737420706f7274207368616c6c2073746f70206f6e206572726f7273>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.6674 Tw + +BT +66.24 195.826 Td +/F1.0 10.5 Tf +<6f6363757272656420647572696e6720636f6e6e656374696f6e2073657475702028696e636c7564696e6720636f6e6e656374696f6e207265667573696e67292c2073656e64696e6720616e6420726563656976696e672c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9639 Tw + +BT +66.24 180.046 Td +/F1.0 10.5 Tf +<646973636f6e6e656374696f6e2028696e636c7564696e672074686520646574656374696f6e206f662074686520646973636f6e6e656374696f6e292e205468652076616c756520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9639 Tw + +BT +440.0858 180.046 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9639 Tw + +BT +466.3358 180.046 Td +/F1.0 10.5 Tf +<206d65616e73207468652074657374> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2169 Tw + +BT +66.24 164.266 Td +/F1.0 10.5 Tf +<706f72742077696c6c2073746f702c207468652076616c756520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2169 Tw + +BT +187.9905 164.266 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2169 Tw + +BT +208.9905 164.266 Td +/F1.0 10.5 Tf +<206d65616e7320746861742069742077696c6c206e6f742073746f70206f6e2073756368206572726f72732e205468652064656661756c742076616c756520697320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2169 Tw + +BT +526.04 164.266 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2169 Tw + +BT +547.04 164.266 Td +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 148.486 Td +/F1.0 10.5 Tf +<696e20736572766572206d6f646520616e6420> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +166.3155 148.486 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +192.5655 148.486 Td +/F1.0 10.5 Tf +<20696e20636c69656e74206d6f64652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +66.24 120.706 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e6720696620>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +274.7251 120.706 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +374.4751 120.706 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +443.4969 120.706 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +469.7469 120.706 Td +/F1.0 10.5 Tf +<2c206265636175736520746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 104.926 Td +/F3.0 10.5 Tf +<706565725f646973636f6e6e6563746564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +155.49 104.926 Td +/F1.0 10.5 Tf +<2066756e6374696f6e206f6620746865207465737420706f72742069732063616c6c6564206f6e20746865206576656e742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 77.146 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 79.33 Td +/F3.0 10.5 Tf +<6e61676c696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7149 Tw + +BT +66.24 53.146 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207768657468657220636f6e636174656e6174696f6e206f6363757273206f6e2054> 20.0195 <4350>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<36> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +64 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 63 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F5.0 59 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +65 0 obj +[64 0 R /XYZ 0 841.89 null] +endobj +66 0 obj +[64 0 R /XYZ 0 686.79 null] +endobj +67 0 obj +<< /Length 16555 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +66.24 794.676 Td +/F1.0 10.5 Tf +[<6c61> 20.0195 <7965722e2049662076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +148.4968 794.676 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +174.7468 794.676 Td +/F1.0 10.5 Tf +<2c20636f6e636174656e6174696f6e20697320656e61626c65642e2049662076616c756520697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +361.4053 794.676 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +382.4053 794.676 Td +/F1.0 10.5 Tf +<2c2069742069732064697361626c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.5 w +0.9333 0.9333 0.9333 SCN +120.4695 778.86 m +120.4695 739.3 l +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +78.3451 755.006 Td +/F2.0 10.5 Tf +[<4e4f> 20.0195 <5445>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9668 Tw + +BT +132.4695 762.896 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.9668 Tw + +BT +154.8563 762.896 Td +/F3.0 10.5 Tf +<6e61676c696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9668 Tw + +BT +191.6063 762.896 Td +/F1.0 10.5 Tf +<2073657474696e672069732076616c6964206f6e6c7920666f7220746865206f7574676f696e67206d657373616765732e2054686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.9668 Tw + +BT +460.0683 762.896 Td +/F3.0 10.5 Tf +<6e61676c696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9668 Tw + +BT +496.8183 762.896 Td +/F1.0 10.5 Tf +<20666f7220746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +132.4695 747.116 Td +/F1.0 10.5 Tf +[<696e636f6d696e67206d65737361676573207368616c6c206265207365742062> 20.0195 <79207468652073656e64696e67207061727479> 89.8438 <2e205468652064656661756c742076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +497.4299 747.116 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +518.4299 747.116 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 715.336 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 717.52 Td +/F3.0 10.5 Tf +<72656d6f74655f61646472657373> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2065 Tw + +BT +66.24 691.336 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465722063616e206265207573656420746f20737065636966792074686520736572766572> -29.7852 ] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 675.556 Td +/F1.0 10.5 Tf +<7573656420696e20736572766572206d6f64652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +66.24 647.776 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e6720696620>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +274.7251 647.776 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +374.4751 647.776 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +443.4969 647.776 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +469.7469 647.776 Td +/F1.0 10.5 Tf +<2c206265636175736520746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 631.996 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +181.74 631.996 Td +/F1.0 10.5 Tf +<2066756e6374696f6e207265636569766573207468652072656d6f746520616e64206f7074696f6e616c6c7920746865206c6f63616c20616464726573732e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 604.216 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 606.4 Td +/F3.0 10.5 Tf +<72656d6f74655f706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4814 Tw + +BT +66.24 580.216 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465722063616e206265207573656420746f20737065636966792074686520736572766572> -29.7852 ] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 564.436 Td +/F1.0 10.5 Tf +<6e6f74207573656420696e20736572766572206d6f64652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +66.24 536.656 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e6720696620>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +274.7251 536.656 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +374.4751 536.656 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +443.4969 536.656 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +469.7469 536.656 Td +/F1.0 10.5 Tf +<2c206265636175736520746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 520.876 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +181.74 520.876 Td +/F1.0 10.5 Tf +<2066756e6374696f6e207265636569766573207468652072656d6f746520616e64206f7074696f6e616c6c7920746865206c6f63616c20616464726573732e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 493.096 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 495.28 Td +/F3.0 10.5 Tf +<6c6f63616c5f706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6334 Tw + +BT +66.24 469.096 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465722063616e206265207573656420746f20737065636966792074686520706f72742077686572652074686520736572766572206973206c697374656e696e6720666f7220636f6e6e656374696f6e732e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 453.316 Td +/F1.0 10.5 Tf +<4d616e6461746f727920696e20736572766572206d6f646520616e64206f7074696f6e616c20696e20636c69656e74206d6f64652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 425.536 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465722073657276657320617320612064656661756c7420696620>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +247.6693 425.536 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +347.4193 425.536 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +390.1858 425.536 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +416.4358 425.536 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 397.756 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 399.94 Td +/F3.0 10.5 Tf +<61695f66616d696c79> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.316 Tw + +BT +66.24 373.756 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465722063616e206265207573656420746f20737065636966792074686520616464726573732066616d696c7920746f20757365207768656e206f70656e696e67206c697374656e696e6720706f727473206f72>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0646 Tw + +BT +66.24 357.976 Td +/F1.0 10.5 Tf +<6372656174696e6720636c69656e7420636f6e6e656374696f6e732e204966206974732076616c75652069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.0646 Tw + +BT +301.9481 357.976 Td +/F5.0 10.5 Tf +<224950763422> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0646 Tw + +BT +333.4481 357.976 Td +/F1.0 10.5 Tf +<206f7220> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.0646 Tw + +BT +350.0204 357.976 Td +/F5.0 10.5 Tf +<2241465f494e455422> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0646 Tw + +BT +397.2704 357.976 Td +/F1.0 10.5 Tf +<206f6e6c792049507634206164647265737365732061726520757365642e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.631 Tw + +BT +66.24 342.196 Td +/F1.0 10.5 Tf +<49662069742069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.631 Tw + +BT +129.6543 342.196 Td +/F5.0 10.5 Tf +<224950763622> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.631 Tw + +BT +161.1543 342.196 Td +/F1.0 10.5 Tf +<206f7220> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.631 Tw + +BT +178.8593 342.196 Td +/F5.0 10.5 Tf +<2241465f494e45543622> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.631 Tw + +BT +231.3593 342.196 Td +/F1.0 10.5 Tf +<206f6e6c79204950763620636f6e6e656374696f6e732061726520616c6c6f7765642e205468652076616c75657320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.631 Tw + +BT +472.0795 342.196 Td +/F5.0 10.5 Tf +<6022554e535045432260> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.631 Tw + +BT +524.5795 342.196 Td +/F1.0 10.5 Tf +<20616e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.0174 Tw + +BT +66.24 326.416 Td +/F3.0 10.5 Tf +<2241465f554e5350454322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0174 Tw + +BT +123.99 326.416 Td +/F1.0 10.5 Tf +<2063616e20626520757365642069662074686520616464726573732066616d696c79206973206e6f74207370656369666965642e2054686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.0174 Tw + +BT +406.9102 326.416 Td +/F5.0 10.5 Tf +<22554e5350454322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0174 Tw + +BT +448.9102 326.416 Td +/F1.0 10.5 Tf +<2076616c756520616c6c6f7773207573696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0689 Tw + +BT +66.24 310.636 Td +/F1.0 10.5 Tf +<4950763420616e64204950763620616464726573736573206174207468652073616d652074696d652e205468652073656c656374696f6e206973206d616465206175746f6d61746963616c6c7920646570656e64696e67206f6e20746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 294.856 Td +/F1.0 10.5 Tf +<61637475616c2076616c7565206f6620746865206c6f63616c20616e642072656d6f7465206164647265737365732e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 267.076 Td +/F1.0 10.5 Tf +[<5468697320706172> 20.0195 <616d65746572206973206f7074696f6e616c2e205468652064656661756c742076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +303.8968 267.076 Td +/F5.0 10.5 Tf +<2241465f554e5350454322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +361.6468 267.076 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 239.296 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 241.48 Td +/F3.0 10.5 Tf +<7365727665725f6261636b6c6f67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.2175 Tw + +BT +66.24 215.296 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465722063616e206265207573656420746f207370656369667920746865206e756d626572206f6620616c6c6f7765642070656e64696e6720287175657565642920636f6e6e656374696f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1006 Tw + +BT +66.24 199.516 Td +/F1.0 10.5 Tf +<7265717565737473206f6e2074686520706f72742074686520736572766572206c697374656e732e204974206973206f7074696f6e616c20696e20736572766572206d6f646520616e64206e6f74207573656420696e20636c69656e74206d6f64652e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 183.736 Td +/F1.0 10.5 Tf +<5468652064656661756c742076616c756520697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +166.851 183.736 Td +/F5.0 10.5 Tf +<223122> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +182.601 183.736 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 155.956 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 158.14 Td +/F3.0 10.5 Tf +<5443505f7265636f6e6e6563745f617474656d707473> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2749 Tw + +BT +66.24 131.956 Td +/F1.0 10.5 Tf +[<5468697320706172> 20.0195 <616d657465722063616e206265207573656420746f207370656369667920746865206d6178696d756d206e756d626572206f662074696d65732074686520636f6e6e656374696f6e206973>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 116.176 Td +/F1.0 10.5 Tf +[<617474656d7074656420746f2062652065737461626c697368656420696e2054> 20.0195 <4350207265636f6e6e656374206d6f64652e205468652064656661756c742076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +427.4398 116.176 Td +/F5.0 10.5 Tf +<223522> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +443.1898 116.176 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +66.24 88.396 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e6720696620>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +274.7251 88.396 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +374.4751 88.396 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +443.4969 88.396 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +469.7469 88.396 Td +/F1.0 10.5 Tf +<2c206265636175736520746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1027 Tw + +BT +66.24 72.616 Td +/F3.0 10.5 Tf +<706565725f646973636f6e6e6563746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1027 Tw + +BT +155.49 72.616 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2069732063616c6c6564207768656e20746865206576656e742068617070656e732c20616e64206974d57320757020746f20746865207465737420706f7274206f72205454> 20.0195 <434e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 56.836 Td +/F1.0 10.5 Tf +<636f646520686f7720746f20636f6e74696e75652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.009 14.388 Td +/F1.0 9 Tf +<37> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +68 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 67 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F5.0 59 0 R +/F2.0 19 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +69 0 obj +<< /Length 13835 +>> +stream +q + +-0.5 Tc +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +56.8805 793.926 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 796.11 Td +/F3.0 10.5 Tf +<5443505f7265636f6e6e6563745f64656c6179> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8156 Tw + +BT +66.24 769.926 Td +/F1.0 10.5 Tf +[<5468697320706172> 20.0195 <616d657465722063616e206265207573656420746f2073706563696679207468652074696d652028696e207365636f6e64732920746865207465737420706f7274207761697473206265747765656e20746f2054> 20.0195 <4350>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 754.146 Td +/F1.0 10.5 Tf +<7265636f6e6e656374696f6e20617474656d70742e205468652064656661756c742076616c756520697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +279.8625 754.146 Td +/F5.0 10.5 Tf +<223122> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +295.6125 754.146 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +66.24 726.366 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e6720696620>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +274.7251 726.366 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +374.4751 726.366 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +443.4969 726.366 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +469.7469 726.366 Td +/F1.0 10.5 Tf +<2c206265636175736520746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1027 Tw + +BT +66.24 710.586 Td +/F3.0 10.5 Tf +<706565725f646973636f6e6e6563746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1027 Tw + +BT +155.49 710.586 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2069732063616c6c6564207768656e20746865206576656e742068617070656e732c20616e64206974d57320757020746f20746865207465737420706f7274206f72205454> 20.0195 <434e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 694.806 Td +/F1.0 10.5 Tf +<636f646520686f7720746f20636f6e74696e75652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 667.026 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 669.21 Td +/F3.0 10.5 Tf +<636c69656e745f5443505f7265636f6e6e656374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3739 Tw + +BT +66.24 643.026 Td +/F1.0 10.5 Tf +[<496620746865207465737420706f727420697320696e20636c69656e74206d6f646520616e642074686520636f6e6e656374696f6e2077617320696e7465727275707465642062> 20.0195 <7920746865206f7468657220736964652c20697420747269657320746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 627.246 Td +/F1.0 10.5 Tf +<7265636f6e6e65637420616761696e2e205468652064656661756c742076616c75652069732060606e6f27272e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +66.24 599.466 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d6574657220686173206e6f206d65616e696e6720696620>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +274.7251 599.466 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +374.4751 599.466 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +6.5638 Tw + +BT +443.4969 599.466 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +6.5638 Tw + +BT +469.7469 599.466 Td +/F1.0 10.5 Tf +<2c206265636175736520746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1027 Tw + +BT +66.24 583.686 Td +/F3.0 10.5 Tf +<706565725f646973636f6e6e6563746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1027 Tw + +BT +155.49 583.686 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2069732063616c6c6564207768656e20746865206576656e742068617070656e732c20616e64206974d57320757020746f20746865207465737420706f7274206f72205454> 20.0195 <434e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 567.906 Td +/F1.0 10.5 Tf +<636f646520686f7720746f20636f6e74696e75652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 540.126 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 542.31 Td +/F3.0 10.5 Tf +<7573655f6e6f6e5f626c6f636b696e675f736f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5441 Tw + +BT +66.24 516.126 Td +/F1.0 10.5 Tf +[<5468697320706172> 20.0195 <616d657465722063616e206265207573656420746f20737065636966792077686574686572207468652054> 29.7852 <65737420506f7274207368616c6c2075736520626c6f636b696e67206f72206e6f6e2d626c6f636b696e67>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3068 Tw + +BT +66.24 500.346 Td +/F1.0 10.5 Tf +[<54> 20.0195 <435020736f636b> 20.0195 <65742e205573696e67207468697320706172> 20.0195 <616d657465722c2074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.3068 Tw + +BT +255.033 500.346 Td +/F3.0 10.5 Tf +<73656e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3068 Tw + +BT +276.033 500.346 Td +/F1.0 10.5 Tf +[<205454> 20.0195 <434e2d33206f706572> 20.0195 <6174696f6e2077696c6c20626c6f636b20756e74696c2074686520646174612069732073656e742c20627574>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 484.566 Td +/F1.0 10.5 Tf +[<616e20616c676f726974686d20697320696d706c656d656e74656420746f2061766f69642054> 20.0195 <435020646561646c6f636b2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 456.786 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c207468652064656661756c742076616c756520697320>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +298.6993 456.786 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +319.6993 456.786 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 416.286 Td +/F2.0 13 Tf +[<41> 20.0195 <64646974696f6e616c204162737472> 20.0195 <61637420536f636b> 20.0195 <65742054> 29.7852 <65737420506f727420506172> 20.0195 <616d657465727320696e207468652054> 29.7852 <65737420506f7274>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 398.606 Td +/F2.0 13 Tf +[<436f6e6669677572> 20.0195 <6174696f6e2046696c6520696620746865205472> 20.0195 <616e73706f7274204368616e6e656c2069732053534c>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 372.046 Td +/F1.0 10.5 Tf +[<546865736520706172> 20.0195 <616d657465727320617661696c61626c65206f6e6c7920696620>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +223.3168 372.046 Td +/F3.0 10.5 Tf +<41535f5553455f53534c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +275.8168 372.046 Td +/F1.0 10.5 Tf +<206d6163726f20697320646566696e656420647572696e6720636f6d70696c6174696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 344.266 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 346.45 Td +/F3.0 10.5 Tf +<73736c5f7573655f73736c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5944 Tw + +BT +66.24 320.266 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207768657468657220746f207573652053534c206f6e2074686520746f70206f66207468652054> 20.0195 <4350>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 304.486 Td +/F1.0 10.5 Tf +<636f6e6e656374696f6e206f72206e6f742e205468652064656661756c742076616c756520697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +260.595 304.486 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +281.595 304.486 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 276.706 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 278.89 Td +/F3.0 10.5 Tf +<73736c5f7665726966795f6365727469666963617465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.642 Tw + +BT +66.24 252.706 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2074656c6c20746865207465737420706f7274207768657468657220746f20636865636b20746865206365727469666963617465>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.042 Tw + +BT +66.24 236.926 Td +/F1.0 10.5 Tf +<6f6620746865206f7468657220736964652e20496620697420697320646566696e656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.042 Tw + +BT +232.9368 236.926 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.042 Tw + +BT +259.1868 236.926 Td +/F1.0 10.5 Tf +<2c20746865207465737420706f72742077696c6c20717565727920616e6420636865636b207468652063657274696669636174652e20496620746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2606 Tw + +BT +66.24 221.146 Td +/F1.0 10.5 Tf +[<6365727469666963617465206973206e6f742076616c69642028692e652eca746865207075626c696320616e642070726976617465206b> 20.0195 <65797320646f206e6f74206d61746368292c2069742077696c6c206578697420776974682061>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.403 Tw + +BT +66.24 205.366 Td +/F1.0 10.5 Tf +<636f72726573706f6e64696e67206572726f72206d6573736167652e20496620697420697320646566696e656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.403 Tw + +BT +293.3095 205.366 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.403 Tw + +BT +314.3095 205.366 Td +/F1.0 10.5 Tf +<2c20746865207465737420706f72742077696c6c206e6f7420636865636b207468652076616c6964697479206f6620746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 189.586 Td +/F1.0 10.5 Tf +<63657274696669636174652e205468652064656661756c742076616c756520697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +222.5745 189.586 Td +/F5.0 10.5 Tf +<226e6f22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +243.5745 189.586 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 161.806 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 163.99 Td +/F3.0 10.5 Tf +<73736c5f7573655f73657373696f6e5f726573756d7074696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.6276 Tw + +BT +66.24 137.806 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207768657468657220746f207573652f737570706f72742053534c2073657373696f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 122.026 Td +/F1.0 10.5 Tf +<726573756d7074696f6e73206f72206e6f742e205468652064656661756c742076616c756520697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +268.0815 122.026 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +294.3315 122.026 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 94.246 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 96.43 Td +/F3.0 10.5 Tf +<73736c5f63657274696669636174655f636861696e5f66696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.2569 Tw + +BT +66.24 70.246 Td +/F1.0 10.5 Tf +<49742073706563696669657320612050454d20656e636f6465642066696c65d5732070617468206f6e207468652066696c652073797374656d20636f6e7461696e696e672074686520636572746966696361746520636861696e2e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4658 Tw + +BT +66.24 54.466 Td +/F1.0 10.5 Tf +[<4d616e6461746f727920696e20736572766572206d6f646520616e64206f7074696f6e616c20696e20636c69656e74206d6f64652e204e6f746520746861742074686520736572766572206d61> 20.0195 <79207265717569726520636c69656e74>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<38> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +70 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 69 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +/F5.0 59 0 R +/F2.0 19 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +71 0 obj +[70 0 R /XYZ 0 434.97 null] +endobj +72 0 obj +<< /Length 9906 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +66.24 794.676 Td +/F1.0 10.5 Tf +<61757468656e7469636174696f6e2e20496e20746869732063617365206e6f20636f6e6e656374696f6e2063616e2062652065737461626c697368656420776974686f7574206120636c69656e742063657274696669636174652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 766.896 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 769.08 Td +/F3.0 10.5 Tf +<73736c5f707269766174655f6b65795f66696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4033 Tw + +BT +66.24 742.896 Td +/F1.0 10.5 Tf +[<49742073706563696669657320612050454d20656e636f6465642066696c65d5732070617468206f6e207468652066696c652073797374656d20636f6e7461696e696e672074686520736572766572> -29.7852 20.0195 <412070726976617465206b> 20.0195 <6579> 89.8438 <2e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 727.116 Td +/F1.0 10.5 Tf +<4d616e6461746f727920696e20736572766572206d6f646520616e64206f7074696f6e616c20696e20636c69656e74206d6f64652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 699.336 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 701.52 Td +/F3.0 10.5 Tf +<73736c5f707269766174655f6b65795f70617373776f7264> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9265 Tw + +BT +66.24 675.336 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f2073706563696679207468652070617373776f72642070726f74656374696e67207468652070726976617465206b> 20.0195 <6579>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 659.556 Td +/F1.0 10.5 Tf +<66696c652e204966206e6f7420646566696e65642c207468652053534c20746f6f6c6b69742077696c6c2061736b20666f722069742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 631.776 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 633.96 Td +/F3.0 10.5 Tf +<73736c5f7472757374656443416c6973745f66696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2628 Tw + +BT +66.24 607.776 Td +/F1.0 10.5 Tf +<49742073706563696669657320612050454d20656e636f6465642066696c65d5732070617468206f6e207468652066696c652073797374656d20636f6e7461696e696e672074686520636572746966696361746573206f66207468652074727573746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +5.4992 Tw + +BT +66.24 591.996 Td +/F1.0 10.5 Tf +<434120617574686f72697469657320746f207573652e204d616e6461746f727920696e20736572766572206d6f64652c20616e64206d616e6461746f727920696e20636c69656e74206d6f6465206966> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 576.216 Td +/F3.0 10.5 Tf +<73736c5f7665726966795f63657274696669636174653d2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +213.24 576.216 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 548.436 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 550.62 Td +/F3.0 10.5 Tf +<73736c5f616c6c6f7765645f636970686572735f6c697374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.0022 Tw + +BT +66.24 524.436 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d65746572206973206f7074696f6e616c2c20616e642063616e206265207573656420746f20737065636966792074686520616c6c6f77656420636970686572206c6973742e205468652076616c756520697320706173736564>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 508.656 Td +/F1.0 10.5 Tf +<6469726563746c7920746f207468652053534c20746f6f6c6b69742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 480.876 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 480.876 Td +/F3.0 10.5 Tf +<73736c5f64697361626c655f53534c7632> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 465.096 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 465.096 Td +/F3.0 10.5 Tf +<73736c5f64697361626c655f53534c7633> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 449.316 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 449.316 Td +/F3.0 10.5 Tf +<73736c5f64697361626c655f544c537631> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 433.536 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 433.536 Td +/F3.0 10.5 Tf +<73736c5f64697361626c655f544c5376315f31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 417.756 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 417.756 Td +/F3.0 10.5 Tf +<73736c5f64697361626c655f544c5376315f32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1716 Tw + +BT +66.24 389.976 Td +/F1.0 10.5 Tf +[<546865207573616765206f6620612073706563696669632053534c2f544c532076657273696f6e2063616e2062652064697361626c65642062> 20.0195 <792073657474696e672074686520706172> 20.0195 <616d6574657220746f20>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1716 Tw + +BT +483.8054 389.976 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1716 Tw + +BT +510.0554 389.976 Td +/F1.0 10.5 Tf +<2e20506c65617365> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 374.196 Td +/F1.0 10.5 Tf +[<6e6f746520746861742074686520617661696c61626c652053534c2f544c532076657273696f6e732061726520646570656e6473206f66207468652075736564204f70656e53534c206c696272> 20.0195 <617279> 89.8438 <2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 324.084 Td +/F2.0 22 Tf +<54686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +95.474 324.084 Td +/F3.0 22 Tf +<4162737472616374536f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +249.474 324.084 Td +/F2.0 22 Tf +<20415049> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 294.896 Td +/F1.0 10.5 Tf +<496e207468652064657269766564207465737420706f72742074686520666f6c6c6f77696e672066756e6374696f6e732063616e20626520757365643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 255.056 Td +/F2.0 18 Tf +[<4d61702f556e6d6170207468652054> 29.7852 <65737420506f7274>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 227.036 Td +/F1.0 10.5 Tf +<496e2074686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +80.2755 227.036 Td +/F3.0 10.5 Tf +<757365725f6d6170> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +122.2755 227.036 Td +/F1.0 10.5 Tf +<20616e6420> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +146.8245 227.036 Td +/F3.0 10.5 Tf +<757365725f756e6d6170> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +199.3245 227.036 Td +/F1.0 10.5 Tf +<2066756e6374696f6e73206f66207468652064657269766564207465737420706f72742074686573652066756e6374696f6e732073686f756c642062652063616c6c65643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 211.22 m +543.04 211.22 l +545.2491 211.22 547.04 209.4291 547.04 207.22 c +547.04 149.0 l +547.04 146.7909 545.2491 145.0 543.04 145.0 c +52.24 145.0 l +50.0309 145.0 48.24 146.7909 48.24 149.0 c +48.24 207.22 l +48.24 209.4291 50.0309 211.22 52.24 211.22 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 211.22 m +543.04 211.22 l +545.2491 211.22 547.04 209.4291 547.04 207.22 c +547.04 149.0 l +547.04 146.7909 545.2491 145.0 543.04 145.0 c +52.24 145.0 l +50.0309 145.0 48.24 146.7909 48.24 149.0 c +48.24 207.22 l +48.24 209.4291 50.0309 211.22 52.24 211.22 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 188.395 Td +/F3.0 11 Tf +<766f6964206d61705f7573657228293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 158.915 Td +/F3.0 11 Tf +<766f696420756e6d61705f7573657228293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 108.976 Td +/F2.0 18 Tf +[<53657474696e672054> 29.7852 <65737420506f727420506172> 20.0195 <616d6574657273>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 92.92 m +543.04 92.92 l +545.2491 92.92 547.04 91.1291 547.04 88.92 c +547.04 60.18 l +547.04 57.9709 545.2491 56.18 543.04 56.18 c +52.24 56.18 l +50.0309 56.18 48.24 57.9709 48.24 60.18 c +48.24 88.92 l +48.24 91.1291 50.0309 92.92 52.24 92.92 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 92.92 m +543.04 92.92 l +545.2491 92.92 547.04 91.1291 547.04 88.92 c +547.04 60.18 l +547.04 57.9709 545.2491 56.18 543.04 56.18 c +52.24 56.18 l +50.0309 56.18 48.24 57.9709 48.24 60.18 c +48.24 88.92 l +48.24 91.1291 50.0309 92.92 52.24 92.92 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 70.095 Td +/F3.0 11 Tf +<626f6f6c20706172616d657465725f73657428636f6e73742063686172205f5f706172616d657465725f6e616d652c20636f6e73742063686172205f5f706172616d657465725f76616c7565293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +541.009 14.388 Td +/F1.0 9 Tf +<39> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +73 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 72 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +/F5.0 59 0 R +/F2.0 19 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +74 0 obj +[73 0 R /XYZ 0 352.38 null] +endobj +75 0 obj +[73 0 R /XYZ 0 279.08 null] +endobj +76 0 obj +[73 0 R /XYZ 0 133.0 null] +endobj +77 0 obj +<< /Length 14771 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +3.5652 Tw + +BT +48.24 793.926 Td +/F1.0 10.5 Tf +<43616c6c20746869732066756e6374696f6e20696e2074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +3.5652 Tw + +BT +185.3883 793.926 Td +/F3.0 10.5 Tf +<7365745f706172616d65746572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.5652 Tw + +BT +253.6383 793.926 Td +/F1.0 10.5 Tf +<2066756e6374696f6e206f66207468652064657269766564207465737420706f727420746f2073657420746865207465737420706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 778.146 Td +/F1.0 10.5 Tf +[<706172> 20.0195 <616d6574657273206f66204162737472> 20.0195 <616374536f636b> 20.0195 <65742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 738.306 Td +/F2.0 18 Tf +<4f70656e2061204c697374656e696e6720506f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 710.286 Td +/F1.0 10.5 Tf +[<54> 29.7852 <6f206f70656e20612073657276657220736f636b> 20.0195 <65742063616c6c2074686520666f6c6c6f77696e672066756e6374696f6e3a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 694.47 m +543.04 694.47 l +545.2491 694.47 547.04 692.6791 547.04 690.47 c +547.04 661.73 l +547.04 659.5209 545.2491 657.73 543.04 657.73 c +52.24 657.73 l +50.0309 657.73 48.24 659.5209 48.24 661.73 c +48.24 690.47 l +48.24 692.6791 50.0309 694.47 52.24 694.47 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 694.47 m +543.04 694.47 l +545.2491 694.47 547.04 692.6791 547.04 690.47 c +547.04 661.73 l +547.04 659.5209 545.2491 657.73 543.04 657.73 c +52.24 657.73 l +50.0309 657.73 48.24 659.5209 48.24 661.73 c +48.24 690.47 l +48.24 692.6791 50.0309 694.47 52.24 694.47 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 671.645 Td +/F3.0 11 Tf +<696e74206f70656e5f6c697374656e5f706f727428636f6e737420636861722a206c6f63616c486f73746e616d652c20636f6e737420636861722a206c6f63616c53657276696365293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0253 Tw + +BT +48.24 633.766 Td +/F1.0 10.5 Tf +[<546869732066756e6374696f6e20737570706f72747320626f7468204950763420616e642049507636206164647265737365732e2054686520706172> 20.0195 <616d6574657220>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.0253 Tw + +BT +402.3994 633.766 Td +/F3.0 10.5 Tf +<6c6f63616c486f73746e616d65> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0253 Tw + +BT +470.6494 633.766 Td +/F1.0 10.5 Tf +<2073686f756c642073706563696679> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3266 Tw + +BT +48.24 617.986 Td +/F1.0 10.5 Tf +[<746865206c6f63616c20686f73746e616d652e2049742063616e20626520746865206e616d65206f662074686520686f7374206f7220616e20495020616464726573732e2054686520706172> 20.0195 <616d6574657220>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.3266 Tw + +BT +484.04 617.986 Td +/F3.0 10.5 Tf +<6c6f63616c53657276696365> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3266 Tw + +BT +547.04 617.986 Td +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1462 Tw + +BT +48.24 602.206 Td +/F1.0 10.5 Tf +[<73686f756c64206265206120737472696e6720636f6e7461696e696e672074686520706f7274206e756d6265722e204f6e65206f66207468652074776f20706172> 20.0195 <616d65746572732063616e20626520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1462 Tw + +BT +457.9595 602.206 Td +/F5.0 10.5 Tf +<4e554c4c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1462 Tw + +BT +478.9595 602.206 Td +/F1.0 10.5 Tf +<2c206d65616e696e6720> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1462 Tw + +BT +531.29 602.206 Td +/F5.0 10.5 Tf +<414e59> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0393 Tw + +BT +48.24 586.426 Td +/F1.0 10.5 Tf +[<666f72207468617420706172> 20.0195 <616d657465722e2054686520616464726573732066616d696c79207573656420697320737065636966696564206569746865722062> 20.0195 <792074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.0393 Tw + +BT +419.3997 586.426 Td +/F3.0 10.5 Tf +<61695f66616d696c795f6e616d652829> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0393 Tw + +BT +503.3997 586.426 Td +/F1.0 10.5 Tf +<2074657374706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 570.646 Td +/F1.0 10.5 Tf +[<706172> 20.0195 <616d65746572206f72207365742062> 20.0195 <79207468652066756e6374696f6e20>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +212.8376 570.646 Td +/F3.0 10.5 Tf +<7365745f61695f66616d696c7928696e7429> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +307.3376 570.646 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 542.866 Td +/F1.0 10.5 Tf +<54686520666f6c6c6f77696e672066756e6374696f6e206f6e6c7920737570706f72747320495076343a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 517.27 Td +/F3.0 10.5 Tf +<696e74206f70656e5f6c697374656e5f706f727428636f6e73742073747275637420736f636b616464725f696e2026206c6f63616c41646472293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.5 w +0.9333 0.9333 0.9333 SCN +102.4695 503.05 m +102.4695 463.49 l +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.3451 479.196 Td +/F2.0 10.5 Tf +[<4e4f> 20.0195 <5445>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6899 Tw + +BT +114.4695 487.086 Td +/F1.0 10.5 Tf +[<546869732066756e6374696f6e20697320646570726563617465642e204974206973206b> 20.0195 <65707420666f7220636f6d7061746962696c69747920776974682070726576696f75732076657273696f6e73206f66>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +114.4695 471.306 Td +/F1.0 10.5 Tf +<7465737420706f72747320746861742075736520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +205.9245 471.306 Td +/F3.0 10.5 Tf +<4162737472616374536f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.5416 Tw + +BT +48.24 439.526 Td +/F1.0 10.5 Tf +<41667465722063616c6c696e672074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.5416 Tw + +BT +144.8777 439.526 Td +/F3.0 10.5 Tf +<6f70656e5f6c697374656e5f706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.5416 Tw + +BT +228.8777 439.526 Td +/F1.0 10.5 Tf +<2066756e6374696f6e2c207468652066756e6374696f6e207669727475616c20766f696420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.5416 Tw + +BT +431.54 439.526 Td +/F3.0 10.5 Tf +<6c697374656e5f706f72745f6f70656e656428696e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.09 Tw + +BT +48.24 423.746 Td +/F3.0 10.5 Tf +<706f72745f6e756d62657229> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.09 Tw + +BT +111.24 423.746 Td +/F1.0 10.5 Tf +<2069732063616c6c6564206175746f6d61746963616c6c79207769746820746865206c697374656e696e6720706f7274206e756d6265722c206f7220> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.09 Tw + +BT +422.7383 423.746 Td +/F5.0 10.5 Tf +<2d31> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.09 Tw + +BT +433.2383 423.746 Td +/F1.0 10.5 Tf +<20696620746865206f70656e696e67206f6620746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4982 Tw + +BT +48.24 407.966 Td +/F1.0 10.5 Tf +<6c697374656e696e6720706f7274206661696c65642e20546869732066756e6374696f6e2063616e206265206f76657272696464656e20696e207468652064657269766564207465737420706f727420746f20696d706c656d656e74207370656369666963> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4061 Tw + +BT +48.24 392.186 Td +/F1.0 10.5 Tf +<6265686176696f7220646570656e64696e67206f6e20746865206c697374656e20726573756c742e20546869732063616e2c20666f72206578616d706c652cca63616c6c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.4061 Tw + +BT +387.6289 392.186 Td +/F3.0 10.5 Tf +<696e636f6d696e675f6d657373616765> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4061 Tw + +BT +471.6289 392.186 Td +/F1.0 10.5 Tf +[<20746f2067656e6572> 20.0195 <61746520616e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 376.406 Td +/F1.0 10.5 Tf +<696e636f6d696e6720> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +97.989 376.406 Td +/F3.0 10.5 Tf +<4c697374656e526573756c74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +160.989 376.406 Td +/F1.0 10.5 Tf +<206d65737361676520696e20746865207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6548 Tw + +BT +48.24 348.626 Td +/F1.0 10.5 Tf +<53756273657175656e742063616c6c73206f66207468652066756e6374696f6e20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.6548 Tw + +BT +214.0017 348.626 Td +/F3.0 10.5 Tf +<6f70656e5f6c697374656e5f706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6548 Tw + +BT +298.0017 348.626 Td +/F1.0 10.5 Tf +<20726573756c747320696e20636c6f73696e67207468652070726576696f7573206c697374656e696e6720706f727420616e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 332.846 Td +/F1.0 10.5 Tf +[<6f70656e696e672061206e6577206f6e652e2054686973206d65616e732074686174206f6e6c79206f6e652073657276657220706f727420697320737570706f727465642062> 20.0195 <7920>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +414.2173 332.846 Td +/F3.0 10.5 Tf +<4162737472616374536f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +487.7173 332.846 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4448 Tw + +BT +48.24 305.066 Td +/F1.0 10.5 Tf +<5768656e206120636c69656e7420636f6e6e6563747320746f20746865206c697374656e696e6720706f72742074686520666f6c6c6f77696e672066756e6374696f6e73206172652063616c6c656420746f206e6f74696679207468652064657269766564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 289.286 Td +/F1.0 10.5 Tf +<7465737420706f72742061626f757420746865206e657720636c69656e7420636f6e6e656374696f6e3a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 273.47 m +543.04 273.47 l +545.2491 273.47 547.04 271.6791 547.04 269.47 c +547.04 225.99 l +547.04 223.7809 545.2491 221.99 543.04 221.99 c +52.24 221.99 l +50.0309 221.99 48.24 223.7809 48.24 225.99 c +48.24 269.47 l +48.24 271.6791 50.0309 273.47 52.24 273.47 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 273.47 m +543.04 273.47 l +545.2491 273.47 547.04 271.6791 547.04 269.47 c +547.04 225.99 l +547.04 223.7809 545.2491 221.99 543.04 221.99 c +52.24 221.99 l +50.0309 221.99 48.24 223.7809 48.24 225.99 c +48.24 269.47 l +48.24 271.6791 50.0309 273.47 52.24 273.47 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 250.645 Td +/F3.0 11 Tf +<7669727475616c20766f696420706565725f636f6e6e656374656428696e7420636c69656e745f69642c20636f6e73742063686172202a20686f73742c20636f6e737420696e7420706f727429> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 235.905 Td +/F3.0 11 Tf +<7669727475616c20766f696420706565725f636f6e6e656374656428696e7420636c69656e745f69642c20736f636b616464725f696e262072656d6f74655f61646472293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8263 Tw + +BT +48.24 198.026 Td +/F1.0 10.5 Tf +<4f6e6c79206f6e65206f662074686573652066756e6374696f6e732073686f756c64206265206f76657272696464656e20696e207468652064657269766564207465737420706f72742e204e6f74652c207468617420746865207365636f6e64206973> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 182.246 Td +/F1.0 10.5 Tf +[<6f62736f6c6574652e204974206973206b> 20.0195 <65707420666f72206261636b7761726420636f6d7061746962696c697479206f6e6c79> 89.8438 <2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 154.466 Td +/F1.0 10.5 Tf +<53696d696c61722066756e6374696f6e7320666f7220636c69656e7420646973636f6e6e656374733a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 138.65 m +543.04 138.65 l +545.2491 138.65 547.04 136.8591 547.04 134.65 c +547.04 91.17 l +547.04 88.9609 545.2491 87.17 543.04 87.17 c +52.24 87.17 l +50.0309 87.17 48.24 88.9609 48.24 91.17 c +48.24 134.65 l +48.24 136.8591 50.0309 138.65 52.24 138.65 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 138.65 m +543.04 138.65 l +545.2491 138.65 547.04 136.8591 547.04 134.65 c +547.04 91.17 l +547.04 88.9609 545.2491 87.17 543.04 87.17 c +52.24 87.17 l +50.0309 87.17 48.24 88.9609 48.24 91.17 c +48.24 134.65 l +48.24 136.8591 50.0309 138.65 52.24 138.65 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 115.825 Td +/F3.0 11 Tf +<7669727475616c20766f696420706565725f646973636f6e6e656374656428696e7420636c69656e745f6964293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 101.085 Td +/F3.0 11 Tf +<7669727475616c20766f696420706565725f68616c665f636c6f73656428696e7420636c69656e745f6964293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.886 Tw + +BT +48.24 63.206 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.886 Tw + +BT +70.546 63.206 Td +/F3.0 10.5 Tf +<636c69656e745f6964> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.886 Tw + +BT +117.796 63.206 Td +/F1.0 10.5 Tf +[<20706172> 20.0195 <616d657465722073706563696669657320776869636820636c69656e742068617320646973636f6e6e65637465642f68616c6620636c6f7365642e2054686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.886 Tw + +BT +463.04 63.206 Td +/F3.0 10.5 Tf +<706565725f68616c665f636c6f736564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.886 Tw + +BT +547.04 63.206 Td +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3130> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +78 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 77 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +/F2.0 19 0 R +/F5.0 59 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +79 0 obj +[78 0 R /XYZ 0 762.33 null] +endobj +80 0 obj +<< /Length 11453 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +1.6303 Tw + +BT +48.24 794.676 Td +/F1.0 10.5 Tf +[<66756e6374696f6e2069732063616c6c6564207768656e2074686520636c69656e7420636c6f7365732074686520736f636b> 20.0195 <657420666f722077726974696e672c207768696c6520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.6303 Tw + +BT +411.3743 794.676 Td +/F3.0 10.5 Tf +<706565725f646973636f6e6e6563746564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6303 Tw + +BT +500.6243 794.676 Td +/F1.0 10.5 Tf +<2069732063616c6c6564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 778.896 Td +/F1.0 10.5 Tf +<7768656e2074686520636c69656e7420697320646973636f6e6e65637465642e20426f74682066756e6374696f6e732063616e206265206f76657272696464656e20696e207468652064657269766564207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 739.056 Td +/F2.0 18 Tf +<436c6f736520746865204c697374656e696e6720506f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 713.22 Td +/F3.0 10.5 Tf +<766f696420636c6f73655f6c697374656e5f706f72742829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 687.036 Td +/F1.0 10.5 Tf +<546869732066756e6374696f6e20636c6f73657320746865206c697374656e696e6720706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 647.196 Td +/F2.0 18 Tf +<4f70656e206120436c69656e7420436f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 631.14 m +543.04 631.14 l +545.2491 631.14 547.04 629.3491 547.04 627.14 c +547.04 583.66 l +547.04 581.4509 545.2491 579.66 543.04 579.66 c +52.24 579.66 l +50.0309 579.66 48.24 581.4509 48.24 583.66 c +48.24 627.14 l +48.24 629.3491 50.0309 631.14 52.24 631.14 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 631.14 m +543.04 631.14 l +545.2491 631.14 547.04 629.3491 547.04 627.14 c +547.04 583.66 l +547.04 581.4509 545.2491 579.66 543.04 579.66 c +52.24 579.66 l +50.0309 579.66 48.24 581.4509 48.24 583.66 c +48.24 627.14 l +48.24 629.3491 50.0309 631.14 52.24 631.14 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 608.315 Td +/F3.0 11 Tf +<696e74206f70656e5f636c69656e745f636f6e6e656374696f6e28636f6e737420636861722a2072656d6f7465486f73746e616d652c20636f6e737420636861722a2072656d6f7465536572766963652c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 593.575 Td +/F3.0 11 Tf +<636f6e737420636861722a206c6f63616c486f73746e616d652c20636f6e737420636861722a206c6f63616c53657276696365293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3227 Tw + +BT +48.24 555.696 Td +/F1.0 10.5 Tf +<546869732066756e6374696f6e206372656174657320616e2049507634206f72204950763620636f6e6e656374696f6e2066726f6d20746865206c6f63616c206164647265737320> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.3227 Tw + +BT +410.54 555.696 Td +/F3.0 10.5 Tf +<6c6f63616c486f73746e616d652f6c6f63616c53657276696365> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3227 Tw + +BT +547.04 555.696 Td +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 539.916 Td +/F1.0 10.5 Tf +<746f207468652072656d6f7465206164647265737320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +159.498 539.916 Td +/F3.0 10.5 Tf +<72656d6f7465486f73746e616d652f72656d6f746553657276696365> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +306.498 539.916 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 512.136 Td +/F1.0 10.5 Tf +<496620> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +58.6875 512.136 Td +/F3.0 10.5 Tf +<6c6f63616c486f73746e616d65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +126.9375 512.136 Td +/F1.0 10.5 Tf +<206f7220> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +143.3805 512.136 Td +/F3.0 10.5 Tf +<6c6f63616c53657276696365> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +206.3805 512.136 Td +/F1.0 10.5 Tf +<20697320> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +219.9045 512.136 Td +/F5.0 10.5 Tf +<4e554c4c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +240.9045 512.136 Td +/F1.0 10.5 Tf +[<2c2069742077696c6c2062652061737369676e6564206175746f6d61746963616c6c79> 89.8438 <2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9131 Tw + +BT +48.24 484.356 Td +/F1.0 10.5 Tf +[<54686520706172> 20.0195 <616d657465727320666f72207468652072656d6f746520616464726573732063616e6e6f7420626520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9131 Tw + +BT +313.4236 484.356 Td +/F5.0 10.5 Tf +<4e554c4c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9131 Tw + +BT +334.4236 484.356 Td +/F1.0 10.5 Tf +[<2e20546865206c6f63616c206f722072656d6f7465207365727669636520706172> 20.0195 <616d6574657273>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8503 Tw + +BT +48.24 468.576 Td +/F1.0 10.5 Tf +<73686f756c64206265206e756d6265727320696e20737472696e6720666f726d61742c207768696c6520746865206164647265737365732073686f756c64206265206e616d6573206f722049502061646472657373657320696e2049507634> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 452.796 Td +/F1.0 10.5 Tf +<6f72204950763620666f726d61742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 425.016 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +69.66 425.016 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +185.16 425.016 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2061626f7665206d616b> 20.0195 <65732074686520666f6c6c6f77696e672066756e6374696f6e206f62736f6c6574653a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 409.2 m +543.04 409.2 l +545.2491 409.2 547.04 407.4091 547.04 405.2 c +547.04 361.72 l +547.04 359.5109 545.2491 357.72 543.04 357.72 c +52.24 357.72 l +50.0309 357.72 48.24 359.5109 48.24 361.72 c +48.24 405.2 l +48.24 407.4091 50.0309 409.2 52.24 409.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 409.2 m +543.04 409.2 l +545.2491 409.2 547.04 407.4091 547.04 405.2 c +547.04 361.72 l +547.04 359.5109 545.2491 357.72 543.04 357.72 c +52.24 357.72 l +50.0309 357.72 48.24 359.5109 48.24 361.72 c +48.24 405.2 l +48.24 407.4091 50.0309 409.2 52.24 409.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 386.375 Td +/F3.0 11 Tf +<696e74206f70656e5f636c69656e745f636f6e6e656374696f6e28636f6e73742073747275637420736f636b616464725f696e2026206e65775f72656d6f74655f616464722c20636f6e737420737472756374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 371.635 Td +/F3.0 11 Tf +<736f636b616464725f696e2026206e65775f6c6f63616c5f6164647229> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.4779 Tw + +BT +48.24 333.756 Td +/F1.0 10.5 Tf +[<4974206973206b> 20.0195 <65707420666f72206261636b7761726420636f6d7061746962696c69747920666f722064657269766564207465737420706f72747320746861742077657265206e6f74206164617074656420746f207468652049507636>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 317.976 Td +/F1.0 10.5 Tf +<737570706f7274696e672066756e6374696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7521 Tw + +BT +48.24 290.196 Td +/F1.0 10.5 Tf +<41667465722063616c6c696e672074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.7521 Tw + +BT +136.5093 290.196 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7521 Tw + +BT +252.0093 290.196 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2c204162737472> 20.0195 <616374536f636b> 20.0195 <65742063616c6c73206175746f6d61746963616c6c79207468652066756e6374696f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5712 Tw + +BT +48.24 274.416 Td +/F3.0 10.5 Tf +<7669727475616c20766f696420636c69656e745f636f6e6e656374696f6e5f6f70656e656428696e7420636c69656e745f696429> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5712 Tw + +BT +322.9535 274.416 Td +/F1.0 10.5 Tf +<20746f20696e666f726d20746865207465737420706f72742061626f75742074686520726573756c742e20546865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5586 Tw + +BT +48.24 258.636 Td +/F3.0 10.5 Tf +<636c69656e745f6964> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5586 Tw + +BT +95.49 258.636 Td +/F1.0 10.5 Tf +[<20706172> 20.0195 <616d657465722069732073657420746f20746865206964206f662074686520636c69656e742c206f7220>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5586 Tw + +BT +309.3453 258.636 Td +/F5.0 10.5 Tf +<2d31> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5586 Tw + +BT +319.8453 258.636 Td +/F1.0 10.5 Tf +<2069662074686520636f6e6e656374696f6e20636f756c64206e6f742062652065737461626c697368656420746f> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 242.856 Td +/F1.0 10.5 Tf +<7468652072656d6f746520616464726573732e20546869732066756e6374696f6e2063616e206265206f76657272696464656e20696e207468652064657269766564207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 203.016 Td +/F2.0 18 Tf +<53656e64204d657373616765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 186.96 m +543.04 186.96 l +545.2491 186.96 547.04 185.1691 547.04 182.96 c +547.04 139.48 l +547.04 137.2709 545.2491 135.48 543.04 135.48 c +52.24 135.48 l +50.0309 135.48 48.24 137.2709 48.24 139.48 c +48.24 182.96 l +48.24 185.1691 50.0309 186.96 52.24 186.96 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 186.96 m +543.04 186.96 l +545.2491 186.96 547.04 185.1691 547.04 182.96 c +547.04 139.48 l +547.04 137.2709 545.2491 135.48 543.04 135.48 c +52.24 135.48 l +50.0309 135.48 48.24 137.2709 48.24 139.48 c +48.24 182.96 l +48.24 185.1691 50.0309 186.96 52.24 186.96 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 164.135 Td +/F3.0 11 Tf +<766f69642073656e645f6f7574676f696e6728636f6e737420756e7369676e656420636861722a206d6573736167655f6275666665722c20696e74206c656e6774682c20696e7420636c69656e745f6964203d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 149.395 Td +/F3.0 11 Tf +<2d31293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 111.516 Td +/F1.0 10.5 Tf +<5769746820746869732066756e6374696f6e2061206d6573736167652063616e2062652073656e7420746f207468652073706563696669656420636c69656e742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3131> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +81 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 80 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +/F2.0 19 0 R +/F5.0 59 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +82 0 obj +[81 0 R /XYZ 0 763.08 null] +endobj +83 0 obj +[81 0 R /XYZ 0 671.22 null] +endobj +84 0 obj +<< /Limits [(_parameter_accessor_functions) (_the_abstractsocket_api)] +/Names [(_parameter_accessor_functions) 93 0 R (_presumed_knowledge) 21 0 R (_references) 159 0 R (_send_message) 85 0 R (_server_mode) 34 0 R (_server_mode_2) 124 0 R (_setting_test_port_parameters) 76 0 R (_ssl_functionality) 43 0 R (_start_procedure) 30 0 R (_system_requirements) 24 0 R (_terminology) 154 0 R (_test_port_parameter_names) 90 0 R (_the_abstractsocket_api) 74 0 R] +>> +endobj +85 0 obj +[81 0 R /XYZ 0 227.04 null] +endobj +86 0 obj +<< /Length 8865 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 792.006 Td +/F2.0 13 Tf +[<54> 29.7852 <6f20526563656976652061204d657373616765>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 765.446 Td +/F1.0 10.5 Tf +<5768656e2061206d6573736167652069732072656365697665642c2074686520666f6c6c6f77696e672066756e6374696f6e2069732063616c6c6564206175746f6d61746963616c6c793a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 749.63 m +543.04 749.63 l +545.2491 749.63 547.04 747.8391 547.04 745.63 c +547.04 702.15 l +547.04 699.9409 545.2491 698.15 543.04 698.15 c +52.24 698.15 l +50.0309 698.15 48.24 699.9409 48.24 702.15 c +48.24 745.63 l +48.24 747.8391 50.0309 749.63 52.24 749.63 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 749.63 m +543.04 749.63 l +545.2491 749.63 547.04 747.8391 547.04 745.63 c +547.04 702.15 l +547.04 699.9409 545.2491 698.15 543.04 698.15 c +52.24 698.15 l +50.0309 698.15 48.24 699.9409 48.24 702.15 c +48.24 745.63 l +48.24 747.8391 50.0309 749.63 52.24 749.63 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 726.805 Td +/F3.0 11 Tf +<7669727475616c20766f6964206d6573736167655f696e636f6d696e6728636f6e737420756e7369676e656420636861722a206d6573736167655f6275666665722c20696e74206c656e6774682c20696e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 712.065 Td +/F3.0 11 Tf +<636c69656e745f6964203d202d3129> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1243 Tw + +BT +48.24 674.186 Td +/F1.0 10.5 Tf +[<546869732066756e6374696f6e206d757374206265206f76657272696464656e20696e207468652064657269766564207465737420706f72742e2054> 29.7852 <6f2067656e6572> 20.0195 <61746520616e20696e636f6d696e67205454> 20.0195 <434e33206d6573736167652c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 658.406 Td +/F1.0 10.5 Tf +<746865207465737420706f7274207368616c6c2063616c6c2074686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +176.76 658.406 Td +/F3.0 10.5 Tf +<696e636f6d696e675f6d657373616765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +260.76 658.406 Td +/F1.0 10.5 Tf +<2066756e6374696f6e206f662074686520546974616e204150492077697468696e20746869732066756e6374696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.5936 Tw + +BT +48.24 630.626 Td +/F1.0 10.5 Tf +[<496e206f72646572207468617420746869732066756e6374696f6e20636f756c642062652063616c6c6564206175746f6d61746963616c6c79> 89.8438 <2c207468652064657269766564207465737420706f7274207368616c6c20646566696e65207468657365>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 614.846 Td +/F1.0 10.5 Tf +<66756e6374696f6e733a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 599.03 m +543.04 599.03 l +545.2491 599.03 547.04 597.2391 547.04 595.03 c +547.04 536.81 l +547.04 534.6009 545.2491 532.81 543.04 532.81 c +52.24 532.81 l +50.0309 532.81 48.24 534.6009 48.24 536.81 c +48.24 595.03 l +48.24 597.2391 50.0309 599.03 52.24 599.03 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 599.03 m +543.04 599.03 l +545.2491 599.03 547.04 597.2391 547.04 595.03 c +547.04 536.81 l +547.04 534.6009 545.2491 532.81 543.04 532.81 c +52.24 532.81 l +50.0309 532.81 48.24 534.6009 48.24 536.81 c +48.24 595.03 l +48.24 597.2391 50.0309 599.03 52.24 599.03 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 576.205 Td +/F3.0 11 Tf +<7669727475616c20766f69642048616e646c65725f496e7374616c6c28636f6e73742066645f7365742a20726561645f6664732c20636f6e73742066645f7365742a2077726974655f6664732c20636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 561.465 Td +/F3.0 11 Tf +<66645f7365742a206572726f725f6664732c20646f75626c652063616c6c5f696e74657276616c293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 546.725 Td +/F3.0 11 Tf +<7669727475616c20766f69642048616e646c65725f556e696e7374616c6c28293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 508.846 Td +/F1.0 10.5 Tf +<496e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +61.5855 508.846 Td +/F3.0 10.5 Tf +<48616e646c65725f496e7374616c6c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +140.3355 508.846 Td +/F1.0 10.5 Tf +<2074686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +161.745 508.846 Td +/F3.0 10.5 Tf +<496e7374616c6c5f48616e646c6572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +240.495 508.846 Td +/F1.0 10.5 Tf +<20546974616e204150492066756e6374696f6e2069732063616c6c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 481.066 Td +/F1.0 10.5 Tf +<416c736f20696e2074686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +103.9425 481.066 Td +/F3.0 10.5 Tf +<4576656e745f48616e646c6572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +172.1925 481.066 Td +/F1.0 10.5 Tf +<20546974616e204150492066756e6374696f6e2c207468652066756e6374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 465.25 m +543.04 465.25 l +545.2491 465.25 547.04 463.4591 547.04 461.25 c +547.04 417.77 l +547.04 415.5609 545.2491 413.77 543.04 413.77 c +52.24 413.77 l +50.0309 413.77 48.24 415.5609 48.24 417.77 c +48.24 461.25 l +48.24 463.4591 50.0309 465.25 52.24 465.25 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 465.25 m +543.04 465.25 l +545.2491 465.25 547.04 463.4591 547.04 461.25 c +547.04 417.77 l +547.04 415.5609 545.2491 413.77 543.04 413.77 c +52.24 413.77 l +50.0309 413.77 48.24 415.5609 48.24 417.77 c +48.24 461.25 l +48.24 463.4591 50.0309 465.25 52.24 465.25 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 442.425 Td +/F3.0 11 Tf +<766f69642048616e646c655f4576656e7428636f6e73742066645f736574202a726561645f6664732c20636f6e73742066645f736574205f5f77726974655f6664732c20636f6e73742066645f736574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 427.685 Td +/F3.0 11 Tf +<5f5f6572726f725f6664732c20646f75626c652074696d655f73696e63655f6c6173745f63616c6c29> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 389.806 Td +/F1.0 10.5 Tf +<69732063616c6c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 349.966 Td +/F2.0 18 Tf +<436c6f7365206120436c69656e7420436f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 333.91 m +543.04 333.91 l +545.2491 333.91 547.04 332.1191 547.04 329.91 c +547.04 286.43 l +547.04 284.2209 545.2491 282.43 543.04 282.43 c +52.24 282.43 l +50.0309 282.43 48.24 284.2209 48.24 286.43 c +48.24 329.91 l +48.24 332.1191 50.0309 333.91 52.24 333.91 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 333.91 m +543.04 333.91 l +545.2491 333.91 547.04 332.1191 547.04 329.91 c +547.04 286.43 l +547.04 284.2209 545.2491 282.43 543.04 282.43 c +52.24 282.43 l +50.0309 282.43 48.24 284.2209 48.24 286.43 c +48.24 329.91 l +48.24 332.1191 50.0309 333.91 52.24 333.91 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 311.085 Td +/F3.0 11 Tf +<7669727475616c20766f69642072656d6f76655f636c69656e7428696e7420636c69656e745f6964293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 296.345 Td +/F3.0 11 Tf +<7669727475616c20766f69642072656d6f76655f616c6c5f636c69656e747328293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4062 Tw + +BT +48.24 258.466 Td +/F1.0 10.5 Tf +<54686520666972737420636c6f7365732074686520636f6e6e656374696f6e20666f72206120676976656e20636c69656e7420746865207365636f6e642066756e6374696f6e20636c6f7365732074686520636f6e6e656374696f6e206f6620616c6c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 242.686 Td +/F1.0 10.5 Tf +<636c69656e74732e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 202.846 Td +/F2.0 18 Tf +[<54> 29.7852 <65737420506f727420506172> 20.0195 <616d65746572204e616d6573>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7461 Tw + +BT +48.24 174.826 Td +/F1.0 10.5 Tf +[<5468652064656661756c74204162737472> 20.0195 <616374536f636b> 20.0195 <6574207465737420706f727420706172> 20.0195 <616d65746572206e616d65732063616e206265207265646566696e656420696e207468652064657269766564207465737420706f72742062> 20.0195 <79>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 159.046 Td +/F1.0 10.5 Tf +<6f766572726964696e672074686520617070726f7072696174652066756e6374696f6e2062656c6f773a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3132> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +87 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 86 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +88 0 obj +[87 0 R /XYZ 0 841.89 null] +endobj +89 0 obj +[87 0 R /XYZ 0 373.99 null] +endobj +90 0 obj +[87 0 R /XYZ 0 226.87 null] +endobj +91 0 obj +<< /Length 9880 +>> +stream +q +q +/DeviceRGB cs +0.9608 0.9608 0.9608 scn +52.24 805.89 m +543.04 805.89 l +545.2491 805.89 547.04 804.0991 547.04 801.89 c +547.04 493.09 l +547.04 490.8809 545.2491 489.09 543.04 489.09 c +52.24 489.09 l +50.0309 489.09 48.24 490.8809 48.24 493.09 c +48.24 801.89 l +48.24 804.0991 50.0309 805.89 52.24 805.89 c +h +f +/DeviceRGB CS +0.8 0.8 0.8 SCN +0.75 w +52.24 805.89 m +543.04 805.89 l +545.2491 805.89 547.04 804.0991 547.04 801.89 c +547.04 493.09 l +547.04 490.8809 545.2491 489.09 543.04 489.09 c +52.24 489.09 l +50.0309 489.09 48.24 490.8809 48.24 493.09 c +48.24 801.89 l +48.24 804.0991 50.0309 805.89 52.24 805.89 c +h +S +Q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +59.24 783.065 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a206c6f63616c5f706f72745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 768.325 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2072656d6f74655f616464726573735f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 753.585 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a206c6f63616c5f616464726573735f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 738.845 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2072656d6f74655f706f72745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 724.105 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2061695f66616d696c795f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 709.365 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a207573655f636f6e6e656374696f6e5f415350735f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 694.625 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2068616c745f6f6e5f636f6e6e656374696f6e5f72657365745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 679.885 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a20636c69656e745f5443505f7265636f6e6e6563745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 665.145 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a205443505f7265636f6e6e6563745f617474656d7074735f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 650.405 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a205443505f7265636f6e6e6563745f64656c61795f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 635.665 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a207365727665725f6d6f64655f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 620.925 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a20736f636b65745f646562756767696e675f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 606.185 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a206e61676c696e675f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 591.445 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a207573655f6e6f6e5f626c6f636b696e675f736f636b65745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 576.705 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a207365727665725f6261636b6c6f675f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 561.965 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2073736c5f64697361626c655f53534c763228293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 547.225 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2073736c5f64697361626c655f53534c763328293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 532.485 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2073736c5f64697361626c655f544c53763128293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 517.745 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2073736c5f64697361626c655f544c5376315f3128293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 503.005 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2073736c5f64697361626c655f544c5376315f3228293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 453.066 Td +/F2.0 18 Tf +[<506172> 20.0195 <616d657465722041> 20.0195 <63636573736f722046756e6374696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 425.046 Td +/F1.0 10.5 Tf +[<54686520666f6c6c6f77696e672066756e6374696f6e732063616e2062652075736520746f206765742f73657420746865204162737472> 20.0195 <616374536f636b> 20.0195 <657420706172> 20.0195 <616d65746572733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 409.23 m +543.04 409.23 l +545.2491 409.23 547.04 407.4391 547.04 405.23 c +547.04 66.95 l +547.04 64.7409 545.2491 62.95 543.04 62.95 c +52.24 62.95 l +50.0309 62.95 48.24 64.7409 48.24 66.95 c +48.24 405.23 l +48.24 407.4391 50.0309 409.23 52.24 409.23 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 409.23 m +543.04 409.23 l +545.2491 409.23 547.04 407.4391 547.04 405.23 c +547.04 66.95 l +547.04 64.7409 545.2491 62.95 543.04 62.95 c +52.24 62.95 l +50.0309 62.95 48.24 64.7409 48.24 66.95 c +48.24 405.23 l +48.24 407.4391 50.0309 409.23 52.24 409.23 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 386.405 Td +/F3.0 11 Tf +<626f6f6c206765745f6e61676c696e67282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 371.665 Td +/F3.0 11 Tf +<626f6f6c206765745f7573655f6e6f6e5f626c6f636b696e675f736f636b6574282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 356.925 Td +/F3.0 11 Tf +<626f6f6c206765745f7365727665725f6d6f6465282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 342.185 Td +/F3.0 11 Tf +<626f6f6c206765745f736f636b65745f646562756767696e67282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 327.445 Td +/F3.0 11 Tf +<626f6f6c206765745f68616c745f6f6e5f636f6e6e656374696f6e5f7265736574282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 312.705 Td +/F3.0 11 Tf +<626f6f6c206765745f7573655f636f6e6e656374696f6e5f41535073282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 297.965 Td +/F3.0 11 Tf +<626f6f6c206765745f68616e646c655f68616c665f636c6f7365282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 283.225 Td +/F3.0 11 Tf +<696e74207365745f6e6f6e5f626c6f636b5f6d6f646528696e742066642c20626f6f6c20656e61626c655f6e6f6e626c6f636b293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 268.485 Td +/F3.0 11 Tf +<626f6f6c20696e6372656173655f73656e645f62756666657228696e742066642c20696e7420266f6c645f73697a652c20696e7426206e65775f73697a65293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 253.745 Td +/F3.0 11 Tf +<636f6e737420636861722a206765745f6c6f63616c5f686f73745f6e616d652829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 239.005 Td +/F3.0 11 Tf +<636f6e737420756e7369676e656420696e74206765745f6c6f63616c5f706f72745f6e756d6265722829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 224.265 Td +/F3.0 11 Tf +<636f6e737420636861722a206765745f72656d6f74655f686f73745f6e616d652829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 209.525 Td +/F3.0 11 Tf +<636f6e737420756e7369676e656420696e74206765745f72656d6f74655f706f72745f6e756d6265722829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 194.785 Td +/F3.0 11 Tf +<636f6e737420696e7426206765745f61695f66616d696c79282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 180.045 Td +/F3.0 11 Tf +<766f6964207365745f61695f66616d696c7928696e7420706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 165.305 Td +/F3.0 11 Tf +<626f6f6c206765745f7474636e5f6275666665725f75736572636f6e74726f6c282920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 150.565 Td +/F3.0 11 Tf +<766f6964207365745f6e61676c696e6728626f6f6c20706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 135.825 Td +/F3.0 11 Tf +<766f6964207365745f7365727665725f6d6f646528626f6f6c20706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 121.085 Td +/F3.0 11 Tf +<766f6964207365745f68616e646c655f68616c665f636c6f736528626f6f6c20706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 106.345 Td +/F3.0 11 Tf +<766f6964207365745f736f636b65745f646562756767696e6728626f6f6c20706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 91.605 Td +/F3.0 11 Tf +<766f6964207365745f68616c745f6f6e5f636f6e6e656374696f6e5f726573657428626f6f6c20706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 76.865 Td +/F3.0 11 Tf +<766f6964207365745f7474636e5f6275666665725f75736572636f6e74726f6c28626f6f6c20706172616d657465725f76616c756529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3133> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +92 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 91 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F3.0 27 0 R +/F2.0 19 0 R +/F1.0 8 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +93 0 obj +[92 0 R /XYZ 0 477.09 null] +endobj +94 0 obj +<< /Length 12747 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 786.666 Td +/F2.0 18 Tf +<4c6f6767696e672046756e6374696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 758.646 Td +/F1.0 10.5 Tf +[<54686520666f6c6c6f77696e672066756e6374696f6e73206c6f67206120676976656e206d65737361676520696e20646966666572656e74207761> 20.0195 <79733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 742.83 m +543.04 742.83 l +545.2491 742.83 547.04 741.0391 547.04 738.83 c +547.04 665.87 l +547.04 663.6609 545.2491 661.87 543.04 661.87 c +52.24 661.87 l +50.0309 661.87 48.24 663.6609 48.24 665.87 c +48.24 738.83 l +48.24 741.0391 50.0309 742.83 52.24 742.83 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 742.83 m +543.04 742.83 l +545.2491 742.83 547.04 741.0391 547.04 738.83 c +547.04 665.87 l +547.04 663.6609 545.2491 661.87 543.04 661.87 c +52.24 661.87 l +50.0309 661.87 48.24 663.6609 48.24 665.87 c +48.24 738.83 l +48.24 741.0391 50.0309 742.83 52.24 742.83 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 720.005 Td +/F3.0 11 Tf +<766f6964206c6f675f646562756728636f6e73742063686172202a666d742c20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +235.24 720.005 Td +/F6.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +246.24 720.005 Td +/F3.0 11 Tf +<2920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 705.265 Td +/F3.0 11 Tf +<766f6964206c6f675f7761726e696e6728636f6e73742063686172202a666d742c20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +246.24 705.265 Td +/F6.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +257.24 705.265 Td +/F3.0 11 Tf +<2920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 690.525 Td +/F3.0 11 Tf +<766f6964206c6f675f6572726f7228636f6e73742063686172202a666d742c20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +235.24 690.525 Td +/F6.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +246.24 690.525 Td +/F3.0 11 Tf +<2920636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 675.785 Td +/F3.0 11 Tf +<766f6964206c6f675f68657828636f6e73742063686172205f5f70726f6d70742c20636f6e737420756e7369676e65642063686172205f5f6d73672c2073697a655f74206c656e6774682920636f6e73743b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 625.846 Td +/F2.0 18 Tf +<4572726f72205265706f7274696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 609.79 m +543.04 609.79 l +545.2491 609.79 547.04 607.9991 547.04 605.79 c +547.04 562.31 l +547.04 560.1009 545.2491 558.31 543.04 558.31 c +52.24 558.31 l +50.0309 558.31 48.24 560.1009 48.24 562.31 c +48.24 605.79 l +48.24 607.9991 50.0309 609.79 52.24 609.79 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 609.79 m +543.04 609.79 l +545.2491 609.79 547.04 607.9991 547.04 605.79 c +547.04 562.31 l +547.04 560.1009 545.2491 558.31 543.04 558.31 c +52.24 558.31 l +50.0309 558.31 48.24 560.1009 48.24 562.31 c +48.24 605.79 l +48.24 607.9991 50.0309 609.79 52.24 609.79 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 586.965 Td +/F3.0 11 Tf +<7669727475616c20766f6964207265706f72745f6572726f7228696e7420636c69656e745f69642c20696e74206d73675f6c656e6774682c20696e742073656e745f6c656e6774682c20636f6e7374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 572.225 Td +/F3.0 11 Tf +<756e7369676e656420636861722a206d73672c20636f6e737420636861722a206572726f725f74657874293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7049 Tw + +BT +48.24 534.346 Td +/F1.0 10.5 Tf +[<546869732066756e6374696f6e2069732063616c6c6564206175746f6d61746963616c6c7920696620616e206572726f72206f636375727320647572696e672073656e64206f706572> 20.0195 <6174696f6e20696e20>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.7049 Tw + +BT +470.915 534.346 Td +/F3.0 10.5 Tf +<4162737472616374536f636b6574> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7049 Tw + +BT +544.415 534.346 Td +/F1.0 10.5 Tf +<2e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7792 Tw + +BT +48.24 518.566 Td +/F1.0 10.5 Tf +<546869732066756e6374696f6e2063616e206265206f76657272696464656e20696e207468652064657269766564207465737420706f727420746f206f76657272696465207468652064656661756c74206572726f72207265706f7274696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4386 Tw + +BT +48.24 502.786 Td +/F1.0 10.5 Tf +<6265686176696f72206f6620> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.4386 Tw + +BT +109.5341 502.786 Td +/F3.0 10.5 Tf +<4162737472616374536f636b6574> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4386 Tw + +BT +183.0341 502.786 Td +/F1.0 10.5 Tf +<2c2077686963682069732063616c6c696e672074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.4386 Tw + +BT +289.723 502.786 Td +/F3.0 10.5 Tf +<6c6f675f6572726f72> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4386 Tw + +BT +336.973 502.786 Td +/F1.0 10.5 Tf +<2066756e6374696f6e2e20546869732066756e6374696f6e2063616e20616c736f2062652063616c6c6564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 487.006 Td +/F1.0 10.5 Tf +[<62> 20.0195 <79207468652064657269766564207465737420706f727420746f20696e69746961746520746865206572726f72207265706f7274696e67206d656368616e69736d2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 437.554 Td +/F2.0 27 Tf +<5469707320616e6420547269636b73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 390.574 Td +/F2.0 22 Tf +<5573616765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 361.386 Td +/F1.0 10.5 Tf +<496e206f7264657220746f206275696c642061207465737420706f7274206261736564206f6e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +233.9745 361.386 Td +/F3.0 10.5 Tf +<41627374726163745f536f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +312.7245 361.386 Td +/F1.0 10.5 Tf +<2074686520666f6c6c6f77696e67207374657073206d75737420626520636f6d706c657465643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +52.6765 333.606 Td +/F1.0 10.5 Tf +<312e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 333.606 Td +/F1.0 10.5 Tf +<4465726976696e6720746865207465737420706f727420636c617373202873656520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +224.202 333.606 Td +/F1.0 10.5 Tf +[<4465726976696e67207468652054> 29.7852 <65737420506f727420436c617373>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +360.7148 333.606 Td +/F1.0 10.5 Tf +<29> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +52.6765 311.826 Td +/F1.0 10.5 Tf +<322e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 311.826 Td +/F1.0 10.5 Tf +<496d706c656d656e746174696f6e206f6620746865206c6f676765722066756e6374696f6e73206966206e6565646564202873656520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +336.3315 311.826 Td +/F1.0 10.5 Tf +<496d706c656d656e746174696f6e206f6620746865204c6f676765722046756e6374696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +537.816 311.826 Td +/F1.0 10.5 Tf +<29> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +52.6765 290.046 Td +/F1.0 10.5 Tf +<332e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 290.046 Td +/F1.0 10.5 Tf +[<46756e6374696f6e207472> 20.0195 <616e736c6174696f6e73202873656520>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +198.2668 290.046 Td +/F1.0 10.5 Tf +[<46756e6374696f6e205472> 20.0195 <616e736c6174696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +307.9811 290.046 Td +/F1.0 10.5 Tf +<29> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +52.6765 268.266 Td +/F1.0 10.5 Tf +<342e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7629 Tw + +BT +66.24 268.266 Td +/F1.0 10.5 Tf +<496e7374616c6c696e67207468652068616e646c657273202873656520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +1.7629 Tw + +BT +211.3034 268.266 Td +/F1.0 10.5 Tf +<46756e6374696f6e7320666f72204d616e6970756c6174696e672074686520536574206f66204576656e747320666f722057686963682074686520506f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +66.24 252.486 Td +/F1.0 10.5 Tf +[<57> 49.8047 <61697473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +94.3821 252.486 Td +/F1.0 10.5 Tf +<29> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +52.6765 230.706 Td +/F1.0 10.5 Tf +<352e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 230.706 Td +/F1.0 10.5 Tf +<46696e616c207374657073202873656520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +144.6855 230.706 Td +/F1.0 10.5 Tf +<46696e616c205374657073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +199.0545 230.706 Td +/F1.0 10.5 Tf +<29> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 202.926 Td +/F1.0 10.5 Tf +<5468657365207374657073206172652064697363757373656420696e2064657461696c20696e2074686520666f6c6c6f77696e672073756273656374696f6e732e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 163.086 Td +/F2.0 18 Tf +[<4465726976696e67207468652054> 29.7852 <65737420506f727420436c617373>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0264 Tw + +BT +48.24 135.066 Td +/F1.0 10.5 Tf +<496e686572697420796f7572207465737420706f727420636c6173732062657369646520746865207465737420706f7274206261736520616c736f2066726f6d2074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.0264 Tw + +BT +388.532 135.066 Td +/F3.0 10.5 Tf +<41627374726163745f536f636b6574> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0264 Tw + +BT +467.282 135.066 Td +/F1.0 10.5 Tf +<20636c6173732c20696620796f7520646f> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7049 Tw + +BT +48.24 119.286 Td +/F1.0 10.5 Tf +<6e6f742077616e7420746f207573652053534c20617420616c6c2e20496620796f7520706c616e20746f207573652053534c2c20696e686572697420746865207465737420706f72742066726f6d2074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.7049 Tw + +BT +450.6472 119.286 Td +/F3.0 10.5 Tf +<53534c5f536f636b6574> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7049 Tw + +BT +503.1472 119.286 Td +/F1.0 10.5 Tf +<20636c6173732e20496e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9214 Tw + +BT +48.24 103.506 Td +/F1.0 10.5 Tf +[<6361736520796f75722053534c20696d706c656d656e746174696f6e206973206a757374206f7074696f6e616c2c20796f75206861766520746f206d616b> 20.0195 <652073757265207468617420697420697320706f737369626c6520746f2064697361626c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.5492 Tw + +BT +48.24 87.726 Td +/F1.0 10.5 Tf +<53534c2072656c6174656420636f646520706172747320617420636f6d70696c652074696d652e20496e207468652041532069662074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.5492 Tw + +BT +339.3578 87.726 Td +/F3.0 10.5 Tf +<41535f5553455f53534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.5492 Tw + +BT +391.8578 87.726 Td +/F1.0 10.5 Tf +<206d6163726f20697320646566696e65642c207468656e2053534c206973> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 71.946 Td +/F1.0 10.5 Tf +<656e61626c65642c206f74686572776973652064697361626c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +95 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 94 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F6.0 97 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +/Annots [101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R] +>> +endobj +96 0 obj +[95 0 R /XYZ 0 841.89 null] +endobj +97 0 obj +<< /Type /Font +/BaseFont /781c87+mplus-1p-regular +/Subtype /TrueType +/FontDescriptor 375 0 R +/FirstChar 32 +/LastChar 255 +/Widths 377 0 R +/ToUnicode 376 0 R +>> +endobj +98 0 obj +[95 0 R /XYZ 0 649.87 null] +endobj +99 0 obj +[95 0 R /XYZ 0 471.19 null] +endobj +100 0 obj +[95 0 R /XYZ 0 418.87 null] +endobj +101 0 obj +<< /Border [0 0 0] +/Dest (deriving_the_test_port_class) +/Subtype /Link +/Rect [224.202 330.54 360.7148 344.82] +/Type /Annot +>> +endobj +102 0 obj +<< /Border [0 0 0] +/Dest (implementation_of_the_logger_functions) +/Subtype /Link +/Rect [336.3315 308.76 537.816 323.04] +/Type /Annot +>> +endobj +103 0 obj +<< /Border [0 0 0] +/Dest (function_translations) +/Subtype /Link +/Rect [198.2668 286.98 307.9811 301.26] +/Type /Annot +>> +endobj +104 0 obj +<< /Border [0 0 0] +/Dest (functions_for_manipulating_the_set_of_events_for_which_the_port_waits) +/Subtype /Link +/Rect [211.3034 265.2 547.04 279.48] +/Type /Annot +>> +endobj +105 0 obj +<< /Border [0 0 0] +/Dest (functions_for_manipulating_the_set_of_events_for_which_the_port_waits) +/Subtype /Link +/Rect [66.24 249.42 94.3821 263.7] +/Type /Annot +>> +endobj +106 0 obj +<< /Border [0 0 0] +/Dest (final_steps) +/Subtype /Link +/Rect [144.6855 227.64 199.0545 241.92] +/Type /Annot +>> +endobj +107 0 obj +[95 0 R /XYZ 0 187.11 null] +endobj +108 0 obj +<< /Length 19936 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 794.676 Td +/F1.0 10.5 Tf +<4578616d706c653a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 778.86 m +543.04 778.86 l +545.2491 778.86 547.04 777.0691 547.04 774.86 c +547.04 687.16 l +547.04 684.9509 545.2491 683.16 543.04 683.16 c +52.24 683.16 l +50.0309 683.16 48.24 684.9509 48.24 687.16 c +48.24 774.86 l +48.24 777.0691 50.0309 778.86 52.24 778.86 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 778.86 m +543.04 778.86 l +545.2491 778.86 547.04 777.0691 547.04 774.86 c +547.04 687.16 l +547.04 684.9509 545.2491 683.16 543.04 683.16 c +52.24 683.16 l +50.0309 683.16 48.24 684.9509 48.24 687.16 c +48.24 774.86 l +48.24 777.0691 50.0309 778.86 52.24 778.86 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 756.035 Td +/F3.0 11 Tf +<2369666465662041535f5553455f53534c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 741.295 Td +/F3.0 11 Tf +<636c617373206d79706f72745f5f5054203a207075626c69632053534c5f536f636b65742c207075626c6963206d79706f72745f5f50545f42415345207b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 726.555 Td +/F3.0 11 Tf +<23656c7365> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 711.815 Td +/F3.0 11 Tf +<636c617373206d79706f72745f5f5054203a207075626c69632041627374726163745f536f636b65742c207075626c6963206d79706f72745f5f50545f42415345207b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 697.075 Td +/F3.0 11 Tf +<23656e646966> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 647.136 Td +/F2.0 18 Tf +<496d706c656d656e746174696f6e206f6620746865204c6f676765722046756e6374696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9598 Tw + +BT +48.24 619.116 Td +/F1.0 10.5 Tf +<496d706c656d656e742074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9598 Tw + +BT +128.6416 619.116 Td +/F3.0 10.5 Tf +<6c6f675f6465627567> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9598 Tw + +BT +175.8916 619.116 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9598 Tw + +BT +183.1959 619.116 Td +/F3.0 10.5 Tf +<6c6f675f6572726f72> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9598 Tw + +BT +230.4459 619.116 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9598 Tw + +BT +237.7502 619.116 Td +/F3.0 10.5 Tf +<6c6f675f7761726e696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9598 Tw + +BT +295.5002 619.116 Td +/F1.0 10.5 Tf +<20616e6420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.9598 Tw + +BT +323.9688 619.116 Td +/F3.0 10.5 Tf +<6c6f675f686578> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.9598 Tw + +BT +360.7188 619.116 Td +/F1.0 10.5 Tf +<207669727475616c2066756e6374696f6e7320696620796f75206e656564206f74686572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 603.336 Td +/F1.0 10.5 Tf +<696d706c656d656e746174696f6e207468616e207468652064656661756c742e2028746865792063616e20626520656d70747920696d706c656d656e746174696f6e73206966206c6f6767696e67206973206e6f74206e656564656429> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 567.24 99.76 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +148.0 567.24 399.04 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 546.96 99.76 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +148.0 546.96 399.04 20.28 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +48.24 526.68 99.76 20.28 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +148.0 526.68 399.04 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 506.4 99.76 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +148.0 506.4 399.04 20.28 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +48.24 486.12 99.76 20.28 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +148.0 486.12 399.04 20.28 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 587.52 m +148.0 587.52 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 567.24 m +148.0 567.24 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 587.77 m +48.24 566.615 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 587.77 m +148.0 566.615 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 573.306 Td +/F2.0 10.5 Tf +<46756e6374696f6e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 587.52 m +547.04 587.52 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +148.0 567.24 m +547.04 567.24 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 587.77 m +148.0 566.615 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 587.77 m +547.04 566.615 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +151.0 573.306 Td +/F2.0 10.5 Tf +<4465736372697074696f6e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 567.24 m +148.0 567.24 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 546.96 m +148.0 546.96 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 567.865 m +48.24 546.71 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 567.865 m +148.0 546.71 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 555.21 Td +/F3.0 10.5 Tf +<6c6f675f6465627567> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +148.0 567.24 m +547.04 567.24 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 546.96 m +547.04 546.96 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 567.865 m +148.0 546.71 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 567.865 m +547.04 546.71 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +151.0 553.026 Td +/F1.0 10.5 Tf +<646f6573207468652064656275672d6c6f6767696e67> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 546.96 m +148.0 546.96 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 526.68 m +148.0 526.68 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 547.21 m +48.24 526.43 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 547.21 m +148.0 526.43 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 534.93 Td +/F3.0 10.5 Tf +<6c6f675f686578> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 546.96 m +547.04 546.96 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 526.68 m +547.04 526.68 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 547.21 m +148.0 526.43 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 547.21 m +547.04 526.43 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +151.0 532.746 Td +/F1.0 10.5 Tf +<646f657320746865206c6f6767696e67206f6620746865206d65737361676520636f6e74656e7420696e2068657820666f726d6174> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 526.68 m +148.0 526.68 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 506.4 m +148.0 506.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 526.93 m +48.24 506.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 526.93 m +148.0 506.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 514.65 Td +/F3.0 10.5 Tf +<6c6f675f7761726e696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 526.68 m +547.04 526.68 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 506.4 m +547.04 506.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 526.93 m +148.0 506.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 526.93 m +547.04 506.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +151.0 512.466 Td +/F1.0 10.5 Tf +<646f657320746865206c6f6767696e67206f66207761726e696e67206d65737361676573> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 506.4 m +148.0 506.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 486.12 m +148.0 486.12 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 506.65 m +48.24 485.87 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 506.65 m +148.0 485.87 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 494.37 Td +/F3.0 10.5 Tf +<6c6f675f6572726f72> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 506.4 m +547.04 506.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 486.12 m +547.04 486.12 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +148.0 506.65 m +148.0 485.87 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 506.65 m +547.04 485.87 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +151.0 492.186 Td +/F1.0 10.5 Tf +[<697320657870656374696e6720746865207465737420706f727420746f2073746f7020776974682061205454> 20.0195 <434e5f455252> 20.0195 <4f52>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.4445 Tw + +BT +48.24 462.156 Td +/F1.0 10.5 Tf +[<59> 69.8242 <6f752063616e2075736520746865206c6f676765722066756e6374696f6e7320696d706c656d656e74656420696e207468652041532e20496e2074686973206361736520796f75206861766520746f2063616c6c20746865204153>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1842 Tw + +BT +48.24 446.376 Td +/F1.0 10.5 Tf +[<636f6e7374727563746f72207769746820796f7572207465737420706f7274207479706520616e64206e616d652e20496e2074686973207761> 20.0195 <79207468652041532077696c6c206c6f67206d6573736167657320616374696e67206c696b> 20.0195 <6520796f7572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 430.596 Td +/F1.0 10.5 Tf +<7465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 390.756 Td +/F2.0 18 Tf +[<46756e6374696f6e205472> 20.0195 <616e736c6174696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4647 Tw + +BT +48.24 362.736 Td +/F1.0 10.5 Tf +[<5472> 20.0195 <616e736c6174652074686520706f7274d5732066756e6374696f6e7320746f2074686520736f636b> 20.0195 <6574d5732066756e6374696f6e732e2042> 20.0195 <79207472> 20.0195 <616e736c6174696e67207765206d65616e20612066756e6374696f6e2063616c6c2077697468>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 346.956 Td +/F1.0 10.5 Tf +[<756e6368616e67656420706172> 20.0195 <616d6574657273206c696b> 20.0195 <6520746869733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 331.14 m +543.04 331.14 l +545.2491 331.14 547.04 329.3491 547.04 327.14 c +547.04 254.18 l +547.04 251.9709 545.2491 250.18 543.04 250.18 c +52.24 250.18 l +50.0309 250.18 48.24 251.9709 48.24 254.18 c +48.24 327.14 l +48.24 329.3491 50.0309 331.14 52.24 331.14 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 331.14 m +543.04 331.14 l +545.2491 331.14 547.04 329.3491 547.04 327.14 c +547.04 254.18 l +547.04 251.9709 545.2491 250.18 543.04 250.18 c +52.24 250.18 l +50.0309 250.18 48.24 251.9709 48.24 254.18 c +48.24 327.14 l +48.24 329.3491 50.0309 331.14 52.24 331.14 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 308.315 Td +/F3.0 11 Tf +<766f6964206d79706f72745f5f50543a3a7365745f706172616d6574657228636f6e73742063686172202a706172616d657465725f6e616d652c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 293.575 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 278.835 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 264.095 Td +/F3.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 226.216 Td +/F1.0 10.5 Tf +[<546865206c697374206f662066756e6374696f6e7320746f206265207472> 20.0195 <616e736c617465643a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 190.12 249.4 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +297.64 190.12 249.4 20.28 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 172.675 249.4 17.445 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +297.64 172.675 249.4 17.445 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +48.24 155.23 249.4 17.445 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +297.64 155.23 249.4 17.445 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 137.785 249.4 17.445 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +297.64 137.785 249.4 17.445 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +48.24 120.34 249.4 17.445 re +f +0.0 0.0 0.0 scn +0.9765 0.9765 0.9765 scn +297.64 120.34 249.4 17.445 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 102.895 249.4 17.445 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +297.64 102.895 249.4 17.445 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 210.4 m +297.64 210.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 190.12 m +297.64 190.12 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 210.65 m +48.24 189.495 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 210.65 m +297.64 189.495 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 196.186 Td +/F2.0 10.5 Tf +<506f72742066756e6374696f6e733a> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 210.4 m +547.04 210.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +297.64 190.12 m +547.04 190.12 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 210.65 m +297.64 189.495 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 210.65 m +547.04 189.495 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +300.64 196.186 Td +/F2.0 10.5 Tf +[<536f636b> 20.0195 <65742066756e6374696f6e733a>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 190.12 m +297.64 190.12 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 172.675 m +297.64 172.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 190.745 m +48.24 172.425 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 190.745 m +297.64 172.425 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 178.09 Td +/F3.0 10.5 Tf +<7365745f706172616d65746572> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +297.64 190.12 m +547.04 190.12 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 172.675 m +547.04 172.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 190.745 m +297.64 172.425 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 190.745 m +547.04 172.425 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +300.64 178.09 Td +/F3.0 10.5 Tf +<706172616d657465725f736574> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 172.675 m +297.64 172.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 155.23 m +297.64 155.23 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 172.925 m +48.24 154.98 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 172.925 m +297.64 154.98 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 160.645 Td +/F3.0 10.5 Tf +<48616e646c655f46645f4576656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 172.675 m +547.04 172.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 155.23 m +547.04 155.23 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 172.925 m +297.64 154.98 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 172.925 m +547.04 154.98 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +300.64 160.645 Td +/F3.0 10.5 Tf +<48616e646c655f536f636b65745f4576656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 155.23 m +297.64 155.23 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 137.785 m +297.64 137.785 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 155.48 m +48.24 137.535 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 155.48 m +297.64 137.535 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 143.2 Td +/F3.0 10.5 Tf +<48616e646c655f54696d656f7574> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 155.23 m +547.04 155.23 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 137.785 m +547.04 137.785 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 155.48 m +297.64 137.535 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 155.48 m +547.04 137.535 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +300.64 143.2 Td +/F3.0 10.5 Tf +<48616e646c655f54696d656f75745f4576656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 137.785 m +297.64 137.785 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 120.34 m +297.64 120.34 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 138.035 m +48.24 120.09 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 138.035 m +297.64 120.09 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 125.755 Td +/F3.0 10.5 Tf +<757365725f6d6170> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 137.785 m +547.04 137.785 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 120.34 m +547.04 120.34 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 138.035 m +297.64 120.09 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 138.035 m +547.04 120.09 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +300.64 125.755 Td +/F3.0 10.5 Tf +<6d61705f75736572> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 120.34 m +297.64 120.34 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 102.895 m +297.64 102.895 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 120.59 m +48.24 102.645 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 120.59 m +297.64 102.645 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +51.24 108.31 Td +/F3.0 10.5 Tf +<757365725f756e6d6170> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 120.34 m +547.04 120.34 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 102.895 m +547.04 102.895 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +297.64 120.59 m +297.64 102.645 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +547.04 120.59 m +547.04 102.645 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +300.64 108.31 Td +/F3.0 10.5 Tf +<756e6d61705f75736572> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5478 Tw + +BT +48.24 78.931 Td +/F1.0 10.5 Tf +<496620796f75206d69676874206e656564206f746865722066756e6374696f6e7320616c736f20746f20626520706572666f726d656420647572696e6720> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5478 Tw + +BT +367.7224 78.931 Td +/F3.0 10.5 Tf +<6d6170> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5478 Tw + +BT +383.4724 78.931 Td +/F1.0 10.5 Tf +<2c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5478 Tw + +BT +389.3648 78.931 Td +/F3.0 10.5 Tf +<756e6d6170> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5478 Tw + +BT +415.6148 78.931 Td +/F1.0 10.5 Tf +<206f7220> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5478 Tw + +BT +433.1534 78.931 Td +/F3.0 10.5 Tf +<7365745f706172616d65746572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5478 Tw + +BT +501.4034 78.931 Td +/F1.0 10.5 Tf +<2c20796f752063616e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 63.151 Td +/F1.0 10.5 Tf +[<616464207468656d2072696768742061667465722074686520736f636b> 20.0195 <6574d5732066756e6374696f6e2063616c6c732e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3135> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +109 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 108 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +/F2.0 19 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +110 0 obj +[109 0 R /XYZ 0 671.16 null] +endobj +111 0 obj +[109 0 R /XYZ 0 414.78 null] +endobj +112 0 obj +<< /Length 9550 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 793.926 Td +/F1.0 10.5 Tf +<4578616d706c653a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 778.11 m +543.04 778.11 l +545.2491 778.11 547.04 776.3191 547.04 774.11 c +547.04 597.97 l +547.04 595.7609 545.2491 593.97 543.04 593.97 c +52.24 593.97 l +50.0309 593.97 48.24 595.7609 48.24 597.97 c +48.24 774.11 l +48.24 776.3191 50.0309 778.11 52.24 778.11 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 778.11 m +543.04 778.11 l +545.2491 778.11 547.04 776.3191 547.04 774.11 c +547.04 597.97 l +547.04 595.7609 545.2491 593.97 543.04 593.97 c +52.24 593.97 l +50.0309 593.97 48.24 595.7609 48.24 597.97 c +48.24 774.11 l +48.24 776.3191 50.0309 778.11 52.24 778.11 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 755.285 Td +/F3.0 11 Tf +<766f6964206d79706f72745f5f50543a3a7365745f706172616d6574657228636f6e73742063686172202a706172616d657465725f6e616d652c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 740.545 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 725.805 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 711.065 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 696.325 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 681.585 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 666.845 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 652.105 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 637.365 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 622.625 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 607.885 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6989 Tw + +BT +48.24 570.006 Td +/F1.0 10.5 Tf +[<546865207472> 20.0195 <616e736c6174696f6e206f662074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.6989 Tw + +BT +165.3904 570.006 Td +/F3.0 10.5 Tf +<6f7574676f696e675f73656e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6989 Tw + +BT +233.6404 570.006 Td +/F1.0 10.5 Tf +<20746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.6989 Tw + +BT +252.2317 570.006 Td +/F3.0 10.5 Tf +<73656e645f6f7574676f696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6989 Tw + +BT +320.4817 570.006 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e206e6565647320736f6d6520706172> 20.0195 <616d6574657220666f726d617474696e67>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +7.4527 Tw + +BT +48.24 554.226 Td +/F1.0 10.5 Tf +<73696e63652074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +7.4527 Tw + +BT +110.1959 554.226 Td +/F3.0 10.5 Tf +<6f7574676f696e675f73656e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +7.4527 Tw + +BT +178.4459 554.226 Td +/F1.0 10.5 Tf +[<2068617320706172> 20.0195 <616d657465727320696e686572697465642066726f6d20796f7572205454> 20.0195 <434e2d3320737472756374757265732c207768696c65>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.1356 Tw + +BT +48.24 538.446 Td +/F3.0 10.5 Tf +<41627374726163745f536f636b6574> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.1356 Tw + +BT +126.99 538.446 Td +/F6.0 10.5 Tf + Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.1356 Tw + +BT +130.014 538.446 Td +/F3.0 10.5 Tf +<7320606f7574676f696e675f73656e64> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.1356 Tw + +BT +218.1496 538.446 Td +/F1.0 10.5 Tf +[<2068617320706172> 20.0195 <616d657465727320617320>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.1356 Tw + +BT +330.9977 538.446 Td +/F3.0 10.5 Tf +<28636861722a206d6573736167652c20696e74206d6573736167654c656e6774682c20696e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 522.666 Td +/F3.0 10.5 Tf +<636c69656e745f696429> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +100.74 522.666 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +5.7831 Tw + +BT +48.24 494.886 Td +/F1.0 10.5 Tf +<5468652073616d65206170706c69657320666f722074686520696e636f6d696e672066756e6374696f6e2063616c6c7320776865726520796f75206861766520746f20777269746520796f7572206f776e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 479.106 Td +/F3.0 10.5 Tf +<6d6573736167655f696e636f6d696e67> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +132.24 479.106 Td +/F1.0 10.5 Tf +<20746f20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +147.4335 479.106 Td +/F3.0 10.5 Tf +<696e636f6d696e675f6d657373616765> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +231.4335 479.106 Td +/F1.0 10.5 Tf +[<207472> 20.0195 <616e736c6174696f6e2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 451.326 Td +/F1.0 10.5 Tf +<4578616d706c653a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 435.51 m +543.04 435.51 l +545.2491 435.51 547.04 433.7191 547.04 431.51 c +547.04 270.11 l +547.04 267.9009 545.2491 266.11 543.04 266.11 c +52.24 266.11 l +50.0309 266.11 48.24 267.9009 48.24 270.11 c +48.24 431.51 l +48.24 433.7191 50.0309 435.51 52.24 435.51 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 435.51 m +543.04 435.51 l +545.2491 435.51 547.04 433.7191 547.04 431.51 c +547.04 270.11 l +547.04 267.9009 545.2491 266.11 543.04 266.11 c +52.24 266.11 l +50.0309 266.11 48.24 267.9009 48.24 270.11 c +48.24 431.51 l +48.24 433.7191 50.0309 435.51 52.24 435.51 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 412.685 Td +/F3.0 11 Tf +<766f6964206d79706f72745f5f50543a3a6f7574676f696e675f73656e6428636f6e7374205454434e335f5f537472756374757265262073656e645f70617229> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 397.945 Td +/F3.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 383.205 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 368.465 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 353.725 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 338.985 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 324.245 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 309.505 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 294.765 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 280.025 Td +/F3.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 230.086 Td +/F2.0 18 Tf +<46756e6374696f6e7320666f72204d616e6970756c6174696e672074686520536574206f66204576656e747320666f72> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 205.606 Td +/F2.0 18 Tf +[<57686963682074686520506f72742057> 49.8047 <61697473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 177.586 Td +/F1.0 10.5 Tf +[<41> 20.0195 <64642074686520666f6c6c6f77696e6720287669727475616c29206d656d6265722066756e6374696f6e7320746f20796f757220706f72742028636c61737320646566696e6974696f6e2920756e6368616e6765643a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3136> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +113 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 112 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F3.0 27 0 R +/F6.0 97 0 R +/F2.0 19 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +114 0 obj +[113 0 R /XYZ 0 254.11 null] +endobj +115 0 obj +<< /Limits [(_the_test_port) (warning_messages_in_case_SSL_connections_are_used)] +/Names [(_the_test_port) 52 0 R (_tips_and_tricks) 99 0 R (_to_receive_a_message) 88 0 R (_usage) 100 0 R (_using_ssl_on_top_of_a_tcp_connection) 121 0 R (_warning_messages) 145 0 R (_warning_messages_in_case_tcp_connections_are_used) 146 0 R (abstract-socket-test-port-parameters-in-the-test-port-configuration-file-if-the-transport-channel-is-tcp-ip) 66 0 R (deriving_the_test_port_class) 107 0 R (final_steps) 118 0 R (function_translations) 111 0 R (functions_for_manipulating_the_set_of_events_for_which_the_port_waits) 114 0 R (implementation_of_the_logger_functions) 110 0 R (map-unmap-the-test-port) 75 0 R (sending-receiving-messages) 36 0 R (using-ttcn-buffer-in-test-ports) 119 0 R (warning_messages_in_case_SSL_connections_are_used) 151 0 R] +>> +endobj +116 0 obj +<< /Length 12325 +>> +stream +q +q +/DeviceRGB cs +0.9608 0.9608 0.9608 scn +52.24 805.89 m +543.04 805.89 l +545.2491 805.89 547.04 804.0991 547.04 801.89 c +547.04 640.49 l +547.04 638.2809 545.2491 636.49 543.04 636.49 c +52.24 636.49 l +50.0309 636.49 48.24 638.2809 48.24 640.49 c +48.24 801.89 l +48.24 804.0991 50.0309 805.89 52.24 805.89 c +h +f +/DeviceRGB CS +0.8 0.8 0.8 SCN +0.75 w +52.24 805.89 m +543.04 805.89 l +545.2491 805.89 547.04 804.0991 547.04 801.89 c +547.04 640.49 l +547.04 638.2809 545.2491 636.49 543.04 636.49 c +52.24 636.49 l +50.0309 636.49 48.24 638.2809 48.24 640.49 c +48.24 801.89 l +48.24 804.0991 50.0309 805.89 52.24 805.89 c +h +S +Q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +59.24 783.065 Td +/F3.0 11 Tf +<766f6964204164645f46645f526561645f48616e646c657228696e7420666429207b2048616e646c65725f4164645f46645f52656164286664293b207d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 768.325 Td +/F3.0 11 Tf +<766f6964204164645f46645f57726974655f48616e646c657228696e7420666429207b2048616e646c65725f4164645f46645f5772697465286664293b207d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 753.585 Td +/F3.0 11 Tf +<766f69642052656d6f76655f46645f526561645f48616e646c657228696e7420666429207b2048616e646c65725f52656d6f76655f46645f52656164286664293b207d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 738.845 Td +/F3.0 11 Tf +<766f69642052656d6f76655f46645f57726974655f48616e646c657228696e7420666429207b2048616e646c65725f52656d6f76655f46645f5772697465286664293b207d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 724.105 Td +/F3.0 11 Tf +<766f69642052656d6f76655f46645f416c6c5f48616e646c65727328696e7420666429207b2048616e646c65725f52656d6f76655f4664286664293b207d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 709.365 Td +/F3.0 11 Tf +<766f69642048616e646c65725f556e696e7374616c6c2829207b20556e696e7374616c6c5f48616e646c657228293b207d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 694.625 Td +/F3.0 11 Tf +<766f69642054696d65725f5365745f48616e646c657228646f75626c652063616c6c5f696e74657276616c2c20626f6f6c65616e2069735f74696d656f7574203d20545255452c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 679.885 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 665.145 Td +/F3.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 650.405 Td +/F3.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.5 w +0.9333 0.9333 0.9333 SCN +102.4695 624.49 m +102.4695 553.37 l +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +60.3451 584.856 Td +/F2.0 10.5 Tf +[<4e4f> 20.0195 <5445>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.5694 Tw + +BT +114.4695 608.526 Td +/F1.0 10.5 Tf +[<5468657365206d656d6265722066756e6374696f6e732061726520726571756972656420616e6420757365642062> 20.0195 <79204162737472> 20.0195 <61637420536f636b> 20.0195 <65742e205468657920617265>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6658 Tw + +BT +114.4695 592.746 Td +/F1.0 10.5 Tf +[<646566696e656420696e204162737472> 20.0195 <61637420536f636b> 20.0195 <6574206173207669727475616c20616e642061726520746f206265206f76657272696464656e20696e207468652064657363656e64616e74>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4769 Tw + +BT +114.4695 576.966 Td +/F1.0 10.5 Tf +[<54> 29.7852 <65737420506f727420636c6173732e20546865792061726520696d706c656d656e74656420696e20746865202854> 29.7852 <65737420506f72742920636c61737320646566696e6974696f6e206f6e6c7920666f7220746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +114.4695 561.186 Td +/F1.0 10.5 Tf +[<73616b> 20.0195 <65206f662073696d706c6963697479> 89.8438 <2e29>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 517.346 Td +/F2.0 18 Tf +<46696e616c205374657073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8102 Tw + +BT +48.24 489.326 Td +/F1.0 10.5 Tf +[<46696e616c6c79> 89.8438 <2c207468652066756e6374696f6e20646566696e6974696f6e73206d75737420626520616464656420746f20746865206865616465722066696c65206163636f7264696e676c79> 89.8438 <2e205468656e2c20796f7520617265207265616479>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 473.546 Td +/F1.0 10.5 Tf +<746f20676f20616865616420616e6420646576656c6f7020796f7572207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 429.434 Td +/F2.0 22 Tf +<5573696e6720> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +115.802 429.434 Td +/F3.0 22 Tf +<5454434e5f427566666572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +236.802 429.434 Td +/F2.0 22 Tf +[<20696e2054> 29.7852 <65737420506f727473>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.79 Tw + +BT +48.24 400.246 Td +/F1.0 10.5 Tf +[<546865204162737472> 20.0195 <61637420536f636b> 20.0195 <65742075736573206120>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.79 Tw + +BT +186.0646 400.246 Td +/F3.0 10.5 Tf +<5454434e5f427566666572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.79 Tw + +BT +243.8146 400.246 Td +/F1.0 10.5 Tf +<20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +0.79 Tw + +BT +247.3241 400.246 Td +/F1.0 10.5 Tf +<5b325d> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.79 Tw + +BT +260.7326 400.246 Td +/F1.0 10.5 Tf +<20746f2073746f726520696e636f6d696e67206d65737361676520706f7274696f6e732e20496620746865207465737420706f727420616c736f> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 384.466 Td +/F1.0 10.5 Tf +[<776f756c64206c696b> 20.0195 <6520746f2073746f726520696e636f6d696e67206d657373616765732c20686572652069732061206465736372697074696f6e20686f7720746f20646f20746861743a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2799 Tw + +BT +48.24 356.686 Td +/F1.0 10.5 Tf +<546865207465737420706f72742063616e206163636573732074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2799 Tw + +BT +188.9497 356.686 Td +/F3.0 10.5 Tf +<5454434e5f427566666572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2799 Tw + +BT +246.6997 356.686 Td +/F1.0 10.5 Tf +<207769746820> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.2799 Tw + +BT +275.4415 356.686 Td +/F3.0 10.5 Tf +<6765745f627566666572> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2799 Tw + +BT +327.9415 356.686 Td +/F1.0 10.5 Tf +[<282920616e642063616e206f706572> 20.0195 <617465206f6e2069742e20496620746865207465737420706f72742075736573>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5545 Tw + +BT +48.24 340.906 Td +/F1.0 10.5 Tf +<7468652062756666657220746f2073746f726520646174612c206974206d757374207365742074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5545 Tw + +BT +246.5145 340.906 Td +/F3.0 10.5 Tf +<7474636e5f6275666665725f75736572636f6e74726f6c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5545 Tw + +BT +367.2645 340.906 Td +/F1.0 10.5 Tf +<207661726961626c6520746f20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5545 Tw + +BT +428.3265 340.906 Td +/F5.0 10.5 Tf +<74727565> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5545 Tw + +BT +449.3265 340.906 Td +/F1.0 10.5 Tf +<2c20736f2074686174207468652041532077696c6c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 325.126 Td +/F1.0 10.5 Tf +<6e6f7420636c656172207468652062756666657220636f6e74656e742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 297.346 Td +/F1.0 10.5 Tf +[<496e2074686973206361736520746865207465737420706f72742063616e20757365207468652062756666657220696e2074686520666f6c6c6f77696e67207761> 20.0195 <79733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 269.566 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +66.24 269.566 Td +/F3.0 10.5 Tf +<6765745f627566666572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +118.74 269.566 Td +/F1.0 10.5 Tf +<282920746f2066657463682074686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +187.62 269.566 Td +/F3.0 10.5 Tf +<5454434e5f427566666572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +245.37 269.566 Td +/F1.0 10.5 Tf +<206173736f63696174656420776974682074686520636c69656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 247.786 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 247.786 Td +/F1.0 10.5 Tf +[<4f7074696f6e616c6c79206d6f6469667920636f6e74656e743b206f72207761697420666f7220636f6d706c65746520544c> 49.8047 <56>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 226.006 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.2893 Tw + +BT +66.24 226.006 Td +/F1.0 10.5 Tf +[<4f6e63652061206d65737361676520706f7274696f6e2069732073656e7420746f20746865205454> 20.0195 <434e2d3320746573742073756974652c20637574207468652073656e74206d6573736167652066726f6d2074686520627566666572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4943 Tw + +BT +66.24 210.226 Td +/F1.0 10.5 Tf +<62656361757365207468652041532077696c6c206e6f7420646f20746861742e20496e206361736520746865207465737420706f72742073696d706c792070617373656420746865206d65737361676520746f207468652074657374207375697465> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.234 Tw + +BT +66.24 194.446 Td +/F1.0 10.5 Tf +[<616e642075736573206e6f2073746f72> 20.0195 <616765206f662069742028652e672eca54> 20.0195 <43502054> 29.7852 <65737420506f7274292c2069742063616e206c6561766520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.234 Tw + +BT +349.421 194.446 Td +/F3.0 10.5 Tf +<7474636e5f6275666665725f75736572636f6e74726f6c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.234 Tw + +BT +470.171 194.446 Td +/F1.0 10.5 Tf +<20696e2066616c736520287768696368> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 178.666 Td +/F1.0 10.5 Tf +[<6973207468652064656661756c742076616c75652920736f2074686174207468652041532077696c6c2074616b> 20.0195 <652063617265206f662062756666657220636c65616e7570732e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 134.554 Td +/F2.0 22 Tf +[<5573696e672053534c206f6e2054> 29.7852 <6f70206f6620612054> 20.0195 <435020436f6e6e656374696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1766 Tw + +BT +48.24 105.366 Td +/F1.0 10.5 Tf +[<53534c2063616e2062652075736564206f6e20746f70206f66207468652054> 20.0195 <435020636f6e6e656374696f6e2e205468652061757468656e7469636174696f6e206d6f64652063616e20626520636f6e666967757265642076696120612074657374>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 89.586 Td +/F1.0 10.5 Tf +[<706f727420706172> 20.0195 <616d657465722e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3137> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +117 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 116 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F3.0 27 0 R +/F2.0 19 0 R +/F1.0 8 0 R +/F5.0 59 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +/Annots [120 0 R] +>> +endobj +118 0 obj +[117 0 R /XYZ 0 541.37 null] +endobj +119 0 obj +[117 0 R /XYZ 0 457.73 null] +endobj +120 0 obj +<< /Border [0 0 0] +/Dest (_2) +/Subtype /Link +/Rect [247.3241 397.18 260.7326 411.46] +/Type /Annot +>> +endobj +121 0 obj +[117 0 R /XYZ 0 162.85 null] +endobj +122 0 obj +<< /Length 13988 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 786.666 Td +/F2.0 18 Tf +<536572766572204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.1326 Tw + +BT +48.24 758.646 Td +/F1.0 10.5 Tf +[<496e20736572766572206d6f64652c20666972737420612054> 20.0195 <435020736f636b> 20.0195 <657420697320637265617465642e20546865207365727665722073746172747320746f206c697374656e206f6e207468697320706f7274202875706f6e20746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.3173 Tw + +BT +48.24 742.866 Td +/F3.0 10.5 Tf +<757365725f6d6170> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3173 Tw + +BT +90.24 742.866 Td +/F1.0 10.5 Tf +[<2829206f706572> 20.0195 <6174696f6e206f7220696e2063617365206f6620636f6e6e656374696f6e20415350732c2063616c6c696e672074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.3173 Tw + +BT +360.5324 742.866 Td +/F3.0 10.5 Tf +<6f70656e5f6c697374656e5f706f7274> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3173 Tw + +BT +444.5324 742.866 Td +/F1.0 10.5 Tf +[<2829206f706572> 20.0195 <6174696f6e292e204f6e63652061>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6174 Tw + +BT +48.24 727.086 Td +/F1.0 10.5 Tf +[<54> 20.0195 <435020636f6e6e65637420726571756573742069732072656365697665642c207468652054> 20.0195 <435020636f6e6e656374696f6e206973207365742075702e2041667465722074686973207468652053534c2068616e647368616b> 20.0195 <6520626567696e732e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3796 Tw + +BT +48.24 711.306 Td +/F1.0 10.5 Tf +[<5468652053534c206973206d617070656420746f207468652066696c652064657363726970746f72206f66207468652054> 20.0195 <435020736f636b> 20.0195 <65742e205468652042494f2c20776869636820697320616e20492f4f206162737472> 20.0195 <616374696f6e2074686174>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6741 Tw + +BT +48.24 695.526 Td +/F1.0 10.5 Tf +[<6869646573206d616e> 20.0195 <79206f662074686520756e6465726c79696e6720492f4f2064657461696c732066726f6d20616e206170706c69636174696f6e2c206973206175746f6d61746963616c6c7920637265617465642062> 20.0195 <79204f70656e53534c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3726 Tw + +BT +48.24 679.746 Td +/F1.0 10.5 Tf +[<696e6865726974696e67207468652063686172> 20.0195 <6163746572697374696373206f662074686520736f636b> 20.0195 <657420286e6f6e2d626c6f636b696e67206d6f6465292e205468652042494f20697320636f6d706c6574656c79207472> 20.0195 <616e73706172656e742e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7048 Tw + +BT +48.24 663.966 Td +/F1.0 10.5 Tf +[<5468652073657276657220616c7761> 20.0195 <79732073656e64732069747320636572746966696361746520746f2074686520636c69656e742e20496620636f6e6669677572656420736f2c20746865207365727665722077696c6c207265717565737420746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8587 Tw + +BT +48.24 648.186 Td +/F1.0 10.5 Tf +<6365727469666963617465206f662074686520636c69656e7420616e6420636865636b20696620697420697320612076616c69642063657274696669636174652e204966206e6f742c207468652053534c20636f6e6e656374696f6e20697320726566757365642e204966> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3686 Tw + +BT +48.24 632.406 Td +/F1.0 10.5 Tf +<636f6e66696775726564206e6f7420746f20766572696679207468652063657274696669636174652c20746865207365727665722077696c6c206e6f7420726571756573742069742066726f6d2074686520636c69656e7420616e64207468652053534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6836 Tw + +BT +48.24 616.626 Td +/F1.0 10.5 Tf +<636f6e6e656374696f6e2069732061636365707465642e204966207573616765206f66207468652053534c2073657373696f6e20726573756d7074696f6e20697320656e61626c656420616e642074686520636c69656e742072656665727320746f2061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5616 Tw + +BT +48.24 600.846 Td +/F1.0 10.5 Tf +<70726576696f75732053534c2073657373696f6e2c20746865207365727665722077696c6c206163636570742069742c20756e6c657373206974206973206e6f7420666f756e6420696e207468652053534c20636f6e746578742063616368652e204f6e6365> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.795 Tw + +BT +48.24 585.066 Td +/F1.0 10.5 Tf +<74686520636f6e6e656374696f6e206973206e65676f7469617465642c20646174612063616e2062652073656e742f72656365697665642e205468652053534c20636f6e6e656374696f6e206973207368757420646f776e207573696e6720616e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.2702 Tw + +BT +48.24 569.286 Td +/F3.0 10.5 Tf +<756e6d6170> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.2702 Tw + +BT +74.49 569.286 Td +/F1.0 10.5 Tf +[<2829206f706572> 20.0195 <6174696f6e2e205468652073687574646f776e2070726f6365737320646f6573206e6f7420666f6c6c6f7720746865207374616e646172643a20746865207365727665722073696d706c79207368757473>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 553.506 Td +/F1.0 10.5 Tf +[<646f776e20616e6420646f6573206e6f742065787065637420616e> 20.0195 <792061636b6e6f776c656467656d656e742066726f6d2074686520636c69656e742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.9681 Tw + +BT +48.24 525.726 Td +/F1.0 10.5 Tf +<436c69656e747320636f6e6e656374656420746f2074686520736572766572206172652064697374696e6775697368656420776974682074686569722066696c652064657363726970746f72206e756d626572732e205768656e2061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 509.946 Td +/F1.0 10.5 Tf +<6d6573736167652069732072656365697665642c207468652066696c652064657363726970746f72206e756d62657220697320616c736f207061737365642c20736f2074686520636c69656e742063616e206265206964656e7469666965642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 470.106 Td +/F2.0 18 Tf +<436c69656e74204d6f6465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1444 Tw + +BT +48.24 442.086 Td +/F1.0 10.5 Tf +[<496e20636c69656e74206d6f64652c20666972737420612054> 20.0195 <435020636f6e6e656374696f6e2069732072657175657374656420746f2074686520736572766572202875706f6e2074686520>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1444 Tw + +BT +419.431 442.086 Td +/F3.0 10.5 Tf +<757365725f6d6170> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1444 Tw + +BT +461.431 442.086 Td +/F1.0 10.5 Tf +[<2829206f706572> 20.0195 <6174696f6e206f7220696e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1412 Tw + +BT +48.24 426.306 Td +/F1.0 10.5 Tf +<63617365206f6620636f6e6e656374696f6e20415350732c2063616c6c696e672074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1412 Tw + +BT +228.3115 426.306 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1412 Tw + +BT +343.8115 426.306 Td +/F1.0 10.5 Tf +[<2829206f706572> 20.0195 <6174696f6e292e204f6e63652069742069732061636365707465642c207468652053534c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.5224 Tw + +BT +48.24 410.526 Td +/F1.0 10.5 Tf +<656e64706f696e7420697320637265617465642e20496620636f6e6669677572656420736f2c2074686520636c69656e7420747269657320746f20757365207468652053534c2073657373696f6e2049642066726f6d207468652070726576696f7573> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.2135 Tw + +BT +48.24 394.746 Td +/F1.0 10.5 Tf +<636f6e6e656374696f6e2c20696620617661696c61626c652028652e672eca6974206973206e6f742074686520666972737420636f6e6e656374696f6e292e204966206e6f2053534c2073657373696f6e20496420697320617661696c61626c652c206f7220746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0185 Tw + +BT +48.24 378.966 Td +/F1.0 10.5 Tf +[<73657276657220646f6573206e6f74206163636570742069742c20612066756c6c2068616e647368616b> 20.0195 <6520697320706572666f726d65642e20496620636f6e6669677572656420736f2c20746865206365727469666963617465206f6620746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0631 Tw + +BT +48.24 363.186 Td +/F1.0 10.5 Tf +[<7365727665722069732076657269666965642e2049662074686520766572696669636174696f6e206661696c732c207468652053534c20636f6e6e656374696f6e20697320696e7465727275707465642062> 20.0195 <792074686520636c69656e742e204966206e6f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4371 Tw + +BT +48.24 347.406 Td +/F1.0 10.5 Tf +<766572696669636174696f6e2072657175697265642c20746865207265636569766564206365727469666963617465206973207374696c6c2076657269666965642c20686f77657665722074686520726573756c7420646f6573206e6f742061666665637420746865> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 331.626 Td +/F1.0 10.5 Tf +<636f6e6e656374696f6e206576656e2074686f756768206974206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 291.786 Td +/F2.0 18 Tf +[<41> 20.0195 <757468656e7469636174696f6e20466c6f77>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 263.766 Td +/F1.0 10.5 Tf +[<496e2073756d6d617279> 89.8438 <2c207468652061757468656e7469636174696f6e20697320646f6e65206163636f7264696e6720746f207468697320666c6f773a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 235.986 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 235.986 Td +/F1.0 10.5 Tf +[<73736c2068616e647368616b> 20.0195 <6520626567696e7320286e657720636c69656e7420747269657320746f20636f6e6e65637429>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 214.206 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.61 Tw + +BT +66.24 214.206 Td +/F3.0 10.5 Tf +<7669727475616c20696e742073736c5f7665726966795f6365727469666963617465735f61745f68616e647368616b6528696e74207072657665726966795f6f6b2c20583530395f53544f52455f435458202a73736c5f63747829> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.61 Tw + +BT +547.04 214.206 Td +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 198.426 Td +/F1.0 10.5 Tf +[<69732063616c6c65642e20447572696e6720746869732068616e647368616b> 20.0195 <6520796f752063616e20706572666f726d206164646974696f6e616c2061757468656e7469636174696f6e2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +56.8805 176.646 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.6971 Tw + +BT +66.24 176.646 Td +/F1.0 10.5 Tf +[<49662074686520636f6e6e656374696f6e2069732061636365707465642c207468652053534c2068616e647368616b> 20.0195 <652069732066696e697368656420616e642053534c2069732065737461626c69736865642e204e6f7720746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.7308 Tw + +BT +66.24 160.866 Td +/F1.0 10.5 Tf +<66756e6374696f6e207669727475616c20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +4.7308 Tw + +BT +157.3705 160.866 Td +/F3.0 10.5 Tf +<626f6f6c2073736c5f7665726966795f636572746966696361746573> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +4.7308 Tw + +BT +309.1013 160.866 Td +/F1.0 10.5 Tf +[<28292069732063616c6c656420776865726520796f75206d61> 20.0195 <7920706572666f726d206f74686572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +66.24 145.086 Td +/F1.0 10.5 Tf +<61757468656e7469636174696f6e20696620796f752077616e742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5779 Tw + +BT +48.24 117.306 Td +/F3.0 10.5 Tf +<73736c5f7665726966795f636572746966696361746573> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5779 Tw + +BT +168.99 117.306 Td +/F1.0 10.5 Tf +[<28292069732061207669727475616c2066756e6374696f6e2e2049742069732063616c6c6564206166746572207468652053534c20636f6e6e656374696f6e2069732075702e2054> 29.7852 <65737420706f727473>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.496 Tw + +BT +48.24 101.526 Td +/F1.0 10.5 Tf +[<6d61> 20.0195 <792075736520697420746f20636865636b206f746865722070656572> -29.7852 ] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1331 Tw + +BT +48.24 85.746 Td +/F1.0 10.5 Tf +<636f6e6e656374696f6e20697320636c6f7365642e20496e2063617365206f6620636c69656e74206d6f64652c20746865207465737420706f7274206578697473207769746820616e206572726f722028> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.1331 Tw + +BT +432.8034 85.746 Td +/F7.0 10.5 Tf +<766572696669636174696f6e5f6572726f72> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1331 Tw + +BT +527.3034 85.746 Td +/F1.0 10.5 Tf +<292e20496e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 69.966 Td +/F1.0 10.5 Tf +[<736572766572206d6f646520746865207465737420706f7274206a7573742072656d6f76657320636c69656e7420646174612c20627574206b> 20.0195 <656570732072756e6e696e672e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3138> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +123 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 122 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F7.0 127 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +124 0 obj +[123 0 R /XYZ 0 841.89 null] +endobj +125 0 obj +[123 0 R /XYZ 0 494.13 null] +endobj +126 0 obj +[123 0 R /XYZ 0 315.81 null] +endobj +127 0 obj +<< /Type /Font +/BaseFont /d420e1+mplus1mn-bold +/Subtype /TrueType +/FontDescriptor 379 0 R +/FirstChar 32 +/LastChar 255 +/Widths 381 0 R +/ToUnicode 380 0 R +>> +endobj +128 0 obj +<< /Length 10422 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 782.394 Td +/F2.0 22 Tf +[<41> 20.0195 <64617074696e6720446572697665642054> 29.7852 <65737420506f72747320746f20537570706f72742049507636>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 753.206 Td +/F1.0 10.5 Tf +[<44657269766564207465737420706f7274732073686f756c64206265207570646174656420696e2074686520666f6c6c6f77696e67207761> 20.0195 <7920746f20737570706f7274204950763420616e6420495076363a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 725.426 Td +/F1.0 10.5 Tf +<416c6c2063616c6c73206f662066756e6374696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 709.61 m +543.04 709.61 l +545.2491 709.61 547.04 707.8191 547.04 705.61 c +547.04 662.13 l +547.04 659.9209 545.2491 658.13 543.04 658.13 c +52.24 658.13 l +50.0309 658.13 48.24 659.9209 48.24 662.13 c +48.24 705.61 l +48.24 707.8191 50.0309 709.61 52.24 709.61 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 709.61 m +543.04 709.61 l +545.2491 709.61 547.04 707.8191 547.04 705.61 c +547.04 662.13 l +547.04 659.9209 545.2491 658.13 543.04 658.13 c +52.24 658.13 l +50.0309 658.13 48.24 659.9209 48.24 662.13 c +48.24 705.61 l +48.24 707.8191 50.0309 709.61 52.24 709.61 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 686.785 Td +/F3.0 11 Tf +<636f6e73742073747275637420736f636b616464725f696e2026206765745f72656d6f74655f616464722829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 672.045 Td +/F3.0 11 Tf +<636f6e73742073747275637420736f636b616464725f696e2026206765745f6c6f63616c5f616464722829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 634.166 Td +/F1.0 10.5 Tf +[<73686f756c642062652072656d6f7665642e20546865792063616e206265207265706c616365642062> 20.0195 <792063616c6c696e672074686573652066756e6374696f6e733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 618.35 m +543.04 618.35 l +545.2491 618.35 547.04 616.5591 547.04 614.35 c +547.04 541.39 l +547.04 539.1809 545.2491 537.39 543.04 537.39 c +52.24 537.39 l +50.0309 537.39 48.24 539.1809 48.24 541.39 c +48.24 614.35 l +48.24 616.5591 50.0309 618.35 52.24 618.35 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 618.35 m +543.04 618.35 l +545.2491 618.35 547.04 616.5591 547.04 614.35 c +547.04 541.39 l +547.04 539.1809 545.2491 537.39 543.04 537.39 c +52.24 537.39 l +50.0309 537.39 48.24 539.1809 48.24 541.39 c +48.24 614.35 l +48.24 616.5591 50.0309 618.35 52.24 618.35 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 595.525 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a206c6f63616c5f706f72745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 580.785 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a206c6f63616c5f616464726573735f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 566.045 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2072656d6f74655f706f72745f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 551.305 Td +/F3.0 11 Tf +<7669727475616c20636f6e737420636861722a2072656d6f74655f616464726573735f6e616d6528293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7796 Tw + +BT +48.24 513.426 Td +/F1.0 10.5 Tf +<5468652066756e6374696f6e20> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.7796 Tw + +BT +116.2853 513.426 Td +/F3.0 10.5 Tf +<696e74206f70656e5f6c697374656e5f706f727428636f6e73742073747275637420736f636b616464725f696e2026206c6f63616c41646472293b> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7796 Tw + +BT +429.9335 513.426 Td +/F1.0 10.5 Tf +<20646f6573206e6f7420737570706f727420495076362e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 497.646 Td +/F1.0 10.5 Tf +<5468652066756e6374696f6e2062656c6f772073686f756c64206265207573656420696e73746561643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 472.05 Td +/F3.0 10.5 Tf +<696e74206f70656e5f6c697374656e5f706f727428636f6e737420636861722a206c6f63616c486f73746e616d652c20636f6e737420636861722a206c6f63616c536572766963656e616d65293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 445.866 Td +/F1.0 10.5 Tf +<5468652073616d652068617320746f20626520646f6e6520666f722074686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +209.6985 445.866 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +325.1985 445.866 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2e205265706c61636520616e> 20.0195 <792063616c6c206f66207468652066756e6374696f6e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 430.05 m +543.04 430.05 l +545.2491 430.05 547.04 428.2591 547.04 426.05 c +547.04 382.57 l +547.04 380.3609 545.2491 378.57 543.04 378.57 c +52.24 378.57 l +50.0309 378.57 48.24 380.3609 48.24 382.57 c +48.24 426.05 l +48.24 428.2591 50.0309 430.05 52.24 430.05 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 430.05 m +543.04 430.05 l +545.2491 430.05 547.04 428.2591 547.04 426.05 c +547.04 382.57 l +547.04 380.3609 545.2491 378.57 543.04 378.57 c +52.24 378.57 l +50.0309 378.57 48.24 380.3609 48.24 382.57 c +48.24 426.05 l +48.24 428.2591 50.0309 430.05 52.24 430.05 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 407.225 Td +/F3.0 11 Tf +<696e74206f70656e5f636c69656e745f636f6e6e656374696f6e28636f6e73742073747275637420736f636b616464725f696e2026206e65775f72656d6f74655f616464722c20636f6e737420737472756374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 392.485 Td +/F3.0 11 Tf +<736f636b616464725f696e2026206e65775f6c6f63616c5f6164647229> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 354.606 Td +/F1.0 10.5 Tf +<77697468207468652066756e6374696f6e3a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 338.79 m +543.04 338.79 l +545.2491 338.79 547.04 336.9991 547.04 334.79 c +547.04 291.31 l +547.04 289.1009 545.2491 287.31 543.04 287.31 c +52.24 287.31 l +50.0309 287.31 48.24 289.1009 48.24 291.31 c +48.24 334.79 l +48.24 336.9991 50.0309 338.79 52.24 338.79 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 338.79 m +543.04 338.79 l +545.2491 338.79 547.04 336.9991 547.04 334.79 c +547.04 291.31 l +547.04 289.1009 545.2491 287.31 543.04 287.31 c +52.24 287.31 l +50.0309 287.31 48.24 289.1009 48.24 291.31 c +48.24 334.79 l +48.24 336.9991 50.0309 338.79 52.24 338.79 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 315.965 Td +/F3.0 11 Tf +<696e74206f70656e5f636c69656e745f636f6e6e656374696f6e28636f6e737420636861722a2072656d6f7465486f73746e616d652c20636f6e737420636861722a2072656d6f7465536572766963652c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 301.225 Td +/F3.0 11 Tf +<636f6e737420636861722a206c6f63616c486f73746e616d652c20636f6e737420636861722a206c6f63616c53657276696365293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 263.346 Td +/F1.0 10.5 Tf +<49662074686520666f6c6c6f77696e672063616c6c6261636b2066756e6374696f6e206973206f76657272696464656e20696e207468652064657269766564207465737420706f72743a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 247.53 m +543.04 247.53 l +545.2491 247.53 547.04 245.7391 547.04 243.53 c +547.04 214.79 l +547.04 212.5809 545.2491 210.79 543.04 210.79 c +52.24 210.79 l +50.0309 210.79 48.24 212.5809 48.24 214.79 c +48.24 243.53 l +48.24 245.7391 50.0309 247.53 52.24 247.53 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 247.53 m +543.04 247.53 l +545.2491 247.53 547.04 245.7391 547.04 243.53 c +547.04 214.79 l +547.04 212.5809 545.2491 210.79 543.04 210.79 c +52.24 210.79 l +50.0309 210.79 48.24 212.5809 48.24 214.79 c +48.24 243.53 l +48.24 245.7391 50.0309 247.53 52.24 247.53 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 224.705 Td +/F3.0 11 Tf +<7669727475616c20766f696420706565725f636f6e6e656374656428696e7420636c69656e745f69642c20736f636b616464725f696e262072656d6f74655f61646472293b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 186.826 Td +/F1.0 10.5 Tf +<69742073686f756c642062652072656d6f76656420616e642074686520666f6c6c6f77696e672066756e6374696f6e2073686f756c64206265206f76657272696464656e20696e73746561643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 171.01 m +543.04 171.01 l +545.2491 171.01 547.04 169.2191 547.04 167.01 c +547.04 138.27 l +547.04 136.0609 545.2491 134.27 543.04 134.27 c +52.24 134.27 l +50.0309 134.27 48.24 136.0609 48.24 138.27 c +48.24 167.01 l +48.24 169.2191 50.0309 171.01 52.24 171.01 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 171.01 m +543.04 171.01 l +545.2491 171.01 547.04 169.2191 547.04 167.01 c +547.04 138.27 l +547.04 136.0609 545.2491 134.27 543.04 134.27 c +52.24 134.27 l +50.0309 134.27 48.24 136.0609 48.24 138.27 c +48.24 167.01 l +48.24 169.2191 50.0309 171.01 52.24 171.01 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 148.185 Td +/F3.0 11 Tf +<7669727475616c20766f696420706565725f636f6e6e656374656428696e7420636c69656e745f69642c20636f6e73742063686172202a20686f73742c20636f6e737420696e7420706f727429> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 110.306 Td +/F1.0 10.5 Tf +<54686520666f6c6c6f77696e672066756e6374696f6e2073686f756c64206e6f7420626520757365643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 84.71 Td +/F3.0 10.5 Tf +<766f6964206765745f686f73745f696428636f6e737420636861722a20686f73744e616d652c2073747275637420736f636b616464725f696e202a6164647229> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 58.526 Td +/F1.0 10.5 Tf +[<54686520736f636b> 20.0195 <6574204150492066756e6374696f6e20>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +168.9583 58.526 Td +/F3.0 10.5 Tf +<67657461646472696e666f> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +226.7083 58.526 Td +/F1.0 10.5 Tf +<2073686f756c64206265207573656420696e73746561642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3139> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +129 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 128 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +130 0 obj +[129 0 R /XYZ 0 841.89 null] +endobj +131 0 obj +<< /Length 11030 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 777.054 Td +/F2.0 27 Tf +<4572726f72204d65737361676573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 730.074 Td +/F2.0 22 Tf +[<4572726f72204d6573736167657320496e20436173652054> 20.0195 <435020436f6e6e656374696f6e7320417265>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 700.154 Td +/F2.0 22 Tf +<55736564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 673.15 Td +/F7.0 10.5 Tf +<506172616d657465722076616c7565203c76616c75653e206e6f74207265636f676e697a656420666f7220706172616d65746572203c6e616d653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 646.966 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +116.9625 646.966 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.7125 646.966 Td +/F1.0 10.5 Tf +[<20696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c65206973206e6f74207265636f676e697a656420666f722074686520706172> 20.0195 <616d65746572203c6e616d653e2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 621.37 Td +/F7.0 10.5 Tf +<496e76616c696420696e707574206173205443505f7265636f6e6e6563745f617474656d70747320636f756e74657220676976656e3a203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 595.186 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +116.9625 595.186 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.7125 595.186 Td +/F1.0 10.5 Tf +[<20696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c65206d757374206265206120706f7369746976652077686f6c65206e756d6265722e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 569.59 Td +/F7.0 10.5 Tf +<5443505f7265636f6e6e6563745f617474656d707473206d7573742062652067726561746572207468616e20302c203c76616c75653e20697320676976656e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9291 Tw + +BT +48.24 543.406 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.9291 Tw + +BT +118.8206 543.406 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9291 Tw + +BT +155.5706 543.406 Td +/F1.0 10.5 Tf +<20666f7220> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.9291 Tw + +BT +177.7462 543.406 Td +/F3.0 10.5 Tf +<5443505f7265636f6e6e6563745f617474656d707473> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9291 Tw + +BT +293.2462 543.406 Td +/F1.0 10.5 Tf +[<20696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c65206d7573742062652067726561746572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 527.626 Td +/F1.0 10.5 Tf +<7468616e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +73.986 527.626 Td +/F5.0 10.5 Tf +<30> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +79.236 527.626 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 502.03 Td +/F7.0 10.5 Tf +<496e76616c696420696e707574206173205443505f7265636f6e6e6563745f64656c617920676976656e3a203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5493 Tw + +BT +48.24 475.846 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5493 Tw + +BT +118.0612 475.846 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5493 Tw + +BT +154.8112 475.846 Td +/F1.0 10.5 Tf +<20666f722074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5493 Tw + +BT +195.4666 475.846 Td +/F3.0 10.5 Tf +<5443505f7265636f6e6e6563745f64656c6179> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5493 Tw + +BT +295.2166 475.846 Td +/F1.0 10.5 Tf +[<20706172> 20.0195 <616d6574657220696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c65206d757374>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 460.066 Td +/F1.0 10.5 Tf +<626520612077686f6c65206e756d626572206e6f74206c657373207468616e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +214.098 460.066 Td +/F5.0 10.5 Tf +<30> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +219.348 460.066 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 434.47 Td +/F7.0 10.5 Tf +<5443505f7265636f6e6e6563745f64656c6179206d757374206e6f74206265206c657373207468616e20302c203c76616c75653e20697320676976656e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5493 Tw + +BT +48.24 408.286 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5493 Tw + +BT +118.0612 408.286 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5493 Tw + +BT +154.8112 408.286 Td +/F1.0 10.5 Tf +<20666f722074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.5493 Tw + +BT +195.4666 408.286 Td +/F3.0 10.5 Tf +<5443505f7265636f6e6e6563745f64656c6179> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5493 Tw + +BT +295.2166 408.286 Td +/F1.0 10.5 Tf +[<20706172> 20.0195 <616d6574657220696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c65206d757374>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 392.506 Td +/F1.0 10.5 Tf +<626520612077686f6c65206e756d626572206e6f74206c657373207468616e20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +214.098 392.506 Td +/F5.0 10.5 Tf +<30> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +219.348 392.506 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 366.91 Td +/F7.0 10.5 Tf +<496e76616c696420696e70757420617320706f7274206e756d62657220676976656e3a203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.1642 Tw + +BT +48.24 340.726 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.1642 Tw + +BT +121.291 340.726 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.1642 Tw + +BT +158.041 340.726 Td +/F1.0 10.5 Tf +[<20696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652069732063616e6e6f7420626520696e74657270726574656420617320612076616c696420706f7274>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 324.946 Td +/F1.0 10.5 Tf +<6e756d6265722028652e672eca737472696e6720697320676976656e292e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 299.35 Td +/F7.0 10.5 Tf +<506f7274206e756d626572206d757374206265206265747765656e203020616e642036353533352c203c76616c75653e20697320676976656e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.1642 Tw + +BT +48.24 273.166 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.1642 Tw + +BT +121.291 273.166 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.1642 Tw + +BT +158.041 273.166 Td +/F1.0 10.5 Tf +[<20696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652069732063616e6e6f7420626520696e74657270726574656420617320612076616c696420706f7274>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 257.386 Td +/F1.0 10.5 Tf +[<6e756d6265722e20506f7274206e756d62657273206d75737420626520696e207468652072> 20.0195 <616e676520302e2e36353533352e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 231.79 Td +/F7.0 10.5 Tf +<496e76616c696420696e70757420617320736572766572206261636b6c6f6720676976656e3a203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4439 Tw + +BT +48.24 205.606 Td +/F1.0 10.5 Tf +<5468652073706563696669656420> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.4439 Tw + +BT +119.8504 205.606 Td +/F3.0 10.5 Tf +<3c76616c75653e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4439 Tw + +BT +156.6004 205.606 Td +/F1.0 10.5 Tf +[<20696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652069732063616e6e6f7420626520696e74657270726574656420617320612076616c696420736572766572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 189.826 Td +/F1.0 10.5 Tf +<6261636b6c6f67206e756d6265722028652e672eca737472696e6720697320676976656e292e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 164.23 Td +/F7.0 10.5 Tf +<43616e6e6f742061636365707420636f6e6e656374696f6e20617420706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 138.046 Td +/F1.0 10.5 Tf +[<436f6e6e656374696f6e20636f756c64206e6f74206265206163636570746564206f6e2054> 20.0195 <435020736f636b> 20.0195 <65742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 112.45 Td +/F7.0 10.5 Tf +<4572726f72207768656e2072656164696e67207468652072656365697665642054435020504455> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 86.266 Td +/F1.0 10.5 Tf +[<53> 20.0195 <797374656d206572726f72206f6363757272656420647572696e672072656164696e672066726f6d207468652054> 20.0195 <435020736f636b> 20.0195 <65742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 60.67 Td +/F7.0 10.5 Tf +<43616e6e6f74206f70656e20736f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3230> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +132 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 131 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F7.0 127 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F5.0 59 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +133 0 obj +[132 0 R /XYZ 0 841.89 null] +endobj +134 0 obj +[132 0 R /XYZ 0 758.37 null] +endobj +135 0 obj +<< /Limits [(_close_the_listening_port) (_fundamental_concepts)] +/Names [(_close_the_listening_port) 82 0 R (_closing_down) 41 0 R (_compilation) 44 0 R (_configuration) 60 0 R (_connection_asps) 33 0 R (_error_handling) 38 0 R (_error_messages) 133 0 R (_error_messages_in_case_tcp_connections_are_used) 134 0 R (_error_reporting) 98 0 R (_functionality) 23 0 R (_fundamental_concepts) 26 0 R] +>> +endobj +136 0 obj +<< /Length 8000 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 793.926 Td +/F1.0 10.5 Tf +[<4372656174696f6e206f6620746865206c697374656e657220736f636b> 20.0195 <6574206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 768.33 Td +/F7.0 10.5 Tf +<536574736f636b6f7074206661696c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 742.146 Td +/F1.0 10.5 Tf +[<53657474696e67206f6620736f636b> 20.0195 <6574206f7074696f6e73206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 716.55 Td +/F7.0 10.5 Tf +<43616e6e6f742062696e6420746f20706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 690.366 Td +/F1.0 10.5 Tf +[<42696e64696e67206f66206120736f636b> 20.0195 <657420746f206120706f7274206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 664.77 Td +/F7.0 10.5 Tf +<43616e6e6f74206c697374656e20617420706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 638.586 Td +/F1.0 10.5 Tf +[<4c697374656e206f6e20746865206c697374656e657220736f636b> 20.0195 <6574206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 612.99 Td +/F7.0 10.5 Tf +<676574736f636b6e616d6528292073797374656d2063616c6c206661696c6564206f6e207468652073657276657220736f636b6574> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 586.806 Td +/F1.0 10.5 Tf +<546865207175657279206f6620746865206c697374656e696e6720706f7274206e756d626572206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 561.21 Td +/F7.0 10.5 Tf +<4162737472616374536f636b65743a206765746e616d65696e666f3a203c6572726f723e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 535.026 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +69.66 535.026 Td +/F3.0 10.5 Tf +<6765746e616d65696e666f> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +127.41 535.026 Td +/F1.0 10.5 Tf +<2066756e6374696f6e2072657475726e656420616e206572726f722e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 509.43 Td +/F7.0 10.5 Tf +<67657461646472696e666f3a203c6572726f72746578743e20666f7220686f7374203c686f73743e2073657276696365203c736572766963653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 483.246 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +69.66 483.246 Td +/F3.0 10.5 Tf +<67657461646472696e666f> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +127.41 483.246 Td +/F1.0 10.5 Tf +<2066756e6374696f6e2072657475726e656420616e206572726f722e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 457.65 Td +/F7.0 10.5 Tf +<4d616c666f726d6564206d6573736167653a20696e76616c6964206c656e6774683a203c6c656e6774683e2e20546865206c656e6774682073686f756c64206265206174206c65617374203c6c656e6768743e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 431.466 Td +/F1.0 10.5 Tf +<546865206d65737361676520726563656976656420636f6e7461696e7320696e76616c6964206c656e67746820696e666f726d6174696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 405.87 Td +/F7.0 10.5 Tf +<416c7265616479207472696564203c76616c75653e2074696d65732c20676976696e67207570> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.7015 Tw + +BT +48.24 379.686 Td +/F1.0 10.5 Tf +<54686520646561646c6f636b20636f756e746572206578636565647320746865206861726420636f646564206c696d6974207768656e20747279696e6720746f20636f6e6e65637420746f20612073657276657220696e20636c69656e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0722 Tw + +BT +48.24 363.906 Td +/F1.0 10.5 Tf +[<6d6f64652e205768656e20636f6e6e656374696e67206f6e206120736f636b> 20.0195 <65742c20736f6d6574696d657320697420697320756e7375636365737366756c2e20546865206e6578742074727920757375616c6c7920736f6c76657320746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0942 Tw + +BT +48.24 348.126 Td +/F1.0 10.5 Tf +<70726f626c656d20616e642074686520636f6e6e656374696f6e2077696c6c206265207375636365737366756c6c792061636365707465642e20546865207465737420706f7274207265747269657320746f20636f6e6e6563742061732061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 332.346 Td +/F1.0 10.5 Tf +<776f726b61726f756e642e20546865206e756d626572206f6620747269657320686f7765766572206c696d6974656420746f2061766f69642068616e67696e6720746865207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3914 Tw + +BT +48.24 304.566 Td +/F1.0 10.5 Tf +[<446966666572656e74206f706572> 20.0195 <6174696e672073797374656d732062656861766520696e206120646966666572656e74207761> 20.0195 <79> 89.8438 <2e20546869732070726f626c656d2069732072> 20.0195 <617265206f6e20536f6c617269732c20556e697820616e64>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 288.786 Td +/F1.0 10.5 Tf +<4c696e75782073797374656d732c20627574206d756368206d6f7265206f6674656e206f6e2043796777696e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 263.19 Td +/F7.0 10.5 Tf +<43616e6e6f7420636f6e6e65637420746f20736572766572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 237.006 Td +/F1.0 10.5 Tf +[<436f6e6e656374696f6e20746f206120736572766572206f6e2054> 20.0195 <4350206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 211.41 Td +/F7.0 10.5 Tf +<436f6e6e656374696f6e2077617320696e74657272757074656420627920746865206f746865722073696465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 185.226 Td +/F1.0 10.5 Tf +[<5468652054> 20.0195 <4350206f722053534c20636f6e6e656374696f6e2077617320726566757365642062> 20.0195 <7920746865206f7468657220706565722c206f722062726f6b> 20.0195 <656e2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 159.63 Td +/F7.0 10.5 Tf +<436c69656e74204964206e6f742073706563696669656420616c74686f756768206e6f74206f6e6c79203120636c69656e7420657869737473> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 133.446 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 107.85 Td +/F7.0 10.5 Tf +<5468657265206973206e6f20636f6e6e656374696f6e20616c6976652c207573652074686520604153505f5443505f436f6e6e65637427206265666f72652073656e64696e6720616e797468696e672e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.6289 Tw + +BT +48.24 81.666 Td +/F1.0 10.5 Tf +[<416e20617474656d707420776173206d6164652062> 20.0195 <7920746865207465737420706f727420746f2073656e642064617461206265666f72652073657474696e6720757020616e> 20.0195 <7920636f6e6e656374696f6e2e20546865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 65.886 Td +/F3.0 10.5 Tf +<6f70656e5f636c69656e745f636f6e6e656374696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +163.74 65.886 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2068617320746f2062652063616c6c6564206265666f72652073656e64696e6720616e> 20.0195 <7920646174612e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3231> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +137 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 136 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F7.0 127 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +138 0 obj +<< /Length 6355 +>> +stream +q +/DeviceRGB cs +0.6941 0.1294 0.2745 scn +/DeviceRGB CS +0.6941 0.1294 0.2745 SCN + +BT +48.24 796.86 Td +/F7.0 10.5 Tf +<53656e642073797374656d2063616c6c206661696c65643a205468657265206973206e6f20636c69656e7420636f6e6e656374656420746f207468652054435020736572766572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 770.676 Td +/F1.0 10.5 Tf +[<412073656e64206f706572> 20.0195 <6174696f6e20697320706572666f726d656420746f2061206e6f6e2d6578697374696e6720636c69656e742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 745.08 Td +/F7.0 10.5 Tf +<53656e642073797374656d2063616c6c206661696c65643a203c76616c75653e20627974657320776572652073656e7420696e7374656164206f66203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 718.896 Td +/F1.0 10.5 Tf +[<5468652073656e64206f706572> 20.0195 <6174696f6e206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 693.3 Td +/F7.0 10.5 Tf +<3c6e616d653e206973206e6f7420646566696e656420696e2074686520636f6e66696775726174696f6e2066696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.6864 Tw + +BT +48.24 667.116 Td +/F1.0 10.5 Tf +[<546865207465737420706f727420706172> 20.0195 <616d65746572203c6e616d653e206973206e6f7420646566696e656420696e207468652072756e74696d6520636f6e6669677572> 20.0195 <6174696f6e2066696c652c20616c74686f75676820697473>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 651.336 Td +/F1.0 10.5 Tf +<70726573656e6365206973206d616e6461746f727920286f7220636f6e646974696f6e616c20616e642074686520636f6e646974696f6e2069732074727565292e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 625.74 Td +/F7.0 10.5 Tf +<54686520686f7374206e616d65203c6e616d653e206973206e6f742076616c696420696e2074686520636f6e66696775726174696f6e2066696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 599.556 Td +/F1.0 10.5 Tf +[<54686520686f7374206e616d652073706563696669656420696e2074686520636f6e6669677572> 20.0195 <6174696f6e2066696c6520636f756c64206e6f74206265207265736f6c7665642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 573.96 Td +/F7.0 10.5 Tf +<4e756d626572206f6620636c69656e74733c3e30206275742063616e6e6f742067657420666972737420636c69656e742c2070726f6772616d6d696e67206572726f72> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 547.776 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 522.18 Td +/F7.0 10.5 Tf +<496e646578203c76616c75653e2065786365656473206c656e677468206f662070656572206c697374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 495.996 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 470.4 Td +/F7.0 10.5 Tf +<41627374726163745f536f636b65743a3a6765745f706565723a20436c69656e74203c76616c75653e20646f6573206e6f74206578697374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 444.216 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 418.62 Td +/F7.0 10.5 Tf +<496e76616c696420436c69656e7420496420697320676976656e3a203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 392.436 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 366.84 Td +/F7.0 10.5 Tf +<50656572203c76616c75653e20646f6573206e6f74206578697374> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 340.656 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 315.06 Td +/F7.0 10.5 Tf +<53657420626c6f636b696e67206d6f6465206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 288.876 Td +/F1.0 10.5 Tf +[<54> 29.7852 <65737420706f727420636f756c64206e6f742073657420736f636b> 20.0195 <6574206f7074696f6e3a20>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +233.2941 288.876 Td +/F3.0 10.5 Tf +<4f5f4e4f4e424c4f434b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 244.764 Td +/F2.0 22 Tf +[<41> 20.0195 <64646974696f6e616c204572726f72204d6573736167657320496e20436173652053534c>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 214.844 Td +/F2.0 22 Tf +<436f6e6e656374696f6e73204172652055736564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6193 Tw + +BT +48.24 185.656 Td +/F1.0 10.5 Tf +<41706172742066726f6d207468652070726576696f75736c79206d656e74696f6e6564206572726f72206d657373616765732c2074686520666f6c6c6f77696e67206d6573736167657320617265207573656420696e20636173652053534c> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 169.876 Td +/F1.0 10.5 Tf +<697320757365643a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 144.28 Td +/F7.0 10.5 Tf +<4e6f2053534c2043545820666f756e642c2053534c206e6f7420696e697469616c697a6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 118.096 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 92.5 Td +/F7.0 10.5 Tf +<4372656174696f6e206f662053534c206f626a656374206661696c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 66.316 Td +/F1.0 10.5 Tf +<4372656174696f6e206f66207468652053534c206f626a656374206973206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3232> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +139 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 138 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F7.0 127 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F2.0 19 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +140 0 obj +[139 0 R /XYZ 0 273.06 null] +endobj +141 0 obj +<< /Length 7793 +>> +stream +q +/DeviceRGB cs +0.6941 0.1294 0.2745 scn +/DeviceRGB CS +0.6941 0.1294 0.2745 SCN + +BT +48.24 796.86 Td +/F7.0 10.5 Tf +<42696e64696e67206f662053534c206f626a65637420746f20736f636b6574206661696c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 770.676 Td +/F1.0 10.5 Tf +[<5468652053534c206f626a65637420636f756c64206e6f7420626520626f756e6420746f207468652054> 20.0195 <435020736f636b> 20.0195 <65742e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 745.08 Td +/F7.0 10.5 Tf +<53534c206572726f72206f63637572726564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7782 Tw + +BT +48.24 718.896 Td +/F1.0 10.5 Tf +[<412067656e6572> 20.0195 <616c2053534c206572726f72206f636375727265642e20436865636b20746865207465737420706f7274206c6f677320746f207365652070726576696f7573206572726f72206d657373616765732073686f77696e6720746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 703.116 Td +/F1.0 10.5 Tf +<7265616c2070726f626c656d2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 677.52 Td +/F7.0 10.5 Tf +<3c6e616d653e206973206e6f7420646566696e656420696e2074686520636f6e66696775726174696f6e2066696c6520616c74686f756768203c76616c75653e3d796573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 663.3 m +543.04 663.3 l +545.2491 663.3 547.04 661.5091 547.04 659.3 c +547.04 630.56 l +547.04 628.3509 545.2491 626.56 543.04 626.56 c +52.24 626.56 l +50.0309 626.56 48.24 628.3509 48.24 630.56 c +48.24 659.3 l +48.24 661.5091 50.0309 663.3 52.24 663.3 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 663.3 m +543.04 663.3 l +545.2491 663.3 547.04 661.5091 547.04 659.3 c +547.04 630.56 l +547.04 628.3509 545.2491 626.56 543.04 626.56 c +52.24 626.56 l +50.0309 626.56 48.24 628.3509 48.24 630.56 c +48.24 659.3 l +48.24 661.5091 50.0309 663.3 52.24 663.3 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 640.475 Td +/F3.0 11 Tf +<3c6e616d653e3a2073736c5f7472757374656443416c6973745f66696c655f6e616d6528292c203c76616c75653e3a2073736c5f76657269667963657274696669636174655f6e616d652829> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 604.78 Td +/F7.0 10.5 Tf +<4e6f2053534c206461746120617661696c61626c6520666f7220636c69656e74203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 578.596 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 553.0 Td +/F7.0 10.5 Tf +<436f756c64206e6f7420726561642066726f6d202f6465762f7572616e646f6d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 526.816 Td +/F1.0 10.5 Tf +[<5468652072656164206f706572> 20.0195 <6174696f6e206f6e2074686520696e7374616c6c65642072> 20.0195 <616e646f6d20646576696365206973206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 501.22 Td +/F7.0 10.5 Tf +<436f756c64206e6f7420726561642066726f6d202f6465762f72616e646f6d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 475.036 Td +/F1.0 10.5 Tf +[<5468652072656164206f706572> 20.0195 <6174696f6e206f6e2074686520696e7374616c6c65642072> 20.0195 <616e646f6d20646576696365206973206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 449.44 Td +/F7.0 10.5 Tf +<436f756c64206e6f742073656564207468652050736575646f2052616e646f6d204e756d6265722047656e657261746f72207769746820656e6f7567682064617461> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 423.256 Td +/F1.0 10.5 Tf +[<4173206e6f2072> 20.0195 <616e646f6d206465766963657320666f756e642c206120776f726b61726f756e64206973207573656420746f2073656564207468652053534c2050524e472e205468652073656564696e67206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 397.66 Td +/F7.0 10.5 Tf +<53534c206d6574686f64206372656174696f6e206661696c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 371.476 Td +/F1.0 10.5 Tf +<546865206372656174696f6e206f66207468652053534c206d6574686f64206f626a656374206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 345.88 Td +/F7.0 10.5 Tf +<53534c20636f6e74657874206372656174696f6e206661696c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 319.696 Td +/F1.0 10.5 Tf +<546865206372656174696f6e206f66207468652053534c20636f6e74657874206f626a656374206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 294.1 Td +/F7.0 10.5 Tf +<43616e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +63.99 294.1 Td +/F6.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +67.014 294.1 Td +/F7.0 10.5 Tf +<7420726561642063657274696669636174652066696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 267.916 Td +/F1.0 10.5 Tf +<546865207370656369666965642063657274696669636174652066696c6520636f756c64206e6f7420626520726561642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 242.32 Td +/F7.0 10.5 Tf +<43616e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +63.99 242.32 Td +/F6.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +67.014 242.32 Td +/F7.0 10.5 Tf +<742072656164206b65792066696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 216.136 Td +/F1.0 10.5 Tf +[<546865207370656369666965642070726976617465206b> 20.0195 <65792066696c6520636f756c64206e6f7420626520726561642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 190.54 Td +/F7.0 10.5 Tf +<43616e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +63.99 190.54 Td +/F6.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +67.014 190.54 Td +/F7.0 10.5 Tf +<742072656164207472757374656443416c6973742066696c65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 164.356 Td +/F1.0 10.5 Tf +<54686520737065636966696564206365727469666963617465206f66207468652074727573746564204341732066696c6520636f756c64206e6f7420626520726561642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 138.76 Td +/F7.0 10.5 Tf +<436970686572206c697374207265737472696374696f6e206661696c656420666f72203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 112.576 Td +/F1.0 10.5 Tf +<5468652073706563696669656420636970686572207265737472696374696f6e206c69737420636f756c64206e6f74206265207365742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 86.98 Td +/F7.0 10.5 Tf +<41637469766174696f6e206f662053534c2073657373696f6e20726573756d7074696f6e206661696c6564206f6e20736572766572> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 60.796 Td +/F1.0 10.5 Tf +<5468652061637469766174696f6e206f66207468652053534c2073657373696f6e20726573756d7074696f6e206f6e2074686520736572766572206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3233> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +142 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 141 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F7.0 127 0 R +/F1.0 8 0 R +/F3.0 27 0 R +/F6.0 97 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +143 0 obj +<< /Length 9230 +>> +stream +q +/DeviceRGB cs +0.6941 0.1294 0.2745 scn +/DeviceRGB CS +0.6941 0.1294 0.2745 SCN + +BT +48.24 796.11 Td +/F7.0 10.5 Tf +<556e6b6e6f776e2053534c206572726f7220636f6465203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 769.926 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 720.474 Td +/F2.0 27 Tf +[<57> 49.8047 <61726e696e67204d65737361676573>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 673.494 Td +/F2.0 22 Tf +[<57> 49.8047 <61726e696e67204d6573736167657320496e20436173652054> 20.0195 <435020436f6e6e656374696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 643.574 Td +/F2.0 22 Tf +<4172652055736564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 616.57 Td +/F7.0 10.5 Tf +<4572726f72207768656e2072656164696e67207468652072656365697665642054435020504455> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 590.386 Td +/F1.0 10.5 Tf +[<5468652072656365697665642054> 20.0195 <4350205044552063616e6e6f7420626520726561642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +2.4269 Tw + +BT +48.24 564.79 Td +/F7.0 10.5 Tf +<636f6e6e65637428292072657475726e6564206572726f7220636f6465204541444452494e5553452e205065726861707320746869732069732061206b65726e656c206275672e20547279696e6720746f20636f6e6e656374> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 551.845 Td +/F7.0 10.5 Tf +<616761696e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.2714 Tw + +BT +48.24 525.661 Td +/F1.0 10.5 Tf +[<5768656e20636f6e6e656374696e67206f6e206120736f636b> 20.0195 <65742c20736f6d6574696d657320697420697320756e7375636365737366756c2e20546865206e6578742074727920757375616c6c7920736f6c766573207468652070726f626c656d>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5668 Tw + +BT +48.24 509.881 Td +/F1.0 10.5 Tf +<616e642074686520636f6e6e656374696f6e2077696c6c206265207375636365737366756c6c792061636365707465642e20546865207465737420706f7274207265747269657320746f20636f6e6e656374206173206120776f726b61726f756e642e> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 494.101 Td +/F1.0 10.5 Tf +<546865206e756d626572206f6620747269657320686f7765766572206c696d6974656420746f2061766f69642068616e67696e6720746865207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3914 Tw + +BT +48.24 466.321 Td +/F1.0 10.5 Tf +[<446966666572656e74206f706572> 20.0195 <6174696e672073797374656d732062656861766520696e206120646966666572656e74207761> 20.0195 <79> 89.8438 <2e20546869732070726f626c656d2069732072> 20.0195 <617265206f6e20536f6c617269732c20556e697820616e64>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 450.541 Td +/F1.0 10.5 Tf +<4c696e75782073797374656d732c20627574206d756368206d6f7265206f6674656e206f6e2043796777696e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 424.945 Td +/F7.0 10.5 Tf +<436f6e6e65637428292072657475726e6564206572726f7220636f6465203c76616c75653e2c20747279696e6720746f20636f6e6e65637420616761696e2028544350207265636f6e6e656374206d6f646529> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5521 Tw + +BT +48.24 398.761 Td +/F1.0 10.5 Tf +[<5768656e20636f6e6e656374696e67206f6e206120736f636b> 20.0195 <65742c20736f6d6574696d657320697420697320756e7375636365737366756c20616e642074686520676976656e206572726f7220636f6465207761732072657475726e65642e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.8496 Tw + +BT +48.24 382.981 Td +/F1.0 10.5 Tf +<546865206e6578742074727920757375616c6c7920736f6c766573207468652070726f626c656d20616e642074686520636f6e6e656374696f6e2077696c6c206265207375636365737366756c6c792061636365707465642e205468652074657374> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 367.201 Td +/F1.0 10.5 Tf +<706f7274207265747269657320746f20636f6e6e656374206173206120776f726b61726f756e642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 341.605 Td +/F7.0 10.5 Tf +<54435020636f6e6e656374696f6e2077617320696e74657272757074656420627920746865206f7468657220736964652c20747279696e6720746f207265636f6e6e65637420616761696e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.1251 Tw + +BT +48.24 315.421 Td +/F1.0 10.5 Tf +[<5468652054> 20.0195 <4350206f722053534c20636f6e6e656374696f6e2077617320726566757365642062> 20.0195 <7920746865206f7468657220706565722c206f72206974207761732062726f6b> 20.0195 <656e2e20546865207465737420706f727420747269657320746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 299.641 Td +/F1.0 10.5 Tf +<7265636f6e6e65637420616761696e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 274.045 Td +/F7.0 10.5 Tf +<544350207265636f6e6e656374207375636365737366756c6c792066696e69736865642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 247.861 Td +/F1.0 10.5 Tf +<54686973207761726e696e67206d65737361676520697320676976656e20696620746865207265636f6e6e656374696f6e20776173207375636365737366756c2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 222.265 Td +/F7.0 10.5 Tf +<506172616d65746572203c6e616d653e20686173206e6f206d65616e696e67206966207573655f636f6e6e656374696f6e5f4153507320697320757365642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 196.081 Td +/F1.0 10.5 Tf +[<5468657265206973206e6f20656666656374206f662073657474696e67207468697320706172> 20.0195 <616d65746572207768656e20>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +293.4778 196.081 Td +/F3.0 10.5 Tf +<7573655f636f6e6e656374696f6e5f41535073> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +393.2278 196.081 Td +/F1.0 10.5 Tf +<2069732073657420746f20> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +435.9943 196.081 Td +/F5.0 10.5 Tf +<2279657322> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +462.2443 196.081 Td +/F1.0 10.5 Tf +<2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 170.485 Td +/F7.0 10.5 Tf +<41627374726163745f536f636b65743a3a72656d6f76655f636c69656e743a203c76616c75653e2069732074686520736572766572206c697374656e696e6720706f72742c2063616e206e6f742062652072656d6f76656421> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6111 Tw + +BT +48.24 144.301 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.6111 Tw + +BT +70.2711 144.301 Td +/F3.0 10.5 Tf +<636c69656e745f6964> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6111 Tw + +BT +117.5211 144.301 Td +/F1.0 10.5 Tf +<20676976656e20696e2074686520> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.6111 Tw + +BT +184.4039 144.301 Td +/F3.0 10.5 Tf +<72656d6f76655f636c69656e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.6111 Tw + +BT +252.6539 144.301 Td +/F1.0 10.5 Tf +[<2066756e6374696f6e2069732063757272656e746c7920757365642061732074686520736572766572> -29.7852 ] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 128.521 Td +/F1.0 10.5 Tf +[<63616e206e6f742062652072656d6f7665642e2054> 29.7852 <6f20636c6f73652074686520736572766572206c697374656e696e6720706f72742c207573652074686520>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +359.4413 128.521 Td +/F3.0 10.5 Tf +<636c6f73655f6c697374656e5f706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +448.6913 128.521 Td +/F1.0 10.5 Tf +<2066756e6374696f6e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 102.925 Td +/F7.0 10.5 Tf +<436c69656e74203c76616c75653e20686173206e6f74206265656e2072656d6f7665642c2070726f6772616d6d696e67206572726f72> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 76.741 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.8792 Tw + +BT +48.24 51.145 Td +/F7.0 10.5 Tf +<53656e64696e672064617461206f6e2066696c652064657363726970746f72203c76616c75653e2e5468652073656e64696e67206f7065726174696f6e20776f756c6420626c6f636b20657865637574696f6e2e205468652073697a65> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3234> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +144 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 143 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F7.0 127 0 R +/F1.0 8 0 R +/F2.0 19 0 R +/F3.0 27 0 R +/F5.0 59 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +145 0 obj +[144 0 R /XYZ 0 754.11 null] +endobj +146 0 obj +[144 0 R /XYZ 0 701.79 null] +endobj +147 0 obj +<< /Length 8421 +>> +stream +q +/DeviceRGB cs +0.6941 0.1294 0.2745 scn +/DeviceRGB CS +0.6941 0.1294 0.2745 SCN + +BT +48.24 796.86 Td +/F7.0 10.5 Tf +<6f6620746865206f7574676f696e67206275666665722077617320696e637265617365642066726f6d203c6f6c645f76616c75653e20746f203c6e65775f76616c75653e2062797465732e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0536 Tw + +BT +48.24 770.676 Td +/F1.0 10.5 Tf +[<5768656e20746865204162737472> 20.0195 <61637420536f636b> 20.0195 <657420697320757365642077697468206e6f6e2d626c6f636b696e6720736f636b> 20.0195 <65742c206966207468652073656e64696e67206f706572> 20.0195 <6174696f6e20776f756c6420626c6f636b2c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9731 Tw + +BT +48.24 754.896 Td +/F1.0 10.5 Tf +[<6669727374207468652073697a65206f66207468652073656e64696e672062756666657220697320696e637265617365642e205468697320697320746865206669727374207374657020746f2061766f69642054> 20.0195 <435020646561646c6f636b2e20496e20746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 739.116 Td +/F1.0 10.5 Tf +[<7365636f6e642073746570207468652054> 29.7852 <65737420506f72742077696c6c2074727920746f207265636569766520736f6d6520646174612e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +0.8115 Tw + +BT +48.24 713.52 Td +/F7.0 10.5 Tf +<53656e64696e672064617461206f6e2066696c652064657363726970746f72203c76616c75653e2e5468652073656e64696e67206f7065726174696f6e20776f756c6420626c6f636b20657865637574696f6e20616e64206974206973> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.1286 Tw + +BT +48.24 700.575 Td +/F7.0 10.5 Tf +<6e6f7420706f737369626c6520746f206675727468657220696e637265617365207468652073697a65206f6620746865206f7574676f696e67206275666665722e20547279696e6720746f2070726f6365737320696e636f6d696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 687.63 Td +/F7.0 10.5 Tf +<6461746120746f2061766f696420646561646c6f636b2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0536 Tw + +BT +48.24 661.446 Td +/F1.0 10.5 Tf +[<5768656e20746865204162737472> 20.0195 <61637420536f636b> 20.0195 <657420697320757365642077697468206e6f6e2d626c6f636b696e6720736f636b> 20.0195 <65742c206966207468652073656e64696e67206f706572> 20.0195 <6174696f6e20776f756c6420626c6f636b2c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7353 Tw + +BT +48.24 645.666 Td +/F1.0 10.5 Tf +[<616e64207468652073697a65206f6620746865206f7574676f696e67206275666665722063616e6e6f7420626520696e637265617365642c207468652054> 29.7852 <65737420506f727420747269657320746f207265636569766520736f6d65206461746120746f>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 629.886 Td +/F1.0 10.5 Tf +<61766f696420646561646c6f636b2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 604.29 Td +/F7.0 10.5 Tf +<53797374656d2063616c6c2066636e746c28465f474554464c29206661696c6564206f6e2066696c652064657363726970746f722025642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 580.29 Td +/F7.0 10.5 Tf +<53797374656d2063616c6c2066636e746c28465f534554464c29206661696c6564206f6e2066696c652064657363726970746f722025642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 556.29 Td +/F7.0 10.5 Tf +<536574736f636b6f7074206661696c6564207768656e20747279696e6720746f206f70656e20746865206c697374656e20706f72743a203c706f72743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 530.106 Td +/F1.0 10.5 Tf +<54686520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +69.66 530.106 Td +/F3.0 10.5 Tf +<736574736f636b6f7074> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +122.16 530.106 Td +/F1.0 10.5 Tf +<2066756e6374696f6e206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 504.51 Td +/F7.0 10.5 Tf +<43616e6e6f742062696e6420746f20706f7274207768656e20747279696e6720746f206f70656e20746865206c697374656e20706f72743a203c706f72743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 478.326 Td +/F1.0 10.5 Tf +<5468652062696e642073797374656d2063616c6c206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 452.73 Td +/F7.0 10.5 Tf +<43616e6e6f74206c697374656e20617420706f7274207768656e20747279696e6720746f206f70656e20746865206c697374656e20706f72743a203c706f72743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 426.546 Td +/F1.0 10.5 Tf +<546865206c697374656e2073797374656d2063616c6c206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.8786 Tw + +BT +48.24 400.95 Td +/F7.0 10.5 Tf +<676574736f636b6e616d6528292073797374656d2063616c6c206661696c6564206f6e207468652073657276657220736f636b6574207768656e20747279696e6720746f206f70656e20746865206c697374656e20706f72743a> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 388.005 Td +/F7.0 10.5 Tf +<3c706f72743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 361.821 Td +/F1.0 10.5 Tf +<54686520676574736f636b6e616d652073797374656d2063616c6c206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 336.225 Td +/F7.0 10.5 Tf +<67657461646472696e666f3a203c6572726f72746578723e20666f7220686f7374203c686f73743e2073657276696365203c736572766963653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 310.041 Td +/F1.0 10.5 Tf +<5468652067657461646472696e666f2073797374656d2063616c6c206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +1.8786 Tw + +BT +48.24 284.445 Td +/F7.0 10.5 Tf +<6765746e616d65696e666f28292073797374656d2063616c6c206661696c6564206f6e207468652073657276657220736f636b6574207768656e20747279696e6720746f206f70656e20746865206c697374656e20706f72743a> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 271.5 Td +/F7.0 10.5 Tf +<3c706f72743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 245.316 Td +/F1.0 10.5 Tf +<546865206765746e616d65696e666f2073797374656d2063616c6c206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 219.72 Td +/F7.0 10.5 Tf +<43616e6e6f74206f70656e20736f636b6574207768656e20747279696e6720746f206f70656e20636c69656e7420636f6e6e656374696f6e3a203c6572726f72746578743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 193.536 Td +/F1.0 10.5 Tf +[<54686520736f636b> 20.0195 <65742073797374656d2063616c6c206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 167.94 Td +/F7.0 10.5 Tf +<536574736f636b6f7074206661696c6564207768656e20747279696e6720746f206f70656e20636c69656e7420636f6e6e656374696f6e3a203c6572726f726d6573736167653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 141.756 Td +/F1.0 10.5 Tf +[<54686520736574736f636b> 20.0195 <6f70742073797374656d2063616c6c206661696c65642e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 116.16 Td +/F7.0 10.5 Tf +<43616e6e6f742062696e6420746f20706f7274207768656e20747279696e6720746f206f70656e20636c69656e7420636f6e6e656374696f6e3a203c6572726f72746578743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 89.976 Td +/F1.0 10.5 Tf +<5468652062696e642073797374656d2063616c6c206661696c65642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 64.38 Td +/F7.0 10.5 Tf +<416c7265616479207472696564203c6e3e2074696d65732c20676976696e67207570207768656e20747279696e6720746f206f70656e20636c69656e7420636f6e6e656374696f6e3a203c6572726f72746578743e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3235> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +148 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 147 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F7.0 127 0 R +/F1.0 8 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +>> +endobj +149 0 obj +<< /Length 7665 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +1.7015 Tw + +BT +48.24 794.676 Td +/F1.0 10.5 Tf +<54686520646561646c6f636b20636f756e746572206578636565647320746865206861726420636f646564206c696d6974207768656e20747279696e6720746f20636f6e6e65637420746f20612073657276657220696e20636c69656e74> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.0722 Tw + +BT +48.24 778.896 Td +/F1.0 10.5 Tf +[<6d6f64652e205768656e20636f6e6e656374696e67206f6e206120736f636b> 20.0195 <65742c20736f6d6574696d657320697420697320756e7375636365737366756c2e20546865206e6578742074727920757375616c6c7920736f6c76657320746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.0942 Tw + +BT +48.24 763.116 Td +/F1.0 10.5 Tf +<70726f626c656d20616e642074686520636f6e6e656374696f6e2077696c6c206265207375636365737366756c6c792061636365707465642e20546865207465737420706f7274207265747269657320746f20636f6e6e6563742061732061> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 747.336 Td +/F1.0 10.5 Tf +<776f726b61726f756e642e20546865206e756d626572206f6620747269657320686f7765766572206c696d6974656420746f2061766f69642068616e67696e6720746865207465737420706f72742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.3914 Tw + +BT +48.24 719.556 Td +/F1.0 10.5 Tf +[<446966666572656e74206f706572> 20.0195 <6174696e672073797374656d732062656861766520696e206120646966666572656e74207761> 20.0195 <79> 89.8438 <2e20546869732070726f626c656d2069732072> 20.0195 <617265206f6e20536f6c617269732c20556e697820616e64>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 703.776 Td +/F1.0 10.5 Tf +<4c696e75782073797374656d732c20627574206d756368206d6f7265206f6674656e206f6e2043796777696e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 659.664 Td +/F2.0 22 Tf +[<57> 49.8047 <61726e696e67204d6573736167657320496e20436173652053534c20436f6e6e656374696f6e73>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 629.744 Td +/F2.0 22 Tf +<4172652055736564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 602.74 Td +/F7.0 10.5 Tf +<5761726e696e673a207261636520636f6e646974696f6e207768696c652073657474696e672063757272656e7420636c69656e74206f626a65637420706f696e7465722e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 576.556 Td +/F1.0 10.5 Tf +<5468652063757272656e7420636c69656e74206f626a65637420706f696e74657220697320616c7265616479207365742e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 550.96 Td +/F7.0 10.5 Tf +<436f6e6e656374696f6e2066726f6d20636c69656e74203c76616c75653e2069732072656675736564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 524.776 Td +/F1.0 10.5 Tf +<54686520636f6e6e656374696f6e2066726f6d206120636c69656e74206973207265667573656420696e20746865207365727665722e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 499.18 Td +/F7.0 10.5 Tf +<436f6e6e656374696f6e20746f207365727665722069732072656675736564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 472.996 Td +/F1.0 10.5 Tf +[<54686520636f6e6e656374696f6e2066726f6d2074686520636c69656e7420697320726566757365642062> 20.0195 <7920746865207365727665722e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 447.4 Td +/F7.0 10.5 Tf +<53657276657220646964206e6f742073656e6420612073657373696f6e204944> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 421.216 Td +/F1.0 10.5 Tf +<5468652053534c2073657276657220646964206e6f742073656e6420612073657373696f6e2049442e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 395.62 Td +/F7.0 10.5 Tf +<566572696669636174696f6e206661696c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 369.436 Td +/F1.0 10.5 Tf +<54686520766572696669636174696f6e206f6620746865206f746865722073696465206973206661696c65642e2054686520636f6e6e656374696f6e2077696c6c206265207368757420646f776e2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 343.84 Td +/F7.0 10.5 Tf +<53534c206f626a656374206e6f7420666f756e6420666f7220636c69656e74203c76616c75653e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 317.656 Td +/F1.0 10.5 Tf +<49742073686f756c64206e657665722073686f772075702e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 292.06 Td +/F7.0 10.5 Tf +<53534c5f536f636b65743a3a726563656976655f6d6573736167655f6f6e5f66643a2053534c20636f6e6e656374696f6e2077617320696e74657272757074656420627920746865206f746865722073696465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.7244 Tw + +BT +48.24 265.876 Td +/F1.0 10.5 Tf +<54686520544c532f53534c20636f6e6e656374696f6e20686173206265656e20636c6f7365642e204966207468652070726f746f636f6c2076657273696f6e2069732053534c20332e30206f7220544c5320312e302c2074686973207761726e696e67> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.1929 Tw + +BT +48.24 250.096 Td +/F1.0 10.5 Tf +<61707065617273206f6e6c79206966206120636c6f7375726520616c65727420686173206f6363757272656420696e207468652070726f746f636f6c2c20692e652eca69662074686520636f6e6e656374696f6e20686173206265656e20636c6f736564> Tj +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.1041 Tw + +BT +48.24 234.316 Td +/F1.0 10.5 Tf +[<636c65616e6c79> 89.8438 <2e204e6f7465207468617420696e2074686973206361736520697420646f6573206e6f74206e65636573736172696c7920696e64696361746520746861742074686520756e6465726c79696e67207472> 20.0195 <616e73706f727420686173206265656e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 218.536 Td +/F1.0 10.5 Tf +<636c6f7365642e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 192.94 Td +/F7.0 10.5 Tf +<4f74686572207369646520646f6573206e6f742068617665206365727469666963617465> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 166.756 Td +/F1.0 10.5 Tf +<546865206f746865722073696465206f66207468652053534c20636f6e6e656374696f6e20646f6573206e6f74206861766520612063657274696669636174652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 141.16 Td +/F7.0 10.5 Tf +<536f6c61726973207061746368657320746f2070726f766964652072616e646f6d2067656e65726174696f6e206465766963657320617265206e6f7420696e7374616c6c6564> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.3944 Tw + +BT +48.24 114.976 Td +/F1.0 10.5 Tf +[<536f6c61726973207061746368657320746f2070726f766964652072> 20.0195 <616e646f6d2067656e6572> 20.0195 <6174696f6e206465766963657320617265206e6f7420696e7374616c6c65642e204120776f726b61726f756e642077696c6c2062652075736564>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 99.196 Td +/F1.0 10.5 Tf +<746f2073656564207468652050524e472e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +48.24 73.6 Td +/F7.0 10.5 Tf +<50726976617465206b657920646f6573206e6f74206d6174636820746865206365727469666963617465207075626c6963206b6579> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3236> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +150 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 149 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F2.0 19 0 R +/F7.0 127 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +>> +endobj +151 0 obj +[150 0 R /XYZ 0 687.96 null] +endobj +152 0 obj +<< /Length 7686 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 794.676 Td +/F1.0 10.5 Tf +[<5468652070726976617465206b> 20.0195 <65792073706563696669656420666f7220746865207465737420706f727420646f6573206e6f74206d61746368207769746820746865207075626c6963206b> 20.0195 <6579> 89.8438 <2e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 745.224 Td +/F2.0 27 Tf +[<54> 29.7852 <65726d696e6f6c6f6779>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 714.576 Td +/F2.0 10.5 Tf +[<536f636b> 20.0195 <6574733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4108 Tw + +BT +48.24 698.796 Td +/F1.0 10.5 Tf +[<54686520736f636b> 20.0195 <65742069732061206d6574686f6420666f7220636f6d6d756e69636174696f6e206265747765656e206120636c69656e742070726f6772> 20.0195 <616d20616e642061207365727665722070726f6772> 20.0195 <616d20696e2061>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.4106 Tw + +BT +48.24 683.016 Td +/F1.0 10.5 Tf +[<6e6574776f726b2e204120736f636b> 20.0195 <657420697320646566696e6564206173202274686520656e64706f696e7420696e206120636f6e6e656374696f6e> 40.0391 <222e20536f636b> 20.0195 <65747320617265206372656174656420616e64207573656420776974682061>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +5.2202 Tw + +BT +48.24 667.236 Td +/F1.0 10.5 Tf +[<736574206f662070726f6772> 20.0195 <616d6d696e67207265717565737473206f72202266756e6374696f6e2063616c6c732220736f6d6574696d65732063616c6c65642074686520736f636b> 20.0195 <657473206170706c69636174696f6e>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +3.0739 Tw + +BT +48.24 651.456 Td +/F1.0 10.5 Tf +[<70726f6772> 20.0195 <616d6d696e6720696e746572666163652028415049292e20546865206d6f737420636f6d6d6f6e20736f636b> 20.0195 <65742041504920697320746865204265726b> 20.0195 <656c657920554e49582043206c616e6775616765>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.658 Tw + +BT +48.24 635.676 Td +/F1.0 10.5 Tf +[<696e7465726661636520666f7220736f636b> 20.0195 <6574732e20536f636b> 20.0195 <6574732063616e20616c736f206265207573656420666f7220636f6d6d756e69636174696f6e206265747765656e2070726f6365737365732077697468696e20746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 619.896 Td +/F1.0 10.5 Tf +<73616d6520636f6d70757465722e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 592.116 Td +/F2.0 10.5 Tf +[<426c6f636b696e6720616e64206e6f6e2d626c6f636b696e6720736f636b> 20.0195 <6574733a>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.5219 Tw + +BT +48.24 576.336 Td +/F1.0 10.5 Tf +[<5573696e67206120626c6f636b696e6720736f636b> 20.0195 <65742c20736f6d6520736f636b> 20.0195 <6574206f706572> 20.0195 <6174696f6e73202873656e642c20726563656976652c20636f6e6e6563742c20616363657074292077696c6c20626c6f636b20756e74696c20746865>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.1886 Tw + +BT +48.24 560.556 Td +/F1.0 10.5 Tf +[<6f706572> 20.0195 <6174696f6e2069732066696e6973686564206f7220616e206572726f72206f63637572732e205573696e672061206e6f6e2d626c6f636b696e6720736f636b> 20.0195 <65742c207468657365206f706572> 20.0195 <6174696f6e732077696c6c206e65766572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 544.776 Td +/F1.0 10.5 Tf +<626c6f636b206275742072657475726e207769746820616e206572726f7220616e642073657420> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +241.5555 544.776 Td +/F3.0 10.5 Tf +<6572726e6f> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +267.8055 544.776 Td +/F1.0 10.5 Tf +<20746f2074686520617070726f7072696174652076616c75652e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 516.996 Td +/F2.0 10.5 Tf +<4f70656e53534c3a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +0.9081 Tw + +BT +48.24 501.216 Td +/F1.0 10.5 Tf +[<546865204f70656e53534c2050726f6a656374206973206120636f6c6c61626f72> 20.0195 <6174697665206566666f727420746f20646576656c6f70206120726f627573742c20636f6d6d65726369616c2d6772> 20.0195 <6164652c2066756c6c2d66656174757265642c>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +1.4408 Tw + +BT +48.24 485.436 Td +/F1.0 10.5 Tf +[<616e64206f70656e20736f7572636520746f6f6c6b697420696d706c656d656e74696e67207468652053656375726520536f636b> 20.0195 <657473204c61> 20.0195 <796572202853534c2076322f76332920616e64205472> 20.0195 <616e73706f7274204c61> 20.0195 <796572>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +2.2266 Tw + +BT +48.24 469.656 Td +/F1.0 10.5 Tf +[<53656375726974792028544c53207631292070726f746f636f6c732061732077656c6c20617320612066756c6c2d737472656e6774682067656e6572> 20.0195 <616c20707572706f73652063727970746f6772> 20.0195 <617068> 20.0195 <79206c696272> 20.0195 <617279> 89.8438 <2e2046> 40.0391 <6f72>] TJ +ET + + +0.0 Tw +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 453.876 Td +/F1.0 10.5 Tf +<6d6f726520696e666f726d6174696f6e206f6e20746865204f70656e53534c2070726f6a6563742073656520> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +278.8935 453.876 Td +/F1.0 10.5 Tf +<5b335d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 404.424 Td +/F2.0 27 Tf +<416262726576696174696f6e73> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 373.776 Td +/F2.0 10.5 Tf +<4153> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 354.996 Td +/F1.0 10.5 Tf +[<4162737472> 20.0195 <61637420536f636b> 20.0195 <6574>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 327.216 Td +/F2.0 10.5 Tf +<415350> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 308.436 Td +/F1.0 10.5 Tf +[<4162737472> 20.0195 <6163742053657276696365205072696d6974697665>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 280.656 Td +/F2.0 10.5 Tf +<49507634> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 261.876 Td +/F1.0 10.5 Tf +<496e7465726e65742050726f746f636f6c2076657273696f6e2034> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 234.096 Td +/F2.0 10.5 Tf +<49507636> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 215.316 Td +/F1.0 10.5 Tf +<496e7465726e65742050726f746f636f6c2076657273696f6e2036> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 187.536 Td +/F2.0 10.5 Tf +<50454d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 168.756 Td +/F1.0 10.5 Tf +<5072697661637920456e68616e636564204d61696c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 140.976 Td +/F2.0 10.5 Tf +[<52> 20.0195 <5445>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 122.196 Td +/F1.0 10.5 Tf +<52756e2d54696d6520456e7669726f6e6d656e74> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 94.416 Td +/F2.0 10.5 Tf +<53534c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 75.636 Td +/F1.0 10.5 Tf +[<53656375726520536f636b> 20.0195 <657473204c61> 20.0195 <796572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +535.978 14.388 Td +/F1.0 9 Tf +<3237> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +153 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 152 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.0 8 0 R +/F2.0 19 0 R +/F3.0 27 0 R +>> +/XObject << /Stamp1 288 0 R +>> +>> +/Annots [155 0 R] +>> +endobj +154 0 obj +[153 0 R /XYZ 0 778.86 null] +endobj +155 0 obj +<< /Border [0 0 0] +/Dest (_3) +/Subtype /Link +/Rect [278.8935 450.81 292.302 465.09] +/Type /Annot +>> +endobj +156 0 obj +[153 0 R /XYZ 0 438.06 null] +endobj +157 0 obj +<< /Length 2665 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 793.926 Td +/F2.0 10.5 Tf +<535554> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 775.146 Td +/F1.0 10.5 Tf +[<53> 20.0195 <797374656d20556e6465722054> 29.7852 <657374>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 747.366 Td +/F2.0 10.5 Tf +[<54> 20.0195 <4350>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 728.586 Td +/F1.0 10.5 Tf +[<5472> 20.0195 <616e736d697373696f6e20436f6e74726f6c2050726f746f636f6c>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 700.806 Td +/F2.0 10.5 Tf +<544c53> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 682.026 Td +/F1.0 10.5 Tf +[<5472> 20.0195 <616e73706f7274204c61> 20.0195 <796572205365637572697479>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 654.246 Td +/F2.0 10.5 Tf +[<5454> 20.0195 <434e2d33>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +63.24 635.466 Td +/F1.0 10.5 Tf +[<54> 29.7852 <657374696e6720616e642054> 29.7852 <65737420436f6e74726f6c204e6f746174696f6e2076657273696f6e2033>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 586.014 Td +/F2.0 27 Tf +<5265666572656e636573> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 555.366 Td +/F1.0 10.5 Tf +<5b315d204554534920455320323031203837332d3120283230303229> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 539.586 Td +/F1.0 10.5 Tf +[<5468652054> 29.7852 <657374696e6720616e642054> 29.7852 <65737420436f6e74726f6c204e6f746174696f6e2076657273696f6e20332e205061727420313a20436f7265204c616e6775616765>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 511.806 Td +/F1.0 10.5 Tf +[<5b325d205573657220477569646520666f7220544954> 60.0586 <414e205454> 20.0195 <434ed0332054> 29.7852 <657374204578656375746f72>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 484.026 Td +/F1.0 10.5 Tf +<5b335d204f70656e53534c20746f6f6c6b6974> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 468.246 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +48.24 468.246 Td +/F1.0 10.5 Tf +[<687474703a2f2f777777> 69.8242 <2e6f70656e73736c2e6f7267>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 14.388 Td +/F1.0 9 Tf +<3238> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +158 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 595.28 841.89] +/CropBox [0 0 595.28 841.89] +/BleedBox [0 0 595.28 841.89] +/TrimBox [0 0 595.28 841.89] +/ArtBox [0 0 595.28 841.89] +/Contents 157 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 19 0 R +/F1.0 8 0 R +>> +/XObject << /Stamp2 289 0 R +>> +>> +/Annots [163 0 R] +>> +endobj +159 0 obj +[158 0 R /XYZ 0 619.65 null] +endobj +160 0 obj +[158 0 R /XYZ 0 567.33 null] +endobj +161 0 obj +[158 0 R /XYZ 0 523.77 null] +endobj +162 0 obj +[158 0 R /XYZ 0 495.99 null] +endobj +163 0 obj +<< /Border [0 0 0] +/A << /Type /Action +/S /URI +/URI (http://www.openssl.org) +>> +/Subtype /Link +/Rect [48.24 465.18 163.6788 479.46] +/Type /Annot +>> +endobj +164 0 obj +<< /Border [0 0 0] +/Dest (_about_this_document) +/Subtype /Link +/Rect [48.24 748.79 156.6105 763.07] +/Type /Annot +>> +endobj +165 0 obj +<< /Border [0 0 0] +/Dest (_about_this_document) +/Subtype /Link +/Rect [541.1705 748.79 547.04 763.07] +/Type /Annot +>> +endobj +166 0 obj +<< /Border [0 0 0] +/Dest (_how_to_read_this_document) +/Subtype /Link +/Rect [60.24 730.31 201.801 744.59] +/Type /Annot +>> +endobj +167 0 obj +<< /Border [0 0 0] +/Dest (_how_to_read_this_document) +/Subtype /Link +/Rect [541.1705 730.31 547.04 744.59] +/Type /Annot +>> +endobj +168 0 obj +<< /Border [0 0 0] +/Dest (_presumed_knowledge) +/Subtype /Link +/Rect [60.24 711.83 169.02 726.11] +/Type /Annot +>> +endobj +169 0 obj +<< /Border [0 0 0] +/Dest (_presumed_knowledge) +/Subtype /Link +/Rect [541.1705 711.83 547.04 726.11] +/Type /Annot +>> +endobj +170 0 obj +<< /Border [0 0 0] +/Dest (_functionality) +/Subtype /Link +/Rect [48.24 693.35 115.02 707.63] +/Type /Annot +>> +endobj +171 0 obj +<< /Border [0 0 0] +/Dest (_functionality) +/Subtype /Link +/Rect [541.1705 693.35 547.04 707.63] +/Type /Annot +>> +endobj +172 0 obj +<< /Border [0 0 0] +/Dest (_system_requirements) +/Subtype /Link +/Rect [60.24 674.87 168.5683 689.15] +/Type /Annot +>> +endobj +173 0 obj +<< /Border [0 0 0] +/Dest (_system_requirements) +/Subtype /Link +/Rect [541.1705 674.87 547.04 689.15] +/Type /Annot +>> +endobj +174 0 obj +<< /Border [0 0 0] +/Dest (_fundamental_concepts) +/Subtype /Link +/Rect [60.24 656.39 174.984 670.67] +/Type /Annot +>> +endobj +175 0 obj +<< /Border [0 0 0] +/Dest (_fundamental_concepts) +/Subtype /Link +/Rect [541.1705 656.39 547.04 670.67] +/Type /Annot +>> +endobj +176 0 obj +<< /Border [0 0 0] +/Dest (_module_structure) +/Subtype /Link +/Rect [72.24 637.91 159.9045 652.19] +/Type /Annot +>> +endobj +177 0 obj +<< /Border [0 0 0] +/Dest (_module_structure) +/Subtype /Link +/Rect [541.1705 637.91 547.04 652.19] +/Type /Annot +>> +endobj +178 0 obj +<< /Border [0 0 0] +/Dest (_start_procedure) +/Subtype /Link +/Rect [60.24 619.43 138.6855 633.71] +/Type /Annot +>> +endobj +179 0 obj +<< /Border [0 0 0] +/Dest (_start_procedure) +/Subtype /Link +/Rect [541.1705 619.43 547.04 633.71] +/Type /Annot +>> +endobj +180 0 obj +<< /Border [0 0 0] +/Dest (_connection_asps) +/Subtype /Link +/Rect [72.24 600.95 155.841 615.23] +/Type /Annot +>> +endobj +181 0 obj +<< /Border [0 0 0] +/Dest (_connection_asps) +/Subtype /Link +/Rect [541.1705 600.95 547.04 615.23] +/Type /Annot +>> +endobj +182 0 obj +<< /Border [0 0 0] +/Dest (_server_mode) +/Subtype /Link +/Rect [72.24 582.47 135.8175 596.75] +/Type /Annot +>> +endobj +183 0 obj +<< /Border [0 0 0] +/Dest (_server_mode) +/Subtype /Link +/Rect [541.1705 582.47 547.04 596.75] +/Type /Annot +>> +endobj +184 0 obj +<< /Border [0 0 0] +/Dest (_client_mode) +/Subtype /Link +/Rect [72.24 563.99 132.0375 578.27] +/Type /Annot +>> +endobj +185 0 obj +<< /Border [0 0 0] +/Dest (_client_mode) +/Subtype /Link +/Rect [541.1705 563.99 547.04 578.27] +/Type /Annot +>> +endobj +186 0 obj +<< /Border [0 0 0] +/Dest (sending-receiving-messages) +/Subtype /Link +/Rect [60.24 545.51 201.591 559.79] +/Type /Annot +>> +endobj +187 0 obj +<< /Border [0 0 0] +/Dest (sending-receiving-messages) +/Subtype /Link +/Rect [541.1705 545.51 547.04 559.79] +/Type /Annot +>> +endobj +188 0 obj +<< /Border [0 0 0] +/Dest (_logging) +/Subtype /Link +/Rect [60.24 527.03 99.909 541.31] +/Type /Annot +>> +endobj +189 0 obj +<< /Border [0 0 0] +/Dest (_logging) +/Subtype /Link +/Rect [541.1705 527.03 547.04 541.31] +/Type /Annot +>> +endobj +190 0 obj +<< /Border [0 0 0] +/Dest (_error_handling) +/Subtype /Link +/Rect [60.24 508.55 136.848 522.83] +/Type /Annot +>> +endobj +191 0 obj +<< /Border [0 0 0] +/Dest (_error_handling) +/Subtype /Link +/Rect [541.1705 508.55 547.04 522.83] +/Type /Annot +>> +endobj +192 0 obj +<< /Border [0 0 0] +/Dest (_closing_down) +/Subtype /Link +/Rect [60.24 490.07 128.721 504.35] +/Type /Annot +>> +endobj +193 0 obj +<< /Border [0 0 0] +/Dest (_closing_down) +/Subtype /Link +/Rect [541.1705 490.07 547.04 504.35] +/Type /Annot +>> +endobj +194 0 obj +<< /Border [0 0 0] +/Dest (_ipv6_support) +/Subtype /Link +/Rect [60.24 471.59 125.0355 485.87] +/Type /Annot +>> +endobj +195 0 obj +<< /Border [0 0 0] +/Dest (_ipv6_support) +/Subtype /Link +/Rect [541.1705 471.59 547.04 485.87] +/Type /Annot +>> +endobj +196 0 obj +<< /Border [0 0 0] +/Dest (_ssl_functionality) +/Subtype /Link +/Rect [60.24 453.11 147.684 467.39] +/Type /Annot +>> +endobj +197 0 obj +<< /Border [0 0 0] +/Dest (_ssl_functionality) +/Subtype /Link +/Rect [541.1705 453.11 547.04 467.39] +/Type /Annot +>> +endobj +198 0 obj +<< /Border [0 0 0] +/Dest (_compilation) +/Subtype /Link +/Rect [72.24 434.63 133.4655 448.91] +/Type /Annot +>> +endobj +199 0 obj +<< /Border [0 0 0] +/Dest (_compilation) +/Subtype /Link +/Rect [541.1705 434.63 547.04 448.91] +/Type /Annot +>> +endobj +200 0 obj +<< /Border [0 0 0] +/Dest (_authentication) +/Subtype /Link +/Rect [72.24 416.15 146.8213 430.43] +/Type /Annot +>> +endobj +201 0 obj +<< /Border [0 0 0] +/Dest (_authentication) +/Subtype /Link +/Rect [541.1705 416.15 547.04 430.43] +/Type /Annot +>> +endobj +202 0 obj +<< /Border [0 0 0] +/Dest (_other_features) +/Subtype /Link +/Rect [72.24 397.67 146.6006 411.95] +/Type /Annot +>> +endobj +203 0 obj +<< /Border [0 0 0] +/Dest (_other_features) +/Subtype /Link +/Rect [541.1705 397.67 547.04 411.95] +/Type /Annot +>> +endobj +204 0 obj +<< /Border [0 0 0] +/Dest (_limitations) +/Subtype /Link +/Rect [72.24 379.19 129.6015 393.47] +/Type /Annot +>> +endobj +205 0 obj +<< /Border [0 0 0] +/Dest (_limitations) +/Subtype /Link +/Rect [541.1705 379.19 547.04 393.47] +/Type /Annot +>> +endobj +206 0 obj +<< /Border [0 0 0] +/Dest (_the_test_port) +/Subtype /Link +/Rect [48.24 360.71 113.5838 374.99] +/Type /Annot +>> +endobj +207 0 obj +<< /Border [0 0 0] +/Dest (_the_test_port) +/Subtype /Link +/Rect [541.1705 360.71 547.04 374.99] +/Type /Annot +>> +endobj +208 0 obj +<< /Border [0 0 0] +/Dest (_overview) +/Subtype /Link +/Rect [60.24 342.23 108.7605 356.51] +/Type /Annot +>> +endobj +209 0 obj +<< /Border [0 0 0] +/Dest (_overview) +/Subtype /Link +/Rect [541.1705 342.23 547.04 356.51] +/Type /Annot +>> +endobj +210 0 obj +<< /Border [0 0 0] +/Dest (_installation) +/Subtype /Link +/Rect [60.24 323.75 117.486 338.03] +/Type /Annot +>> +endobj +211 0 obj +<< /Border [0 0 0] +/Dest (_installation) +/Subtype /Link +/Rect [541.1705 323.75 547.04 338.03] +/Type /Annot +>> +endobj +212 0 obj +<< /Border [0 0 0] +/Dest (_configuration) +/Subtype /Link +/Rect [60.24 305.27 129.5503 319.55] +/Type /Annot +>> +endobj +213 0 obj +<< /Border [0 0 0] +/Dest (_configuration) +/Subtype /Link +/Rect [541.1705 305.27 547.04 319.55] +/Type /Annot +>> +endobj +214 0 obj +<< /Border [0 0 0] +/Dest (Abstract_Socket_Test_Port_Parameters_in_the_Test_Port_Configuration_File) +/Subtype /Link +/Rect [72.24 286.79 426.9862 301.07] +/Type /Annot +>> +endobj +215 0 obj +<< /Border [0 0 0] +/Dest (Abstract_Socket_Test_Port_Parameters_in_the_Test_Port_Configuration_File) +/Subtype /Link +/Rect [541.1705 286.79 547.04 301.07] +/Type /Annot +>> +endobj +216 0 obj +<< /Border [0 0 0] +/Dest (_the_abstractsocket_api) +/Subtype /Link +/Rect [60.24 268.31 81.66 282.59] +/Type /Annot +>> +endobj +217 0 obj +<< /Border [0 0 0] +/Dest (_the_abstractsocket_api) +/Subtype /Link +/Rect [81.66 269.906 155.16 280.406] +/Type /Annot +>> +endobj +218 0 obj +<< /Border [0 0 0] +/Dest (_the_abstractsocket_api) +/Subtype /Link +/Rect [155.16 268.31 175.4775 282.59] +/Type /Annot +>> +endobj +219 0 obj +<< /Border [0 0 0] +/Dest (_the_abstractsocket_api) +/Subtype /Link +/Rect [541.1705 268.31 547.04 282.59] +/Type /Annot +>> +endobj +220 0 obj +<< /Border [0 0 0] +/Dest (map-unmap-the-test-port) +/Subtype /Link +/Rect [72.24 249.83 199.3133 264.11] +/Type /Annot +>> +endobj +221 0 obj +<< /Border [0 0 0] +/Dest (map-unmap-the-test-port) +/Subtype /Link +/Rect [541.1705 249.83 547.04 264.11] +/Type /Annot +>> +endobj +222 0 obj +<< /Border [0 0 0] +/Dest (_setting_test_port_parameters) +/Subtype /Link +/Rect [72.24 231.35 213.4881 245.63] +/Type /Annot +>> +endobj +223 0 obj +<< /Border [0 0 0] +/Dest (_setting_test_port_parameters) +/Subtype /Link +/Rect [541.1705 231.35 547.04 245.63] +/Type /Annot +>> +endobj +224 0 obj +<< /Border [0 0 0] +/Dest (_open_a_listening_port) +/Subtype /Link +/Rect [72.24 212.87 180.4425 227.15] +/Type /Annot +>> +endobj +225 0 obj +<< /Border [0 0 0] +/Dest (_open_a_listening_port) +/Subtype /Link +/Rect [535.301 212.87 547.04 227.15] +/Type /Annot +>> +endobj +226 0 obj +<< /Border [0 0 0] +/Dest (_close_the_listening_port) +/Subtype /Link +/Rect [72.24 194.39 189.9975 208.67] +/Type /Annot +>> +endobj +227 0 obj +<< /Border [0 0 0] +/Dest (_close_the_listening_port) +/Subtype /Link +/Rect [535.301 194.39 547.04 208.67] +/Type /Annot +>> +endobj +228 0 obj +<< /Border [0 0 0] +/Dest (_open_a_client_connection) +/Subtype /Link +/Rect [72.24 175.91 198.744 190.19] +/Type /Annot +>> +endobj +229 0 obj +<< /Border [0 0 0] +/Dest (_open_a_client_connection) +/Subtype /Link +/Rect [535.301 175.91 547.04 190.19] +/Type /Annot +>> +endobj +230 0 obj +<< /Border [0 0 0] +/Dest (_send_message) +/Subtype /Link +/Rect [72.24 157.43 141.582 171.71] +/Type /Annot +>> +endobj +231 0 obj +<< /Border [0 0 0] +/Dest (_send_message) +/Subtype /Link +/Rect [535.301 157.43 547.04 171.71] +/Type /Annot +>> +endobj +232 0 obj +<< /Border [0 0 0] +/Dest (_close_a_client_connection) +/Subtype /Link +/Rect [72.24 138.95 198.2295 153.23] +/Type /Annot +>> +endobj +233 0 obj +<< /Border [0 0 0] +/Dest (_close_a_client_connection) +/Subtype /Link +/Rect [535.301 138.95 547.04 153.23] +/Type /Annot +>> +endobj +234 0 obj +<< /Border [0 0 0] +/Dest (_test_port_parameter_names) +/Subtype /Link +/Rect [72.24 120.47 208.4481 134.75] +/Type /Annot +>> +endobj +235 0 obj +<< /Border [0 0 0] +/Dest (_test_port_parameter_names) +/Subtype /Link +/Rect [535.301 120.47 547.04 134.75] +/Type /Annot +>> +endobj +236 0 obj +<< /Border [0 0 0] +/Dest (_parameter_accessor_functions) +/Subtype /Link +/Rect [72.24 101.99 223.3556 116.27] +/Type /Annot +>> +endobj +237 0 obj +<< /Border [0 0 0] +/Dest (_parameter_accessor_functions) +/Subtype /Link +/Rect [535.301 101.99 547.04 116.27] +/Type /Annot +>> +endobj +238 0 obj +<< /Border [0 0 0] +/Dest (_logging_functions) +/Subtype /Link +/Rect [72.24 83.51 164.0205 97.79] +/Type /Annot +>> +endobj +239 0 obj +<< /Border [0 0 0] +/Dest (_logging_functions) +/Subtype /Link +/Rect [535.301 83.51 547.04 97.79] +/Type /Annot +>> +endobj +240 0 obj +<< /Border [0 0 0] +/Dest (_error_reporting) +/Subtype /Link +/Rect [72.24 65.03 151.7985 79.31] +/Type /Annot +>> +endobj +241 0 obj +<< /Border [0 0 0] +/Dest (_error_reporting) +/Subtype /Link +/Rect [535.301 65.03 547.04 79.31] +/Type /Annot +>> +endobj +242 0 obj +<< /Border [0 0 0] +/Dest (_tips_and_tricks) +/Subtype /Link +/Rect [48.24 791.61 124.491 805.89] +/Type /Annot +>> +endobj +243 0 obj +<< /Border [0 0 0] +/Dest (_tips_and_tricks) +/Subtype /Link +/Rect [535.301 791.61 547.04 805.89] +/Type /Annot +>> +endobj +244 0 obj +<< /Border [0 0 0] +/Dest (_usage) +/Subtype /Link +/Rect [60.24 773.13 89.661 787.41] +/Type /Annot +>> +endobj +245 0 obj +<< /Border [0 0 0] +/Dest (_usage) +/Subtype /Link +/Rect [535.301 773.13 547.04 787.41] +/Type /Annot +>> +endobj +246 0 obj +<< /Border [0 0 0] +/Dest (deriving_the_test_port_class) +/Subtype /Link +/Rect [72.24 754.65 208.7528 768.93] +/Type /Annot +>> +endobj +247 0 obj +<< /Border [0 0 0] +/Dest (deriving_the_test_port_class) +/Subtype /Link +/Rect [535.301 754.65 547.04 768.93] +/Type /Annot +>> +endobj +248 0 obj +<< /Border [0 0 0] +/Dest (implementation_of_the_logger_functions) +/Subtype /Link +/Rect [72.24 736.17 273.7245 750.45] +/Type /Annot +>> +endobj +249 0 obj +<< /Border [0 0 0] +/Dest (implementation_of_the_logger_functions) +/Subtype /Link +/Rect [535.301 736.17 547.04 750.45] +/Type /Annot +>> +endobj +250 0 obj +<< /Border [0 0 0] +/Dest (function_translations) +/Subtype /Link +/Rect [72.24 717.69 181.9543 731.97] +/Type /Annot +>> +endobj +251 0 obj +<< /Border [0 0 0] +/Dest (function_translations) +/Subtype /Link +/Rect [535.301 717.69 547.04 731.97] +/Type /Annot +>> +endobj +252 0 obj +<< /Border [0 0 0] +/Dest (functions_for_manipulating_the_set_of_events_for_which_the_port_waits) +/Subtype /Link +/Rect [72.24 699.21 421.2096 713.49] +/Type /Annot +>> +endobj +253 0 obj +<< /Border [0 0 0] +/Dest (functions_for_manipulating_the_set_of_events_for_which_the_port_waits) +/Subtype /Link +/Rect [535.301 699.21 547.04 713.49] +/Type /Annot +>> +endobj +254 0 obj +<< /Border [0 0 0] +/Dest (final_steps) +/Subtype /Link +/Rect [72.24 680.73 126.609 695.01] +/Type /Annot +>> +endobj +255 0 obj +<< /Border [0 0 0] +/Dest (final_steps) +/Subtype /Link +/Rect [535.301 680.73 547.04 695.01] +/Type /Annot +>> +endobj +256 0 obj +<< /Border [0 0 0] +/Dest (using-ttcn-buffer-in-test-ports) +/Subtype /Link +/Rect [60.24 662.25 90.984 676.53] +/Type /Annot +>> +endobj +257 0 obj +<< /Border [0 0 0] +/Dest (using-ttcn-buffer-in-test-ports) +/Subtype /Link +/Rect [90.984 663.846 148.734 674.346] +/Type /Annot +>> +endobj +258 0 obj +<< /Border [0 0 0] +/Dest (using-ttcn-buffer-in-test-ports) +/Subtype /Link +/Rect [148.734 662.25 212.9543 676.53] +/Type /Annot +>> +endobj +259 0 obj +<< /Border [0 0 0] +/Dest (using-ttcn-buffer-in-test-ports) +/Subtype /Link +/Rect [535.301 662.25 547.04 676.53] +/Type /Annot +>> +endobj +260 0 obj +<< /Border [0 0 0] +/Dest (_using_ssl_on_top_of_a_tcp_connection) +/Subtype /Link +/Rect [60.24 643.77 248.2131 658.05] +/Type /Annot +>> +endobj +261 0 obj +<< /Border [0 0 0] +/Dest (_using_ssl_on_top_of_a_tcp_connection) +/Subtype /Link +/Rect [535.301 643.77 547.04 658.05] +/Type /Annot +>> +endobj +262 0 obj +<< /Border [0 0 0] +/Dest (_server_mode_2) +/Subtype /Link +/Rect [72.24 625.29 135.8175 639.57] +/Type /Annot +>> +endobj +263 0 obj +<< /Border [0 0 0] +/Dest (_server_mode_2) +/Subtype /Link +/Rect [535.301 625.29 547.04 639.57] +/Type /Annot +>> +endobj +264 0 obj +<< /Border [0 0 0] +/Dest (_client_mode_2) +/Subtype /Link +/Rect [72.24 606.81 132.0375 621.09] +/Type /Annot +>> +endobj +265 0 obj +<< /Border [0 0 0] +/Dest (_client_mode_2) +/Subtype /Link +/Rect [535.301 606.81 547.04 621.09] +/Type /Annot +>> +endobj +266 0 obj +<< /Border [0 0 0] +/Dest (_authentication_flow) +/Subtype /Link +/Rect [72.24 588.33 174.0793 602.61] +/Type /Annot +>> +endobj +267 0 obj +<< /Border [0 0 0] +/Dest (_authentication_flow) +/Subtype /Link +/Rect [535.301 588.33 547.04 602.61] +/Type /Annot +>> +endobj +268 0 obj +<< /Border [0 0 0] +/Dest (_adapting_derived_test_ports_to_support_ipv6) +/Subtype /Link +/Rect [60.24 569.85 279.4401 584.13] +/Type /Annot +>> +endobj +269 0 obj +<< /Border [0 0 0] +/Dest (_adapting_derived_test_ports_to_support_ipv6) +/Subtype /Link +/Rect [535.301 569.85 547.04 584.13] +/Type /Annot +>> +endobj +270 0 obj +<< /Border [0 0 0] +/Dest (_error_messages) +/Subtype /Link +/Rect [48.24 551.37 125.226 565.65] +/Type /Annot +>> +endobj +271 0 obj +<< /Border [0 0 0] +/Dest (_error_messages) +/Subtype /Link +/Rect [535.301 551.37 547.04 565.65] +/Type /Annot +>> +endobj +272 0 obj +<< /Border [0 0 0] +/Dest (_error_messages_in_case_tcp_connections_are_used) +/Subtype /Link +/Rect [60.24 532.89 309.5623 547.17] +/Type /Annot +>> +endobj +273 0 obj +<< /Border [0 0 0] +/Dest (_error_messages_in_case_tcp_connections_are_used) +/Subtype /Link +/Rect [535.301 532.89 547.04 547.17] +/Type /Annot +>> +endobj +274 0 obj +<< /Border [0 0 0] +/Dest (_additional_error_messages_in_case_ssl_connections_are_used) +/Subtype /Link +/Rect [60.24 514.41 363.6793 528.69] +/Type /Annot +>> +endobj +275 0 obj +<< /Border [0 0 0] +/Dest (_additional_error_messages_in_case_ssl_connections_are_used) +/Subtype /Link +/Rect [535.301 514.41 547.04 528.69] +/Type /Annot +>> +endobj +276 0 obj +<< /Border [0 0 0] +/Dest (_warning_messages) +/Subtype /Link +/Rect [48.24 495.93 141.6396 510.21] +/Type /Annot +>> +endobj +277 0 obj +<< /Border [0 0 0] +/Dest (_warning_messages) +/Subtype /Link +/Rect [535.301 495.93 547.04 510.21] +/Type /Annot +>> +endobj +278 0 obj +<< /Border [0 0 0] +/Dest (_warning_messages_in_case_tcp_connections_are_used) +/Subtype /Link +/Rect [60.24 477.45 325.9758 491.73] +/Type /Annot +>> +endobj +279 0 obj +<< /Border [0 0 0] +/Dest (_warning_messages_in_case_tcp_connections_are_used) +/Subtype /Link +/Rect [535.301 477.45 547.04 491.73] +/Type /Annot +>> +endobj +280 0 obj +<< /Border [0 0 0] +/Dest (warning_messages_in_case_SSL_connections_are_used) +/Subtype /Link +/Rect [60.24 458.97 324.9261 473.25] +/Type /Annot +>> +endobj +281 0 obj +<< /Border [0 0 0] +/Dest (warning_messages_in_case_SSL_connections_are_used) +/Subtype /Link +/Rect [535.301 458.97 547.04 473.25] +/Type /Annot +>> +endobj +282 0 obj +<< /Border [0 0 0] +/Dest (_terminology) +/Subtype /Link +/Rect [48.24 440.49 111.8933 454.77] +/Type /Annot +>> +endobj +283 0 obj +<< /Border [0 0 0] +/Dest (_terminology) +/Subtype /Link +/Rect [535.301 440.49 547.04 454.77] +/Type /Annot +>> +endobj +284 0 obj +<< /Border [0 0 0] +/Dest (_abbreviations) +/Subtype /Link +/Rect [48.24 422.01 119.0205 436.29] +/Type /Annot +>> +endobj +285 0 obj +<< /Border [0 0 0] +/Dest (_abbreviations) +/Subtype /Link +/Rect [535.301 422.01 547.04 436.29] +/Type /Annot +>> +endobj +286 0 obj +<< /Border [0 0 0] +/Dest (_references) +/Subtype /Link +/Rect [48.24 403.53 103.0815 417.81] +/Type /Annot +>> +endobj +287 0 obj +<< /Border [0 0 0] +/Dest (_references) +/Subtype /Link +/Rect [535.301 403.53 547.04 417.81] +/Type /Annot +>> +endobj +288 0 obj +<< /Type /XObject +/Subtype /Form +/BBox [0 0 595.28 841.89] +/Length 162 +>> +stream +q +/DeviceRGB cs +0.0 0.0 0.0 scn +/DeviceRGB CS +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +q +0.25 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 30.0 m +547.04 30.0 l +S +Q +Q + +endstream +endobj +289 0 obj +<< /Type /XObject +/Subtype /Form +/BBox [0 0 595.28 841.89] +/Length 162 +>> +stream +q +/DeviceRGB cs +0.0 0.0 0.0 scn +/DeviceRGB CS +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +q +0.25 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 30.0 m +547.04 30.0 l +S +Q +Q + +endstream +endobj +290 0 obj +<< /Type /Outlines +/Count 62 +/First 291 0 R +/Last 352 0 R +>> +endobj +291 0 obj +<< /Title +/Parent 290 0 R +/Count 0 +/Next 292 0 R +/Dest [7 0 R /XYZ 0 841.89 null] +>> +endobj +292 0 obj +<< /Title +/Parent 290 0 R +/Count 0 +/Next 293 0 R +/Prev 291 0 R +/Dest [10 0 R /XYZ 0 841.89 null] +>> +endobj +293 0 obj +<< /Title +/Parent 290 0 R +/Count 2 +/First 294 0 R +/Last 295 0 R +/Next 296 0 R +/Prev 292 0 R +/Dest [14 0 R /XYZ 0 841.89 null] +>> +endobj +294 0 obj +<< /Title +/Parent 293 0 R +/Count 0 +/Next 295 0 R +/Dest [14 0 R /XYZ 0 765.17 null] +>> +endobj +295 0 obj +<< /Title +/Parent 293 0 R +/Count 0 +/Prev 294 0 R +/Dest [14 0 R /XYZ 0 681.53 null] +>> +endobj +296 0 obj +<< /Title +/Parent 290 0 R +/Count 17 +/First 297 0 R +/Last 309 0 R +/Next 314 0 R +/Prev 293 0 R +/Dest [14 0 R /XYZ 0 613.67 null] +>> +endobj +297 0 obj +<< /Title +/Parent 296 0 R +/Count 0 +/Next 298 0 R +/Dest [14 0 R /XYZ 0 561.35 null] +>> +endobj +298 0 obj +<< /Title +/Parent 296 0 R +/Count 1 +/First 299 0 R +/Last 299 0 R +/Next 300 0 R +/Prev 297 0 R +/Dest [14 0 R /XYZ 0 359.15 null] +>> +endobj +299 0 obj +<< /Title +/Parent 298 0 R +/Count 0 +/Dest [14 0 R /XYZ 0 254.29 null] +>> +endobj +300 0 obj +<< /Title +/Parent 296 0 R +/Count 3 +/First 301 0 R +/Last 303 0 R +/Next 304 0 R +/Prev 298 0 R +/Dest [14 0 R /XYZ 0 136.87 null] +>> +endobj +301 0 obj +<< /Title +/Parent 300 0 R +/Count 0 +/Next 302 0 R +/Dest [32 0 R /XYZ 0 841.89 null] +>> +endobj +302 0 obj +<< /Title +/Parent 300 0 R +/Count 0 +/Next 303 0 R +/Prev 301 0 R +/Dest [32 0 R /XYZ 0 727.05 null] +>> +endobj +303 0 obj +<< /Title +/Parent 300 0 R +/Count 0 +/Prev 302 0 R +/Dest [32 0 R /XYZ 0 627.63 null] +>> +endobj +304 0 obj +<< /Title +/Parent 296 0 R +/Count 0 +/Next 305 0 R +/Prev 300 0 R +/Dest [32 0 R /XYZ 0 484.65 null] +>> +endobj +305 0 obj +<< /Title +/Parent 296 0 R +/Count 0 +/Next 306 0 R +/Prev 304 0 R +/Dest [32 0 R /XYZ 0 364.01 null] +>> +endobj +306 0 obj +<< /Title +/Parent 296 0 R +/Count 0 +/Next 307 0 R +/Prev 305 0 R +/Dest [32 0 R /XYZ 0 211.81 null] +>> +endobj +307 0 obj +<< /Title +/Parent 296 0 R +/Count 0 +/Next 308 0 R +/Prev 306 0 R +/Dest [40 0 R /XYZ 0 841.89 null] +>> +endobj +308 0 obj +<< /Title +/Parent 296 0 R +/Count 0 +/Next 309 0 R +/Prev 307 0 R +/Dest [40 0 R /XYZ 0 721.61 null] +>> +endobj +309 0 obj +<< /Title +/Parent 296 0 R +/Count 4 +/First 310 0 R +/Last 313 0 R +/Prev 308 0 R +/Dest [40 0 R /XYZ 0 616.75 null] +>> +endobj +310 0 obj +<< /Title +/Parent 309 0 R +/Count 0 +/Next 311 0 R +/Dest [40 0 R /XYZ 0 484.11 null] +>> +endobj +311 0 obj +<< /Title +/Parent 309 0 R +/Count 0 +/Next 312 0 R +/Prev 310 0 R +/Dest [40 0 R /XYZ 0 309.57 null] +>> +endobj +312 0 obj +<< /Title +/Parent 309 0 R +/Count 0 +/Next 313 0 R +/Prev 311 0 R +/Dest [47 0 R /XYZ 0 644.4 null] +>> +endobj +313 0 obj +<< /Title +/Parent 309 0 R +/Count 0 +/Prev 312 0 R +/Dest [47 0 R /XYZ 0 505.2 null] +>> +endobj +314 0 obj +<< /Title +/Parent 290 0 R +/Count 16 +/First 315 0 R +/Last 319 0 R +/Next 331 0 R +/Prev 296 0 R +/Dest [47 0 R /XYZ 0 399.78 null] +>> +endobj +315 0 obj +<< /Title +/Parent 314 0 R +/Count 0 +/Next 316 0 R +/Dest [47 0 R /XYZ 0 347.46 null] +>> +endobj +316 0 obj +<< /Title +/Parent 314 0 R +/Count 0 +/Next 317 0 R +/Prev 315 0 R +/Dest [56 0 R /XYZ 0 609.39 null] +>> +endobj +317 0 obj +<< /Title +/Parent 314 0 R +/Count 1 +/First 318 0 R +/Last 318 0 R +/Next 319 0 R +/Prev 316 0 R +/Dest [56 0 R /XYZ 0 286.95 null] +>> +endobj +318 0 obj +<< /Title +/Parent 317 0 R +/Count 0 +/Dest [64 0 R /XYZ 0 841.89 null] +>> +endobj +319 0 obj +<< /Title +/Parent 314 0 R +/Count 11 +/First 320 0 R +/Last 330 0 R +/Prev 317 0 R +/Dest [73 0 R /XYZ 0 352.38 null] +>> +endobj +320 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 321 0 R +/Dest [73 0 R /XYZ 0 279.08 null] +>> +endobj +321 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 322 0 R +/Prev 320 0 R +/Dest [73 0 R /XYZ 0 133.0 null] +>> +endobj +322 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 323 0 R +/Prev 321 0 R +/Dest [78 0 R /XYZ 0 762.33 null] +>> +endobj +323 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 324 0 R +/Prev 322 0 R +/Dest [81 0 R /XYZ 0 763.08 null] +>> +endobj +324 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 325 0 R +/Prev 323 0 R +/Dest [81 0 R /XYZ 0 671.22 null] +>> +endobj +325 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 326 0 R +/Prev 324 0 R +/Dest [81 0 R /XYZ 0 227.04 null] +>> +endobj +326 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 327 0 R +/Prev 325 0 R +/Dest [87 0 R /XYZ 0 373.99 null] +>> +endobj +327 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 328 0 R +/Prev 326 0 R +/Dest [87 0 R /XYZ 0 226.87 null] +>> +endobj +328 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 329 0 R +/Prev 327 0 R +/Dest [92 0 R /XYZ 0 477.09 null] +>> +endobj +329 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Next 330 0 R +/Prev 328 0 R +/Dest [95 0 R /XYZ 0 841.89 null] +>> +endobj +330 0 obj +<< /Title +/Parent 319 0 R +/Count 0 +/Prev 329 0 R +/Dest [95 0 R /XYZ 0 649.87 null] +>> +endobj +331 0 obj +<< /Title +/Parent 290 0 R +/Count 12 +/First 332 0 R +/Last 343 0 R +/Next 344 0 R +/Prev 314 0 R +/Dest [95 0 R /XYZ 0 471.19 null] +>> +endobj +332 0 obj +<< /Title +/Parent 331 0 R +/Count 5 +/First 333 0 R +/Last 337 0 R +/Next 338 0 R +/Dest [95 0 R /XYZ 0 418.87 null] +>> +endobj +333 0 obj +<< /Title +/Parent 332 0 R +/Count 0 +/Next 334 0 R +/Dest [95 0 R /XYZ 0 187.11 null] +>> +endobj +334 0 obj +<< /Title +/Parent 332 0 R +/Count 0 +/Next 335 0 R +/Prev 333 0 R +/Dest [109 0 R /XYZ 0 671.16 null] +>> +endobj +335 0 obj +<< /Title +/Parent 332 0 R +/Count 0 +/Next 336 0 R +/Prev 334 0 R +/Dest [109 0 R /XYZ 0 414.78 null] +>> +endobj +336 0 obj +<< /Title +/Parent 332 0 R +/Count 0 +/Next 337 0 R +/Prev 335 0 R +/Dest [113 0 R /XYZ 0 254.11 null] +>> +endobj +337 0 obj +<< /Title +/Parent 332 0 R +/Count 0 +/Prev 336 0 R +/Dest [117 0 R /XYZ 0 541.37 null] +>> +endobj +338 0 obj +<< /Title +/Parent 331 0 R +/Count 0 +/Next 339 0 R +/Prev 332 0 R +/Dest [117 0 R /XYZ 0 457.73 null] +>> +endobj +339 0 obj +<< /Title +/Parent 331 0 R +/Count 3 +/First 340 0 R +/Last 342 0 R +/Next 343 0 R +/Prev 338 0 R +/Dest [117 0 R /XYZ 0 162.85 null] +>> +endobj +340 0 obj +<< /Title +/Parent 339 0 R +/Count 0 +/Next 341 0 R +/Dest [123 0 R /XYZ 0 841.89 null] +>> +endobj +341 0 obj +<< /Title +/Parent 339 0 R +/Count 0 +/Next 342 0 R +/Prev 340 0 R +/Dest [123 0 R /XYZ 0 494.13 null] +>> +endobj +342 0 obj +<< /Title +/Parent 339 0 R +/Count 0 +/Prev 341 0 R +/Dest [123 0 R /XYZ 0 315.81 null] +>> +endobj +343 0 obj +<< /Title +/Parent 331 0 R +/Count 0 +/Prev 339 0 R +/Dest [129 0 R /XYZ 0 841.89 null] +>> +endobj +344 0 obj +<< /Title +/Parent 290 0 R +/Count 2 +/First 345 0 R +/Last 346 0 R +/Next 347 0 R +/Prev 331 0 R +/Dest [132 0 R /XYZ 0 841.89 null] +>> +endobj +345 0 obj +<< /Title +/Parent 344 0 R +/Count 0 +/Next 346 0 R +/Dest [132 0 R /XYZ 0 758.37 null] +>> +endobj +346 0 obj +<< /Title +/Parent 344 0 R +/Count 0 +/Prev 345 0 R +/Dest [139 0 R /XYZ 0 273.06 null] +>> +endobj +347 0 obj +<< /Title +/Parent 290 0 R +/Count 2 +/First 348 0 R +/Last 349 0 R +/Next 350 0 R +/Prev 344 0 R +/Dest [144 0 R /XYZ 0 754.11 null] +>> +endobj +348 0 obj +<< /Title +/Parent 347 0 R +/Count 0 +/Next 349 0 R +/Dest [144 0 R /XYZ 0 701.79 null] +>> +endobj +349 0 obj +<< /Title +/Parent 347 0 R +/Count 0 +/Prev 348 0 R +/Dest [150 0 R /XYZ 0 687.96 null] +>> +endobj +350 0 obj +<< /Title +/Parent 290 0 R +/Count 0 +/Next 351 0 R +/Prev 347 0 R +/Dest [153 0 R /XYZ 0 778.86 null] +>> +endobj +351 0 obj +<< /Title +/Parent 290 0 R +/Count 0 +/Next 352 0 R +/Prev 350 0 R +/Dest [153 0 R /XYZ 0 438.06 null] +>> +endobj +352 0 obj +<< /Title +/Parent 290 0 R +/Count 0 +/Prev 351 0 R +/Dest [158 0 R /XYZ 0 619.65 null] +>> +endobj +353 0 obj +<< /Nums [0 << /P (i) +>> 1 << /P (ii) +>> 2 << /P (iii) +>> 3 << /P (1) +>> 4 << /P (2) +>> 5 << /P (3) +>> 6 << /P (4) +>> 7 << /P (5) +>> 8 << /P (6) +>> 9 << /P (7) +>> 10 << /P (8) +>> 11 << /P (9) +>> 12 << /P (10) +>> 13 << /P (11) +>> 14 << /P (12) +>> 15 << /P (13) +>> 16 << /P (14) +>> 17 << /P (15) +>> 18 << /P (16) +>> 19 << /P (17) +>> 20 << /P (18) +>> 21 << /P (19) +>> 22 << /P (20) +>> 23 << /P (21) +>> 24 << /P (22) +>> 25 << /P (23) +>> 26 << /P (24) +>> 27 << /P (25) +>> 28 << /P (26) +>> 29 << /P (27) +>> 30 << /P (28) +>>] +>> +endobj +354 0 obj +<< /Length1 13108 +/Length 8295 +/Filter [/FlateDecode] +>> +stream +xz X[es @Y !@I/e+[ZJ)K(-Z;VUgԪvlvqUǿόuq׿;˭gz>-9{sF qD"&tf Ń%fBwG{~)L=Ʀw '=5CCwJ'wM< +c4Y_N_wO$#_n"B|'kʂ1r(E#9!.!Ċ,OP(Tj ɆdL5g- +2̲g;"!ץ6 +]Xvq^1+9O]Pdx<mQ{2rðf-O-1`mVfe@:\^ }RU}%Kl()GzGGs:FST|hۑ{ Y(2eŮu'Ț}c3JB$k+ޱ, F6gd4NV8jb'#Mzʨ}g&kM.(V{vѱ|!q~ hodsЙc&]naFKe6t dơTp$[8)#GG&x*du=1qrxIy;6k%UENa,O Зe$q豞їUnye:0ȰtZM}_ F?9Pku1X/0>0xQω%QM k3\&HZȵvJ.˜ҌQZ^l&p{.kdI^O1k>2Li, 3nAXmZo?/¶W[Qn[yb +kc x]jKɍ%'ksg5mN^.6Qk{Ej,$y6sЭEVoƪ&8!KEJksζF;Npw2mDoTIb\hrܛTh~NU~[;leQ=tl(p@uizKxYlmVXiRrWּF]\pj@n>;lANNhByE)Ggule>zB6@Wer#E`2TO%W+!un=@]'W<3O+İd63C[b.l*24b҂BGjAI2tj ~UT.C\d78Dd/+Bi 0Ӗ]5:զ]o?ؾRm*ˆb~Tֽ o]dc0٥_S1XG]ʀd{UuW  +e9+E }PKJ[QJBnG3wwTO(Dqх'/~y[m: R[WuϏd{@66CQ,}k%ȍ#2,/ڵb30q:n0L%w{O +M'>yg }-_BjYq('2-,(8s +ǢdlP" }_ V/"e&i>ܿQ2nˬ, +XWdҥ,SvAR~l]̾,/K&_tyt r%0t&7Ժӵ^NtH}~09*{Yj"o<܁tSߗwuT}OON>ݛ/'k7GF.??-s_lYA(/˅\M~uaZ;='1ƶldݡ:N﫥X$[LS8llsJPllǁ"nRϣ?}U12Yu/C7}<|ngŷ]S`/='&>wgkuIf(glqLF .v+&tL\a ںʈM("!ic24kǫD`&eJ֏`ǁ#$ۣAWH}@yxHwn۷#عI!xmO]mL9i ;S2YKTX. SWab.T0&az= Ql?R+QWV&-aCu4|UB7q("rX}(7fA d Sr-S}čQ0J2 c/|.pݨ2'bOD t xQIyszq~ՊĮ(Jy7 ߱U?% rs`ni(+uH,$؂WC-()52-IfF{9B?DcE\:>Z~բ$ҹzB@ +$ ?'r by4sg3}8UgɆX}sO.GEEJJ26ƅyWkU3C' z"\: }@Ҧ*&Q/%D=%PjBw>gLMWЧ!7lwL(Tq|tR^}`i>$̀,}>LQ]oGR$hmzަ >]},n_гk-8>ɩdψ!yabCK[,$ߠ?!rE@o!rR^gn|nˊ$66(e$&Du!!94. I ۆKY ި_ 8 / [)[f*_7[z*TeBqFɯ(,bEVcSԪE \J_I>}Gnq$-eT`Dnijc'G i9?m☽CpHl_{ +;;b%m~vۃiF˷]~ԇ$dovT|Es *5Q__"+l +=h堂;8*~6/w%tE^dz~5PI*+jV*,K.+#Z|v#(@^ij#. +r3:.Ov k*2lgM'"{[ .%a 2_\x웋s;lw2S"?MH~ eVӲ[` n<٥Wm/Q%=hu1ÝGL"N|;SILOQ-Yb\Xi)Q ECβVZ + JWNMIgXkR0HgBwfgRh))ҤzV&AXΪk {/ivYFZXQfMu?7Tz2cbR:Yx">nfQgyzCAΖެ Is_JgLEˢgZku90& ^"OP8ŭ:o/LP94qAC큞HI|tQ'J2ތ7h NG/I!Vy%s03 Pk}ϵA¹& ?ؚ+ム󝖃oV!M(TIXO 񓒡Jeg`mv\kCɺbr=+ bMZB|Z"Q'ilj#tN&TQQ*[2U nSaX#ڴ1.[͂Xfb/YoY 6A:ly{Adn/* sy9,r qڦ/=]kiL;~bxi"MKqą#Lu$8ސQ|}A{fu5r,U`9ҫo\* {pĺ lS]s^YEJv-#+luw,!ە݅-Nyذ#'>̔r7 Tؙm< &W ]'3 -KM̆mV9O1W-/k@v `~4f7c?Smٹ_c>Ib"G|aH0e/?#3}[TT26#&:-_7Q?fhcp}}K+΍hvgU͋3Ku=@ +~'W1w(Uz͝Y wAdMRZA yKSVEK&BZvW{ɇu X郎HBnU0==@ +? xyZ 4jFU(A^lv^NIniVCL" YٱQl1ѓ !.E)nDzYR& *uиv $Aїҥ4U)*\<&OZ[j͍bˠJ\ư2ojcĩ1).{,oܐ\\0 +ʸtĐMXma$n' rr&/H}!Wgh,Jӳ͋(=nG!4{Cqy!$}!pn0uQLJL JA#H>GJr8YqsfsƋU+]#ވ"~!H|GI$?2%2;.r!Fm"ua^1Q1w2;KX]tT{q>RɄN1Nk'|đK !.G11pK04̢N81N8pcpt1׈*G|?Sܨpށ"Wᶢ: ~48ۇJp.vd⼆ԜH̩DtK*G y֗q #U)2!+1p/ })y\ R3ETJC;Xg'DP':>ğP#75it ]UMտ&v bk:c? W(|gh@D$8APmY!u cؼ"}+h G*7Bi'6Xp G(yc?@mQR'%!v-X #Ji(v7oQx9 \}nyc1* j +CQ Euh3G P4-ZP+jCuh^Fy36[lQYE)bQp'CVxh@<|h@B'amoIahB,SHy<pihbWORhhdwy>J@RbWJ%Cмu +G"|$'蕷Ud^h> +哭hd! GNǡy!JTy!j*KÃCӚ,[f"lhFG5̥)McT}Pm,u !4 f2 (<hhG`.(jG__~jùh}Rh'XpWjbF3IA4h60cAYF(fu<6Spl뛑'L-[33\K ; "Ɇo3h8,AƯ'G4pɇfc8AH&˿FɅ%qtlKY 2:g!R_33>4<> ߧլ #[ +Mk2C,AciPlo#0CyVko2ȊNXHʚ4< + T,@cUv~ O1ҍ5DyΝвXS3}Áuw*)`C5ýS IPh Е ͲfYl[J?Н +IckX??}&fpcak,AhŔfSIY]SAza\-@ydjs0ude,w <-&H>~scwg(+~mC @ +endstream +endobj +355 0 obj +<< /Type /FontDescriptor +/FontName /3a0e86+NotoSerif +/FontFile2 354 0 R +/FontBBox [-212 -250 1246 1047] +/Flags 6 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 1068 +/Descent -292 +/CapHeight 1462 +/XHeight 1098 +>> +endobj +356 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +357 0 obj +[259 1000 408 1000 1000 1000 1000 220 346 346 1000 1000 250 310 250 288 559 559 559 559 559 559 559 559 559 559 286 286 559 1000 559 1000 1000 705 653 613 727 623 589 713 792 367 1000 700 623 937 763 742 604 1000 655 543 612 716 674 1046 660 625 1000 359 1000 359 1000 458 577 562 613 492 613 535 369 538 634 319 299 584 310 944 645 577 613 613 471 451 352 634 579 861 578 564 511 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 562 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 361 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 259 1000 1000 1000 1000 1000 500 1000 1000 1000 1000 250 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +358 0 obj +<< /Length1 9744 +/Length 6315 +/Filter [/FlateDecode] +>> +stream +xZ{xוwf$˲-[dz˲%[dCOF0–X$a yѐPB Ih6MnM6ل|ۥ_Zگeaόd=ss9w#Ȏ8h?c y!,lx~x!H?솧fNAh=< [GR.s5ih۟< 폠7Tq~P^)WA7 ~l!=F ^Rᒋ/l1&ed~Jj (S,ARYV6|FS5ZsjoNe%NB_?>~-\1sOfO^#J + X +)VNG\[ 3._!%! $%ɜF9vV_ԱfԾq=۫W]ZL>?}isk yKXe7U9ub5wVOu/ V;S+K)꺻{ C̜#vp^AYH Ӑ2,Q`}X]B2 - +KF>h}ψZ{F\aMx7-[ȟ̶l\~_VתLBT: +r Ɗ&Q)H ˒}塺Ux;NLn߯?4ʽkʒ +- k}5~v@!MF }/bdž6 rko}0G++{ؓq3DLdDȽp.i[*U4 +|i{o0m +Ph ;o +]LJIŦqc5V7@ VV"e[7FLz.%3Fi:l[`\RΓ(mb__sgߊ&LΜ7+k"-Mz`ٲ^o6v'n\pl8n06nK&fzjO_^} +'ҴW]W!- V +ڣ-]Iuڊ#obǰ1}Jʮp;OO70ex; ɑaRZbTɀK!#!e\4H}O;vfj8۱8ɑU/O`=V^_L%z5NrLъjZ0Px8z[Pj1ȂoW×iYGGoO s#PS6NfLt9p/MiV?cf\aN9q\-3c*Ƨ|sg7!FM42;Wz{\ t 4?ר&nF{b$Au#$d nYiWkdkzugV_͋?,`Cy[qLA\q h~l%r 249< \QFEj04/Wԫ፵l\Ui7fW0 +&x{'@RZOQD#߰AnΧ=kP +JT|}+tiܨ.Ƈ#ԷSq~>d2,/2]?fA6 O]kHƋ BTtNUb,եԂ. ˲詴b,+ՒىZAV $ g$8-o}Wz+5<GYbz(&^~y71jAdӂd)s/_  sN2tm]׷Cx`]߶.qyoF J^xKwg.sg3yE6v5L@^_{/[&RK@3g`g`Ѽ&OQz^o9}] )8L tlj5c,v`Irc5EI<< ¸-` NU^TT˫1Ԥqbn';/['* S7eFz~艫Hm^ܷ}Pc5B}=j +ЅYOF܇lƪNKA㐯ZSmg"GG2S[tȁuGw :J,v[q{_W6rwS/uVEijnnh(0,v1`s~X)ҌI?kY=Z+j#4VX^TX܃wSh\z1K ~~t@#um"s.t3lk۶}r& tk6,0 u]ڟ 9OMZkg򴍓-&Y!&R*Hw&oIdU +KeLW9H"KI\RҪЯ}N/d֢T/*|i)R%Ps|uB8UF" + o~ꢪ ؝ªh\6*'7 ?nD\_%Fd9/xθ'>XZ^XTW%vL=2QWZ]ã74J]>Γ;qQw>*?%.nuY!wl&_~f~NN8ga_gbEMZebn7ߙjoI I3=fAniB^X8$E +O<9)_],w«WG?]$QFi K}D4Xl5;csІQ}׾W+e"fODīo?YP[imm:6jQʒzyGŧMw۪LU/1peCUV-ȜX>< GϱSLYF kEa +K&q _{X\s6X$+gmJ~pA-f6\8$FeDS΋\94 gTpC~fb5Τ,e}0}-_6NU="%"}q G[ +ZgӚݶGw}V3rc3 E{1-q-8nFi}啢#2fd|,/皝>6j^Kfrj+70k8Q DƄ7 RZonea4\NTߨk$@&jOA4']hLEOh4y4$~'9^oYVaUh*4٭7|Oy%W>0Mv]jU4E saL$\%Ҩm3 @{߮ūxKl O`o"F*vmEp8E#sШܞzC]o8jwnaa 5\B D[ÝIiB4+Dy-+w +5Z.qzhx唟d.eRJR~ZV'[v6NTKIa&Tzm=7^mx\ZX57yX +FCN$ҕ^cn=Ϯ dx@Io` W7c%.Ycmt$tg-C$ $ XQ_yc r%j9 jc>V,ܡ5 -qeAw[VʾJ‘}2e +2-%m=o-K'|U&Ey k}Få= `t5Dy`m;7V\~$߉^%@|;Jg(d 5H_m~cGNǼͯhɜeeN){pH }mj,_cH!~EimFTĹx&xD}d)Cܮ'f)Grn V +:Zux˯kvjV5,jw#1w>v +o84dpbp2*N .W{%xW̘+(DY;&:,ner*[;\PY y-;Sǰd7/[e +Q(+g?}?`0?4fgQd#]Nk1iR* R3GSbdVuvC{Ndl*u͞k WSx̀W̩GJ}-I +hN [iHTWxK< K_KmW{F5;]sv):PK525M3,WrW߱~=Jו[,|Jtp_I6/,x&}+G-NyR4O.sbkJjp|'ISUdJѩ!6iz>G$J'w,2yWV4{ ;LX^jU]HU@qVh7!p0_3E:7l)ݰvIliRS+B2op[\S݊ +_ +/HyhAnuY^.,GZcu\79*GZ.з4V˝f.= ]|a@ +$_LƑЅPm u$fPeZZ[ʺac5T&_Fԗ +"^.ND@@n`+RG5FZy>l,o[;5W#lYts8ܫ3fi>"GlF P|+# &r8qVsp%%M=!ܓTRS))oHUt %pw#YKp!O kMp ;N"s!5o )BZʍKC}d52R "-qi99? d&wׄ!;#} J n\=w!fnO- ?V@'Pzq'Mqʈ9ȁ3>W DCDܨDwހLuuH8n[3ì9@h wYb1HHQ.!=2*B$b$;@sCET գԈP3jA ں +D+Q7ZVVS.^s6V+ -FGr] 9(~RBN" aBN 9qnBN!%.L9 oL9 _sߑNB+' }&%d$&dO&|d# 9O%)HI\KSP9u?dWB +Ʉ< Y y! PU P&6irdhxZ9TuP$j뷪"UskJ +On XQ q M44#ah6C(j@cA-*0SSl+ 0 kKl: O [ĠW zu=F`u,2_ FXMoؐʢzlqv3Vğ17P$ +endstream +endobj +359 0 obj +<< /Type /FontDescriptor +/FontName /ace878+NotoSerif-Bold +/FontFile2 358 0 R +/FontBBox [-212 -250 1306 1058] +/Flags 6 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 1068 +/Descent -292 +/CapHeight 1462 +/XHeight 1098 +>> +endobj +360 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +361 0 obj +[259 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 310 1000 288 1000 1000 1000 559 559 1000 559 1000 1000 1000 304 1000 1000 1000 1000 1000 1000 752 671 667 767 652 621 1000 818 400 1000 733 653 952 788 787 638 1000 707 585 652 747 1000 1066 1000 1000 1000 1000 1000 1000 1000 1000 1000 599 648 526 648 570 407 560 666 352 1000 636 352 985 666 612 645 647 522 487 404 666 605 855 1000 579 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +362 0 obj +<< /Length1 7188 +/Length 4926 +/Filter [/FlateDecode] +>> +stream +xY tU~U !ImYH('@TT*TR @H,f3 DdTHt+2(b gCӎ=AFmt9}H}Lϙy{{ ZP:6IF"{))hBH;޶?Iwf_WBI1tuu6R侶A܍ZںLoq|j [A(&!Q< '>x;[:CMWA;NfAHG-C(QP0X#"BH$R$[0ߜSAǛ8\K.dzxTZ%RQUbr'?3(ÁW,$ Y|GVqJ)7_+0ǽ$pq<2"x?{ft;GG]yz>FSEb|w_G݀]>(kh\qN].Fx ρ_DMQImCQz+4?ds^؆-GQrrx$kH?79EѬ-IG+Lh}$z`j; +Ç->SPF@f@Rr'F=^_iezbb[ c$Tc 5p/)Q"R̤ftBⳅ% y +9 x^j|2='KT?8qΑ*.!5rS8qА=eTкM+\166 +6[UZ5AnΏ9\xxt:gz_CT\^ V?Ǿ]$EN/Q\ k).LJY-$5q{=Y7pt gayߓɩ>l<>>p;Zp]pq&JŖa +hw]d4@1ɹ;EOP~@(P3_ w" '4gg{A,Xӄwa|;QVrGkN nu7句Ŏ_LyQ@>)|VR=c.iGZ%j|UU9*ͪEtŚʑlky& y]ȿ̗Ѷw=%93woѐ+T&ӱj=aN'>G<*)Ya~\׋:;y tq N)&XT`X3SYۖ+k]יu ]ئ5lEsNN +(Nyg74L|\\Zt} 67$Zm\pĶMRp\<Ÿ5b"L=c CI՞ŋ4[_Őp2&P4xNXJ"R}K6wm0fS\ş:;Q*4FI&i3s4PH4wr>'j}*gb窼8%HnNkA/8R#c75vwtm|7N{O{I!~*|GS̤rKUEwnb5YV+\Ex4O|$ϝ6 +qoPV^5^Fm` +þT Oܙd9IK Cܝ6>@`g?SlLI]*׿gOSiس';읋:#}X'ئBm"3lmUW~&S̢qshFq]J ۷٣a/v=q88΍#pл }aW +;ܘf%7tbL/69ti8J +&ֲ)W^~k̪/((AoF ^w1A g #澈@DnG1t]Eo=;W,~OD줊!1rED"GQ_t\tQ4-^.n/EV ӄU Mv]"HvɤdZkKJOJ?ޒIdOCCtv5WA@ 2(SBu(YPAB)$ M90FPV M\P{{((& #u<]䘄ysa\%0db$>Y䋗;D (0w2Nހ.P6&$$qهgyw0kD`D:(Jj1K$Zޚ G( -CcDY(Y!cQ.ʃ3hBŨX P _| *@`fԂAh ,N]3%qb1V=~q {sL'(mEh9Eȏ~+Q$( ahah1v [v8a&0$0"U-s8#) 4& Ik_5eeh뫭,-  nԉxP@?Ԃ`w-xJN1~*~_GhouQ0jr:;,m_iad5TK5GWN PH |) dqn?qhfgdY쀰 pٜd6e97;: 箑Lnظ<1<0:ޱn=g<П + Q` ]3dro==[=> oX J> +endobj +364 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +365 0 obj +[500 1000 500 500 1000 1000 500 1000 500 500 500 1000 500 500 500 500 500 500 500 500 1000 500 1000 1000 1000 500 500 500 500 500 500 1000 1000 500 500 500 500 500 500 1000 500 500 1000 500 500 500 500 500 500 1000 500 500 500 500 1000 500 500 500 1000 500 1000 500 1000 500 500 500 500 500 500 500 500 500 500 500 1000 500 500 500 500 500 500 1000 500 500 500 500 500 500 500 500 500 500 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +366 0 obj +<< /Length1 4412 +/Length 2871 +/Filter [/FlateDecode] +>> +stream +xV{XTespQ.3$aRd' G"< 3fX3Tb7}t7bhjم'+J"\4Kk)}ϙ<=3Ϲ|~;/tPF3"=DR?|@9A]ڈk&;݁nBEݣ8Vz! -)3f\|g SpT4)7ù?)HW'Q_#J?KNKwf*BnjH,Zb?sd P$y)#F|pv[a|E:j anS)c3Jg5eL&#H֑mwңeth׵?,cV|'Q靌.+26%ȩ#9"mzsl6ȇ_, $`CiA'#ULSU!:> 'jӃZ{@__q$/P>͸Z[dHgƖ5bwR#Jm,BvZpY+DE e܊p3F-'2bczs2K 1ZF~y恎ǟj#cv~ǯz/Nzݲ[Gw|۲rV1+rSZ$JOHJI-HJA'-fꯚG"6B tv~o\,aM0{7'Ow/sm$[öJf(SmA*IHcM.CzKRKFі뙙Tq  wwWk/ +Ϭ@Gj培@ݔ)&}i}?NZz@9 X1Zt'XcTϡԺ`Hb}oYSݗvdߘdu[n?I_@tuD!E^—m{-JC +ZyRY(K*pY@/M$ ڧcӬb7@;e3cLeֆ7JO]qG!kõ5ugk+{/s)ѽ&3"3#t{NHݜL7ڸ̽;fl约b+1v`~M)j:sȴ`b#SDK|)Ƅj߿YO/ &- 'D{2UƙOuO[[`W1#EYTg+$j.1'ٷsԄߔ3b ՆjE7)P8ft.S^ Ym=ɪS%EMIBRQ{ޡ&4+%k]uʯJNze={Hra]=vաXil"N,7$)KScJ-O +ht=gGD>wS"=\T,>ʧIG95-ZV·o?;cM/m}ohYb޺oymo:y]Mҿ"ObfhL*Jt7ov#-ozl{qk$r3k-v &,:zz z9@`Q<5ԮZ3tg(y*6PA +j֣U TR<1!fο0Q]l~Bw`o7xa;ԉqJ ~}N#>׶K4$g@]]I>POS@+(FRql7!7Iܜ_RÄ!T O_b_a_!ΣC?U:Z{I^p@.AB +ŰJзIA 쑠GD3A V@ 82N7eF'dh2IH"2HR% +H d\ q>]5*!e<b(d*^CAKx(L.a`xTS/x8$23)W:)c_/c@PEx3˳yo S3|ohtjldK)?[;|u>pA8!!PN; 8#`,DYze_9@x>eӀU<*V05\`{@us .O^`#AЀ βɓV^K_bs.N5f'̏SF,̀3[38O[RE1Irl9ܜo׏=\[9(C:$S} 1^o‘{9{9R H*:˝8ty_2ma֍MfqJscų(S72@i4:Arλ^#* L<{h8/O y/^96FyŊlD4׹WH\Un?b(SewxfO6!La1Ð',f&ryҫX',=S>3Ta#'i`} Ơ~cqav4QFH5 }j ~D1+/W.p$l3a553C#|9xAS!=iM +endstream +endobj +367 0 obj +<< /Type /FontDescriptor +/FontName /91a4c8+NotoSerif-Italic +/FontFile2 366 0 R +/FontBBox [-254 -250 1238 1047] +/Flags 70 +/StemV 0 +/ItalicAngle -12.0 +/Ascent 1068 +/Descent -292 +/CapHeight 1462 +/XHeight 1098 +>> +endobj +368 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +369 0 obj +[1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 250 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 705 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 937 1000 1000 1000 1000 1000 543 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 458 1000 579 562 486 1000 493 317 556 599 304 1000 568 304 1000 1000 574 1000 1000 467 463 368 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +370 0 obj +<< /Length1 4388 +/Length 3021 +/Filter [/FlateDecode] +>> +stream +xkP\;/ ra ' ky@<XX4u Cq! dt?[LH"7<6so]JB֔h8 +&C+ ; [7qϷuJ$$)]3\6w.ԿoBTxv ?y qKJvţ_"YCYH +IMSFC||Ԓu+lؘb_t_~  G_;'p`X\ H0Z +GiiЍC&L#/&JQTmKO1(P6# *?yRwͬF.͝dz4r <)=JpC ά4n +_0d^2/*ĐTBT3uNp`i==6$NI{8+߲>41pm:mL\N/h p$jBj<5MUFzVm}`/m(Wĸ#(9'U"tMald%q(qTЌ&UPtvoؔ)4UыE Xf_z"R8:nG]DXm/YcLN56=#Nۜ}=6֖yvnlcD@[u{t]- ]0WQ=_؉>g\%b5BzUWٍQz}x19Uh3hEIfu #8B۽섧n%lvzq$ʸδAeE>!I5tVP:gB:3Iy\ṮNp)G8Wk Hiv09齹9zݴ4g2vi m,f<tz; O)* +q#j+E'B-"rLmT(!xY'+F͔n)={C/X+Ӓe8RXG5LFZrc -8V` !Q~ +/>hey>&Ӑ(OB BL4WWp!(ͮtn֔;o.@a}ҍ#7ޯsJg{G{H,%͗ZQ n j/o lkmikJ[=EβFg{nPsKO=_s8,*F3U)),Qui4*m:j wKuh {룆? 5!&9FrΡtniעuJ# 8-^> Y~ n82o4"$5B+W nu6+# JoCP5QlX^Z+`! [[< 7z7w]HJT8ˬc|6ݫć4M]2 gU%6[YSe>k)zQzBms99qڧuuՏWS!C`hp+Թu bڄ?pӪփ:N!]6@mwjmmzWm[v4tSΔ05&OM#o Z]u޲:&zw^cwuchӣ1 u˗Jq}rjZsRU){]J 3֎cJGjkj]&(#pwucflO8#cr7rK!m8NpLCR4!&&RQ!# KD5cl5!kF1d=F/cH:GI+6$X?5<_ۊK<Ʀ#U+1%mdu1Fm#',R124'M(-&މPYr^Gq,6 3LqcZ--<)_Eւʩ siѲb}TOԠ2a^Whjzxb/;K1!=2aIJe>4 b33EE22N['fCaȤl OYT`QܝFӸE~p}+Az9Ðr=rKO};/nqXg +wc(äELhx$pgĴ@``gD-!H4-ba_l%7Acʹ`毋&H->0XD<ɋv X3c5 +ο$ b/z@ŚX88zx\YE%*"&yuË\^1f#HgRGO1kidߕI6Eb<op}FiF|oxB: =H1 Ț*e zZÀLMh͎m,,עҡ7GС&!"𑦈d + ,bKV1B="l#{jDdy@ċ|BO_xjje1 Q?}~j8Pלp~q]hÊ.YD, ٹfٵ +endstream +endobj +371 0 obj +<< /Type /FontDescriptor +/FontName /79e08b+mplus1mn-italic +/FontFile2 370 0 R +/FontBBox [0 -230 1000 860] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 860 +/Descent -140 +/CapHeight 860 +/XHeight 0 +>> +endobj +372 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +373 0 obj +[1000 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 500 1000 1000 500 500 1000 1000 500 500 500 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 500 1000 500 1000 500 500 1000 1000 500 1000 1000 500 1000 500 500 500 1000 500 500 500 500 1000 1000 1000 500 1000 1000 1000 1000 1000 500 500 1000 1000 1000 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 500 500 1000 1000 500 500 500 500 500 1000 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +374 0 obj +<< /Length1 2328 +/Length 1338 +/Filter [/FlateDecode] +>> +stream +xU_lSUν78$"zovbA6a˽d*` Hn !Ɯ<7ƐAF  ܞ-D_m{~}_: KbB#- fi"lBlv#Lw{7LLXٺ4Mq:*b:8K$O?<TB'[Eŗ r+>* x:vٲ<وy{;/a+wJ}sC7CEV8im>Z~T;:)C/,~}J)C_uoO<>w0K!ŕy:aŹG{'Wi) z +"6yo$H1⳵܂8>+I,I`Gq!x B)$-.Vᰧ$ȧ?X9W!x>u4{pߋo'*p/x$zPiS=mK~|֐]ٵ>' §$vKoɞ-OOTDG|;ɦtf_0B l2L8L@@{8v@0 ChA}?96-[3lY81)Ť&dd4]MMD;h7] qbйr,_i2&\QI{Y :RcRULi<ڱ F𨌗dUе+)څuwZcf+Ji펼e!"Z,]AyqkTО9_@vXZjm4V#Ϸ!Ҿ8p{Ӊ0w,9`1O|14XkW̍5L`1h`?f2PiccrL#-6d I@اdmd&My4 fG_Ͱ0o`c{`ϫ5֙Oo'g:=3:fi&J.S-LNx똆2>2~iñ,FWXQ̰L kj᠂5NFc̏tNQ~2爐C-,'XcJ{n)Jpp ԇj mVS Q\PXa4lOuT9jB B7_pf섇h؄:[MU$C.+w>d5cGQƍ=8dƸ7sP9RuC炋'lŸtS iOҰ +endstream +endobj +375 0 obj +<< /Type /FontDescriptor +/FontName /781c87+mplus-1p-regular +/FontFile2 374 0 R +/FontBBox [-109 -288 1403 1075] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 860 +/Descent -140 +/CapHeight 860 +/XHeight 0 +>> +endobj +376 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +377 0 obj +[1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 288 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +378 0 obj +<< /Length1 6468 +/Length 4546 +/Filter [/FlateDecode] +>> +stream +xXyTTW߭ +vA_ՃVD U K(J޶f1=̴Ѵc2T1۶s:=v:8I3m2v'1Nxw{tN pwwz=B|EtK6+)SBlã[MՄhSfĦ]i + vG?B?&Dw +ߧto +Cb[549l2ψG£UF1PHnB'4=`8r'ǀG9?<04ػqfBP& O`+2 +i$z^L, Dա`iAbYHHrJj"™-|zUڞ8f/p8]n,)ZZ\RPY_gCYԳΠjTȩn>͠f==袈a F#],ѓd>#<,Va2PyBLKb]jĞ.l#}Na0t4\ +E;}0E'\!̛ <ňTi5 xkb^_yEX+ iHQ&i=;:IԚ,=|+[dήV{ɉ:uIq={]hK2x?r:󕀌qՁ66%FޑxƓ [hXNG)]<ՒºZS̙ Yi8('O@ ^7pddneA:jשKO4J7Y+)By^Ey8d4Lp9v:lvzA%c#AyAM88|ǚi^UtwӺmMY[U&k(o"IGTJ5hR4U!㫌dFтufӛaϵem[rB7`Wk ])?_l/l\*i|6 +l/=Ia z9Z( epg9_R{yzY<~l="w1/Jz73"U%bh}穈MDZeSgjvJ^dƩ rJgf.Y]MX D&̈́d0k%嗀ifnע]olշUjxيlyۙR3_Ζ͇ +h D3Egj& +ǎ:.W[p<ƃEI]1}pX)˅"F 1%,j;zC/TB?.6'J|{F3 Bp*Զz1awi1WEu vQ `qtPzC-*^Z0J1R(YiqQÊ,nSݬmgihh 5<4x+h(q +<<3;b%'HN)<4|Ct/AM7Z`ϊU V~^Iŏ;h8L !a҅`Ŝ^`fu0XVvt+{r1:. I.#mG?wCu=oޒ]8R]ʳpT׸Qhfq+'o>r|T N<,_->4ֽ2dwt \R.PV{Ǵ@E83ܿ'+ff)i +jKmvj֥x.}[:?dL1dez"-ulMZ=6|>YZ.a3mq>]@4 Q$x 3Q*-)]vN*|x\$\Bs˱ya%RAJPenY0FBYQc/^*暄$cn!(b]̫5hvޅ-GrbF`q|qELh?-,jxNvoxT"{5R]k 5d 4I.[]KV:B^ >ݳa7/mNf!t m  ИQVr|υݩpI0 _WčWEPc. +wB{?"39v}{hjoYSl(VY^ K8w71$i '֤%XL1 p0و!_%:;, nid!{Y&& ܧf;uFejtaůW ۇTSs'gff25=`|PC_ٺG/e;ÅXZ*1ܠorQЉ(Z&GTw1-ֽ:VSϚx5H8$MMX(=b6`uI&9D'D8 +gwӍ=F/kSFWlTW\UT*BeG9<e*:bkQעbTOVPjF:QmSRw&Jb3`; s#¶)ljaǗu/blqJٱd:?6[iid".c1جZH/iZ>2}[$Ͻ 3K#a 2D.vf.nT+*16vާS82-pGcQk er:.s ҮtBY~wdNܣ}~*o1%Fi aUJ;FuK$IX.Bt3~f`Ŕ.,F=H>)@L'qBڥ oJREVeV-YE㵉H3i%md5~H;YC:ZQsXD@Yu */:,SNQme-+ 5ו31zE]^WaL kdXRۖ7.=RP5j*EFIl&cd= xfH/ơ]8#9WI ڈCkm fHH* #$T1:܇E+U&F#7+$jn$ط~rdC$q B&G} +=3m~_t(͟oek  qBt|#HT v>#?X3G@{NL5{?8;>:9gE[Nm0o9N"DRt|"!g^9\WB$G:q}=-TTt mt6@*Uj#NvR# b!$Bl,nGj6"(_Kw%D{lL$.Zm}")kDز=f޼_ɿ $#6ɼ9Tm /ċhGT-s::#aԶťK6[g̳q(2V\DiFTpcd9<%>'0FN1#b,g"j4ǭૺ8?#A03榸SU7ŋx)CJԏ-DʂċJ&)4nZҴʲE]󜿶9 +ZO)m07Pn-SMtR` |кoj¶m^f>~JvAYEԞ`8=#n{Pz"+e>i<&z+N8DHR0>/-h,ϧc:ƪL7ύ +endstream +endobj +379 0 obj +<< /Type /FontDescriptor +/FontName /d420e1+mplus1mn-bold +/FontFile2 378 0 R +/FontBBox [0 -230 1000 860] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 860 +/Descent -140 +/CapHeight 860 +/XHeight 0 +>> +endobj +380 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +381 0 obj +[500 500 1000 1000 1000 500 1000 500 500 500 1000 1000 500 1000 500 500 500 500 1000 500 1000 500 500 1000 1000 1000 500 1000 500 500 500 1000 1000 500 500 500 500 500 500 500 1000 500 1000 1000 500 500 500 500 500 1000 500 500 500 500 500 500 500 1000 1000 1000 1000 1000 1000 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 1000 500 500 500 500 500 500 500 500 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +xref +0 382 +0000000000 65535 f +0000000015 00000 n +0000000381 00000 n +0000000585 00000 n +0000000867 00000 n +0000000918 00000 n +0000001190 00000 n +0000002075 00000 n +0000002371 00000 n +0000002538 00000 n +0000030543 00000 n +0000031500 00000 n +0000047488 00000 n +0000048177 00000 n +0000055172 00000 n +0000055564 00000 n +0000055608 00000 n +0000055657 00000 n +0000055724 00000 n +0000055768 00000 n +0000055941 00000 n +0000055985 00000 n +0000056029 00000 n +0000056145 00000 n +0000056189 00000 n +0000056233 00000 n +0000056347 00000 n +0000056391 00000 n +0000056566 00000 n +0000056610 00000 n +0000056785 00000 n +0000056829 00000 n +0000066050 00000 n +0000066405 00000 n +0000066449 00000 n +0000066493 00000 n +0000066537 00000 n +0000066581 00000 n +0000066625 00000 n +0000066669 00000 n +0000077465 00000 n +0000077833 00000 n +0000077877 00000 n +0000077921 00000 n +0000077965 00000 n +0000078009 00000 n +0000078053 00000 n +0000085568 00000 n +0000085910 00000 n +0000085953 00000 n +0000086686 00000 n +0000087056 00000 n +0000087099 00000 n +0000087143 00000 n +0000087187 00000 n +0000092378 00000 n +0000104537 00000 n +0000104960 00000 n +0000105004 00000 n +0000105168 00000 n +0000105342 00000 n +0000105386 00000 n +0000105499 00000 n +0000105685 00000 n +0000124188 00000 n +0000124556 00000 n +0000124600 00000 n +0000124644 00000 n +0000141253 00000 n +0000141621 00000 n +0000155510 00000 n +0000155878 00000 n +0000155922 00000 n +0000165881 00000 n +0000166249 00000 n +0000166293 00000 n +0000166337 00000 n +0000166380 00000 n +0000181205 00000 n +0000181573 00000 n +0000181617 00000 n +0000193124 00000 n +0000193492 00000 n +0000193536 00000 n +0000193580 00000 n +0000194054 00000 n +0000194098 00000 n +0000203016 00000 n +0000203371 00000 n +0000203415 00000 n +0000203459 00000 n +0000203503 00000 n +0000213436 00000 n +0000213791 00000 n +0000213835 00000 n +0000226636 00000 n +0000227062 00000 n +0000227106 00000 n +0000227281 00000 n +0000227325 00000 n +0000227369 00000 n +0000227414 00000 n +0000227557 00000 n +0000227710 00000 n +0000227847 00000 n +0000228029 00000 n +0000228209 00000 n +0000228336 00000 n +0000228381 00000 n +0000248372 00000 n +0000248729 00000 n +0000248775 00000 n +0000248821 00000 n +0000258425 00000 n +0000258795 00000 n +0000258841 00000 n +0000259697 00000 n +0000272077 00000 n +0000272465 00000 n +0000272511 00000 n +0000272557 00000 n +0000272675 00000 n +0000272721 00000 n +0000286764 00000 n +0000287135 00000 n +0000287181 00000 n +0000287227 00000 n +0000287273 00000 n +0000287446 00000 n +0000297923 00000 n +0000298280 00000 n +0000298326 00000 n +0000309411 00000 n +0000309795 00000 n +0000309841 00000 n +0000309887 00000 n +0000310302 00000 n +0000318356 00000 n +0000318714 00000 n +0000325123 00000 n +0000325494 00000 n +0000325540 00000 n +0000333387 00000 n +0000333758 00000 n +0000343042 00000 n +0000343426 00000 n +0000343472 00000 n +0000343518 00000 n +0000351993 00000 n +0000352351 00000 n +0000360070 00000 n +0000360428 00000 n +0000360474 00000 n +0000368214 00000 n +0000368589 00000 n +0000368635 00000 n +0000368752 00000 n +0000368798 00000 n +0000371517 00000 n +0000371879 00000 n +0000371925 00000 n +0000371971 00000 n +0000372017 00000 n +0000372063 00000 n +0000372228 00000 n +0000372361 00000 n +0000372495 00000 n +0000372633 00000 n +0000372773 00000 n +0000372903 00000 n +0000373036 00000 n +0000373161 00000 n +0000373289 00000 n +0000373422 00000 n +0000373556 00000 n +0000373689 00000 n +0000373824 00000 n +0000373954 00000 n +0000374085 00000 n +0000374214 00000 n +0000374344 00000 n +0000374472 00000 n +0000374602 00000 n +0000374727 00000 n +0000374853 00000 n +0000374978 00000 n +0000375104 00000 n +0000375242 00000 n +0000375382 00000 n +0000375501 00000 n +0000375623 00000 n +0000375750 00000 n +0000375879 00000 n +0000376004 00000 n +0000376131 00000 n +0000376257 00000 n +0000376384 00000 n +0000376514 00000 n +0000376646 00000 n +0000376771 00000 n +0000376897 00000 n +0000377025 00000 n +0000377154 00000 n +0000377282 00000 n +0000377411 00000 n +0000377536 00000 n +0000377662 00000 n +0000377789 00000 n +0000377917 00000 n +0000378039 00000 n +0000378162 00000 n +0000378287 00000 n +0000378414 00000 n +0000378541 00000 n +0000378669 00000 n +0000378854 00000 n +0000379040 00000 n +0000379173 00000 n +0000379309 00000 n +0000379446 00000 n +0000379583 00000 n +0000379719 00000 n +0000379856 00000 n +0000379998 00000 n +0000380141 00000 n +0000380276 00000 n +0000380411 00000 n +0000380549 00000 n +0000380687 00000 n +0000380824 00000 n +0000380962 00000 n +0000381087 00000 n +0000381213 00000 n +0000381352 00000 n +0000381491 00000 n +0000381630 00000 n +0000381769 00000 n +0000381911 00000 n +0000382053 00000 n +0000382182 00000 n +0000382311 00000 n +0000382438 00000 n +0000382565 00000 n +0000382693 00000 n +0000382822 00000 n +0000382939 00000 n +0000383058 00000 n +0000383199 00000 n +0000383340 00000 n +0000383491 00000 n +0000383642 00000 n +0000383776 00000 n +0000383910 00000 n +0000384092 00000 n +0000384274 00000 n +0000384397 00000 n +0000384521 00000 n +0000384663 00000 n +0000384809 00000 n +0000384955 00000 n +0000385099 00000 n +0000385249 00000 n +0000385399 00000 n +0000385526 00000 n +0000385653 00000 n +0000385780 00000 n +0000385907 00000 n +0000386040 00000 n +0000386173 00000 n +0000386330 00000 n +0000386487 00000 n +0000386614 00000 n +0000386742 00000 n +0000386903 00000 n +0000387064 00000 n +0000387236 00000 n +0000387408 00000 n +0000387538 00000 n +0000387668 00000 n +0000387831 00000 n +0000387994 00000 n +0000388156 00000 n +0000388318 00000 n +0000388443 00000 n +0000388568 00000 n +0000388695 00000 n +0000388822 00000 n +0000388946 00000 n +0000389070 00000 n +0000389341 00000 n +0000389612 00000 n +0000389690 00000 n +0000390071 00000 n +0000390263 00000 n +0000390492 00000 n +0000390702 00000 n +0000390884 00000 n +0000391090 00000 n +0000391276 00000 n +0000391509 00000 n +0000391669 00000 n +0000391882 00000 n +0000392052 00000 n +0000392220 00000 n +0000392374 00000 n +0000392602 00000 n +0000392754 00000 n +0000392934 00000 n +0000393106 00000 n +0000393278 00000 n +0000393485 00000 n +0000393639 00000 n +0000393819 00000 n +0000393998 00000 n +0000394151 00000 n +0000394357 00000 n +0000394499 00000 n +0000394671 00000 n +0000394876 00000 n +0000395260 00000 n +0000395488 00000 n +0000395690 00000 n +0000395925 00000 n +0000396133 00000 n +0000396353 00000 n +0000396573 00000 n +0000396745 00000 n +0000396969 00000 n +0000397193 00000 n +0000397429 00000 n +0000397621 00000 n +0000397791 00000 n +0000398005 00000 n +0000398164 00000 n +0000398386 00000 n +0000398663 00000 n +0000398872 00000 n +0000399273 00000 n +0000399428 00000 n +0000399677 00000 n +0000399975 00000 n +0000400130 00000 n +0000400299 00000 n +0000400486 00000 n +0000400769 00000 n +0000400979 00000 n +0000401278 00000 n +0000401621 00000 n +0000401839 00000 n +0000402146 00000 n +0000402453 00000 n +0000402622 00000 n +0000402799 00000 n +0000402950 00000 n +0000403489 00000 n +0000411876 00000 n +0000412092 00000 n +0000413455 00000 n +0000414514 00000 n +0000420920 00000 n +0000421141 00000 n +0000422504 00000 n +0000423595 00000 n +0000428612 00000 n +0000428826 00000 n +0000430189 00000 n +0000431254 00000 n +0000434216 00000 n +0000434442 00000 n +0000435805 00000 n +0000436925 00000 n +0000440037 00000 n +0000440250 00000 n +0000441613 00000 n +0000442719 00000 n +0000444148 00000 n +0000444366 00000 n +0000445729 00000 n +0000446867 00000 n +0000451504 00000 n +0000451715 00000 n +0000453078 00000 n +trailer +<< /Size 382 +/Root 2 0 R +/Info 1 0 R +>> +startxref +454152 +%%EOF diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_PRI.doc b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_PRI.doc new file mode 100644 index 0000000000000000000000000000000000000000..c03c6eecc4ba9b02ca29734c9029be87a83712f2 Binary files /dev/null and b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/Abstract_Socket_CNL113384_PRI.doc differ diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/images/Abstract socket.png b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/images/Abstract socket.png new file mode 100644 index 0000000000000000000000000000000000000000..d862a0e0c83fbc824c812ea63bf9ef0a7d1052f1 Binary files /dev/null and b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/doc/images/Abstract socket.png differ diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc new file mode 100644 index 0000000000000000000000000000000000000000..fcff30b43db4aa08cefb7d655fcab59d0fc309ec --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc @@ -0,0 +1,2821 @@ +/****************************************************************************** +* Copyright (c) 2000-2019 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v2.0 +* which accompanies this distribution, and is available at +* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +* +* Contributors: +* Zoltan Bibo - initial implementation and initial documentation +* Gergely Futo +* Oliver Ferenc Czerman +* Balasko Jeno +* Zoltan Bibo +* Eduard Czimbalmos +* Kulcsár Endre +* Gabor Szalai +* Jozsef Gyurusi +* Csöndes Tibor +* Zoltan Jasz +******************************************************************************/ +// +// File: Abstract_Socket.cc +// Description: Abstract_Socket implementation file +// Rev: R9B +// Prodnr: CNL 113 384 +// + +#include "Abstract_Socket.hh" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined SOLARIS8 +# include +#endif + + +#define AS_TCP_CHUNCK_SIZE 4096 +#define AS_SSL_CHUNCK_SIZE 16384 +// Used for the 'address already in use' bug workaround +#define AS_DEADLOCK_COUNTER 16 +// character buffer length to store temporary SSL informations, 256 is usually enough +#define SSL_CHARBUF_LENGTH 256 +// number of bytes to read from the random devices +#define SSL_PRNG_LENGTH 1024 + +#ifndef NI_MAXHOST +#define NI_MAXHOST 1024 +#endif +#ifndef NI_MAXSERV +#define NI_MAXSERV 32 +#endif + +/******************************** + ** PacketHeaderDescr + ** used for fragmentation and concatenation + ** of fixed format messages + *********************************/ + +unsigned long PacketHeaderDescr::Get_Message_Length(const unsigned char* buff) const +{ + unsigned long m_length = 0; + for (unsigned long i = 0; i < nr_bytes_in_length; i++) { + unsigned long shift_count = + byte_order == Header_MSB ? nr_bytes_in_length - 1 - i : i; + m_length |= buff[length_offset + i] << (8 * shift_count); + } + m_length *= length_multiplier; + if (value_offset < 0 && (long)m_length < -value_offset) return 0; + else return m_length + value_offset; +} + + +//////////////////////////////////////////////////////////////////////// +///// Default log functions +//////////////////////////////////////////////////////////////////////// +void Abstract_Socket::log_debug(const char *fmt, ...) const +{ + if (socket_debugging) { + TTCN_Logger::begin_event(TTCN_DEBUG); + if (test_port_type != NULL && test_port_name != NULL) + TTCN_Logger::log_event("%s test port (%s): ", test_port_type, + test_port_name); + else TTCN_Logger::log_event_str("Abstract socket: "); + va_list args; + va_start(args, fmt); + TTCN_Logger::log_event_va_list(fmt, args); + va_end(args); + TTCN_Logger::end_event(); + } +} + +void Abstract_Socket::log_warning(const char *fmt, ...) const +{ + TTCN_Logger::begin_event(TTCN_WARNING); + if (test_port_type != NULL && test_port_name != NULL) + TTCN_Logger::log_event("%s test port (%s): warning: ", test_port_type, + test_port_name); + else TTCN_Logger::log_event_str("Abstract socket: warning: "); + va_list args; + va_start(args, fmt); + TTCN_Logger::log_event_va_list(fmt, args); + va_end(args); + TTCN_Logger::end_event(); +} + + +void Abstract_Socket::log_error(const char *fmt, ...) const +{ + va_list args; + va_start(args, fmt); + char *error_str = mprintf_va_list(fmt, args); + va_end(args); + try { + if (test_port_type != NULL && test_port_name != NULL) + TTCN_error("%s test port (%s): %s", test_port_type, test_port_name, + error_str); + else TTCN_error("Abstract socket: %s", error_str); + } catch (...) { + Free(error_str); + throw; + } + Free(error_str); +} + +void Abstract_Socket::log_hex(const char *prompt, const unsigned char *msg, + size_t length) const +{ + if (socket_debugging) { + TTCN_Logger::begin_event(TTCN_DEBUG); + if (test_port_type != NULL && test_port_name != NULL) + TTCN_Logger::log_event("%s test port (%s): ", test_port_type, + test_port_name); + else TTCN_Logger::log_event_str("Abstract socket: "); + if (prompt != NULL) TTCN_Logger::log_event_str(prompt); + TTCN_Logger::log_event("Size: %lu, Msg:", (unsigned long)length); + for (size_t i = 0; i < length; i++) TTCN_Logger::log_event(" %02x", msg[i]); + TTCN_Logger::end_event(); + } +} + + +/******************************** + ** Abstract_Socket + ** abstract base type for TCP socket handling + *********************************/ + +Abstract_Socket::Abstract_Socket() { + server_mode=false; + socket_debugging=false; + nagling=false; + use_non_blocking_socket=false; + halt_on_connection_reset=true; + halt_on_connection_reset_set=false; + client_TCP_reconnect=false; + TCP_reconnect_attempts=5; + TCP_reconnect_delay=1; + listen_fd=-1; + memset(&remoteAddr, 0, sizeof(remoteAddr)); + memset(&localAddr, 0, sizeof(localAddr)); + server_backlog=1; + peer_list_length=0; + local_host_name = NULL; + local_port_number = 0; + remote_host_name = NULL; + remote_port_number = 0; + ai_family = AF_UNSPEC; // default: Auto + test_port_type=NULL; + test_port_name=NULL; + ttcn_buffer_usercontrol=false; + use_connection_ASPs=false; + handle_half_close = false; + peer_list_root = NULL; +} + +Abstract_Socket::Abstract_Socket(const char *tp_type, const char *tp_name) { + server_mode=false; + socket_debugging=false; + nagling=false; + use_non_blocking_socket=false; + halt_on_connection_reset=true; + halt_on_connection_reset_set=false; + client_TCP_reconnect=false; + TCP_reconnect_attempts=5; + TCP_reconnect_delay=1; + listen_fd=-1; + memset(&remoteAddr, 0, sizeof(remoteAddr)); + memset(&localAddr, 0, sizeof(localAddr)); + server_backlog=1; + peer_list_length=0; + local_host_name = NULL; + local_port_number = 0; + remote_host_name = NULL; + remote_port_number = 0; + ai_family = AF_UNSPEC; // default: Auto + test_port_type=tp_type; + test_port_name=tp_name; + ttcn_buffer_usercontrol=false; + use_connection_ASPs=false; + handle_half_close = false; + peer_list_root = NULL; +} + +Abstract_Socket::~Abstract_Socket() { + peer_list_reset_peer(); + Free(local_host_name); + Free(remote_host_name); +} + +bool Abstract_Socket::parameter_set(const char *parameter_name, + const char *parameter_value) +{ + log_debug("entering Abstract_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); + + if (strcmp(parameter_name, socket_debugging_name()) == 0) { + if (strcasecmp(parameter_value,"yes")==0) socket_debugging = true; + else if (strcasecmp(parameter_value,"no")==0) socket_debugging = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, socket_debugging_name()); + } else if (strcmp(parameter_name, server_mode_name()) == 0) { + if (strcasecmp(parameter_value,"yes")==0) server_mode = true; + else if (strcasecmp(parameter_value,"no")==0) server_mode = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, server_mode_name()); + } else if (strcmp(parameter_name, use_connection_ASPs_name()) == 0) { + if (strcasecmp(parameter_value,"yes")==0) use_connection_ASPs = true; + else if (strcasecmp(parameter_value,"no")==0) use_connection_ASPs = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, use_connection_ASPs_name()); + } else if (strcmp(parameter_name, halt_on_connection_reset_name()) == 0) { + halt_on_connection_reset_set=true; + if (strcasecmp(parameter_value,"yes")==0) halt_on_connection_reset = true; + else if (strcasecmp(parameter_value,"no")==0) halt_on_connection_reset = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, halt_on_connection_reset_name()); + } else if (strcmp(parameter_name, client_TCP_reconnect_name()) == 0) { + if (strcasecmp(parameter_value,"yes")==0) client_TCP_reconnect = true; + else if (strcasecmp(parameter_value,"no")==0) client_TCP_reconnect = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, client_TCP_reconnect_name()); + } else if (strcmp(parameter_name, TCP_reconnect_attempts_name()) == 0) { + if (sscanf(parameter_value, "%d", &TCP_reconnect_attempts)!=1) log_error("Invalid input as TCP_reconnect_attempts counter given: %s", parameter_value); + if (TCP_reconnect_attempts<=0) log_error("TCP_reconnect_attempts must be greater than 0, %d is given", TCP_reconnect_attempts); + } else if (strcmp(parameter_name, TCP_reconnect_delay_name()) == 0) { + if (sscanf(parameter_value, "%d", &TCP_reconnect_delay)!=1) log_error("Invalid input as TCP_reconnect_delay given: %s", parameter_value); + if (TCP_reconnect_delay<0) log_error("TCP_reconnect_delay must not be less than 0, %d is given", TCP_reconnect_delay); + } else if(strcmp(parameter_name, remote_address_name()) == 0){ + Free(remote_host_name); + remote_host_name = mcopystr(parameter_value); + } else if(strcmp(parameter_name, local_address_name()) == 0){ // only for backward compatibility + Free(local_host_name); + local_host_name = mcopystr(parameter_value); + } else if(strcmp(parameter_name, remote_port_name()) == 0){ + int a; + if (sscanf(parameter_value, "%d", &a)!=1) log_error("Invalid input as port number given: %s", parameter_value); + if (a>65535 || a<0){ log_error("Port number must be between 0 and 65535, %d is given", remote_port_number);} + else {remote_port_number=a;} + } else if(strcmp(parameter_name, ai_family_name()) == 0){ + if (strcasecmp(parameter_value,"IPv6")==0 || strcasecmp(parameter_value,"AF_INET6")==0) ai_family = AF_INET6; + else if (strcasecmp(parameter_value,"IPv4")==0 || strcasecmp(parameter_value,"AF_INET")==0) ai_family = AF_INET; + else if (strcasecmp(parameter_value,"UNSPEC")==0 || strcasecmp(parameter_value,"AF_UNSPEC")==0) ai_family = AF_UNSPEC; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ai_family_name()); + } else if(strcmp(parameter_name, local_port_name()) == 0){ + int a; + if (sscanf(parameter_value, "%d", &a)!=1) log_error("Invalid input as port number given: %s", parameter_value); + if (a>65535 || a<0) {log_error("Port number must be between 0 and 65535, %d is given", local_port_number);} + else {local_port_number=a;} + } else if (strcmp(parameter_name, nagling_name()) == 0) { + if (strcasecmp(parameter_value,"yes")==0) nagling = true; + else if (strcasecmp(parameter_value,"no")==0) nagling = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, nagling_name()); + } else if (strcmp(parameter_name, use_non_blocking_socket_name()) == 0){ + if (strcasecmp(parameter_value, "yes") == 0) use_non_blocking_socket = true; + else if (strcasecmp(parameter_value, "no") == 0) use_non_blocking_socket = false; + } else if (strcmp(parameter_name, server_backlog_name()) == 0) { + if (sscanf(parameter_value, "%d", &server_backlog)!=1) log_error("Invalid input as server backlog given: %s", parameter_value); + } else { + log_debug("leaving Abstract_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); + return false; + } + + log_debug("leaving Abstract_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); + return true; +} + +void Abstract_Socket::Handle_Socket_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error) +{ + log_debug("entering Abstract_Socket::Handle_Socket_Event(): fd: %d%s%s%s", fd, + is_readable ? " readable" : "", is_writable ? " writable" : "", is_error ? " error" : ""); + + if (fd != listen_fd /* on server the connection requests are handled after the user messages */ + && peer_list_root[fd] != NULL && (is_readable || is_writable) + && get_peer(fd)->reading_state != STATE_DONT_RECEIVE) { + log_debug("receiving data"); + int messageLength = receive_message_on_fd(fd); + if (messageLength == 0) { // peer disconnected + as_client_struct * client_data = get_peer(fd); + log_debug("Abstract_Socket::Handle_Socket_Event(). Client %d closed connection.", fd); + switch (client_data->reading_state) { + case STATE_BLOCK_FOR_SENDING: + log_debug("Abstract_Socket::Handle_Socket_Event(): state is STATE_BLOCK_FOR_SENDING, don't close connection."); + Remove_Fd_Read_Handler(fd); + client_data->reading_state = STATE_DONT_CLOSE; + log_debug("Abstract_Socket::Handle_Socket_Event(): setting socket state to STATE_DONT_CLOSE"); + break; + case STATE_DONT_CLOSE: + log_debug("Abstract_Socket::Handle_Socket_Event(): state is STATE_DONT_CLOSE, don't close connection."); + break; + default: + if((client_data->tcp_state == CLOSE_WAIT) || (client_data->tcp_state == FIN_WAIT)) { + remove_client(fd); + peer_disconnected(fd); + } else { + if(shutdown(fd, SHUT_RD) != 0) { + if(errno == ENOTCONN) { + errno = 0; + } else { + log_error("shutdown(SHUT_RD) system call failed"); + } + } + client_data->tcp_state = CLOSE_WAIT; + Remove_Fd_Read_Handler(fd); + peer_half_closed(fd); + } + } // switch (client_data->reading_state) + } else if (messageLength > 0) { + as_client_struct *client_data=get_peer(fd); + if (socket_debugging) { + struct sockaddr_storage clientAddr = client_data->clientAddr; +#ifdef WIN32 + log_debug("Message received from address %s:%d", inet_ntoa(((struct sockaddr_in*)&clientAddr)->sin_addr), ntohs(((struct sockaddr_in *)&clientAddr)->sin_port)); +#else + char hname[NI_MAXHOST]; + char sname[NI_MAXSERV]; +#if defined LINUX || defined FREEBSD || defined SOLARIS8 + socklen_t +#else /* SOLARIS or WIN32 */ + int +#endif + clientAddrlen = client_data->clientAddrlen; + int error = getnameinfo((struct sockaddr *)&clientAddr, clientAddrlen, + hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICHOST|NI_NUMERICSERV); + if (error) log_error("AbstractSocket: getnameinfo 2: %s\n", gai_strerror(error)); + log_debug("Message received from address (addr) %s/%s", hname, sname); +#endif + } + log_hex("Message received, buffer content: ", get_buffer(fd)->get_data(), get_buffer(fd)->get_len()); + handle_message(fd); + } /* else if (messageLength == -2) => + used in case of SSL: means that reading would bloc. + in this case I stop receiving message on the file descriptor */ + } // if ... (not new connection request) + + if (fd == listen_fd && is_readable) { + // new connection request arrived + log_debug("waiting for accept"); + // receiving new connection on the TCP server + struct sockaddr_storage clientAddr; + +#if defined LINUX || defined FREEBSD || defined SOLARIS8 + socklen_t +#else /* SOLARIS or WIN32 */ + int +#endif + clientAddrlen = sizeof(clientAddr); +#if defined LINUX || defined FREEBSD || defined SOLARIS8 + int newclient_fd = accept(listen_fd, (struct sockaddr *) &clientAddr, (socklen_t*)&clientAddrlen); +#else + int newclient_fd = accept(listen_fd, (struct sockaddr *) &clientAddr, (int*)&clientAddrlen); +#endif + if(newclient_fd < 0) log_error("Cannot accept connection at port"); + + as_client_struct *client_data=peer_list_add_peer(newclient_fd); + Add_Fd_Read_Handler(newclient_fd); // Done here - as in case of error: remove_client expects the handler as added + log_debug("Abstract_Socket::Handle_Socket_Event(). Handler set to other fd %d", newclient_fd); + client_data->fd_buff = new TTCN_Buffer; + client_data->clientAddr = clientAddr; + client_data->clientAddrlen = clientAddrlen; + client_data->tcp_state = ESTABLISHED; + client_data->reading_state = STATE_NORMAL; + if (add_user_data(newclient_fd)) { + char hname[NI_MAXHOST]; + int clientPort = 0; +#ifdef WIN32 + clientPort=ntohs(((struct sockaddr_in *)&clientAddr)->sin_port); + char* tmp=inet_ntoa(((struct sockaddr_in*)&clientAddr)->sin_addr); + strcpy(hname,tmp); +#else + int error; + char sname[NI_MAXSERV]; + error = getnameinfo((struct sockaddr *)&clientAddr, clientAddrlen, + hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICHOST|NI_NUMERICSERV); + if (error) { + log_error("AbstractSocket: getnameinfo: %s\n", + gai_strerror(error)); + } + clientPort = atoi(sname); +#endif + log_debug("Client %d connected from address %s/%d", newclient_fd, hname, clientPort); + peer_connected(newclient_fd, hname, clientPort); + peer_connected(newclient_fd, *((struct sockaddr_in *)&clientAddr)); /* calling deprecated function also */ + log_debug("Handle_Socket_Event updated with client %d ", newclient_fd); + + if (set_non_block_mode(newclient_fd, use_non_blocking_socket) < 0) { + log_error("Set blocking mode failed."); + } + + } else { + remove_client(newclient_fd); + peer_disconnected(newclient_fd); + } + } // if (fd == listen_fd && is_readable) + + log_debug("leaving Abstract_Socket::Handle_Socket_Event()"); +} + +int Abstract_Socket::receive_message_on_fd(int client_id) +{ + as_client_struct * client_data = get_peer(client_id); + TTCN_Buffer* recv_tb = client_data->fd_buff; + unsigned char *end_ptr; + size_t end_len=AS_TCP_CHUNCK_SIZE; + recv_tb->get_end(end_ptr, end_len); + int messageLength = recv(client_id, (char *)end_ptr, end_len, 0); + if (messageLength==0) return messageLength; // peer disconnected + else if (messageLength < 0) { + log_warning("Error when reading the received TCP PDU: %s", strerror(errno)); + errno = 0; + return 0; + } + recv_tb->increase_length(messageLength); + return messageLength; +} + +int Abstract_Socket::send_message_on_fd(int client_id, const unsigned char* send_par, int message_length) +{ + get_peer(client_id); + return send(client_id, (const char *)send_par, message_length, 0); +} + + +//Tthe EAGAIN errno value set by the send operation means that +//the sending operation would block. +//First I try to increase the length of the sending buffer (increase_send_buffer()). +//If the outgoing buffer cannot be increased, the block_for_sending function will +//be called. This function will block until the file descriptor given as its argument +//is ready to write. While the block for sending operation calls the Event_Handler, +//states must be used to indicate that the Event_Handler is called when the +//execution is blocking. +//STATE_BLOCK_FOR_SENDING: the block for sending operation has been called +//STATE_DONT_CLOSE: if the other side close the connection before the block_for_sending +// operation returns, in the Event_Handler the connection +// must not be closed and the block_for_sending must return before we can +// close the connection. This state means that the other side closed the connection +// during the block_for_sending operation +//STATE_NORMAL: normal state +int Abstract_Socket::send_message_on_nonblocking_fd(int client_id, + const unsigned char* send_par, + int length){ + + log_debug("entering Abstract_Socket::" + "send_message_on_nonblocking_fd(id: %d)", client_id); + as_client_struct * client_data = get_peer(client_id); + int sent_len = 0; + while(sent_len < length){ + int ret; + log_debug("Abstract_Socket::send_message_on_nonblocking_fd(id: %d): new iteration", client_id); + if (client_data->reading_state == STATE_DONT_CLOSE){ + goto client_closed_connection; + } else ret = send(client_id, send_par + sent_len, length - sent_len, 0); + + if (ret > 0) sent_len+=ret; + else{ + switch(errno){ + case EINTR:{ //signal: do nothing, try again + errno = 0; + break; + } + case EPIPE:{ //client closed connection + goto client_closed_connection; + } + case EAGAIN:{ // the output buffer is full: + //try to increase it if possible + errno = 0; + int old_bufsize, new_bufsize; + + if (increase_send_buffer( + client_id, old_bufsize, new_bufsize)) { + log_warning("Sending data on on file descriptor %d", + client_id); + log_warning("The sending operation would" + "block execution. The size of the " + "outgoing buffer was increased from %d to " + "%d bytes.",old_bufsize, + new_bufsize); + } else { + log_warning("Sending data on file descriptor %d", + client_id); + log_warning("The sending operation would block " + "execution and it is not possible to " + "further increase the size of the " + "outgoing buffer. Trying to process incoming" + "data to avoid deadlock."); + log_debug("Abstract_Socket::" + "send_message_on_nonblocking_fd():" + " setting socket state to " + "STATE_BLOCK_FOR_SENDING"); + client_data->reading_state = STATE_BLOCK_FOR_SENDING; + TTCN_Snapshot::block_for_sending(client_id); + } + break; + } + default:{ + log_debug("Abstract_Socket::" + "send_message_on_nonblocking_fd(): " + "setting socket state to STATE_NORMAL"); + client_data->reading_state = STATE_NORMAL; + log_debug("leaving Abstract_Socket::" + "send_message_on_nonblocking_fd(id: %d)" + " with error", client_id); + return -1; + } + } //end of switch + }//end of else + } //end of while + + log_debug("Abstract_Socket::send_message_on_nonblocking_fd():" + "setting socket state to STATE_NORMAL"); + client_data->reading_state = STATE_NORMAL; + log_debug("leaving Abstract_Socket::" + "send_message_on_nonblocking_fd(id: %d)", client_id); + return sent_len; + +client_closed_connection: + log_debug("Abstract_Socket::send_message_on_nonblocking_fd(): setting socket state to STATE_NORMAL"); + client_data->reading_state = STATE_NORMAL; + log_debug("leaving Abstract_Socket::" + "send_message_on_nonblocking_fd(id: %d)", client_id); + errno = EPIPE; + return -1; +} + +const PacketHeaderDescr* Abstract_Socket::Get_Header_Descriptor() const +{ + return NULL; +} + +void Abstract_Socket::peer_connected(int /*client_id*/, sockaddr_in& /*remote_addr*/) +{ +} + +void Abstract_Socket::handle_message(int client_id) +{ + const PacketHeaderDescr* head_descr = Get_Header_Descriptor(); + as_client_struct * client_data = get_peer(client_id); + TTCN_Buffer *recv_tb = client_data->fd_buff; + + if(!head_descr){ + message_incoming(recv_tb->get_data(), recv_tb->get_len(), client_id); + if (!ttcn_buffer_usercontrol) recv_tb->clear(); + } else { + recv_tb->rewind(); + unsigned long valid_header_length = head_descr->Get_Valid_Header_Length(); + while (recv_tb->get_len() > 0) { + if ((unsigned long)recv_tb->get_len() < valid_header_length) { + // this is a message without a valid header + // recv_tb->handle_fragment(); + return; + } + unsigned long message_length = + head_descr->Get_Message_Length(recv_tb->get_data()); + if (message_length < valid_header_length) { + // this is a message with a malformed length + log_error("Malformed message: invalid length: %lu. The length should " + "be at least %lu.", message_length, valid_header_length); + } + if((unsigned long)recv_tb->get_len() < message_length){ + // this is a fragmented message with a valid header + // recv_tb->handle_fragment(); + return; + } + // this a valid message + message_incoming(recv_tb->get_data(), message_length, client_id); + if (!ttcn_buffer_usercontrol) { + recv_tb->set_pos(message_length); + recv_tb->cut(); + } + } + } + log_debug("leaving Abstract_Socket::handle_message()"); +} + +void Abstract_Socket::map_user() +{ + log_debug("entering Abstract_Socket::map_user()"); +#if defined SOLARIS8 + sigignore(SIGPIPE); +#endif + if(!use_connection_ASPs) + { + // If halt_on_connection_reset is not set explicitly + // set it to the default value: true on clients, false on servers + if (!halt_on_connection_reset_set) { + if (local_port_number != 0) halt_on_connection_reset=false; + else halt_on_connection_reset=true; + } + } + + all_mandatory_configparameters_present(); + + char remotePort[6]; + char localPort[6]; + sprintf(localPort, "%u", local_port_number); + sprintf(remotePort, "%u", remote_port_number); + + if(!use_connection_ASPs) + { + if(server_mode) { + //open_listen_port(localAddr); + open_listen_port(local_host_name,(char*)&localPort); + } else { + //open_client_connection(remoteAddr, localAddr); + open_client_connection(remote_host_name,(char*)&remotePort,local_host_name,(char*)&localPort); + } + } + + log_debug("leaving Abstract_Socket::map_user()"); +} + +int Abstract_Socket::open_listen_port(const struct sockaddr_in & new_local_addr) +{ +#ifndef WIN32 + log_debug("**** DEPRECATED FUNCTION CALLED: Abstract_Socket::open_listen_port(const struct sockaddr_in & new_local_addr)." + " USE Abstract_Socket::open_listen_port(const char* localHostname, const char* localServicename) INSTEAD! ****"); +#endif + log_debug("Local address: %s:%d", inet_ntoa(new_local_addr.sin_addr), ntohs(new_local_addr.sin_port)); + + close_listen_port(); + + listen_fd = socket(AF_INET, SOCK_STREAM, 0); + if(listen_fd<0) { + if(use_connection_ASPs) + { + log_warning("Cannot open socket when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot open socket"); + } + + if(!nagling) { + int on = 1; + setsockopt(listen_fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); + } + int val = 1; + if(setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&val, sizeof(val)) < 0) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("Setsockopt failed when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + return -1; + } + else log_error("Setsockopt failed"); + } + + int rc = 0; + + log_debug("Bind to port..."); + rc = bind(listen_fd, (const struct sockaddr *)&new_local_addr, sizeof(new_local_addr)); + if(rc<0) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("Cannot bind to port when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot bind to port"); + } + log_debug("Bind successful on server."); + + rc = listen(listen_fd, server_backlog); + if(rc<0) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("Cannot listen at port when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot listen at port"); + } + + // to avoid dead-locks and make possible + // handling of multiple clients "accept" is placed in the Event_Handler + +#if defined LINUX || defined FREEBSD || defined SOLARIS8 + socklen_t +#else /* SOLARIS or WIN32 */ + int +#endif + addr_len = sizeof(new_local_addr); + if (getsockname(listen_fd, (struct sockaddr*)&new_local_addr, &addr_len)) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("getsockname() system call failed on the server socket when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + return -1; + } + else log_error("getsockname() system call failed on the server socket"); + } + log_debug("Listen successful on server port %d", ntohs(new_local_addr.sin_port)); + + Add_Fd_Read_Handler(listen_fd); // Done here - after all error checks: as closed fd should not be left added + log_debug("Abstract_Socket::open_listen_port(): Handler set to socket fd %d", listen_fd); + + //localAddr = new_local_addr; + + if(use_connection_ASPs) + listen_port_opened(ntohs(new_local_addr.sin_port)); + + return new_local_addr.sin_port; +} + +int Abstract_Socket::open_listen_port(const char* localHostname, const char* localServicename) { + log_debug("Local address: %s/%s", (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); + +#ifdef WIN32 + struct sockaddr_in new_local_addr; + memset(&new_local_addr, 0, sizeof(new_local_addr)); + if(localHostname!=NULL){ + get_host_id(localHostname,&new_local_addr); + } + if(localServicename!=NULL){ + new_local_addr.sin_port=htons(atoi(localServicename)); + } + return open_listen_port(new_local_addr); +#else + close_listen_port(); + + struct addrinfo *aip; + struct addrinfo hints; + int sock_opt; + int error; + + /* Set up a socket to listen for connections. */ + bzero(&hints, sizeof (hints)); + hints.ai_flags = /*AI_ALL|*/AI_ADDRCONFIG|AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = ai_family; + + error = getaddrinfo(localHostname, localServicename, &hints, &aip); + if (error != 0) { + if(use_connection_ASPs) + { + log_warning("getaddrinfo: %s for host %s service %s", gai_strerror(error), + (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); + listen_port_opened(-1); + return -1; + } + else log_error("getaddrinfo: %s for host %s service %s", gai_strerror(error), + (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); + } + + struct addrinfo *res; + if (socket_debugging) { + /* count the returned addresses: */ + int counter = 0; + for (res = aip; res != NULL; res = res->ai_next,++counter) {}; + log_debug("Number of local addresses: %d\n", counter); + } + + + for (res = aip; res != NULL; res = res->ai_next) { + listen_fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + log_debug("Waiting for connection via: %s\n", + ((res->ai_family==AF_INET)?"IPv4": + ((res->ai_family==AF_INET6)?"IPv6":"unknown"))); + if (listen_fd == -1) { + if(use_connection_ASPs) + { + log_warning("Cannot open socket when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + freeaddrinfo(aip); + return -1; + } + else log_error("Cannot open socket"); + } + + /* Tell the system to allow local addresses to be reused. */ + sock_opt = 1; + if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&sock_opt, + sizeof (sock_opt)) == -1) { + + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("Setsockopt failed when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + freeaddrinfo(aip); + return -1; + } + else log_error("Setsockopt failed"); + } + + if(!nagling) { + int on = 1; + setsockopt(listen_fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); + } + + log_debug("Bind to port..."); + if (bind(listen_fd, res->ai_addr, res->ai_addrlen) == -1) { + error = errno; // save it for the warning message + close(listen_fd); + listen_fd = -1; + log_debug("Cannot bind to port when trying to open the listen port: %s", strerror(errno)); + errno = 0; + continue; + } + log_debug("Bind successful on server."); + break; + } + if (res==NULL) { + if(use_connection_ASPs) + { + log_warning("Cannot bind to port when trying to open the listen port: %s", strerror(error)); + listen_port_opened(-1); + error = 0; + freeaddrinfo(aip); + return -1; + } + else log_error("Cannot bind to port"); + } + + if (listen(listen_fd, server_backlog) == -1) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("Cannot listen at port when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + freeaddrinfo(aip); + return -1; + } + else log_error("Cannot listen at port"); + } + + + // to avoid dead-locks and make possible + // handling of multiple clients "accept" is placed in Handle_Socket_Event + + // to determine the local address: + if (getsockname(listen_fd, res->ai_addr, &res->ai_addrlen)) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("getsockname() system call failed on the server socket when trying to open the listen port: %s", strerror(errno)); + listen_port_opened(-1); + errno = 0; + freeaddrinfo(aip); + return -1; + } + else log_error("getsockname() system call failed on the server socket"); + } + char hname[NI_MAXHOST]; + char sname[NI_MAXSERV]; +/* error = getnameinfo(res->ai_addr, res->ai_addrlen, + hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICSERV); + if (error) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("getnameinfo() system call failed on the server socket when trying to open the listen port: %s", gai_strerror(error)); + listen_port_opened(-1); + freeaddrinfo(aip); + return -1; + } + else log_error("getsockname() system call failed on the server socket"); + } else { + log_debug("Listening on (name): %s/%s\n", + hname, sname); + }*/ + error = getnameinfo(res->ai_addr, res->ai_addrlen, + hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICHOST|NI_NUMERICSERV); + if (error) { + close(listen_fd); + listen_fd = -1; + if(use_connection_ASPs) + { + log_warning("getnameinfo() system call failed on the server socket when trying to open the listen port: %s", gai_strerror(error)); + listen_port_opened(-1); + freeaddrinfo(aip); + return -1; + } + else log_error("getsockname() system call failed on the server socket"); + } else { + log_debug("Listening on (addr): %s/%s\n", + hname, sname); + } + + Add_Fd_Read_Handler(listen_fd); // Done here - after all error checks: as closed fd should not be left added + log_debug("Abstract_Socket::open_listen_port(): Handler set to socket fd %d", listen_fd); + + log_debug("new_local_addr Addr family: %s\n", + ((res->ai_addr->sa_family==AF_INET)?"IPv4": + ((res->ai_addr->sa_family==AF_INET6)?"IPv6":"unknown")) + ); + + + int listenPort = atoi(sname); + if(use_connection_ASPs) + listen_port_opened(listenPort); + + freeaddrinfo(aip); + return listenPort; +#endif +} + +void Abstract_Socket::listen_port_opened(int /*port_number*/) +{ + // Intentionally blank +} + +void Abstract_Socket::close_listen_port() +{ + // close current listening port if it is alive + if(listen_fd != -1) + { + Remove_Fd_Read_Handler(listen_fd); + close(listen_fd); + log_debug("Closed listening port of fd: %d", listen_fd); + listen_fd = -1; + } +} + +int Abstract_Socket::get_socket_fd() const{ + if(server_mode) return listen_fd; + if(peer_list_get_nr_of_peers()==0) return -1; + return peer_list_get_first_peer(); +} + +int Abstract_Socket::open_client_connection(const struct sockaddr_in & new_remote_addr, const struct sockaddr_in & new_local_addr) +{ +#ifdef WIN32 + log_debug("**** DEPRECATED FUNCTION CALLED: Abstract_Socket::open_client_connection(const struct sockaddr_in & new_remote_addr, const struct sockaddr_in & new_local_addr)." + " USE open_client_connection(const char* remoteHostname, const char* remoteServicename, const char* localHostname, const char* localServicename) INSTEAD! ****"); +#endif + log_debug("Remote address: %s:%d", inet_ntoa(new_remote_addr.sin_addr), ntohs(new_remote_addr.sin_port)); + + int deadlock_counter = AS_DEADLOCK_COUNTER; + int TCP_reconnect_counter = TCP_reconnect_attempts; + + // workaround for the 'address already used' bug + // used also when TCP reconnect is used + as_start_connecting: + + int socket_fd = socket(AF_INET, SOCK_STREAM, 0); + if(socket_fd<0) { + if(use_connection_ASPs) + { + log_warning("Cannot open socket when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot open socket."); + } + + if(!nagling) { + int on = 1; + setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); + } + + int rc; + + // when using client mode there is no separate file_desriptor for listening and target + log_debug("Connecting to server from address %s:%d", inet_ntoa(new_local_addr.sin_addr), ntohs(new_local_addr.sin_port)); + if (new_local_addr.sin_port != ntohs(0)) { // specific port to use + int val = 1; + if(setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&val, sizeof(val)) < 0) { + if(use_connection_ASPs) + { + log_warning("Setsockopt failed when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Setsockopt failed."); + } + rc = bind(socket_fd, (const struct sockaddr *)&new_local_addr, sizeof(new_local_addr)); + if(rc<0) { + if(use_connection_ASPs) + { + log_warning("Cannot bind to port when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot bind to port."); + } + log_debug("Bind successful on client."); + } + rc = connect(socket_fd, (const struct sockaddr *)&new_remote_addr, sizeof(new_remote_addr)); + + if(rc<0){ + if (errno == EADDRINUSE) { + log_warning("connect() returned error code EADDRINUSE. Perhaps this is a kernel bug. Trying to connect again."); + close(socket_fd); + errno = 0; + deadlock_counter--; + if (deadlock_counter<0) { + if(use_connection_ASPs) + { + log_warning("Already tried %d times, giving up when trying to open client connection: %s", AS_DEADLOCK_COUNTER, strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Already tried %d times, giving up", AS_DEADLOCK_COUNTER); + } + goto as_start_connecting; + } else if (client_TCP_reconnect && errno != 0) { + log_warning("connect() returned error code %d, trying to connect again (TCP reconnect mode).", errno); + close(socket_fd); + errno = 0; + TCP_reconnect_counter--; + if (TCP_reconnect_counter<0) { + if(use_connection_ASPs) + { + log_warning("Already tried %d times, giving up when trying to open client connection: %s", TCP_reconnect_attempts, strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Already tried %d times, giving up", TCP_reconnect_attempts); + } + sleep(TCP_reconnect_delay); + goto as_start_connecting; + } + + if(use_connection_ASPs) + { + log_warning("Cannot connect to server when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot connect to server"); + } + + // Non-blocking mode is set before updating bookkeping to handle the error case properly. + if (set_non_block_mode(socket_fd, use_non_blocking_socket) < 0){ + close(socket_fd); + if (use_connection_ASPs){ + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Set blocking mode failed."); + } + + as_client_struct * client_data=peer_list_add_peer(socket_fd); + Add_Fd_Read_Handler(socket_fd); // Done here - as in case of error: remove_client expects the handler as added + log_debug("Abstract_Socket::open_client_connection(). Handler set to socket fd %d", socket_fd); + client_data->fd_buff = new TTCN_Buffer; +// client_data->clientAddr = *(struct sockaddr_storage*)&new_remote_addr; + memset(&client_data->clientAddr,0,sizeof(client_data->clientAddr)); + memcpy(&client_data->clientAddr,&new_remote_addr,sizeof(new_remote_addr)); + client_data->clientAddrlen = sizeof(new_remote_addr); + client_data->tcp_state = ESTABLISHED; + client_data->reading_state = STATE_NORMAL; + if (!add_user_data(socket_fd)) { + remove_client(socket_fd); + peer_disconnected(socket_fd); + return -1; + } + + +// localAddr = new_local_addr; +// remoteAddr = new_remote_addr; + + client_connection_opened(socket_fd); + + return socket_fd; +} + +int Abstract_Socket::open_client_connection(const char* remoteHostname, const char* remoteServicename, const char* localHostname, const char* localServicename) { + log_debug("Abstract_Socket::open_client_connection(remoteAddr: %s/%s, localAddr: %s/%s) called", + remoteHostname,remoteServicename, + (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); +#ifdef WIN32 + struct sockaddr_in new_local_addr; + struct sockaddr_in new_remote_addr; + memset(&new_local_addr, 0, sizeof(new_local_addr)); + memset(&new_local_addr, 0, sizeof(new_remote_addr)); + if(localHostname!=NULL){ + get_host_id(localHostname,&new_local_addr); + } + if(localServicename!=NULL){ + new_local_addr.sin_port=htons(atoi(localServicename)); + } + if(remoteHostname!=NULL){ + get_host_id(remoteHostname,&new_remote_addr); + } + if(remoteServicename!=NULL){ + new_remote_addr.sin_port=htons(atoi(remoteServicename)); + } + return open_client_connection(new_remote_addr,new_local_addr); +#else + + int deadlock_counter = AS_DEADLOCK_COUNTER; + int TCP_reconnect_counter = TCP_reconnect_attempts; + + + struct addrinfo *res, *aip; + struct addrinfo hints; + int socket_fd = -1; + int error; + + /* Get host address. Any type of address will do. */ + bzero(&hints, sizeof (hints)); + hints.ai_flags = AI_ADDRCONFIG; /* |AI_ALL*/ + if (localHostname!=NULL || localServicename!=NULL) { /* use specific local address */ + hints.ai_flags |= AI_PASSIVE; + } + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = ai_family; + + error = getaddrinfo(remoteHostname, remoteServicename, &hints, &res); + if (error != 0) { + if(use_connection_ASPs) + { + log_warning("getaddrinfo: %s for host %s service %s", + gai_strerror(error), remoteHostname, remoteServicename); + client_connection_opened(-1); + return -1; + } + else { log_error("getaddrinfo: %s for host %s service %s", + gai_strerror(error), remoteHostname, remoteServicename); + } + } + + if (socket_debugging) { + /* count the returned addresses: */ + int counter = 0; + for (aip = res; aip != NULL; aip = aip->ai_next,++counter) {}; + log_debug("Number of remote addresses: %d\n", counter); + } + + // workaround for the 'address already used' bug + // used also when TCP reconnect is used + as_start_connecting: + + /* Try all returned addresses until one works */ + for (aip = res; aip != NULL; aip = aip->ai_next) { + /* + * Open socket. The address type depends on what + * getaddrinfo() gave us. + */ + socket_fd = socket(aip->ai_family, aip->ai_socktype, + aip->ai_protocol); + if (socket_fd == -1) { + if(use_connection_ASPs) + { + log_warning("Cannot open socket when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + freeaddrinfo(res); + return -1; + } + else { + freeaddrinfo(res); + log_error("Cannot open socket."); + } + } + + log_debug("Using address family for socket %d: %s",socket_fd, + ((aip->ai_family==AF_INET)?"IPv4": + ((aip->ai_family==AF_INET6)?"IPv6":"unknown")) + ); + + + if(!nagling) { + int on = 1; + setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); + } + + // when using client mode there is no separate file_descriptor for listening and target + log_debug("Connecting to server from address %s/%s", + (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); + if (localHostname!=NULL || localServicename!=NULL) { // specific localaddress/port to use + int val = 1; + if(setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&val, sizeof(val)) < 0) { + if(use_connection_ASPs) + { + log_warning("Setsockopt failed when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Setsockopt failed."); + } + + // determine the local address: + struct addrinfo *localAddrinfo; + /* Get host address. Any type of address will do. */ + bzero(&hints, sizeof (hints)); + hints.ai_flags = AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = ai_family;//aip->ai_family; // NOTE: On solaris 10 if is set to aip->ai_family, getaddrinfo will crash for IPv4-mapped addresses! + + error = getaddrinfo(localHostname, localServicename, &hints, &localAddrinfo); + if (error != 0) { + if(use_connection_ASPs) + { + log_warning("getaddrinfo: %s for host %s service %s", + gai_strerror(error), (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); + client_connection_opened(-1); + return -1; + } + else { log_error("getaddrinfo: %s for host %s service %s", + gai_strerror(error), (localHostname!=NULL)?localHostname:"UNSPEC",(localServicename!=NULL)?localServicename:"UNSPEC"); + } + } + + if (socket_debugging) { + /* count the returned addresses: */ + int counter = 0; + for (struct addrinfo* aip2 = localAddrinfo; aip2 != NULL; aip2 = aip2->ai_next,++counter) {}; + log_debug("Number of local addresses: %d\n", counter); + } + + /* Try all returned addresses until one works */ + struct addrinfo* aip2; + for (aip2 = localAddrinfo; aip2 != NULL; aip2 = aip2->ai_next) { + log_debug("Using address family for bind: %s", + ((aip2->ai_family==AF_INET)?"IPv4": + ((aip2->ai_family==AF_INET6)?"IPv6":"unknown")) + ); + + if(bind(socket_fd, aip2->ai_addr, aip2->ai_addrlen)<0) { +/* if(use_connection_ASPs) // the if else branches are the same + {*/ + log_debug("Cannot bind to port when trying to open client connection: %s", strerror(errno)); + //client_connection_opened(-1); + //freeaddrinfo(localAddrinfo); + errno = 0; + continue; //aip2 cycle + //return -1; +/* } + else { + //freeaddrinfo(localAddrinfo); + //log_error("Cannot bind to port."); + log_debug("Cannot bind to port when trying to open client connection: %s", strerror(errno)); + errno = 0; + continue; //aip2 cycle + }*/ + } + log_debug("Bind successful on client."); + freeaddrinfo(localAddrinfo); + break; + } + if (aip2==NULL) { + log_debug("Bind failed for all local addresses."); + freeaddrinfo(localAddrinfo); + continue; // aip cycle + } + } + + /* Connect to the host. */ + if (connect(socket_fd, aip->ai_addr, aip->ai_addrlen) == -1) { + if (errno == EADDRINUSE) { + log_warning("connect() returned error code EADDRINUSE. Perhaps this is a kernel bug. Trying to connect again."); + close(socket_fd); + socket_fd = -1; + errno = 0; + deadlock_counter--; + if (deadlock_counter<0) { + if(use_connection_ASPs) + { + log_warning("Already tried %d times, giving up when trying to open client connection: %s", AS_DEADLOCK_COUNTER, strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Already tried %d times, giving up", AS_DEADLOCK_COUNTER); + } + goto as_start_connecting; + } else if (client_TCP_reconnect && errno != 0) { + log_warning("connect() returned error code %d (%s), trying to connect again (TCP reconnect mode).", errno, strerror(errno)); + close(socket_fd); + socket_fd = -1; + errno = 0; + if (aip->ai_next==NULL) { /* Last address is tried and there is still an error */ + TCP_reconnect_counter--; + if (TCP_reconnect_counter<0) { + if(use_connection_ASPs) + { + log_warning("Already tried %d times, giving up when trying to open client connection: %s", TCP_reconnect_attempts, strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else { log_error("Already tried %d times, giving up", TCP_reconnect_attempts); } + } + } + sleep(TCP_reconnect_delay); + goto as_start_connecting; + } else { + log_debug("Cannot connect to server: %s", strerror(errno)); + (void) close(socket_fd); + socket_fd = -1; + } + + if (aip->ai_next==NULL) { + if(use_connection_ASPs) + { + log_warning("Cannot connect to server when trying to open client connection: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Cannot connect to server"); + } + continue; //aip cycle + } + + // to determine the local address: + if (getsockname(socket_fd, aip->ai_addr, &aip->ai_addrlen)) { + close(socket_fd); + if(use_connection_ASPs) { + log_warning("getsockname() system call failed on the client socket when trying to connect to server: %s", strerror(errno)); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("getsockname() system call failed on the client socket when trying to connect to server: %s", strerror(errno)); + } + char hname[NI_MAXHOST]; + char sname[NI_MAXSERV]; +/* error = getnameinfo(aip->ai_addr, aip->ai_addrlen, + hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICSERV); + if (error) { + close(socket_fd); + if(use_connection_ASPs) + { + log_warning("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); + client_connection_opened(-1); + return -1; + } + else log_error("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); + } else { + log_debug("Connection established (name): %s/%s -> %s/%s\n", + hname, sname, + remoteHostname, remoteServicename); + }*/ + error = getnameinfo(aip->ai_addr, aip->ai_addrlen, + hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICHOST|NI_NUMERICSERV); + if (error) { +/* close(socket_fd); + if(use_connection_ASPs) + { + log_warning("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); +// client_connection_opened(-1); +// return -1; + } + else*/ + log_warning("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); + } else { + log_debug("Connection established (addr): %s/%s -> %s/%s\n", + hname, sname, + remoteHostname, remoteServicename); + } + + log_debug( + "connected to: host %s service %s via address family %s\n", + remoteHostname, remoteServicename, + ((aip->ai_family==AF_INET)?"IPv4": + ((aip->ai_family==AF_INET6)?"IPv6":"unknown"))); + break; + } + if (aip==NULL) { + if(use_connection_ASPs) + { + log_warning("Cannot connect to server"); + client_connection_opened(-1); + freeaddrinfo(res); + return -1; + } + else log_error("Cannot connect to server"); + } + + // Non-blocking mode is set before updating bookkeping to handle the error case properly. + if (set_non_block_mode(socket_fd, use_non_blocking_socket) < 0) { + freeaddrinfo(res); + close(socket_fd); + if (use_connection_ASPs){ + log_warning("Set blocking mode failed."); + client_connection_opened(-1); + errno = 0; + return -1; + } + else log_error("Set blocking mode failed."); + } + + as_client_struct * client_data=peer_list_add_peer(socket_fd); + Add_Fd_Read_Handler(socket_fd); // Done here - as in case of error: remove_client expects the handler as added + log_debug("Abstract_Socket::open_client_connection(). Handler set to socket fd %d", socket_fd); + client_data->fd_buff = new TTCN_Buffer; +// client_data->clientAddr = *(struct sockaddr_storage*)aip->ai_addr; + memset(&client_data->clientAddr,0,sizeof(client_data->clientAddr)); + memcpy(&client_data->clientAddr,aip->ai_addr,sizeof(*aip->ai_addr)); + client_data->clientAddrlen = aip->ai_addrlen; + client_data->tcp_state = ESTABLISHED; + client_data->reading_state = STATE_NORMAL; + + freeaddrinfo(res); + + if (!add_user_data(socket_fd)) { + remove_client(socket_fd); + peer_disconnected(socket_fd); + return -1; + } + + client_connection_opened(socket_fd); + + return socket_fd; +#endif +} + + +void Abstract_Socket::client_connection_opened(int /*client_id*/) +{ + // Intentionally blank +} + +void Abstract_Socket::unmap_user() +{ + log_debug("entering Abstract_Socket::unmap_user()"); + remove_all_clients(); + close_listen_port(); + Handler_Uninstall(); // For robustness only + log_debug("leaving Abstract_Socket::unmap_user()"); +} + +void Abstract_Socket::peer_disconnected(int /*fd*/) +{ + // virtual peer_disconnected() needs to be overriden in test ports! + if(!use_connection_ASPs) { + if (halt_on_connection_reset) + log_error("Connection was interrupted by the other side."); + if (client_TCP_reconnect){ + log_warning("TCP connection was interrupted by the other side, trying to reconnect again..."); + unmap_user(); + map_user(); + log_warning("TCP reconnect successfuly finished"); + } + } +} + +void Abstract_Socket::peer_half_closed(int fd) +{ + log_debug("Entering Abstract_Socket::peer_half_closed()"); + remove_client(fd); + peer_disconnected(fd); + log_debug("Leaving Abstract_Socket::peer_half_closed()"); +} + +void Abstract_Socket::send_shutdown(int client_id) +{ + log_debug("entering Abstract_Socket::send_shutdown()"); + int dest_fd = client_id; + + if (dest_fd == -1) { + if(peer_list_get_nr_of_peers() > 1) + log_error("Client Id not specified altough not only 1 client exists"); + else if(peer_list_get_nr_of_peers() == 0) + log_error("There is no connection alive, connect before sending anything."); + dest_fd = peer_list_get_first_peer(); + } + as_client_struct * client_data = get_peer(dest_fd); + if(client_data->tcp_state != ESTABLISHED) + log_error("TCP state of client nr %i does not allow to shut down its connection for writing!", dest_fd); + + if(shutdown(dest_fd, SHUT_WR) != 0) + { + if(errno == ENOTCONN) + { + remove_client(dest_fd); + peer_disconnected(dest_fd); + errno = 0; + } + else + log_error("shutdown() system call failed"); + } + else client_data->tcp_state = FIN_WAIT; + + // dest_fd is not removed from readfds, data can be received + + log_debug("leaving Abstract_Socket::send_shutdown()"); +} + +void Abstract_Socket::send_outgoing(const unsigned char* send_par, int length, int client_id) +{ + log_debug("entering Abstract_Socket::send_outgoing()"); + log_hex("Sending data: ", send_par, length); + int dest_fd; + int nrOfBytesSent; + + dest_fd = client_id; + if (dest_fd == -1) { + if(peer_list_get_nr_of_peers() > 1) + log_error("Client Id not specified altough not only 1 client exists"); + else if(peer_list_get_nr_of_peers() == 0) + log_error("There is no connection alive, use a Connect ASP before sending anything."); + dest_fd = peer_list_get_first_peer(); + } + as_client_struct * client_data = get_peer(dest_fd,true); + if(!client_data || ((client_data->tcp_state != ESTABLISHED) && (client_data->tcp_state != CLOSE_WAIT))){ + char *error_text=mprintf("client nr %i has no established connection", dest_fd); + report_error(client_id,length,-2,send_par,error_text); + Free(error_text); + log_debug("leaving Abstract_Socket::send_outgoing()"); + return; + } + + nrOfBytesSent = use_non_blocking_socket ? send_message_on_nonblocking_fd(dest_fd, send_par, length) : + send_message_on_fd(dest_fd, send_par, length); + + if (nrOfBytesSent == -1){ + log_debug("Client %d closed connection. Error: %d %s", client_id, errno, strerror(errno)); + report_unsent(dest_fd,length,nrOfBytesSent,send_par,"Client closed the connection"); + + if(client_data->tcp_state == CLOSE_WAIT){ + log_debug("Client %d waiting for close ASP.", client_id); + } else { + errno = 0; + log_debug("Client %d closed connection", client_id); + client_data->tcp_state = CLOSE_WAIT; + Remove_Fd_Read_Handler(dest_fd); + peer_half_closed(dest_fd); + } + }else if (nrOfBytesSent != length) { + char *error_text=mprintf("Send system call failed: %d bytes were sent instead of %d", nrOfBytesSent, length); + report_error(client_id,length,nrOfBytesSent,send_par,error_text); + Free(error_text); + } else { + log_debug("Nr of bytes sent = %d", nrOfBytesSent); + } + log_debug("leaving Abstract_Socket::send_outgoing()"); +} + +void Abstract_Socket::report_error(int /*client_id*/, int /*msg_length*/, int /*sent_length*/, const unsigned char* /*msg*/, const char* error_text) +{ + log_error("%s",error_text); +} + +void Abstract_Socket::report_unsent(int /*client_id*/, int /*msg_length*/, int /*sent_length*/, const unsigned char* /*msg*/, const char* error_text) +{ + log_debug("%s",error_text); +} + +void Abstract_Socket::all_mandatory_configparameters_present() +{ + if(!use_connection_ASPs) + { + if(server_mode) { + if(local_port_number == 0) { + log_error("%s is not defined in the configuration file", local_port_name()); + } + } + else { // client mode + if (remote_host_name == NULL) { + log_error("%s is not defined in the configuration file", remote_address_name()); + } + if(remote_port_number == 0){ + log_error("%s is not defined in the configuration file", remote_port_name()); + } + } + } + user_all_mandatory_configparameters_present(); +} + + +void Abstract_Socket::get_host_id(const char* hostName, struct sockaddr_in *addr) +{ + log_debug("Abstract_Socket::get_host_id called"); + unsigned int port = addr->sin_port; + memset(addr, 0, sizeof(*addr)); + addr->sin_family = AF_INET; + addr->sin_port = port; + struct hostent *hptr; + if(strcmp("localhost", hostName) != 0) + { + hptr = gethostbyname(hostName); + if (hptr != NULL) memcpy(&addr->sin_addr, hptr->h_addr_list[0], hptr->h_length); + else log_error("The host name %s is not valid in the configuration file.", hostName); + log_debug("The address set to %s[%s]", hptr->h_name, inet_ntoa(addr->sin_addr)); + } + else + { + addr->sin_addr.s_addr = htonl(INADDR_ANY); + log_debug("The address set to [%s]", inet_ntoa(addr->sin_addr)); + } +} + +void Abstract_Socket::remove_client(int fd) +{ + log_debug("entering Abstract_Socket::remove_client(%d)", fd); + if(fd != listen_fd) { + get_peer(fd); // check if client exists, log_error && fail if not + // TODO FIXME: remove the Add_Fd_Read_Handler(fd); if TITAN is fixed + Add_Fd_Read_Handler(fd); + Remove_Fd_All_Handlers(fd); + remove_user_data(fd); + delete get_peer(fd)->fd_buff; + peer_list_remove_peer(fd); + close(fd); + log_debug("Removed client %d.", fd); + } + else log_warning("Abstract_Socket::remove_client: %d is the server listening port, can not be removed!", fd); + log_debug("leaving Abstract_Socket::remove_client(%d)", fd); +} + +void Abstract_Socket::remove_all_clients() +{ + log_debug("entering Abstract_Socket::remove_all_clients"); + for(int i = 0; peer_list_root != NULL && i < peer_list_length; i++) + { + if(i != listen_fd && peer_list_root[i] != NULL) + remove_client(i); + } + // check if no stucked data + while (peer_list_get_nr_of_peers()) { + int client_id = peer_list_get_first_peer(); + if (client_id >= 0) log_warning("Client %d has not been removed, programming error", client_id); + else log_error("Number of clients<>0 but cannot get first client, programming error"); + peer_list_remove_peer(client_id); + } + + log_debug("leaving Abstract_Socket::remove_all_clients"); +} + +int Abstract_Socket::set_non_block_mode(int fd, bool enable_nonblock){ + + int flags = fcntl(fd, F_GETFL); + if (flags < 0) { + log_warning("System call fcntl(F_GETFL) failed on file " + "descriptor %d.", fd); + return -1; + } + + if (enable_nonblock) flags |= O_NONBLOCK; + else flags &= ~O_NONBLOCK; + + if (fcntl(fd, F_SETFL, flags) == -1) { + log_warning("System call fcntl(F_SETFL) failed on file " + "descriptor %d.", fd); + return -1; + } + return 0; + +} + +bool Abstract_Socket::increase_send_buffer(int fd, + int &old_size, int& new_size) +{ + int set_size; +#if defined LINUX || defined FREEBSD || defined SOLARIS8 + socklen_t +#else /* SOLARIS or WIN32 */ + int +#endif + optlen = sizeof(old_size); + // obtaining the current buffer size first + if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&old_size, &optlen)) + goto getsockopt_failure; + if (old_size <= 0) { + log_warning("System call getsockopt(SO_SNDBUF) " + "returned invalid buffer size (%d) on file descriptor %d.", + old_size, fd); + return false; + } + // trying to double the buffer size + set_size = 2 * old_size; + if (set_size > old_size) { + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const char*)&set_size, + sizeof(set_size))) { + // the operation failed + switch (errno) { + case ENOMEM: + case ENOBUFS: + errno = 0; + break; + default: + // other error codes indicate a fatal error + goto setsockopt_failure; + } + } else { + // the operation was successful + goto success; + } + } + // trying to perform a binary search to determine the maximum buffer size + set_size = old_size; + for (int size_step = old_size / 2; size_step > 0; size_step /= 2) { + int tried_size = set_size + size_step; + if (tried_size > set_size) { + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const char*)&tried_size, + sizeof(tried_size))) { + // the operation failed + switch (errno) { + case ENOMEM: + case ENOBUFS: + errno = 0; + break; + default: + // other error codes indicate a fatal error + goto setsockopt_failure; + } + } else { + // the operation was successful + set_size = tried_size; + } + } + } + if (set_size <= old_size) return false; +success: + // querying the new effective buffer size (it might be smaller + // than set_size but should not be smaller than old_size) + optlen = sizeof(new_size); + if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&new_size, + &optlen)) goto getsockopt_failure; + if (new_size > old_size) return true; + else { + if (new_size < old_size) + log_warning("System call getsockopt(SO_SNDBUF) returned unexpected buffer size " + "(%d, after increasing it from %d to %d) on file descriptor %d.", + new_size, old_size, set_size, fd); + return false; + } +getsockopt_failure: + log_warning("System call getsockopt(SO_SNDBUF) failed on file " + "descriptor %d. (%s)", fd, strerror(errno)); + return false; +setsockopt_failure: + log_warning("System call setsockopt(SO_SNDBUF) failed on file " + "descriptor %d. (%s)", fd, strerror(errno)); + return false; +} + + +const char* Abstract_Socket::local_port_name() { return "serverPort";} +const char* Abstract_Socket::remote_address_name() { return "destIPAddr";} +const char* Abstract_Socket::local_address_name() { return "serverIPAddr";} +const char* Abstract_Socket::remote_port_name() { return "destPort";} +const char* Abstract_Socket::ai_family_name() { return "ai_family";} +const char* Abstract_Socket::use_connection_ASPs_name() { return "use_connection_ASPs";} +const char* Abstract_Socket::halt_on_connection_reset_name(){ return "halt_on_connection_reset";} +const char* Abstract_Socket::client_TCP_reconnect_name() { return "client_TCP_reconnect";} +const char* Abstract_Socket::TCP_reconnect_attempts_name() { return "TCP_reconnect_attempts";} +const char* Abstract_Socket::TCP_reconnect_delay_name() { return "TCP_reconnect_delay";} +const char* Abstract_Socket::server_mode_name() { return "server_mode";} +const char* Abstract_Socket::socket_debugging_name() { return "socket_debugging";} +const char* Abstract_Socket::nagling_name() { return "nagling";} +const char* Abstract_Socket::use_non_blocking_socket_name() { return "use_non_blocking_socket";} +const char* Abstract_Socket::server_backlog_name() { return "server_backlog";} +bool Abstract_Socket::add_user_data(int) {return true;} +bool Abstract_Socket::remove_user_data(int) {return true;} +bool Abstract_Socket::user_all_mandatory_configparameters_present() { return true; } + + + +//////////////////////////////////////////////////////////////////////// +///// Peer handling functions +//////////////////////////////////////////////////////////////////////// + +void Abstract_Socket::peer_list_reset_peer() { + log_debug("Abstract_Socket::peer_list_reset_peer: Resetting peer array"); + for (int i = 0; i < peer_list_length; i++) + if (peer_list_root[i] != NULL) { + delete peer_list_root[i]; + peer_list_root[i] = NULL; + } + + peer_list_resize_list(-1); + log_debug("Abstract_Socket::peer_list_reset_peer: New length is %d", peer_list_length); +} + +void Abstract_Socket::peer_list_resize_list(int client_id) { + int new_length=client_id; + if (new_length<0) new_length = peer_list_get_last_peer(); + new_length++; // index starts from 0 + log_debug("Abstract_Socket::peer_list_resize_list: Resizing to %d", new_length); + peer_list_root = (as_client_struct **)Realloc(peer_list_root, new_length*sizeof(as_client_struct *)); + + // initialize new entries + for (int i = peer_list_length; i < new_length; i++) + peer_list_root[i] = NULL; + + peer_list_length = new_length; + log_debug("Abstract_Socket::peer_list_resize_list: New length is %d", peer_list_length); +} + +int Abstract_Socket::peer_list_get_first_peer() const { + log_debug("Abstract_Socket::peer_list_get_first_peer: Finding first peer of the peer array"); + for (int i = 0; i < peer_list_length; i++) { + if (peer_list_root[i] != NULL) { + log_debug("Abstract_Socket::peer_list_get_first_peer: First peer is %d", i); + return i; + } + } + log_debug("Abstract_Socket::peer_list_get_first_peer: No active peer found"); + return -1; // this indicates an empty list +} + +int Abstract_Socket::peer_list_get_last_peer() const +{ + log_debug("Abstract_Socket::peer_list_get_last_peer: Finding last peer of the peer array"); + if (peer_list_length==0) { + log_debug("Abstract_Socket::peer_list_get_last_peer: No active peer found"); + return -1; + } + for (int i = peer_list_length - 1; i >= 0; i--) { + if (peer_list_root[i] != NULL) { + log_debug("Abstract_Socket::peer_list_get_last_peer: Last peer is %u", i); + return i; + } + } + log_debug("Abstract_Socket::peer_list_get_last_peer: No active peer found"); + return -1; // this indicates an empty list +} + +int Abstract_Socket::peer_list_get_nr_of_peers() const +{ + int nr=0; + for (int i = 0; i < peer_list_length; i++) + if (peer_list_root[i] != NULL) nr++; + log_debug("Abstract_Socket::peer_list_get_nr_of_peers: Number of active peers = %d", nr); + return nr; +} + +Abstract_Socket::as_client_struct *Abstract_Socket::get_peer (int client_id, bool no_error) const +{ + if (client_id >= peer_list_length){ + if(no_error) return NULL; + else log_error ("Index %d exceeds length of peer list.", client_id); + } + if (peer_list_root[client_id]==NULL){ + if(no_error) return NULL; + else log_error("Abstract_Socket::get_peer: Client %d does not exist", client_id); + } + return peer_list_root[client_id]; +} + +Abstract_Socket::as_client_struct * Abstract_Socket::peer_list_add_peer (int client_id) { + log_debug("Abstract_Socket::peer_list_add_peer: Adding client %d to peer list", client_id); + if (client_id<0) log_error("Invalid Client Id is given: %d.", client_id); + if (client_id>peer_list_get_last_peer()) peer_list_resize_list(client_id); + peer_list_root[client_id] = new as_client_struct; + peer_list_root[client_id]->user_data = NULL; + peer_list_root[client_id]->fd_buff = NULL; + peer_list_root[client_id]->tcp_state = CLOSED; + peer_list_root[client_id]->reading_state = STATE_NORMAL; + return peer_list_root[client_id]; +} + +void Abstract_Socket::peer_list_remove_peer (int client_id) { + + log_debug("Abstract_Socket::peer_list_remove_peer: Removing client %d from peer list", client_id); + if (client_id >= peer_list_length || client_id<0) log_error("Invalid Client Id is given: %d.", client_id); + if (peer_list_root[client_id] == NULL) log_error("Peer %d does not exist.", client_id); + + delete peer_list_root[client_id]; + peer_list_root[client_id] = NULL; + + peer_list_resize_list(-1); +} + + + +#ifdef AS_USE_SSL +/* + * Server mode + When the mode is server, first a TCP socket is created. The server starts + to listen on this port. Once a TCP connect request is received, the TCP + connection is setup. After this the SSL handshake begins. + The SSL is mapped to the file descriptor of the TCP socket. The BIO is + automatically created by OpenSSL inheriting the characteristics of the + socket (non-blocking mode). The BIO is completely transparent. + The server always sends its certificate to the client. If configured so, + the server will request the certificate of the client and check if it is + a valid certificate. If not, the SSL connection is refused. + If configured not to verify the certificate, the server will not request + it from the client and the SSL connection is accepted. + If usage of the SSL ssl_session resumption is enabled and + the client refers to a previous ssl_session, the server will accept it, + unless it is not found in the SSL context cache. + Once the connection is negotiated, data can be sent/received. + The SSL connection is shutted down on an unmap() operation. The shutdown + process does not follow the standard. The server simply shuts down and + does not expect any acknowledgement from the client. + Clients connected to the server are distinguished with their file + descriptor numbers. When a message is received, the file descriptor + number is also passed, so the client can be identified. + * Client mode + When the mode is client, first a TCP connection is requested to the + server. Once accepted, the SSL endpoint is created. + If configured so, the client tries to use the ssl_session Id from the + previous connection, if available (e.g. not the first connection). + If no ssl_session Id is available or the server does not accept it, + a full handshake if performed. + If configured so, the certificate of the server is verified. + If the verification fails, the SSL connection is interrupted by the + client. If no verification required, the received certificate is + still verified, however the result does not affect the connection + (might fail). + * ssl_verify_certificates() is a virtual function. It is called after + SSL connection is up. Testports may use it to check other peer's + certificate and do actions. If the return value is 0, then the + SSL connection is closed. In case of a client, the test port + exits with an error (verification_error). The server just removes + client data, but keeps running. + If ssl_verifiycertificate == "yes", then accept connections only + where certificate is valid + Further checks can be done using SSL_Socket::ssl_verify_certificates() + after the SSL connection is established with the following function call + sequence: + + remove_client(dest_fd); + peer_disconnected(dest_fd); + +*/ + + +// ssl_session ID context of the server +static unsigned char ssl_server_context_name[] = "McHalls&EduardWasHere"; +const unsigned char * SSL_Socket::ssl_server_auth_session_id_context = ssl_server_context_name; +// Password pointer +void *SSL_Socket::ssl_current_client = NULL; + + +SSL_Socket::SSL_Socket() +{ + ssl_use_ssl=false; + ssl_initialized=false; + ssl_key_file=NULL; + ssl_certificate_file=NULL; + ssl_trustedCAlist_file=NULL; + ssl_cipher_list=NULL; + ssl_verify_certificate=false; + ssl_use_session_resumption=true; + ssl_session=NULL; + ssl_password=NULL; + test_port_type=NULL; + test_port_name=NULL; + ssl_ctx = NULL; + ssl_current_ssl = NULL; + SSLv2=true; + SSLv3=true; + TLSv1=true; + TLSv1_1=true; + TLSv1_2=true; +} + +SSL_Socket::SSL_Socket(const char *tp_type, const char *tp_name) +{ + ssl_use_ssl=false; + ssl_initialized=false; + ssl_key_file=NULL; + ssl_certificate_file=NULL; + ssl_trustedCAlist_file=NULL; + ssl_cipher_list=NULL; + ssl_verify_certificate=false; + ssl_use_session_resumption=true; + ssl_session=NULL; + ssl_password=NULL; + test_port_type=tp_type; + test_port_name=tp_name; + ssl_ctx = NULL; + ssl_current_ssl = NULL; + SSLv2=true; + SSLv3=true; + TLSv1=true; + TLSv1_1=true; + TLSv1_2=true; +} + +SSL_Socket::~SSL_Socket() +{ + // now SSL context can be removed + if (ssl_use_ssl && ssl_ctx!=NULL) { + SSL_CTX_free(ssl_ctx); + } + delete [] ssl_key_file; + delete [] ssl_certificate_file; + delete [] ssl_trustedCAlist_file; + delete [] ssl_cipher_list; + delete [] ssl_password; +} + + +bool SSL_Socket::parameter_set(const char *parameter_name, + const char *parameter_value) +{ + log_debug("entering SSL_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); + + if(strcmp(parameter_name, ssl_use_ssl_name()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) ssl_use_ssl = true; + else if(strcasecmp(parameter_value, "no") == 0) ssl_use_ssl = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_use_ssl_name()); + } else if(strcmp(parameter_name, ssl_use_session_resumption_name()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) ssl_use_session_resumption = true; + else if(strcasecmp(parameter_value, "no") == 0) ssl_use_session_resumption = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_use_session_resumption_name()); + } else if(strcmp(parameter_name, ssl_private_key_file_name()) == 0) { + delete [] ssl_key_file; + ssl_key_file=new char[strlen(parameter_value)+1]; + strcpy(ssl_key_file, parameter_value); + } else if(strcmp(parameter_name, ssl_trustedCAlist_file_name()) == 0) { + delete [] ssl_trustedCAlist_file; + ssl_trustedCAlist_file=new char[strlen(parameter_value)+1]; + strcpy(ssl_trustedCAlist_file, parameter_value); + } else if(strcmp(parameter_name, ssl_certificate_file_name()) == 0) { + delete [] ssl_certificate_file; + ssl_certificate_file=new char[strlen(parameter_value)+1]; + strcpy(ssl_certificate_file, parameter_value); + } else if(strcmp(parameter_name, ssl_cipher_list_name()) == 0) { + delete [] ssl_cipher_list; + ssl_cipher_list=new char[strlen(parameter_value)+1]; + strcpy(ssl_cipher_list, parameter_value); + } else if(strcmp(parameter_name, ssl_password_name()) == 0) { + ssl_password=new char[strlen(parameter_value)+1]; + strcpy(ssl_password, parameter_value); + } else if(strcmp(parameter_name, ssl_verifycertificate_name()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) ssl_verify_certificate = true; + else if(strcasecmp(parameter_value, "no") == 0) ssl_verify_certificate = false; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_verifycertificate_name()); + } else if(strcasecmp(parameter_name, ssl_disable_SSLv2()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) SSLv2= false; + else if(strcasecmp(parameter_value, "no") == 0) SSLv2 = true; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_SSLv2()); + } else if(strcasecmp(parameter_name, ssl_disable_SSLv3()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) SSLv2 = false; + else if(strcasecmp(parameter_value, "no") == 0) SSLv2 = true; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_SSLv3()); + } else if(strcasecmp(parameter_name, ssl_disable_TLSv1()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) TLSv1= false; + else if(strcasecmp(parameter_value, "no") == 0) TLSv1 = true; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_TLSv1()); + } else if(strcasecmp(parameter_name, ssl_disable_TLSv1_1()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) TLSv1_1 = false; + else if(strcasecmp(parameter_value, "no") == 0) TLSv1_1 = true; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_TLSv1_1()); + } else if(strcasecmp(parameter_name, ssl_disable_TLSv1_2()) == 0) { + if(strcasecmp(parameter_value, "yes") == 0) TLSv1_2 = false; + else if(strcasecmp(parameter_value, "no") == 0) TLSv1_2 = true; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_TLSv1_2()); + } else { + log_debug("leaving SSL_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); + return Abstract_Socket::parameter_set(parameter_name, parameter_value); + } + log_debug("leaving SSL_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); + return true; +} + + +bool SSL_Socket::add_user_data(int client_id) { + + log_debug("entering SSL_Socket::add_user_data()"); + if (!ssl_use_ssl) { + log_debug("leaving SSL_Socket::add_user_data()"); + return Abstract_Socket::add_user_data(client_id); + } + + ssl_init_SSL(); + + log_debug("Create a new SSL object"); + if (ssl_ctx==NULL) + log_error("No SSL CTX found, SSL not initialized"); + ssl_current_ssl=SSL_new(ssl_ctx); + + if (ssl_current_ssl==NULL) + log_error("Creation of SSL object failed"); +#ifdef SSL_OP_NO_SSLv2 + if(!SSLv2){ + SSL_set_options(ssl_current_ssl,SSL_OP_NO_SSLv2); + } +#endif +#ifdef SSL_OP_NO_SSLv3 + if(!SSLv3){ + SSL_set_options(ssl_current_ssl,SSL_OP_NO_SSLv3); + } +#endif +#ifdef SSL_OP_NO_TLSv1 + if(!TLSv1){ + SSL_set_options(ssl_current_ssl,SSL_OP_NO_TLSv1); + } +#endif +#ifdef SSL_OP_NO_TLSv1_1 + if(!TLSv1_1){ + SSL_set_options(ssl_current_ssl,SSL_OP_NO_TLSv1_1); + } +#endif +#ifdef SSL_OP_NO_TLSv1_2 + if(!TLSv1_2){ + SSL_set_options(ssl_current_ssl,SSL_OP_NO_TLSv1_2); + } +#endif + + set_user_data(client_id, ssl_current_ssl); + log_debug("New client added with key '%d'", client_id); + log_debug("Binding SSL to the socket"); + if (SSL_set_fd(ssl_current_ssl, client_id)!=1) + log_error("Binding of SSL object to socket failed"); + + // Conext change for SSL objects may come here in the + // future. + + if (Abstract_Socket::get_server_mode()) { + log_debug("Accept SSL connection request"); + if (ssl_current_client!=NULL) log_warning("Warning: race condition while setting current client object pointer"); + ssl_current_client=(SSL_Socket *)this; + if (ssl_getresult(SSL_accept(ssl_current_ssl))!=SSL_ERROR_NONE) { + log_warning("Connection from client %d is refused", client_id); + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::add_user_data()"); + return false; + } + ssl_current_client=NULL; + + } else { + if (ssl_use_session_resumption && ssl_session!=NULL) { + log_debug("Try to use ssl_session resumption"); + if (ssl_getresult(SSL_set_session(ssl_current_ssl, ssl_session))!=SSL_ERROR_NONE) + log_error("SSL error occured"); + } + + log_debug("Connect to server"); + if (ssl_current_client!=NULL) log_warning("Warning: race condition while setting current client object pointer"); + ssl_current_client=(SSL_Socket *)this; + // + + while(true) + { + int res = ssl_getresult(SSL_connect(ssl_current_ssl)); + switch (res) { + case SSL_ERROR_NONE: break; + case SSL_ERROR_WANT_WRITE: + ssl_current_client = NULL; + TTCN_Snapshot::block_for_sending(client_id); + continue; + case SSL_ERROR_WANT_READ: + for(;;) { + pollfd pollClientFd = { client_id, POLLIN, 0 }; + int nEvents = poll(&pollClientFd, 1, 0); + if (nEvents == 1 && (pollClientFd.revents & (POLLIN | POLLHUP)) != 0) + break; + if(nEvents < 0 && errno != EINTR) + log_error("System call poll() failed on file descriptor %d", client_id); + } + continue; + default: + log_warning("Connection to server is refused"); + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::add_user_data()"); + return false; + } + break; + } //while + + + ssl_current_client=NULL; + if (ssl_use_session_resumption) { + log_debug("Connected, get new ssl_session"); + ssl_session=SSL_get1_session(ssl_current_ssl); + if (ssl_session==NULL) + log_warning("Server did not send a session ID"); + } + } + + if (ssl_use_session_resumption) { + if (SSL_session_reused(ssl_current_ssl)) log_debug("Session was reused"); + else log_debug("Session was not reused"); + } + + if (!ssl_verify_certificates()) { // remove client + log_warning("Verification failed"); + log_debug("leaving SSL_Socket::add_user_data()"); + return false; + + } + log_debug("leaving SSL_Socket::add_user_data()"); + return true; +} + + +bool SSL_Socket::remove_user_data(int client_id) { + + log_debug("entering SSL_Socket::remove_user_data()"); + if (!ssl_use_ssl) { + log_debug("leaving SSL_Socket::remove_user_data()"); + return Abstract_Socket::remove_user_data(client_id); + } + ssl_current_ssl = (SSL*)get_user_data(client_id); + if (ssl_current_ssl!=NULL) { + SSL_shutdown(ssl_current_ssl); + SSL_free(ssl_current_ssl); + } else + log_warning("SSL object not found for client %d", client_id); + log_debug("leaving SSL_Socket::remove_user_data()"); + return true; +} + + + +bool SSL_Socket::user_all_mandatory_configparameters_present() { + if (!ssl_use_ssl) { return true; } + if (Abstract_Socket::get_server_mode()) { + if (ssl_certificate_file==NULL) + log_error("%s is not defined in the configuration file", ssl_certificate_file_name()); + if (ssl_trustedCAlist_file==NULL) + log_error("%s is not defined in the configuration file", ssl_trustedCAlist_file_name()); + if (ssl_key_file==NULL) + log_error("%s is not defined in the configuration file", ssl_private_key_file_name()); + } else { + if (ssl_verify_certificate && ssl_trustedCAlist_file==NULL) + log_error("%s is not defined in the configuration file altough %s=yes", ssl_trustedCAlist_file_name(), ssl_verifycertificate_name()); + } + return true; +} + + + +//STATE_WAIT_FOR_RECEIVE_CALLBACK: if the SSL_read operation would +// block because the socket is not ready for writing, +// I set the socket state to this state and add the file +// descriptor to the Event_Handler. The Event_Handler will +// wake up and call the receive_message_on_fd operation +// if the socket is ready to write. +//If the SSL_read operation would block because the socket is not ready for +//reading, I do nothing +int SSL_Socket::receive_message_on_fd(int client_id) +{ + log_debug("entering SSL_Socket::receive_message_on_fd()"); + if (!ssl_use_ssl) { + log_debug("leaving SSL_Socket::receive_message_on_fd()"); + return Abstract_Socket::receive_message_on_fd(client_id); + } + + if (ssl_current_client!=NULL) log_warning("Warning: race condition while setting current client object pointer"); + ssl_current_client=(SSL_Socket *)this; + + as_client_struct* peer = get_peer(client_id); // check if client exists + if (peer->reading_state == STATE_WAIT_FOR_RECEIVE_CALLBACK){ + Remove_Fd_Write_Handler(client_id); + log_debug("SSL_Socket::receive_message_on_fd: setting socket state to STATE_NORMAL"); + peer->reading_state = STATE_NORMAL; + } + TTCN_Buffer* recv_tb = get_buffer(client_id); + ssl_current_ssl=(SSL*)get_user_data(client_id); + int messageLength=0; + size_t end_len=AS_SSL_CHUNCK_SIZE; + unsigned char *end_ptr; + while (messageLength<=0) { + log_debug(" one read cycle started"); + recv_tb->get_end(end_ptr, end_len); + messageLength = SSL_read(ssl_current_ssl, end_ptr, end_len); + if (messageLength <= 0) { + int res=ssl_getresult(messageLength); + switch (res) { + case SSL_ERROR_ZERO_RETURN: + log_debug("SSL_Socket::receive_message_on_fd: SSL connection was interrupted by the other side"); + SSL_set_quiet_shutdown(ssl_current_ssl, 1); + log_debug("SSL_ERROR_ZERO_RETURN is received, setting SSL SHUTDOWN mode to QUIET"); + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::receive_message_on_fd() with SSL_ERROR_ZERO_RETURN"); + return 0; + case SSL_ERROR_WANT_WRITE://writing would block + if (get_use_non_blocking_socket()){ + Add_Fd_Write_Handler(client_id); + log_debug("SSL_Socket::receive_message_on_fd: setting socket state to STATE_WAIT_FOR_RECEIVE_CALLBACK"); + peer->reading_state = STATE_WAIT_FOR_RECEIVE_CALLBACK; + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::receive_message_on_fd()"); + return -2; + } + case SSL_ERROR_WANT_READ: //reading would block, continue processing data + if (get_use_non_blocking_socket()){ + log_debug("SSL_Socket::receive_message_on_fd: reading would block, leaving SSL_Socket::receive_message_on_fd()"); + ssl_current_client = NULL; + log_debug("leaving SSL_Socket::receive_message_on_fd()"); + return -2; + } + log_debug("repeat the read operation to finish the pending SSL handshake"); + break; + default: + log_error("SSL error occured"); + } + } else { + recv_tb->increase_length(messageLength); + } + } + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::receive_message_on_fd() with number of bytes read: %d", messageLength); + return messageLength; +} + + +int SSL_Socket::send_message_on_fd(int client_id, const unsigned char* send_par, int message_length) +{ + log_debug("entering SSL_Socket::send_message_on_fd()"); + + if (!ssl_use_ssl) { + log_debug("leaving SSL_Socket::send_message_on_fd()"); + return Abstract_Socket::send_message_on_fd(client_id, send_par, message_length); + } + + if (ssl_current_client!=NULL) log_warning("Warning: race condition while setting current client object pointer"); + ssl_current_client=(SSL_Socket *)this; + + get_peer(client_id); // check if client exists + ssl_current_ssl=(SSL*)get_user_data(client_id); + if (ssl_current_ssl==NULL) { log_error("No SSL data available for client %d", client_id); } + log_debug("Client ID = %d", client_id); + while (true) { + log_debug(" one write cycle started"); + + int res = ssl_getresult(SSL_write(ssl_current_ssl, send_par, message_length)); + switch (res) { + case SSL_ERROR_NONE: + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::send_message_on_fd()"); + return message_length; + case SSL_ERROR_WANT_WRITE: + case SSL_ERROR_WANT_READ: + log_debug("repeat the write operation to finish the pending SSL handshake"); + break; + case SSL_ERROR_ZERO_RETURN: + log_warning("SSL_Socket::send_message_on_fd: SSL connection was interrupted by the other side"); + SSL_set_quiet_shutdown(ssl_current_ssl, 1); + log_debug("SSL_ERROR_ZERO_RETURN is received, setting SSL SHUTDOWN mode to QUIET"); + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::send_message_on_fd()"); + return -1; + default: + log_debug("SSL error occured"); + return -1; + } + } + // avoid compiler warnings + return 0; +} + +//If the socket is not ready for writing, the same mechanism is used +//as described at the Abstract_Socket class +//If the socket is not ready for reading, I block the execution using +//the take_new operation while the socket is not ready for reading. +//While this operation will call the Event_Handler, +//I indicate with the STATE_DONT_RECEIVE state that from the Event_Handler the receive_message_on_fd +//operation must not be called for this socket. +int SSL_Socket::send_message_on_nonblocking_fd(int client_id, const unsigned char* send_par, int message_length){ + log_debug("entering SSL_Socket::send_message_on_nonblocking_fd()"); + + if (!ssl_use_ssl) { + log_debug("leaving SSL_Socket::send_message_on_nonblocking_fd()"); + return Abstract_Socket::send_message_on_nonblocking_fd(client_id, send_par, message_length); + } + + as_client_struct* peer; + if (ssl_current_client!=NULL) log_warning("Warning: race condition while setting current client object pointer"); + ssl_current_client=(SSL_Socket *)this; + + get_peer(client_id); + ssl_current_ssl=(SSL*)get_user_data(client_id); + if (ssl_current_ssl==NULL) { log_error("No SSL data available for client %d", client_id); } + log_debug("Client ID = %d", client_id); + while (true) { + int res; + peer = get_peer(client_id); // check if client exists + log_debug(" one write cycle started"); + ssl_current_ssl = (SSL*)get_user_data(client_id); + if (peer -> reading_state == STATE_DONT_CLOSE){ + goto client_closed_connection; + }else res = ssl_getresult(SSL_write(ssl_current_ssl, send_par, message_length)); + + switch (res) { + case SSL_ERROR_NONE: + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::send_message_on_nonblocking_fd()"); + log_debug("SSL_Socket::send_message_on_nonblocking_fd: setting socket state to STATE_NORMAL"); + peer -> reading_state = STATE_NORMAL; + return message_length; + case SSL_ERROR_WANT_WRITE: + if (peer == NULL){ + log_error("SSL_Socket::send_message_on_nonblocking_fd, Client ID %d does not exist.", client_id); + } + int old_bufsize, new_bufsize; + if (increase_send_buffer(client_id, old_bufsize, new_bufsize)) { + log_debug("Sending data on on file descriptor %d",client_id); + log_debug("The sending operation would block execution. The " + "size of the outgoing buffer was increased from %d to " + "%d bytes.",old_bufsize, + new_bufsize); + } else { + log_warning("Sending data on file descriptor %d", client_id); + log_warning("The sending operation would block execution and it " + "is not possible to further increase the size of the " + "outgoing buffer. Trying to process incoming data to " + "avoid deadlock."); + ssl_current_client=NULL; + log_debug("SSL_Socket::send_message_on_nonblocking_fd: setting socket state to STATE_BLOCK_FOR_SENDING"); + peer->reading_state = STATE_BLOCK_FOR_SENDING; + TTCN_Snapshot::block_for_sending(client_id); + } + peer = get_peer(client_id); // check if client exists + if (peer == NULL){ + log_error("SSL_Socket::send_message_on_nonblocking_fd, Client ID %d does not exist.", client_id); + } + break; + case SSL_ERROR_WANT_READ: + //receiving buffer is probably empty thus reading would block execution + log_debug("SSL_write cannot read data from socket %d. Trying to process data to avoid deadlock.", client_id); + log_debug("SSL_Socket::send_message_on_nonblocking_fd: setting socket state to STATE_DONT_RECEIVE"); + peer -> reading_state = STATE_DONT_RECEIVE; //don't call receive_message_on_fd() to this socket + for (;;) { + TTCN_Snapshot::take_new(TRUE); + pollfd pollClientFd = { client_id, POLLIN, 0 }; + int nEvents = poll(&pollClientFd, 1, 0); + if (nEvents == 1 && (pollClientFd.revents & (POLLIN | POLLHUP)) != 0) + break; + if (nEvents < 0 && errno != EINTR) + log_error("System call poll() failed on file descriptor %d", client_id); + } + log_debug("Deadlock resolved"); + break; + case SSL_ERROR_ZERO_RETURN: + goto client_closed_connection; + default: + log_warning("SSL error occured"); + return -1; + } + } + +client_closed_connection: + log_warning("SSL_Socket::send_message_on_nonblocking_fd: SSL connection was interrupted by the other side"); + SSL_set_quiet_shutdown(ssl_current_ssl, 1); + log_debug("Setting SSL SHUTDOWN mode to QUIET"); + ssl_current_client=NULL; + log_debug("leaving SSL_Socket::send_message_on_nonblocking_fd()"); + log_debug("SSL_Socket::send_message_on_nonblocking_fd: setting socket state to STATE_NORMAL"); + peer -> reading_state = STATE_NORMAL; + errno = EPIPE; + return -1; + +} + +bool SSL_Socket::ssl_verify_certificates() +{ + char str[SSL_CHARBUF_LENGTH]; + + log_debug("entering SSL_Socket::ssl_verify_certificates()"); + + ssl_log_SSL_info(); + + // Get the other side's certificate + log_debug("Check certificate of the other party"); + X509 *cert = SSL_get_peer_certificate (ssl_current_ssl); + if (cert != NULL) { + + { + log_debug("Certificate information:"); + X509_NAME_oneline (X509_get_subject_name (cert), str, SSL_CHARBUF_LENGTH); + log_debug(" subject: %s", str); + } + + // We could do all sorts of certificate verification stuff here before + // deallocating the certificate. + + // Just a basic check that the certificate is valid + // Other checks (e.g. Name in certificate vs. hostname) shall be + // done on application level + if (ssl_verify_certificate) + log_debug("Verification state is: %s", X509_verify_cert_error_string(SSL_get_verify_result(ssl_current_ssl))); + X509_free (cert); + + } else + log_warning("Other side does not have certificate."); + + log_debug("leaving SSL_Socket::ssl_verify_certificates()"); + return true; +} + + + +// Data set/get functions +char * SSL_Socket::get_ssl_password() const {return ssl_password;} +void SSL_Socket::set_ssl_use_ssl(bool par) {ssl_use_ssl=par;} +void SSL_Socket::set_ssl_verifycertificate(bool par) {ssl_verify_certificate=par;} +void SSL_Socket::set_ssl_use_session_resumption(bool par) {ssl_use_session_resumption=par;} +void SSL_Socket::set_ssl_key_file(char * par) { + delete [] ssl_key_file; + ssl_key_file=par; +} +void SSL_Socket::set_ssl_certificate_file(char * par) { + delete [] ssl_certificate_file; + ssl_certificate_file=par; +} +void SSL_Socket::set_ssl_trustedCAlist_file(char * par) { + delete [] ssl_trustedCAlist_file; + ssl_trustedCAlist_file=par; +} +void SSL_Socket::set_ssl_cipher_list(char * par) { + delete [] ssl_cipher_list; + ssl_cipher_list=par; +} +void SSL_Socket::set_ssl_server_auth_session_id_context(const unsigned char * par) { + ssl_server_auth_session_id_context=par; +} + +// Default parameter names +const char* SSL_Socket::ssl_use_ssl_name() { return "ssl_use_ssl";} +const char* SSL_Socket::ssl_use_session_resumption_name() { return "ssl_use_session_resumption";} +const char* SSL_Socket::ssl_private_key_file_name() { return "ssl_private_key_file";} +const char* SSL_Socket::ssl_trustedCAlist_file_name() { return "ssl_trustedCAlist_file";} +const char* SSL_Socket::ssl_certificate_file_name() { return "ssl_certificate_chain_file";} +const char* SSL_Socket::ssl_password_name() { return "ssl_private_key_password";} +const char* SSL_Socket::ssl_cipher_list_name() { return "ssl_allowed_ciphers_list";} +const char* SSL_Socket::ssl_verifycertificate_name() { return "ssl_verify_certificate";} +const char* SSL_Socket::ssl_disable_SSLv2() { return "ssl_disable_SSLv2";} +const char* SSL_Socket::ssl_disable_SSLv3() { return "ssl_disable_SSLv3";} +const char* SSL_Socket::ssl_disable_TLSv1() { return "ssl_disable_TLSv1";} +const char* SSL_Socket::ssl_disable_TLSv1_1() { return "ssl_disable_TLSv1_1";} +const char* SSL_Socket::ssl_disable_TLSv1_2() { return "ssl_disable_TLSv1_2";} + + +void SSL_Socket::ssl_actions_to_seed_PRNG() { + struct stat randstat; + + if(RAND_status()) { + log_debug("PRNG already initialized, no action needed"); + return; + } + log_debug("Seeding PRND"); + // OpenSSL tries to use random devives automatically + // these would not be necessary + if (!stat("/dev/urandom", &randstat)) { + log_debug("Using installed random device /dev/urandom for seeding the PRNG with %d bytes.", SSL_PRNG_LENGTH); + if (RAND_load_file("/dev/urandom", SSL_PRNG_LENGTH)!=SSL_PRNG_LENGTH) + log_error("Could not read from /dev/urandom"); + } else if (!stat("/dev/random", &randstat)) { + log_debug("Using installed random device /dev/random for seeding the PRNG with %d bytes.", SSL_PRNG_LENGTH); + if (RAND_load_file("/dev/random", SSL_PRNG_LENGTH)!=SSL_PRNG_LENGTH) + log_error("Could not read from /dev/random"); + } else { + /* Neither /dev/random nor /dev/urandom are present, so add + entropy to the SSL PRNG a hard way. */ + log_warning("Solaris patches to provide random generation devices are not installed.\nSee http://www.openssl.org/support/faq.html \"Why do I get a \"PRNG not seeded\" error message?\"\nA workaround will be used."); + for (int i = 0; i < 10000 && !RAND_status(); ++i) { + char buf[4]; + struct timeval tv; + gettimeofday(&tv, 0); + buf[0] = tv.tv_usec & 0xF; + buf[2] = (tv.tv_usec & 0xF0) >> 4; + buf[3] = (tv.tv_usec & 0xF00) >> 8; + buf[1] = (tv.tv_usec & 0xF000) >> 12; + RAND_add(buf, sizeof buf, 0.1); + } + return; + } + + if(!RAND_status()) { + log_error("Could not seed the Pseudo Random Number Generator with enough data."); + } else { + log_debug("PRNG successfully initialized."); + } +} + + +void SSL_Socket::ssl_init_SSL() +{ + if (ssl_initialized) { + log_debug("SSL already initialized, no action needed"); + return; + } + + { + log_debug("Init SSL started"); + log_debug("Using %s (%lx)", SSLeay_version(SSLEAY_VERSION), OPENSSL_VERSION_NUMBER); + } + + SSL_library_init(); // initialize library + SSL_load_error_strings(); // readable error messages + + // Create SSL method: both server and client understanding SSLv2, SSLv3, TLSv1 +// ssl_method = SSLv23_method(); +// if (ssl_method==NULL) +// log_error("SSL method creation failed."); + // Create context + ssl_ctx = SSL_CTX_new (SSLv23_method()); + if (ssl_ctx==NULL) + log_error("SSL context creation failed."); + + // valid for all SSL objects created from this context afterwards + if(ssl_certificate_file!=NULL) { + log_debug("Loading certificate file"); + if(SSL_CTX_use_certificate_chain_file(ssl_ctx, ssl_certificate_file)!=1) + log_error("Can't read certificate file "); + } + + // valid for all SSL objects created from this context afterwards + if(ssl_key_file!=NULL) { + log_debug("Loading key file"); + if (ssl_current_client!=NULL) log_warning("Warning: race condition while setting current client object pointer"); + ssl_current_client=(SSL_Socket *)this; + if(ssl_password!=NULL) + SSL_CTX_set_default_passwd_cb(ssl_ctx, ssl_password_cb); + if(SSL_CTX_use_PrivateKey_file(ssl_ctx, ssl_key_file, SSL_FILETYPE_PEM)!=1) + log_error("Can't read key file "); + ssl_current_client=NULL; + } + + if (ssl_trustedCAlist_file!=NULL) { + log_debug("Loading trusted CA list file"); + if (SSL_CTX_load_verify_locations(ssl_ctx, ssl_trustedCAlist_file, NULL)!=1) + log_error("Can't read trustedCAlist file "); + } + + if (ssl_certificate_file!=NULL && ssl_key_file!=NULL) { + log_debug("Check for consistency between private and public keys"); + if (SSL_CTX_check_private_key(ssl_ctx)!=1) + log_warning("Private key does not match the certificate public key"); + } + + // check the other side's certificates + if (ssl_verify_certificate) { + log_debug("Setting verification behaviour: verification required and do not allow to continue on failure.."); + SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, ssl_verify_callback); + } else { + log_debug("Setting verification behaviour: verification not required and do allow to continue on failure.."); + SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, ssl_verify_callback); + } + + if (ssl_cipher_list!=NULL) { + log_debug("Setting ssl_cipher list restrictions"); + if (SSL_CTX_set_cipher_list(ssl_ctx, ssl_cipher_list)!=1) + log_error("Cipher list restriction failed for %s", ssl_cipher_list); + } + + ssl_actions_to_seed_PRNG(); + + if (Abstract_Socket::get_server_mode() && ssl_use_session_resumption) { + log_debug("Prepare server for ssl_session resumption"); + + log_debug("Context is: %s; length = %lu", ssl_server_auth_session_id_context, (unsigned long)strlen((const char*)ssl_server_auth_session_id_context)); + if (SSL_CTX_set_session_id_context(ssl_ctx, ssl_server_auth_session_id_context, strlen((const char*)ssl_server_auth_session_id_context))!=1) + log_error("Activation of SSL ssl_session resumption failed on server"); + } + + ssl_initialized=true; + + log_debug("Init SSL successfully finished"); +} + + +void SSL_Socket::ssl_log_SSL_info() +{ + char str[SSL_CHARBUF_LENGTH]; + + log_debug("Check SSL description"); + const SSL_CIPHER *ssl_cipher=SSL_get_current_cipher(ssl_current_ssl); + if (ssl_cipher!=NULL) { + SSL_CIPHER_description(SSL_get_current_cipher(ssl_current_ssl), str, SSL_CHARBUF_LENGTH); + { + log_debug("SSL description:"); + log_debug("%s", str); + } + } +} + + + +// Log the SSL error and flush the error queue +// Can be used after the followings: +// SSL_connect(), SSL_accept(), SSL_do_handshake(), +// SSL_read(), SSL_peek(), or SSL_write() +int SSL_Socket::ssl_getresult(int res) +{ + int err = SSL_get_error(ssl_current_ssl, res); + + log_debug("SSL operation result:"); + + switch(err) { + case SSL_ERROR_NONE: + log_debug("SSL_ERROR_NONE"); + break; + case SSL_ERROR_ZERO_RETURN: + log_debug("SSL_ERROR_ZERO_RETURN"); + break; + case SSL_ERROR_WANT_READ: + log_debug("SSL_ERROR_WANT_READ"); + break; + case SSL_ERROR_WANT_WRITE: + log_debug("SSL_ERROR_WANT_WRITE"); + break; + case SSL_ERROR_WANT_CONNECT: + log_debug("SSL_ERROR_WANT_CONNECT"); + break; + case SSL_ERROR_WANT_ACCEPT: + log_debug("SSL_ERROR_WANT_ACCEPT"); + break; + case SSL_ERROR_WANT_X509_LOOKUP: + log_debug("SSL_ERROR_WANT_X509_LOOKUP"); + break; + case SSL_ERROR_SYSCALL: + log_debug("SSL_ERROR_SYSCALL"); + log_debug("EOF was observed that violates the protocol, peer disconnected; treated as a normal disconnect"); + return SSL_ERROR_ZERO_RETURN; + break; + case SSL_ERROR_SSL: + log_debug("SSL_ERROR_SSL"); + break; + default: + log_error("Unknown SSL error code: %d", err); + } + // get the copy of the error string in readable format + unsigned long e=ERR_get_error(); + while (e) { + log_debug("SSL error queue content:"); + log_debug(" Library: %s", ERR_lib_error_string(e)); + log_debug(" Function: %s", ERR_func_error_string(e)); + log_debug(" Reason: %s", ERR_reason_error_string(e)); + e=ERR_get_error(); + } + //It does the same but more simple: + // ERR_print_errors_fp(stderr); + return err; +} + +int SSL_Socket::ssl_verify_certificates_at_handshake(int /*preverify_ok*/, X509_STORE_CTX */*ssl_ctx*/) { + // don't care by default + return -1; +} + +// Callback function used by OpenSSL. +// Called when a password is needed to decrypt the private key file. +// NOTE: not thread safe +int SSL_Socket::ssl_password_cb(char *buf, int num, int /*rwflag*/,void */*userdata*/) { + + if (ssl_current_client!=NULL) { + char *ssl_client_password; + ssl_client_password=((SSL_Socket *)ssl_current_client)->get_ssl_password(); + if(ssl_client_password==NULL) return 0; + const char* pass = (const char*) ssl_client_password; + int pass_len = strlen(pass) + 1; + if (num < pass_len) return 0; + + strcpy(buf, pass); + return(strlen(pass)); + } else { // go on with no password set + fprintf(stderr, "Warning: no current SSL object found but ssl_password_cb is called, programming error\n"); + return 0; + } +} + +// Callback function used by OpenSSL. +// Called during SSL handshake with a pre-verification status. +int SSL_Socket::ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ssl_ctx) +{ + SSL *ssl_pointer; + SSL_CTX *ctx_pointer; + int user_result; + + ssl_pointer = (SSL *)X509_STORE_CTX_get_ex_data(ssl_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); + ctx_pointer = SSL_get_SSL_CTX(ssl_pointer); + + if (ssl_current_client!=NULL) { + // if ssl_verifiycertificate == "no", then always accept connections + if(((SSL_Socket *)ssl_current_client)->ssl_verify_certificate) { + user_result=((SSL_Socket *)ssl_current_client)->ssl_verify_certificates_at_handshake(preverify_ok, ssl_ctx); + if (user_result>=0) return user_result; + } else { + return 1; + } + } else { // go on with default authentication + fprintf(stderr, "Warning: no current SSL object found but ssl_verify_callback is called, programming error\n"); + } + + // if ssl_verifiycertificate == "no", then always accept connections + if (SSL_CTX_get_verify_mode(ctx_pointer) == SSL_VERIFY_NONE) + return 1; + // if ssl_verifiycertificate == "yes", then accept connections only if the + // certificate is valid + else if (SSL_CTX_get_verify_mode(ctx_pointer) & SSL_VERIFY_PEER) { + return preverify_ok; + } + // something went wrong + else + return 0; +} + +#endif diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.grp b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.grp new file mode 100644 index 0000000000000000000000000000000000000000..bd7791173ba5c111b7f956b16e80fbc80ee3b80f --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.grp @@ -0,0 +1,35 @@ + + + + + + + + diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh new file mode 100644 index 0000000000000000000000000000000000000000..7de8446c0bb381b290314e418868e2db3310781f --- /dev/null +++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh @@ -0,0 +1,414 @@ +/****************************************************************************** +* Copyright (c) 2000-2019 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v2.0 +* which accompanies this distribution, and is available at +* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +* +* Contributors: +* Zoltan Bibo - initial implementation and initial documentation +* Gergely Futo +* Oliver Ferenc Czerman +* Balasko Jeno +* Zoltan Bibo +* Eduard Czimbalmos +* Kulcsr Endre +* Gabor Szalai +* Jozsef Gyurusi +* Csndes Tibor +* Zoltan Jasz +******************************************************************************/ +// +// File: Abstract_Socket.hh +// Description: Abstract_Socket header file +// Rev: R9B +// Prodnr: CNL 113 384 +// + + +#ifndef Abstract_Socket_HH +#define Abstract_Socket_HH + +#ifdef AS_USE_SSL +#include +#include +#include +#endif + +#include +#include +#include + +// to support systems not supporting IPv6 define AF_INET6 to some dummy value: +#ifndef AF_INET6 +#define AF_INET6 (-255) +#endif + +class PacketHeaderDescr { +public: + // Byte order in the header + enum HeaderByteOrder{ Header_MSB, Header_LSB }; +private: + unsigned long length_offset; + unsigned long nr_bytes_in_length; + HeaderByteOrder byte_order; + long value_offset; + unsigned long length_multiplier; +public: + PacketHeaderDescr(unsigned long p_length_offset, + unsigned long p_nr_bytes_in_length, HeaderByteOrder p_byte_order, + long p_value_offset = 0, unsigned long p_length_multiplier = 1) + : length_offset(p_length_offset), nr_bytes_in_length(p_nr_bytes_in_length), + byte_order(p_byte_order), value_offset(p_value_offset), + length_multiplier(p_length_multiplier) { } + + // returns the message length + unsigned long Get_Message_Length(const unsigned char* buffer_pointer) const; + // returns the number of bytes needed to have a valid message length + inline unsigned long Get_Valid_Header_Length() const + { return length_offset + nr_bytes_in_length; } +}; + +class Abstract_Socket +{ +protected: + enum TCP_STATES {CLOSED, LISTEN, ESTABLISHED, CLOSE_WAIT, FIN_WAIT}; + enum READING_STATES {STATE_DONT_RECEIVE, STATE_WAIT_FOR_RECEIVE_CALLBACK, STATE_BLOCK_FOR_SENDING, STATE_DONT_CLOSE, STATE_NORMAL}; + // client data + struct as_client_struct { + void *user_data; // pointer to any additional data needed by the user + TTCN_Buffer *fd_buff; // pointer to the data buffer + struct sockaddr_storage clientAddr;// client address +#if defined LINUX || defined FREEBSD || defined SOLARIS8 + socklen_t +#else /* SOLARIS or WIN32 */ + int +#endif + clientAddrlen; + TCP_STATES tcp_state; // TCP state + READING_STATES reading_state; //used when SSL_write returns SSL_ERROR_WANT_READ an we are using non-blocking socket + }; + + Abstract_Socket(); + Abstract_Socket(const char *testport_type, const char *testport_name); + virtual ~Abstract_Socket(); + + // Shall be called from set_parameter() + bool parameter_set(const char *parameter_name, const char *parameter_value); + // Shall be called from user_map() + void map_user(); + // Shall be called from user_unmap() + void unmap_user(); + + // puts the IP address in the addr + void get_host_id(const char* hostName, struct sockaddr_in *addr); /* This function should not be used! Use getaddrinfo instead! */ + + // Closes the current listening port and opens the specified one + int open_listen_port(const struct sockaddr_in & localAddr); /* This function should be removed! Deprecated by: */ + int open_listen_port(const char* localHostname, const char* localServicename); + // Closes the current listening port + void close_listen_port(); + + virtual void listen_port_opened(int port_number); + + // Opens a new client connection + int open_client_connection(const struct sockaddr_in & new_remote_addr, const struct sockaddr_in & new_local_addr); /* This function should be removed! Deprecated by: */ + int open_client_connection(const char* remoteHostname, const char* remoteService, const char* localHostname, const char* localService); + + virtual void client_connection_opened(int client_id); + + // Shall be called from Handle_Fd_Event() + void Handle_Socket_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error); + // Shall be called from Handle_Timeout() - for possible future development + void Handle_Timeout_Event(double /*time_since_last_call*/) {}; + + // Shall be called from outgoing_send() + void send_outgoing(const unsigned char* message_buffer, int length, int client_id = -1); + void send_shutdown(int client_id = -1); + + // Access to private variables + bool get_nagling() const {return nagling;} + bool get_use_non_blocking_socket() const {return use_non_blocking_socket;}; + bool get_server_mode() const {return server_mode;} + bool get_socket_debugging() const {return socket_debugging;} + bool get_halt_on_connection_reset() const {return halt_on_connection_reset;} + bool get_use_connection_ASPs() const {return use_connection_ASPs;} + bool get_handle_half_close() const {return handle_half_close;} + int get_socket_fd() const; + int get_listen_fd() const {return listen_fd;} + + //set non-blocking mode + int set_non_block_mode(int fd, bool enable_nonblock); + + //increase buffer size + bool increase_send_buffer(int fd, int &old_size, int& new_size); + + const char* get_local_host_name(){return local_host_name; }; + unsigned int get_local_port_number(){return local_port_number; }; + const char* get_remote_host_name(){return remote_host_name; }; + unsigned int get_remote_port_number(){return remote_port_number; }; + const struct sockaddr_in & get_remote_addr() {return remoteAddr; }; /* FIXME: This function is deprecated and should be removed! */ + const struct sockaddr_in & get_local_addr() {return localAddr; }; /* FIXME: This function is deprecated and should be removed! */ + const int& get_ai_family() const {return ai_family;} + void set_ai_family(int parameter_value) {ai_family=parameter_value;} + bool get_ttcn_buffer_usercontrol() const {return ttcn_buffer_usercontrol; } + void set_nagling(bool parameter_value) {nagling=parameter_value;} + void set_server_mode(bool parameter_value) {server_mode=parameter_value;} + void set_handle_half_close(bool parameter_value) {handle_half_close=parameter_value;} + void set_socket_debugging(bool parameter_value) {socket_debugging=parameter_value;} + void set_halt_on_connection_reset(bool parameter_value) {halt_on_connection_reset=parameter_value;} + void set_ttcn_buffer_usercontrol(bool parameter_value) {ttcn_buffer_usercontrol=parameter_value;} + const char *test_port_type; + const char *test_port_name; + + // Called when a message is received + virtual void message_incoming(const unsigned char* message_buffer, int length, int client_id = -1) = 0; + + virtual void Add_Fd_Read_Handler(int fd) = 0; + virtual void Add_Fd_Write_Handler(int fd) = 0; + virtual void Remove_Fd_Read_Handler(int fd) = 0; + virtual void Remove_Fd_Write_Handler(int fd) = 0; + virtual void Remove_Fd_All_Handlers(int fd) = 0; + virtual void Handler_Uninstall() = 0; + virtual void Timer_Set_Handler(double call_interval, boolean is_timeout = TRUE, + boolean call_anyway = TRUE, boolean is_periodic = TRUE) = 0; // unused - for possible future development + virtual const PacketHeaderDescr* Get_Header_Descriptor() const; + + // Logging functions + void log_debug(const char *fmt, ...) const + __attribute__ ((__format__ (__printf__, 2, 3))); + void log_warning(const char *fmt, ...) const + __attribute__ ((__format__ (__printf__, 2, 3))); + void log_error(const char *fmt, ...) const + __attribute__ ((__format__ (__printf__, 2, 3), __noreturn__)); + void log_hex(const char *prompt, const unsigned char *msg, size_t length) const; + + // Called when a message is to be received (an event detected) + virtual int receive_message_on_fd(int client_id); + // Called when a message is to be sent + virtual int send_message_on_fd(int client_id, const unsigned char* message_buffer, int message_length); + virtual int send_message_on_nonblocking_fd(int client_id, const unsigned char *message_buffer, int message_length); + // Called after a peer is connected + virtual void peer_connected(int client_id, sockaddr_in& remote_addr); /* This function should be removed! deprecated by: */ + virtual void peer_connected(int /*client_id*/, const char * /*host*/, const int /*port*/) {}; + // Called after a peer is disconnected + virtual void peer_disconnected(int client_id); + // Called when a peer shut down its fd for writing + virtual void peer_half_closed(int client_id); + // Called after a send error + virtual void report_error(int client_id, int msg_length, int sent_length, const unsigned char* msg, const char* error_text); + // Called after a unsent message + virtual void report_unsent(int client_id, int msg_length, int sent_length, const unsigned char* msg, const char* error_text); + + // Test port parameters + virtual const char* local_port_name(); + virtual const char* remote_address_name(); + virtual const char* local_address_name(); + virtual const char* remote_port_name(); + virtual const char* ai_family_name(); + virtual const char* use_connection_ASPs_name(); + virtual const char* halt_on_connection_reset_name(); + virtual const char* client_TCP_reconnect_name(); + virtual const char* TCP_reconnect_attempts_name(); + virtual const char* TCP_reconnect_delay_name(); + virtual const char* server_mode_name(); + virtual const char* socket_debugging_name(); + virtual const char* nagling_name(); + virtual const char* use_non_blocking_socket_name(); + virtual const char* server_backlog_name(); + + // Fetch/Set user data pointer + void* get_user_data(int client_id) {return get_peer(client_id)->user_data;} + void set_user_data(int client_id, void *uptr) {get_peer(client_id)->user_data = uptr;} + // Called after a TCP connection is established + virtual bool add_user_data(int client_id); + // Called before the TCP connection is drop down + virtual bool remove_user_data(int client_id); + // Called when a client shall be removed + virtual void remove_client(int client_id); + // Called when all clients shall be removed + virtual void remove_all_clients(); + // Called at the beginning of map() to check mandatory parameter presence + virtual bool user_all_mandatory_configparameters_present(); + TTCN_Buffer *get_buffer(int client_id) {return get_peer(client_id)->fd_buff; } + + // Client data management functions + // add peer to the list + as_client_struct *peer_list_add_peer(int client_id); + // remove peer from list + void peer_list_remove_peer(int client_id); + // remove all peers from list + void peer_list_reset_peer(); + // returns back the structure of the peer + as_client_struct *get_peer(int client_id, bool no_error=false) const; + // length of the list + int peer_list_get_length() const { return peer_list_length; } + // number of peers in the list + int peer_list_get_nr_of_peers() const; + // fd of the last peer in the list + int peer_list_get_last_peer() const; + // fd of the first peer in the list + int peer_list_get_first_peer() const; + + +private: + void handle_message(int client_id = -1); + void all_mandatory_configparameters_present(); + bool halt_on_connection_reset_set; + bool halt_on_connection_reset; + bool client_TCP_reconnect; + int TCP_reconnect_attempts; + int TCP_reconnect_delay; + bool server_mode; + bool use_connection_ASPs; + bool handle_half_close; + bool socket_debugging; + bool nagling; + bool use_non_blocking_socket; + bool ttcn_buffer_usercontrol; + char* local_host_name; + unsigned int local_port_number; + char* remote_host_name; + unsigned int remote_port_number; + int ai_family; // address family to use + // remoteAddr and localAddr is filled when map_user is called + struct sockaddr_in remoteAddr; /* FIXME: not used! should be removed */ + struct sockaddr_in localAddr; /* FIXME: not used! should be removed */ + int server_backlog; + int deadlock_counter; + int listen_fd; + int peer_list_length; + + // Client data management functions + as_client_struct **peer_list_root; + void peer_list_resize_list(int client_id); +}; + + + +#ifdef AS_USE_SSL + +class SSL_Socket: public Abstract_Socket +{ + +protected: + SSL_Socket(); + SSL_Socket(const char *tp_type, const char *tp_name); + virtual ~SSL_Socket(); + + bool parameter_set(const char * parameter_name, const char * parameter_value); + // Called after a TCP connection is established (client side or server accepted a connection). + // It will create a new SSL conenction on the top of the TCP connection. + virtual bool add_user_data(int client_id); + // Called after a TCP connection is closed. + // It will delete the SSL conenction. + virtual bool remove_user_data(int client_id); + // Called from all_mandatory_configparameters_present() function + // during map() operation to check mandatory parameter presents. + virtual bool user_all_mandatory_configparameters_present(); + // Called after an SSL connection is established (handshake finished) for further + // authentication. Shall return 'true' if verification + // is OK, otherwise 'false'. If return value was 'true', the connection is kept, otherwise + // the connection will be shutted down. + virtual bool ssl_verify_certificates(); + // Call during SSL handshake (and rehandshake as well) by OpenSSL + // Return values: + // ==1: user authentication is passed, go on with handshake + // ==0: user authentication failed, refuse the connection to the other peer + // <0 : user don't care, go on with default basic checks + virtual int ssl_verify_certificates_at_handshake(int preverify_ok, X509_STORE_CTX *ssl_ctx); + // Called to receive from the socket if data is available (select()). + // Shall return with 0 if the peer is disconnected or with the number of bytes read. + // If error occured, execution shall stop in the function by calling log_error() + virtual int receive_message_on_fd(int client_id); + // Called to send a message on the socket. + // Shall return with 0 if the peer is disconnected or with the number of bytes written. + // If error occured, execution shall stop in the function by calling log_error() + virtual int send_message_on_fd(int client_id, const unsigned char * message_buffer, int length_of_message); + virtual int send_message_on_nonblocking_fd(int client_id, const unsigned char * message_buffer, int length_of_message); + + // The following members can be called to fetch the current values + bool get_ssl_use_ssl() const {return ssl_use_ssl;} + bool get_ssl_verifycertificate() const {return ssl_verify_certificate;} + bool get_ssl_use_session_resumption() const {return ssl_use_session_resumption;} + bool get_ssl_initialized() const {return ssl_initialized;} + char * get_ssl_key_file() const {return ssl_key_file;} + char * get_ssl_certificate_file() const {return ssl_certificate_file;} + char * get_ssl_trustedCAlist_file() const {return ssl_trustedCAlist_file;} + char * get_ssl_cipher_list() const {return ssl_cipher_list;} + char * get_ssl_password() const; + const unsigned char * get_ssl_server_auth_session_id_context() const {return ssl_server_auth_session_id_context;} +// const SSL_METHOD * get_current_ssl_method() const {return ssl_method;} +// const SSL_CIPHER * get_current_ssl_cipher() const {return ssl_cipher;} + SSL_SESSION* get_current_ssl_session() const {return ssl_session;} + SSL_CTX * get_current_ssl_ctx() const {return ssl_ctx;} + SSL * get_current_ssl() const {return ssl_current_ssl;} + + // The following members can be called to set the current values + // NOTE that in case the parameter_value is a char *pointer, the old character + // array is deleted by these functions automatically. + void set_ssl_use_ssl(bool parameter_value); + void set_ssl_verifycertificate(bool parameter_value); + void set_ssl_use_session_resumption(bool parameter_value); + void set_ssl_key_file(char * parameter_value); + void set_ssl_certificate_file(char * parameter_value); + void set_ssl_trustedCAlist_file(char * parameter_value); + void set_ssl_cipher_list(char * parameter_value); + void set_ssl_server_auth_session_id_context(const unsigned char * parameter_value); + + // The following members can be called to fetch the default test port parameter names + virtual const char* ssl_use_ssl_name(); + virtual const char* ssl_use_session_resumption_name(); + virtual const char* ssl_private_key_file_name(); + virtual const char* ssl_trustedCAlist_file_name(); + virtual const char* ssl_certificate_file_name(); + virtual const char* ssl_password_name(); + virtual const char* ssl_cipher_list_name(); + virtual const char* ssl_verifycertificate_name(); + virtual const char* ssl_disable_SSLv2(); + virtual const char* ssl_disable_SSLv3(); + virtual const char* ssl_disable_TLSv1(); + virtual const char* ssl_disable_TLSv1_1(); + virtual const char* ssl_disable_TLSv1_2(); + +private: + bool ssl_verify_certificate; // verify other part's certificate or not + bool ssl_use_ssl; // whether to use SSL + bool ssl_initialized; // whether SSL already initialized or not + bool ssl_use_session_resumption; // use SSL sessions or not + + bool SSLv2; + bool SSLv3; + bool TLSv1; + bool TLSv1_1; + bool TLSv1_2; + + + char *ssl_key_file; // private key file + char *ssl_certificate_file; // own certificate file + char *ssl_trustedCAlist_file; // trusted CA list file + char *ssl_cipher_list; // ssl_cipher list restriction to apply + char *ssl_password; // password to decode the private key + static const unsigned char * ssl_server_auth_session_id_context; + +// const SSL_METHOD *ssl_method; // SSL context method + SSL_CTX *ssl_ctx; // SSL context +// const SSL_CIPHER *ssl_cipher; // used SSL ssl_cipher + SSL_SESSION *ssl_session; // SSL ssl_session + SSL *ssl_current_ssl; // currently used SSL object + static void *ssl_current_client; // current SSL object, used only during authentication + + void ssl_actions_to_seed_PRNG(); // Seed the PRNG with enough random data + void ssl_init_SSL(); // Initialize SSL libraries and create the SSL context + void ssl_log_SSL_info(); // Log the currently used SSL setting (debug) + int ssl_getresult(int result_code); // Fetch and log the SSL error code from I/O operation result codes + // Callback function to pass the password to OpenSSL. Called by OpenSSL + // during SSL handshake. + static int ssl_password_cb(char * password_buffer, int length_of_password, int rw_flag, void * user_data); + // Callback function to perform authentication during SSL handshake. Called by OpenSSL. + // NOTE: for further authentication, use ssl_verify_certificates(). + static int ssl_verify_callback(int preverify_status, X509_STORE_CTX * ssl_context); +}; +#endif + +#endif diff --git a/ttcn/patch_ats_ims_iot/module.mk b/ttcn/patch_ats_ims_iot/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..2b448a59ec3f695f66348e8192d3518b4c23a953 --- /dev/null +++ b/ttcn/patch_ats_ims_iot/module.mk @@ -0,0 +1,75 @@ +suite := AtsImsIot + +sources := \ + AtsImsIot_TypesAndValues.ttcn \ + AtsImsIot_Diameter_Templates.ttcn \ + AtsImsIot_Templates.ttcn \ + AtsImsIot_Templates_GM.ttcn \ + AtsImsIot_Templates_IC.ttcn \ + AtsImsIot_Templates_MW.ttcn \ + AtsImsIot_Templates_MI.ttcn \ + AtsImsIot_Templates_MM.ttcn \ + AtsImsIot_Templates_MX.ttcn \ + AtsImsIot_Templates_ML.ttcn \ + AtsImsIot_TestConfiguration.ttcn \ + AtsImsIot_TP_behavior_CX.ttcn \ + AtsImsIot_TP_behavior_ISC.ttcn \ + AtsImsIot_TP_behavior_SH.ttcn \ + AtsImsIot_TP_behavior_GM.ttcn \ + AtsImsIot_TP_behavior_MW_IS.ttcn \ + AtsImsIot_TP_behavior_RX.ttcn \ + AtsImsIot_TP_behavior_GX.ttcn \ + AtsImsIot_TP_behavior_MW_PS.ttcn \ + AtsImsIot_TP_behavior_MM.ttcn \ + AtsImsIot_TP_behavior_ML.ttcn \ + AtsImsIot_TP_behavior_MI.ttcn \ + AtsImsIot_TP_behavior_MX.ttcn \ + AtsImsIot_TP_behavior_S6A.ttcn \ + AtsImsIot_TD_ATT.ttcn \ + AtsImsIot_TD_REG.ttcn \ + AtsImsIot_Functions.ttcn \ + AtsImsIot_Emergency.ttcn \ + AtsImsIot_TD_DRG.ttcn \ + AtsImsIot_TD_DTC.ttcn \ + AtsImsIot_TestControl.ttcn \ + AtsImsIot_PIXITS.ttcn \ + AtsImsIot_TD_INI.ttcn \ + ../patch_ats_ims_iot/ttcn/AtsImsIot_TestSystem.ttcn \ + AtsImsIot_TP_behavior_IC.ttcn \ + AtsImsIot_TP_behavior_MW_SI.ttcn \ + AtsImsIot_TP_behavior_S9.ttcn \ + + +modules := ../LibCommon \ + ../LibIms \ + ../LibIot \ + ../LibMsrp \ + ../LibUpperTester \ + ../LibIms_ConfigAndTrigger \ + ../LibSip \ + ../LibDiameter \ + ../../titan-test-system-framework/ttcn/LibHelpers \ + ../../titan-test-system-framework/ccsrc/Framework \ + ../../titan-test-system-framework/ccsrc/Helpers \ + ../../titan-test-system-framework/ccsrc/loggers \ + ../../titan-test-system-framework/ccsrc/Protocols/ETH \ + ../../titan-test-system-framework/ccsrc/Protocols/Tcp \ + ../../titan-test-system-framework/ccsrc/Protocols/UDP \ + ../../titan-test-system-framework/ccsrc/Protocols/Xml \ + ../../ccsrc/Ports/LibSip \ + ../../ccsrc/Ports/ImsMonitorSipPort \ + ../../ccsrc/Ports/LibDiameter \ + ../../ccsrc/Ports/ImsMonitorDiameterPort \ + ../../ccsrc/Ports/Naptr \ + ../../ccsrc/Ports/Data \ + ../../ccsrc/Ports/Sgi \ + ../../ccsrc/Ports/LibIot \ + ../../ccsrc/EncDec/LibDiameter \ + ../../ccsrc/EncDec/LibSip \ + ../../ccsrc/EncDec/LibMsrp \ + ../../ccsrc/Protocols/Diameter \ + ../../ccsrc/Protocols/LowerLayerPPort \ + ../../ccsrc/Protocols/Sip \ + ../../ccsrc/Protocols/Naptr \ + ../../ccsrc/Protocols/UpperTester \ + ../modules/titan.TestPorts.Common_Components.Abstract_Socket \ diff --git a/ttcn/patch_ats_ims_iot/ttcn/AtsImsIot_TestSystem.ttcn b/ttcn/patch_ats_ims_iot/ttcn/AtsImsIot_TestSystem.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..0eaf92689779c3806cff8f140bb4a9d441eee77c --- /dev/null +++ b/ttcn/patch_ats_ims_iot/ttcn/AtsImsIot_TestSystem.ttcn @@ -0,0 +1,174 @@ +module AtsImsIot_TestSystem { + + import from LibSip_SIPTypesAndValues all; + import from LibMsrp_TypesAndValues all; + import from AtsImsIot_TypesAndValues all; + import from LibIot_TestInterface all; + import from LibIot_TestInterface all; + import from LibIot_TypesAndValues all; + import from LibDiameter_TypesAndValues all; + + /** + * @desc interfaces to the SUT + */ + type component IotSystemInterface { + port DataPort dPort; + port ImsMonitorSipPort sipPort; + port ImsMonitorDiameterPort diameterPort; + port SgiPort sgiPort; + port EquipmentAccessPort eaPort; + port AdapterConfigPort acPort; + } + /** + * @desc + * providing monitoring functionality of involved interfaces. Used as + * PTC. + */ + type component ImsInterfaceMonitor extends InterfaceMonitor { + port DataPort dPort; + port NaptrPort naptrPort; + port ImsMonitorDiameterPort rxPort; + port SgiPort sgiPort; + port ImsCoordinationPort icpPort; + } + + type component SipInterfaceMonitor extends InterfaceMonitor { + port ImsMonitorSipPort sipPort; + port ImsCoordinationPort icpPort; + } + type component DiameterInterfaceMonitor extends InterfaceMonitor { + port ImsMonitorDiameterPort diameterPort; + port ImsCoordinationPort icpPort; + } + type component NaptrInterfaceMonitor extends InterfaceMonitor { + port NaptrPort naptrPort; + port ImsCoordinationPort icpPort; + } + type component SgiInterfaceMonitor extends InterfaceMonitor { + port SgiPort sgiPort; + port ImsCoordinationPort icpPort; + } + + /** + * @desc + * used to coordinate the behavior of other components. It is in charge + * of controlling the overall execution, manangement of testing phases, + * test verdicts collection and synchronization. Used as MTC. + */ + type component ImsTestCoordinator extends TestCoordinator { + port ImsCoordinationPort icpPort; + var VxLTEMonitorInterfaceList vc_MonIntfList; + var CF_VXLTE_Interfaces vc_vxlte_monitor_components; + } + + group portDefinitions { + type port ImsCoordinationPort message { + inout SipMessage, DIAMETER_MSG; + } with { + extension "internal" + } + type port DataPort message { + in Request, Response, SEND_request, RECEIVE_response; // SIP + } + type port ImsMonitorSipPort message { //type port SipPort message + in Request, Response, SEND_request, RECEIVE_response; // SIP + } + type port NaptrPort message { + in NAPTRmessage; + } + type port ImsMonitorDiameterPort message { + in DIAMETER_MSG; + } + type port SgiPort message { + in charstring; + } + } + + type record CF_INT_CALL { + ImsInterfaceMonitor gmA, + ImsInterfaceMonitor mxA, + ImsInterfaceMonitor ici, + ImsInterfaceMonitor mxB, + ImsInterfaceMonitor gmB optional, + ImsInterfaceMonitor naptr optional + } + type record CF_INT_AS { + ImsInterfaceMonitor gmA, + ImsInterfaceMonitor ici, + ImsInterfaceMonitor mxA, + ImsInterfaceMonitor gmB, + ImsInterfaceMonitor mxB, + ImsInterfaceMonitor iscA optional, + ImsInterfaceMonitor iscB optional + } + type record CF_ROAM_AS { + ImsInterfaceMonitor gmA, + ImsInterfaceMonitor mxA, + ImsInterfaceMonitor ici, + ImsInterfaceMonitor mxB, + ImsInterfaceMonitor gmB, + ImsInterfaceMonitor iscA optional, + ImsInterfaceMonitor iscB optional + } + type record CF_EPC_CALL { + ImsInterfaceMonitor gmA, // See ETSI TS 103 029 V3.1.1 clause 5.4.1.1 + ImsInterfaceMonitor rx, // See ETSI TS 103 029 V3.1.1 clause 5.4.2 + ImsInterfaceMonitor mxA, + ImsInterfaceMonitor mw, + ImsInterfaceMonitor sgi, + ImsInterfaceMonitor gmB // See ETSI TS 103 029 V3.1.1 clause 5.4.1.1 + } + + group g_release15 { + + type record CF_VXLTE_Interfaces{ + SipInterfaceMonitor gmA optional, + SipInterfaceMonitor gmB optional, + SipInterfaceMonitor mmB_PSAP optional,// MmMx interface at IBCF to PSAP + SipInterfaceMonitor mwEB optional,// Mw interface at E-CSCF/IBCF or E-CSCF/BGCF + SipInterfaceMonitor mlE_LRF optional,// Ml interface at E-CSCF/LRF + SipInterfaceMonitor mwS_PSAP optional,// MwMmMx interface at E,SCSCF to PSAP + SipInterfaceMonitor ic optional, + SipInterfaceMonitor mwPI optional,// Mw interface at P-CSCF/I-CSCF or P-CSCF/S-CSCF if I-CSCF not used + SipInterfaceMonitor mwPS optional, + SipInterfaceMonitor mwPE optional,// Mw interface at P-CSCF to E-CSCF + SipInterfaceMonitor mwIS optional,// Mw interface at I-CSCF/S-CSCF + SipInterfaceMonitor mwIE optional,// Mw interface at I-CSCF/S-CSCF to E-CSCF + SipInterfaceMonitor mwPB optional,// Mw interface at P-CSCF/IBCF + SipInterfaceMonitor mwIB optional,// Mw interface at I-CSCF/IBCF + SipInterfaceMonitor isc optional, + DiameterInterfaceMonitor cxIH optional, + DiameterInterfaceMonitor cxSH optional, + DiameterInterfaceMonitor gx optional, + DiameterInterfaceMonitor rx optional, + DiameterInterfaceMonitor s6a optional, + DiameterInterfaceMonitor s9 optional, + DiameterInterfaceMonitor sh optional + } + + type record CF_ATT_old { + ImsInterfaceMonitor gmA, + ImsInterfaceMonitor rx, + ImsInterfaceMonitor s6a, + ImsInterfaceMonitor gx, + ImsInterfaceMonitor mxA, + ImsInterfaceMonitor mwPS, // Mw interface at P-CSCF/I-CSCF or P-CSCF/S-CSCF if I-CSCF not used + ImsInterfaceMonitor mwIS, // Mw interface at I-CSCF/S-CSCF + ImsInterfaceMonitor mwSI, // Mw interface at S-CSCF/IBCF + ImsInterfaceMonitor sgi, + ImsInterfaceMonitor gmB + } + + type record CF_ATT { + SipInterfaceMonitor gmA, + DiameterInterfaceMonitor rx, + DiameterInterfaceMonitor s6a, + DiameterInterfaceMonitor gx, + SipInterfaceMonitor mxA, + SipInterfaceMonitor mw, + SgiInterfaceMonitor sgi, + SipInterfaceMonitor gmB + } + } // end of g_release15 + +} \ No newline at end of file diff --git a/ttcn/patch_lib_common_titan/module.mk b/ttcn/patch_lib_common_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..905b4887a000439649532bbbb61e8e39df20d6dc --- /dev/null +++ b/ttcn/patch_lib_common_titan/module.mk @@ -0,0 +1,9 @@ +sources := \ + ttcn/LibCommon_AbstractData.ttcn \ + ttcn/LibCommon_TextStrings.ttcn \ + ttcn/LibCommon_Time.ttcn \ + ttcn/LibCommon_VerdictControl.ttcn \ + ../patch_lib_common_titan/ttcn/LibCommon_BasicTypesAndValues.ttcn \ + ../patch_lib_common_titan/ttcn/LibCommon_DataStrings.ttcn \ + ../patch_lib_common_titan/ttcn/LibCommon_Sync.ttcn \ + diff --git a/ttcn/patch_lib_common_titan/ttcn/LibCommon_BasicTypesAndValues.ttcn b/ttcn/patch_lib_common_titan/ttcn/LibCommon_BasicTypesAndValues.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..14f8f57cb8ccdc5ce7953f4d9f85741b656d4593 --- /dev/null +++ b/ttcn/patch_lib_common_titan/ttcn/LibCommon_BasicTypesAndValues.ttcn @@ -0,0 +1,250 @@ +/** + * @author ETSI + * @version $URL$ + * $Id$ + * @desc A collection of basic type and value definitions which may be + * useful in the implementation of any TTCN-3 test suite.

+ * @remark End users should be aware that any changes made to the in + * definitions this module may be overwritten in future releases. + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions so that future + * updates will include your changes. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * + */ + module LibCommon_BasicTypesAndValues { + + /** + * @remark Number in subtype name always indicates encoding length + * in _bits_ + */ + group unsignedIntegerDefintions { + + const integer c_uInt1Max := 1; + const integer c_uInt2Max := 3; + const integer c_uInt3Max := 7; + const integer c_uInt4Max := 15; + const integer c_uInt5Max := 31; + const integer c_uInt6Max := 63; + const integer c_uInt7Max := 127; + const integer c_uInt8Max := 255; + const integer c_uInt9Max := 511; + const integer c_uInt10Max := 1023; + const integer c_uInt11Max := 2047; + const integer c_uInt12Max := 4095; + const integer c_uInt13Max := 8191; + const integer c_uInt14Max := 16383; + const integer c_uInt15Max := 32767; + const integer c_uInt16Max := 65535; + const integer c_uInt17Max := 131071; + const integer c_uInt18Max := 262143; + const integer c_uInt19Max := 524287; + const integer c_uInt20Max := 1048575; + const integer c_uInt21Max := 2097151; + const integer c_uInt22Max := 4194303; + const integer c_uInt23Max := 8388607; + const integer c_uInt24Max := 16777215; + const integer c_uInt25Max := 33554431; + const integer c_uInt26Max := 67108863; + const integer c_uInt27Max := 134217727; + const integer c_uInt28Max := 268435456; + const integer c_uInt29Max := 536870911; + const integer c_uInt30Max := 1073741823; + const integer c_uInt31Max := 2147483647; + const integer c_uInt32Max := 4294967295; + const integer c_uInt36Max := 68719476735; + const integer c_uInt48Max := 281474976710655; + const integer c_uInt52Max := 4503599627370495; + const integer c_uInt64Max := 18446744073709551615; + + type integer UInt (0 .. infinity); + type integer UInt1 (0 .. c_uInt1Max) with {variant "unsigned 1 bit"}; + type integer UInt2 (0 .. c_uInt2Max) with {variant "unsigned 2 bit"}; + type integer UInt3 (0 .. c_uInt3Max) with {variant "unsigned 3 bit"}; + type integer UInt4 (0 .. c_uInt4Max) with {variant "unsigned 4 bit"}; + type integer UInt5 (0 .. c_uInt5Max) with {variant "unsigned 5 bit"}; + type integer UInt6 (0 .. c_uInt6Max) with {variant "unsigned 6 bit"}; + type integer UInt7 (0 .. c_uInt7Max) with {variant "unsigned 7 bit"}; + type integer UInt8 (0 .. c_uInt8Max) with {variant "unsigned 8 bit"}; + type integer UInt9 (0 .. c_uInt9Max) with {variant "unsigned 9 bit"}; + type integer UInt10 (0 .. c_uInt10Max) with {variant "unsigned 10 bit"}; + type integer UInt11 (0 .. c_uInt11Max) with {variant "unsigned 11 bit"}; + type integer UInt12 (0 .. c_uInt12Max) with {variant "unsigned 12 bit"}; + type integer UInt13 (0 .. c_uInt13Max) with {variant "unsigned 13 bit"}; + type integer UInt14 (0 .. c_uInt14Max) with {variant "unsigned 14 bit"}; + type integer UInt15 (0 .. c_uInt15Max) with {variant "unsigned 15 bit"}; + type integer UInt16 (0 .. c_uInt16Max) with {variant "unsigned 16 bit"}; + type integer UInt17 (0 .. c_uInt17Max) with {variant "unsigned 17 bit"}; + type integer UInt18 (0 .. c_uInt18Max) with {variant "unsigned 18 bit"}; + type integer UInt19 (0 .. c_uInt19Max) with {variant "unsigned 19 bit"}; + type integer UInt20 (0 .. c_uInt20Max) with {variant "unsigned 20 bit"}; + type integer UInt21 (0 .. c_uInt21Max) with {variant "unsigned 21 bit"}; + type integer UInt22 (0 .. c_uInt22Max) with {variant "unsigned 22 bit"}; + type integer UInt23 (0 .. c_uInt23Max) with {variant "unsigned 23 bit"}; + type integer UInt24 (0 .. c_uInt24Max) with {variant "unsigned 24 bit"}; + type integer UInt25 (0 .. c_uInt25Max) with {variant "unsigned 25 bit"}; + type integer UInt26 (0 .. c_uInt26Max) with {variant "unsigned 26 bit"}; + type integer UInt27 (0 .. c_uInt27Max) with {variant "unsigned 27 bit"}; + type integer UInt28 (0 .. c_uInt28Max) with {variant "unsigned 28 bit"}; + type integer UInt29 (0 .. c_uInt29Max) with {variant "unsigned 29 bit"}; + type integer UInt30 (0 .. c_uInt30Max) with {variant "unsigned 30 bit"}; + type integer UInt31 (0 .. c_uInt31Max) with {variant "unsigned 31 bit"}; + type integer UInt32 (0 .. c_uInt32Max) with {variant "unsigned 32 bit"}; + type integer UInt36 (0 .. c_uInt36Max) with {variant "unsigned 36 bit"}; + type integer UInt48 (0 .. c_uInt48Max) with {variant "unsigned 48 bit"}; + type integer UInt52 (0 .. c_uInt52Max) with {variant "unsigned 52 bit"}; + type integer UInt64 (0 .. c_uInt64Max) with {variant "unsigned 64 bit"}; + + } // end group unsignedIntegerDefintions + + /** + * @remark Number in subtype name always indicates encoding length + * in _bits_ + */ + group signedIntegerDefintions { + + const integer c_int1Min := -1; + const integer c_int1Max := 0; + const integer c_int2Min := -2; + const integer c_int2Max := 1; + const integer c_int3Min := -4; + const integer c_int3Max := 3; + const integer c_int4Min := -8; + const integer c_int4Max := 7; + const integer c_int5Min := -16; + const integer c_int5Max := 15; + const integer c_int6Min := -32; + const integer c_int6Max := 31; + const integer c_int7Min := -64; + const integer c_int7Max := 63; + const integer c_int8Min := -128; + const integer c_int8Max := 127; + const integer c_int9Min := -256; + const integer c_int9Max := 255; + const integer c_int10Min := -512; + const integer c_int10Max := 511; + const integer c_int11Min := -1024; + const integer c_int11Max := 1023; + const integer c_int12Min := -2048; + const integer c_int12Max := 2047; + const integer c_int13Min := -4096; + const integer c_int13Max := 4095; + const integer c_int14Min := -8192; + const integer c_int14Max := 8191; + const integer c_int15Min := -16384; + const integer c_int15Max := 16383; + const integer c_int16Min := -32768; + const integer c_int16Max := 32767; + const integer c_int17Min := -65536; + const integer c_int17Max := 65535; + const integer c_int18Min := -131072; + const integer c_int18Max := 131071; + const integer c_int19Min := -262144; + const integer c_int19Max := 262143; + const integer c_int20Min := -524288; + const integer c_int20Max := 524287; + const integer c_int21Min := -1048576; + const integer c_int21Max := 1048575; + const integer c_int22Min := -2097152; + const integer c_int22Max := 2097151; + const integer c_int23Min := -4194304; + const integer c_int23Max := 4194303; + const integer c_int24Min := -8388608; + const integer c_int24Max := 8388607; + const integer c_int25Min := -16777216; + const integer c_int25Max := 16777215; + const integer c_int26Min := -33554432; + const integer c_int26Max := 33554431; + const integer c_int27Min := -67108864; + const integer c_int27Max := 67108863; + const integer c_int28Min := -134217728; + const integer c_int28Max := 134217727; + const integer c_int29Min := -268435456; + const integer c_int29Max := 268435456; + const integer c_int30Min := -536870912; + const integer c_int30Max := 536870911; + const integer c_int31Min := -1073741824; + const integer c_int31Max := 1073741823; + const integer c_int32Min := -2147483648; + const integer c_int32Max := 2147483647; + const integer c_int64Min := -9223372036854775808; + const integer c_int64Max := 9223372036854775807; + + type integer Int; + type integer Int1 (c_int1Min .. c_int1Max) with { variant "1 bit"}; + type integer Int2 (c_int2Min .. c_int2Max) with { variant "2 bit"}; + type integer Int3 (c_int3Min .. c_int3Max) with { variant "3 bit"}; + type integer Int4 (c_int4Min .. c_int4Max) with { variant "4 bit"}; + type integer Int5 (c_int5Min .. c_int5Max) with { variant "5 bit"}; + type integer Int6 (c_int6Min .. c_int6Max) with { variant "6 bit"}; + type integer Int7 (c_int7Min .. c_int7Max) with { variant "7 bit"}; + type integer Int8 (c_int8Min .. c_int8Max) with { variant "8 bit"}; + type integer Int9 (c_int9Min .. c_int9Max) with { variant "9 bit"}; + type integer Int10 (c_int10Min .. c_int10Max) with { variant "10 bit"}; + type integer Int11 (c_int11Min .. c_int11Max) with { variant "11 bit"}; + type integer Int12 (c_int12Min .. c_int12Max) with { variant "12 bit"}; + type integer Int13 (c_int13Min .. c_int13Max) with { variant "13 bit"}; + type integer Int14 (c_int14Min .. c_int14Max) with { variant "14 bit"}; + type integer Int15 (c_int15Min .. c_int15Max) with { variant "15 bit"}; + type integer Int16 (c_int16Min .. c_int16Max) with { variant "16 bit"}; + type integer Int17 (c_int17Min .. c_int17Max) with { variant "17 bit"}; + type integer Int18 (c_int18Min .. c_int18Max) with { variant "18 bit"}; + type integer Int19 (c_int19Min .. c_int19Max) with { variant "19 bit"}; + type integer Int20 (c_int20Min .. c_int20Max) with { variant "20 bit"}; + type integer Int21 (c_int21Min .. c_int21Max) with { variant "21 bit"}; + type integer Int22 (c_int22Min .. c_int22Max) with { variant "22 bit"}; + type integer Int23 (c_int23Min .. c_int23Max) with { variant "23 bit"}; + type integer Int24 (c_int24Min .. c_int24Max) with { variant "24 bit"}; + type integer Int25 (c_int25Min .. c_int25Max) with { variant "25 bit"}; + type integer Int26 (c_int26Min .. c_int26Max) with { variant "26 bit"}; + type integer Int27 (c_int27Min .. c_int27Max) with { variant "27 bit"}; + type integer Int28 (c_int28Min .. c_int28Max) with { variant "28 bit"}; + type integer Int29 (c_int29Min .. c_int29Max) with { variant "29 bit"}; + type integer Int30 (c_int30Min .. c_int30Max) with { variant "30 bit"}; + type integer Int31 (c_int31Min .. c_int31Max) with { variant "31 bit"}; + type integer Int32 (c_int32Min .. c_int32Max) with { variant "32 bit"}; + type integer Int64 (c_int64Min .. c_int64Max) with { variant "64 bit"}; + + } // end group signedIntegerDefintions + + group zeroedIntegers { + + const UInt1 c_uInt1Zero := 0; + const UInt2 c_uInt2Zero := 0; + const UInt3 c_uInt3Zero := 0; + const UInt4 c_uInt4Zero := 0; + const UInt5 c_uInt5Zero := 0; + const UInt6 c_uInt6Zero := 0; + const UInt7 c_uInt7Zero := 0; + const UInt8 c_uInt8Zero := 0; + const UInt10 c_uInt10Zero := 0; + const UInt12 c_uInt12Zero := 0; + const UInt14 c_uInt14Zero := 0; + const UInt16 c_uInt16Zero := 0; + const UInt24 c_uInt24Zero := 0; + const UInt32 c_uInt32Zero := 0; + const UInt48 c_uInt48Zero := 0; + + }//end group zeroedInt + + /** + * @remark Number in subtype name always indicates encoding length + * in _bits_ + */ + group booleanDefintions { + + type boolean Bool1 with { variant "1 bit" }; + type boolean Bool2 with { variant "2 bit" }; + type boolean Bool3 with { variant "3 bit" }; + type boolean Bool4 with { variant "4 bit" }; + type boolean Bool5 with { variant "5 bit" }; + type boolean Bool6 with { variant "6 bit" }; + type boolean Bool7 with { variant "7 bit" }; + type boolean Bool8 with { variant "8 bit" }; + + } // end group booleanDefintions + +} // end module LibCommon_BasicTypesAndValues diff --git a/ttcn/patch_lib_common_titan/ttcn/LibCommon_DataStrings.ttcn b/ttcn/patch_lib_common_titan/ttcn/LibCommon_DataStrings.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..9bfbe61a78b4cb161929cae010cf34f510d97e00 --- /dev/null +++ b/ttcn/patch_lib_common_titan/ttcn/LibCommon_DataStrings.ttcn @@ -0,0 +1,168 @@ +/** + * + * @author ETSI + * @version $URL$ + * $Id$ + * @desc A collection of data string type and value definitions which + * may be useful in the implementation of any TTCN-3 test + * suite. "Data string" refers to TTCN-3 hexstring, octetstring + * and bitstring types. + * @remark End users should be aware that any changes made to the in + * definitions this module may be overwritten in future releases. + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions so that future + * updates will include your changes. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * + */ + module LibCommon_DataStrings { + + /** + * @remark Number in name indicates string length in number of + * _bits_ + */ + group bitStringSubTypes { + + type bitstring Bit1 length(1) with {encode "length(1)"}; + type bitstring Bit2 length(2) with {encode "length(2)"}; + type bitstring Bit3 length(3) with {encode "length(3)"}; + type bitstring Bit4 length(4) with {encode "length(4)"}; + type bitstring Bit5 length(5) with {encode "length(5)"}; + type bitstring Bit6 length(6) with {encode "length(6)"}; + type bitstring Bit7 length(7) with {encode "length(7)"}; + type bitstring Bit8 length(8) with {encode "length(8)"}; + type bitstring Bit9 length(9) with {encode "length(9)"}; + type bitstring Bit10 length(10) with {encode "length(10)"}; + type bitstring Bit11 length(11) with {encode "length(11)"}; + type bitstring Bit12 length(12) with {encode "length(12)"}; + type bitstring Bit13 length(13) with {encode "length(13)"}; + type bitstring Bit14 length(14) with {encode "length(14)"}; + type bitstring Bit15 length(15) with {encode "length(15)"}; + type bitstring Bit16 length(16) with {encode "length(16)"}; + type bitstring Bit17 length(17) with {encode "length(17)"}; + type bitstring Bit18 length(18) with {encode "length(18)"}; + type bitstring Bit19 length(19) with {encode "length(19)"}; + type bitstring Bit20 length(20) with {encode "length(20)"}; + type bitstring Bit21 length(21) with {encode "length(21)"}; + type bitstring Bit22 length(22) with {encode "length(22)"}; + type bitstring Bit23 length(23) with {encode "length(23)"}; + type bitstring Bit24 length(24) with {encode "length(24)"}; + type bitstring Bit25 length(25) with {encode "length(25)"}; + type bitstring Bit26 length(26) with {encode "length(26)"}; + type bitstring Bit27 length(27) with {encode "length(27)"}; + type bitstring Bit28 length(28) with {encode "length(28)"}; + type bitstring Bit29 length(29) with {encode "length(29)"}; + type bitstring Bit30 length(30) with {encode "length(30)"}; + type bitstring Bit31 length(31) with {encode "length(31)"}; + type bitstring Bit32 length(32) with {encode "length(32)"}; + type bitstring Bit40 length(40) with {encode "length(40)"}; + + type bitstring Bit48 length(48) with {encode "length(48)"}; + type bitstring Bit64 length(64) with {encode "length(64)"}; + type bitstring Bit72 length(72) with {encode "length(72)"}; + type bitstring Bit128 length(128) with {encode "length(128)"}; + type bitstring Bit144 length(144) with {encode "length(144)"}; + type bitstring Bit256 length(256) with {encode "length(256)"}; + + } // end group bitStringSubTypes + + group zeroedBits { + + const Bit1 c_1ZeroBit := int2bit(0,1); + const Bit2 c_2ZeroBits := int2bit(0,2); + const Bit4 c_4ZeroBits := int2bit(0,4); + const Bit5 c_5ZeroBits := int2bit(0,5); + const Bit6 c_6ZeroBits := int2bit(0,6); + const Bit8 c_8ZeroBits := int2bit(0,8); + const Bit14 c_14ZeroBits := int2bit(0,14); + const Bit64 c_64ZeroBits := int2bit(0,64); + + }//end group zeroedBits + + /** + * @remark Number in name indicates string length in number of + * _octets_ + */ + group octetStringSubTypes { + + type octetstring Oct1 length(1) with {encode "length(1)"}; + type octetstring Oct2 length(2) with {encode "length(2)"}; + type octetstring Oct3 length(3) with {encode "length(3)"}; + type octetstring Oct4 length(4) with {encode "length(4)"}; + type octetstring Oct5 length(5) with {encode "length(5)"}; + type octetstring Oct6 length(6) with {encode "length(6)"}; + type octetstring Oct7 length(7) with {encode "length(7)"}; + type octetstring Oct8 length(8) with {encode "length(8)"}; + type octetstring Oct9 length(9) with {encode "length(9)"}; + type octetstring Oct10 length(10) with {encode "length(10)"}; + type octetstring Oct11 length(11) with {encode "length(11)"}; + type octetstring Oct12 length(12) with {encode "length(12)"}; + type octetstring Oct13 length(13) with {encode "length(13)"}; + type octetstring Oct14 length(14) with {encode "length(14)"}; + type octetstring Oct15 length(15) with {encode "length(15)"}; + type octetstring Oct16 length(16) with {encode "length(16)"}; + + type octetstring Oct20 length(20) with {encode "length(20)"}; + type octetstring Oct32 length(32) with {encode "length(32)"}; + type octetstring Oct48 length(48) with {encode "length(48)"}; + type octetstring Oct64 length(64) with {encode "length(64)"}; + type octetstring Oct80 length(80) with {encode "length(80)"}; + type octetstring Oct96 length(96) with {encode "length(96)"}; + type octetstring Oct128 length(128) with {encode "length(128)"}; + type octetstring Oct160 length(160) with {encode "length(160)"}; + type octetstring Oct320 length(320) with {encode "length(320)"}; + type octetstring Oct640 length(640) with {encode "length(640)"}; + type octetstring Oct1280 length(1280) with {encode "length(1280)"}; + type octetstring Oct1380 length(1380) with {encode "length(1380)"}; + + type octetstring Oct0to3 length(0..3) with {encode "length(0..3)"}; + type octetstring Oct0to8 length(0..16) with {encode "length(0..8)"}; + type octetstring Oct0to12 length(0..12) with {encode "length(0..12)"}; + type octetstring Oct0to16 length(0..16) with {encode "length(0..16)"}; + type octetstring Oct0to31 length(0..31) with {encode "length(0..31)"}; + type octetstring Oct0to20 length(0..20) with {encode "length(0..20)"}; + type octetstring Oct0to30 length(0..20) with {encode "length(0..30)"}; + type octetstring Oct0to127 length(0..127) with {encode "length(0..127)"}; + type octetstring Oct0to255 length(0..255) with {encode "length(0..255)"}; + + type octetstring Oct1to15 length(1..15) with {encode "length(1..15)"}; + type octetstring Oct1to31 length(1..31) with {encode "length(1..31)"}; + type octetstring Oct1to128 length(1..128) with {encode "length(1..128)"}; + type octetstring Oct1to254 length(1..254) with {encode "length(1..254)"}; + type octetstring Oct1to255 length(1..255) with {encode "length(1..255)"}; + + type octetstring Oct4to16 length(4..16) with {encode "length(4..16)"}; + type octetstring Oct6to15 length(6..15) with {encode "length(6..15)"}; + + } // end group octetStringSubTypes + + group zeroedBytes { + const Oct1 c_1ZeroByte := int2oct(0,1); + const Oct2 c_2ZeroBytes := int2oct(0,2); + const Oct4 c_4ZeroBytes := int2oct(0,4); + const Oct6 c_6ZeroBytes := int2oct(0,6); + const Oct8 c_8ZeroBytes := int2oct(0,8); + const Oct9 c_9ZeroBytes := int2oct(0,9); + const Oct12 c_12ZeroBytes := int2oct(0,12); + const Oct16 c_16ZeroBytes := int2oct(0,16); + const Oct20 c_20ZeroBytes := int2oct(0,20); + + const Oct80 c_80ZeroBytes := int2oct(0,80); + const Oct160 c_160ZeroBytes := int2oct(0,160); + const Oct320 c_320ZeroBytes := int2oct(0,320); + const Oct640 c_640ZeroBytes := int2oct(0,640); + const Oct1280 c_1280ZeroBytes := int2oct(0,1280); + const Oct1380 c_1380ZeroBytes := int2oct(0,1380); + const octetstring c_256ZeroBytes := int2oct(0,256); + const octetstring c_1KZeroBytes := int2oct(0,1024); + const octetstring c_4KZeroBytes := int2oct(0,4096); + const octetstring c_16KZeroBytes := int2oct(0,16384); + const octetstring c_64KZeroBytes := int2oct(0,65536); + const octetstring c_128KZeroBytes := int2oct(0,131072); + + }//end group zeroedBytes + +} // end module LibCommon_DataStrings diff --git a/ttcn/patch_lib_common_titan/ttcn/LibCommon_Sync.ttcn b/ttcn/patch_lib_common_titan/ttcn/LibCommon_Sync.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..5b2ae660235ac093aaada64e906c5fcd8842a304 --- /dev/null +++ b/ttcn/patch_lib_common_titan/ttcn/LibCommon_Sync.ttcn @@ -0,0 +1,1359 @@ +/** + * @author ETSI + * @version $URL$ + * $Id$ + * @desc This module implements _one_ generic synchronization mechanism + * for TTCN-3 test cases with one or more test components. + * Key concept is here that one test component acts as a + * synchronization server which listens and triggers one or more + * synchronization clients. It is recomended to use the MTC always as + * the synchronization server but in theory also a PTC can act as such + * a server.

+ * This synchronization is used by calling a function on + * the server test component to wait for a desired amount of clients + * to notify the server that they have reached a specific synchronization + * point. Each client test component must call another + * function to perform this notification.

+ * In the event that a client is not able to reach a synchronization + * point the server sends out a signal to all clients to abort the + * test case. This signal is a STOP message which can be caught by + * a test component default which in turn can then run a proper + * shut down behavior based on the current state of the test + * component.

+ * Note that this synchronization mechanism can also be used + * in a special mode called "self synchronization" when a test case + * only has one test component. Here, the test component in essence + * acts as a server and client at the same time. The main benefit of + * using self synchoronization is that the same shutdown mechanisms + * can also be reused fomr the multi component test cases.

+ * This module contains a lot of TTCN-3 definitions. It has been + * structured into tree main groups to help the user to identify + * quickly relevant TTCN-3 definitions. For rookie users of this + * module basicUserRelevantDefinitions should offer all the needed + * definitions. Advanced users can consider use of definitions in + * advancedUserRelevantDefinitions. Finally, internalDefinitions + * are definitions which are required for the module to work + * properly but do not need to be used in your code. Remember that + * the main motiviation of this sychronization module is to offer + * are _simple_ user interface. Practice has shown that when writing + * actual test component behavior _only a handful_ of functions + * usually wind up being used! Also check the synchronization examples + * module for example uses of this synchronization mechanism.

+ * The invocation of the sync functions is also closely tied + * to the verdict control functions which should also be reviewed + * prior to using this module.

+ * This module has been derived from EtsiCommon_Synchronization + * which was created in ETSIs STF256/276. It has been kept + * intentionally separate to avoid conflicts with future ETSI + * test suite releases. + * @see LibCommon_Sync.basicUserRelevantDefinitions + * @see LibCommon_Sync.advancedUserRelevantDefinitions + * @remark End users should be aware that any changes made to the in + * definitions this module may be overwritten in future releases. + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions so that future + * updates will include your changes. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * + */ +module LibCommon_Sync { + + //Common + import from LibCommon_BasicTypesAndValues { type UInt } ; + import from LibCommon_AbstractData all; + import from LibCommon_VerdictControl all; + + group basicUserRelevantDefinitions { + + group importantSyncTypeDefinitions { + + group compTypeRelated { + + /** + * @desc This type is used to be the base of any synchronization + * behavior which is to be executed on a sync server + * component. The test component which acts as a + * sync server in a test case must NOT directly use + * this component type in its runs on clause! + * Note that server synchronization functions may be + * invoked by a test component as long as its + * component type is type compatible to this component + * type definition! + */ + type component BaseSyncComp { + port SyncPort syncPort; + timer tc_sync := PX_TSYNC_TIME_LIMIT; + } + + /** + * @desc This type is used to define any synchronization + * behavior which is to be executed on a sync server + * component. The test component which acts as a + * sync server in a test case may - but does + * not have to - directly use this component type its + * runs on clause. + * Note that server synchronization functions may be + * invoked by a test component as long as its + * component type is type compatible to this component + * type definition! + */ + type component ServerSyncComp extends BaseSyncComp { + timer tc_shutDown := PX_TSHUT_DOWN_TIME_LIMIT; + } + + /** + * @desc This type is used to define any synchronization + * behavior which is to be executed on a sync client + * component. The test component(s) which act as a + * sync client in a test case may - but do not have + * to - directly use this component type their runs + * on clause. + * Note that server synchronization functions may be + * invoked by a test component as long as its + * component type is type compatible to this component + * type definition! + */ + type component ClientSyncComp extends BaseSyncComp { + var StringStack v_stateStack:= c_initStringStack; + var TestcaseStep vc_testcaseStep := e_preamble; + } + + /** + * @desc This type is used to define any synchronization + * behavior which is relevant to non-concurrent test + * cases. + * Note that self synchronization functions may be + * invoked by a test component as long as its + * component type is type compatible to this component + * type definition! + * Note also that this type is type compatible to the + * ClientSyncComp type so that shutdown altsteps from + * concurrent test cases can also be reused in single + * component test cases! + * @see LibCommon_Sync.ClientSyncComp + */ + type component SelfSyncComp extends ClientSyncComp { + port SyncPort syncSendPort; + } + + /** + * @desc This port type must be imported into test suites + * when defining test component types which are + * type compatible to a synchronization component + * type + * @see LibCommon_Sync.SelfSyncComp + * @see LibCommon_Sync.ServerSyncComp + * @see LibCommon_Sync.ClientSyncComp + */ + type port SyncPort message { + inout SyncCmd + } with { + extension "internal" + } + + + /** + * @desc Describes in which step of execution is the testcase + */ + type enumerated TestcaseStep { + e_preamble, + e_testBody, + e_postamble + } + + } // end compTypeRelated + + group standardSyncPointNames { + const charstring c_prDone := "preambleDone"; + const charstring c_poDone := "postambleDone"; + const charstring c_tbDone := "testBodyDone"; + const charstring c_initDone := "initDone"; + } + + } // end group importantSyncTypeDefinitions + + group syncCompTestConfiguration { + + /** + * @desc Calls self connect function if invoking + * component is the MTC or otherwise connects the client + * the server. This function allows to implement preambles + * in a way that they can be used by test components + * in both non-concurrent as well as concurrent test + * cases! + * @remark This function should _not_ be called if the MTC + * acts as a client (and not a server) in a concurrent + * test case. In this case f_connect4ClientSync + * should be used instead. + * @see LibCommon_Sync.f_connect4SelfSync + * @see LibCommon_Sync.f_connect4ClientSync + */ + function f_connect4SelfOrClientSync() + runs on SelfSyncComp { + if ( self == mtc ) { + f_connect4SelfSync(); + } else { + f_connect4ClientSync(); + } + } + + /** + * @desc Calls self connect function if the invoking + * component is the MTC or otherwise disconnects the client + * from the server. This function allows to implement + * postambles in a way that they can be used in both + * non-concurrent as well as concurrent test cases. + * @remark This function should _not_ be called if the MTC + * acts as a client (and not a server) in a concurrent + * test case. In this case f_disconnect4ClientSync + * should be used instead. + * @see LibCommon_Sync.f_disconnect4SelfSync + * @see LibCommon_Sync.f_disconnect4ClientSync + */ + function f_disconnect4SelfOrClientSync() + runs on SelfSyncComp { + if ( self == mtc ) { + f_disconnect4SelfSync(); + } else { + f_disconnect4ClientSync(); + } + } + + } // end group syncCompTestConfiguration + + group syncFunctions { + + /** + * @desc Implements synchronization of 2 clients from server side + * on one or more synchronization points. + * If problem occurs, then server sends STOP to all clients. + * Waits for PX_TSYNC_TIME_LIMIT to let clients + * finish executing their behavior until this + * synchronization point. After passing all synchronization + * points successfuly the server waits for all clients + * to stop. + * See f_serverSyncClientsTimed for overwriting this + * the timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @see LibCommon_Sync.f_serverWaitForAllClientsToStop + * @param p_syncPointIds list of synchronization point name/ids + */ + function f_serverSync2ClientsAndStop( in SyncPointList p_syncPointIds ) + runs on ServerSyncComp { + f_serverSyncNClientsAndStop(2, p_syncPointIds); + } + + /** + * @desc Implements synchronization of 3 clients from server side + * on one or more synchronization points. + * If problem occurs, then server sends STOP to all clients. + * Waits for PX_TSYNC_TIME_LIMIT to let clients + * finish executing their behavior until this + * synchronization point. After passing all synchronization + * points successfuly the server waits for all clients + * to stop. + * See f_serverSyncClientsTimed for overwriting this + * the timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @see LibCommon_Sync.f_serverWaitForAllClientsToStop + * @param p_syncPointIds list of synchronization point name/ids + */ + function f_serverSync3ClientsAndStop( in SyncPointList p_syncPointIds ) + runs on ServerSyncComp { + f_serverSyncNClientsAndStop(3, p_syncPointIds); + } + + /** + * @desc Implements synchronization of 4 clients from server side + * on one or more synchronization points. + * If problem occurs, then server sends STOP to all clients. + * Waits for PX_TSYNC_TIME_LIMIT to let clients + * finish executing their behavior until this + * synchronization point. After passing all synchronization + * points successfuly the server waits for all clients + * to stop. + * See f_serverSyncClientsTimed for overwriting this + * the timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @see LibCommon_Sync.f_serverWaitForAllClientsToStop + * @param p_syncPointIds list of synchronization point name/ids + */ + function f_serverSync4ClientsAndStop( in SyncPointList p_syncPointIds ) + runs on ServerSyncComp { + f_serverSyncNClientsAndStop(4, p_syncPointIds); + } + + /** + * @desc Implements synchronization of N clients from server side + * on one or more synchronization points. + * If problem occurs, then server sends STOP to all clients. + * Waits for PX_TSYNC_TIME_LIMIT to let clients + * finish executing their behavior until this + * synchronization point. After passing all synchronization + * points successfuly the server waits for all clients + * to stop. + * See f_serverSyncClientsTimed for overwriting this + * the timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @see LibCommon_Sync.f_serverWaitForAllClientsToStop + * @param p_numClients number of synchronization clients + * @param p_syncPointIds list of synchronization point name/ids + */ + function f_serverSyncNClientsAndStop ( + in UInt p_numClients, + in SyncPointList p_syncPointIds ) + runs on ServerSyncComp { + var integer i, v_noOfSyncIds := sizeof(p_syncPointIds); + for ( i := 0; i < v_noOfSyncIds; i := i+1 ) { + f_serverSyncClientsTimed ( + p_numClients, + valueof(p_syncPointIds[i]), + PX_TSYNC_TIME_LIMIT ); + } + f_serverWaitForAllClientsToStop(); + } + + /** + * @desc Implements synchronization of 2 clients and 1 UT from server side + * on one or more synchronization points. + * If problem occurs, then server sends STOP to all clients. + * Waits for PX_TSYNC_TIME_LIMIT to let clients + * finish executing their behavior until this + * synchronization point. After passing all synchronization + * points successfuly the server waits for all clients + * to stop. + * See f_serverSyncClientsTimed for overwriting this + * the timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @see LibCommon_Sync.f_serverWaitForAllClientsToStop + * @param p_syncPointIds list of synchronization point name/ids + */ + function f_serverSync2ClientsUtAndStop( in SyncPointList p_syncPointIds ) + runs on ServerSyncComp { + var integer i, v_noOfSyncIds := sizeof(p_syncPointIds); + for ( i := 0; i < v_noOfSyncIds; i := i+1 ) { + f_serverSyncClientsTimed(3,valueof(p_syncPointIds[i]), PX_TSYNC_TIME_LIMIT); + } + f_serverWaitForAllClientsToStop(); + } + + /** + * @desc Calls either self synchronization function if + * invoking component is the MTC, otherwise + * calls client synchronization. After that it + * sets the verdict based on the specified return code. + * This function allows to implement TTCN-3 functions + * in a way that they can be used in both non-concurrent + * as well as concurrent test cases. + * @remark This function should _not_ be called if the MTC + * acts as a client (and not a server) in a concurrent + * test case. In this case f_clientSyncAndVerdict + * should be used instead. + * @param p_syncPoint Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_Sync.f_clientSyncAndVerdict + * @see LibCommon_VerdictControl.f_setVerdict + */ + function f_selfOrClientSyncAndVerdict( in charstring p_syncPoint, + in FncRetCode p_ret) + runs on SelfSyncComp { + if ( self == mtc ) { + // then assume we are running non-conurrent test case + f_selfSyncAndVerdict(p_syncPoint, p_ret); + } else { + f_clientSyncAndVerdict(p_syncPoint, p_ret); + } + } + + /** + * @desc Calls either self synchronization function if + * invoking component is the MTC, otherwise + * calls client synchronization. After that it + * sets a preamble specific verdict based on the + * specified return code. + * This function allows to implement TTCN-3 functions + * in a way that they can be used in both non-concurrent + * as well as concurrent test cases. + * @remark This function should _not_ be called if the MTC + * acts as a client (and not a server) in a concurrent + * test case. In this case f_clientSyncAndVerdictPreamble + * should be used instead. + * @param p_syncPoint Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_Sync.f_clientSyncAndVerdict + * @see LibCommon_VerdictControl.f_setVerdictPreamble + */ + function f_selfOrClientSyncAndVerdictPreamble( in charstring p_syncPoint, + in FncRetCode p_ret) + runs on SelfSyncComp { + if ( self == mtc ) { + // then assume we are running non-conurrent test case + f_selfSyncAndVerdictPreamble(p_syncPoint, p_ret); + } else { + f_clientSyncAndVerdictPreamble(p_syncPoint, p_ret); + } + } + + /** + * @desc Calls either self synchronization function if + * invoking component is the MTC, otherwise + * calls client synchronization. After that it + * sets a preamble specific verdict based on the + * specified return code. + * This function allows to implement TTCN-3 functions + * in a way that they can be used in both non-concurrent + * as well as concurrent test cases. + * @remark This function should _not_ be called if the MTC + * acts as a client (and not a server) in a concurrent + * test case. In this case f_clientSyncAndVerdictTestBody + * should be used instead. + * @param p_syncPoint Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_Sync.f_clientSyncAndVerdict + * @see LibCommon_VerdictControl.f_setVerdictPreamble + */ + function f_selfOrClientSyncAndVerdictTestBody( in charstring p_syncPoint, + in FncRetCode p_ret) + runs on SelfSyncComp { + if ( self == mtc ) { + // then assume we are running non-conurrent test case + f_selfSyncAndVerdictTestBody(p_syncPoint, p_ret); + } else { + f_clientSyncAndVerdictTestBody(p_syncPoint, p_ret); + } + } + + /** + * @desc Function kept for backward compatibility + * @see f_selfOrClientSyncAndVerdictPreamble + * + */ + function f_selfOrClientSyncAndVerdictPR( in charstring p_syncPoint, + in FncRetCode p_ret) + runs on SelfSyncComp { + f_selfOrClientSyncAndVerdictPreamble(p_syncPoint, p_ret); + } + + } // end group syncFunctions + + group syncCompStateHandling { + + /** + * + * @desc This function updates the state (stack) of a + * sync client or self sync component. This stack is + * key in the shutdown handling of test components. + * It adds the new state name to the top of the + * sync component stack of states. + * The state will only be added in case of a current + * execution status of e_success. + * @param p_newSyncCompState Name of state which was attempted to be reached. + * @param p_ret Current behavior execution status + * @remark If the state of component changes this function must be + * _at least_ called from your test suite prior to f_selfSync + * or f_clientSync which is the only definite place for the + * shutdown default invocation! + * @see LibCommon_Sync.a_dummyShutDown + * @see LibCommon_Sync.f_selfSync + * @see LibCommon_Sync.f_clientSync + */ + function f_addSyncCompState(in charstring p_newSyncCompState, + in FncRetCode p_ret) + runs on ClientSyncComp { + if ( p_ret == e_success ) { + if ( f_isItemOnStringStack(v_stateStack,p_newSyncCompState) ) { + log("**** f_addSyncCompState: WARNING: Attempt to add state which is already on sync state stack! No additition done.****"); + } else { + f_pushStringStack(v_stateStack,p_newSyncCompState); + } + } + } // end function f_addSyncCompState + + /** + * + * @desc This function returns the top state on the sync + * state stack of a sync client or self sync + * component and removes it from the stack + * This function cna be used, e.g., in a while + * statement within a postamble or shutdown + * implementation + * @param p_state State on top of the state stack. + * @return false if state stack is empty, true otherwise + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_getTopSyncCompState( out charstring p_state ) + runs on ClientSyncComp + return boolean { + if ( not f_peekStringStackTop(v_stateStack,p_state) ) { + p_state := "IDLE"; + return false; + } + f_popStringStack(v_stateStack); + return true; + } // end function f_getTopSyncCompState + + /* + * @desc This function removes the last state on the state stack + * of a sync client or self sync component. + * This stack is key in the shutdown handling of test + * components. + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_popSyncCompState() + runs on ClientSyncComp { + f_popStringStack(v_stateStack); + } // end function f_popSyncCompState + + /** + * + * @desc This function returns the top state on the sync state + * stack of a sync client or self sync component. It + * does not remove it from the stack + * This stack is key in the shutdown handling of test + * components. + * @param p_state State on top of the state stack. + * @return false if state stack is empty, true otherwise + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_peekTopSyncCompState(out charstring p_state) + runs on ClientSyncComp + return boolean { + return f_peekStringStackTop(v_stateStack,p_state); + } // end function f_peekTopSyncCompState + + /** + * @desc This function checks if the sync state stack + * of a sync client or self sync component is empty. + * This stack is key in the shutdown handling of test + * components. + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_isSyncCompStateStackEmpty() + runs on ClientSyncComp + return boolean { + return f_isStringStackEmpty(v_stateStack); + } // end function f_isSyncCompStateStackEmpty + + } // end group syncCompStateHandling + + group shutDownAltsteps { + + /** + * @desc This is an example of a shutdown altstep which can be + * used as a "template" for a interface specific shutdown + * altstep or possily as a first temporary solution in + * test case development.

+ * This altstep shall be activated as a default as the + * first statement in each test case function which drives + * an interface, i.e., in MTC behavior of single component + * and in each client behavior of multi component test + * cases.
+ * The required behavior from this altstep is to:

+ * 1) expect the STOP either via the test component + * syncPort

+ * 2) upon its arrival it should shut down the SUT + * gracefully based on the current component state

+ * The current component state should have been + * previously kept uptodate from a test suite via the + * f_addSyncCompState function. This default will then be + * (automatically) invoked either from within f_selfSync + * or f_clientSync.
+ * Note that shutdown defaults can be written as + * _interface specific_ - they do not need to be test case + * or test component specific! See another example of a + * shutdown altstep in the sync module. + * @see LibCommon_Sync.f_addSyncCompState + * @see LibCommon_Sync.f_selfSync + * @see LibCommon_Sync.f_clientSync + * @see LibCommon_SyncExamples.a_exampleShutDown + * @remark Your application specific shutdown altstep + * implementation(s) should _not_ be defined in this + * module but as part of your test suite or application specific + * modules. + */ + altstep a_dummyShutDown() + runs on SelfSyncComp { + [] syncPort.receive(m_syncServerStop){ + var charstring v_state := ""; + tc_sync.stop; + log("**** a_dummyShutDown: Test component received STOP signal from sync server - going to IDLE state ****"); + while ( f_getTopSyncCompState(v_state) ) { + if ( v_state == "x" ) { + // then do something + } else if ( v_state == "y" ) { + // then do something else + } + } // end while + f_disconnect4SelfOrClientSync(); + // unmap/disconnect more if needed + log("**** a_dummyShutDown: -> Test component stopping itself now! ****") ; + stop ; + } + } // end altstep a_dummyShutDown + + /** + * @desc Shutdown alstep in case the sync server is requesting shutdown. + * + * @remark User shall stop the component + */ + altstep a_shutdown() + runs on ClientSyncComp { + [] syncPort.receive(m_syncServerStop){ + tc_sync.stop ; + log("**** a_shutdown: Test component received STOP signal from MTC **** "); + } + } + + } // end group shutDownAltsteps + + } // end group basicUserRelevantDefinitions + + group advancedUserRelevantDefinitions { + + group serverRelated { + + /** + * @desc Implements synchronization of "n" clients from server + * side. If a problem occurs, then server sends STOP to + * all clients. Waits for PX_TSYNC_TIME_LIMIT to let + * clients finish executing their behavior until this + * synchronization point. See f_serverSyncClientsTimed for + * overwriting this later timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync port! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @param p_noOfClients number of clients to be synchronized + * @param p_syncId synchronization point name/id + */ + function f_serverSyncClients( in UInt p_noOfClients, in charstring p_syncId ) + runs on ServerSyncComp { + f_serverSyncClientsTimed(p_noOfClients,p_syncId, PX_TSYNC_TIME_LIMIT); + } + + /** + * @desc Implements synchronization of "n" clients from server + * side including intermediate synchronization. + * If a problem occurs, then server sends STOP to + * all clients. Waits for PX_TSYNC_TIME_LIMIT to let + * clients finish executing their behavior until this + * synchronization point. See f_serverSyncClientsTimed for + * overwriting this later timing constraint! + * This function sets the server component verdict. + * @remark The use of this function requires prior connection of + * the server sync port! + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.f_serverSyncClientsTimed + * @param p_noOfClients number of clients to be synchronized + * @param p_syncId synchronization point name/id + */ + function f_serverSyncClientsIntermediateSync( in UInt p_noOfClients, in charstring p_syncId, in UInt p_NoOfClientIntermediate, in template (present) charstring p_syncIdIntermediate ) + runs on ServerSyncComp { + f_serverSyncClientsTimedIntermediateSync(p_noOfClients,p_syncId, p_NoOfClientIntermediate, p_syncIdIntermediate, PX_TSYNC_TIME_LIMIT); + } + + /** + * @desc Handles synchronization of clients from server side. + * If problem occurs, then server sends STOP to all clients. + * This function sets the server verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @param p_NoOfClients number of clients to be synchronized + * @param p_syncId synchronization point name/id + * @param p_execTimeLimit time limit given to all clients to finish the execution + * of their behavior up to this synchronization point + * @see LibCommon_Sync.f_connect4SelfOrClientSync + */ + function f_serverSyncClientsTimed(in UInt p_NoOfClients, + in charstring p_syncId, + float p_execTimeLimit ) + runs on ServerSyncComp { + f_serverSyncClientsTimedIntermediateSync(p_NoOfClients, p_syncId, 0, ?, p_execTimeLimit ) + } // end function f_serverSyncClientsTimed + + /** @desc Handles synchronization of clients from server side including + * intermediate synchronization. + * If problem occurs, then server sends STOP to all clients. + * This function sets the server verdict. + * @remark The use of this function requires prior connection of + * the server sync ports! + * @param p_NoOfClients number of clients to be synchronized + * @param p_syncId synchronization point name/id + * @param p_execTimeLimit time limit given to all clients to finish the execution + * of their behavior up to this synchronization point + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @return execution status + */ + function f_serverSyncClientsTimedIntermediateSync( in UInt p_NoOfClients, + in charstring p_syncId, in UInt p_NoOfClientIntermediate, in template (present) charstring p_syncIdIntermediate, + float p_execTimeLimit ) + runs on ServerSyncComp { + + var integer v_noOfRecvdSyncMsgs := 0, v_noOfRecvdSyncMsgsIntermediate := 0; + var boolean v_stopClients := false; + var ClientSyncCompList v_clientRefs := {}, v_clientRefsIntermediate := {}; + var ClientSyncComp v_clientRef; + + if ( p_syncId == c_prDone ) { + log("**** f_serverSyncClientsTimed: Sync server now starting PREAMBLE synchronization ... ****") ; + } else if ( p_syncId == c_tbDone ) { + log("**** f_serverSyncClientsTimed: Sync server now starting TEST BODY synchronization ... ****") ; + } else if ( p_syncId == c_initDone ) { + log("**** f_serverSyncClientsTimed: Sync server now starting UPPER TESTER synchronization ... ****") ; + } else { + log("**** f_serverSyncClientsTimed: Sync server now starting handling of next synchronization point ... ****") ; + } + tc_sync.start(p_execTimeLimit) ; + alt{ + [v_noOfRecvdSyncMsgsIntermediate != p_NoOfClientIntermediate] syncPort.receive(m_syncClientReady(p_syncIdIntermediate)) -> sender v_clientRef { + if(not f_isPresentInArray(v_clientRef, v_clientRefsIntermediate)) { + v_clientRefsIntermediate[v_noOfRecvdSyncMsgsIntermediate] := v_clientRef; + v_noOfRecvdSyncMsgsIntermediate := v_noOfRecvdSyncMsgsIntermediate + 1; + if (v_noOfRecvdSyncMsgsIntermediate == p_NoOfClientIntermediate) { + f_serverSendToAllClients(v_clientRefsIntermediate, m_syncServerReady(p_syncIdIntermediate)); + } + } + repeat; + } + [] syncPort.receive(m_syncClientReady(p_syncId)) -> sender v_clientRef { + if(not f_isPresentInArray(v_clientRef, v_clientRefs)) { + v_clientRefs[v_noOfRecvdSyncMsgs] := v_clientRef; + v_noOfRecvdSyncMsgs := v_noOfRecvdSyncMsgs + 1; + } + if ( v_noOfRecvdSyncMsgs != p_NoOfClients ) { repeat; } + } + [] syncPort.receive(m_syncClientStop) -> sender v_clientRef { + log("**** f_serverSyncClientsTimed: Sync server received STOP signal from a client - server will wait for all clients to reach their next synchronization point and then stop them! ****") ; + v_stopClients := true; + if(not f_isPresentInArray(v_clientRef, v_clientRefs)) { + v_clientRefs[v_noOfRecvdSyncMsgs] := v_clientRef; + v_noOfRecvdSyncMsgs := v_noOfRecvdSyncMsgs + 1; + } + if ( v_noOfRecvdSyncMsgs != p_NoOfClients ) { repeat; } + + } + [] syncPort.receive(m_syncClientReady(?)) -> sender v_clientRef { + log("**** f_serverSyncClientsTimed: Sync server received client sync message with incorrect synchronization point id which is currently not handled - server will stop all clients! ****") ; + v_stopClients := true; + if(not f_isPresentInArray(v_clientRef, v_clientRefs)) { + v_clientRefs[v_noOfRecvdSyncMsgs] := v_clientRef; + } + } + [] syncPort.receive(SyncCmd :? ) { + log("**** f_serverSyncClientsTimed: Sync server received (invalid) sync message from other sync server - server will stop all clients! ****") ; + v_stopClients := true; } + [] any port.receive { + // leave it to be ok to receive anything else + // in case that the user has added any non-sync ports to + // his/her server component type definition! + repeat; + } + [] tc_sync.timeout{ + log("**** f_serverSyncClientsTimed: A client is not responding within specified time limit - sync server is sending stop to all clients! ****"); + v_stopClients := true; } + } //end alt + if (v_noOfRecvdSyncMsgsIntermediate != p_NoOfClientIntermediate) { + v_stopClients := true; + } + tc_sync.stop ; + if ( v_stopClients ) { + setverdict(inconc); + // then send out STOP sync msg + f_serverSendToAllClients(v_clientRefs, m_syncServerStop); + f_serverWaitForAllClientsToShutDown(); // function will never return! + } else { + setverdict(pass); + // then send out READY sync msg + f_serverSendToAllClients(v_clientRefs, m_syncServerReady(p_syncId)); + if ( p_syncId == c_prDone ) { + log("**** f_serverSyncClientsTimed: Sync server successfully passed PREAMBLE synchronization point. ****") ; + } else if ( p_syncId == c_tbDone ) { + log("**** f_serverSyncClientsTimed: Sync server successfully passed TEST BODY synchronization point. ****") ; + } else { + log("**** f_serverSyncClientsTimed: Sync server successfully passed synchronization point. ****") ; + } + } + } // end function f_serverSyncClientsTimedIntermediateSync + + /** + * @desc This function is intended only for use on the sync + * server component in concurrent TTCN-3 test cases. + * It waits for all components to finish execution within + * the PX_TSYNC_TIME_LIMIT. If a timeout occurs + * the server will stop all clients. + * This function sets the server component verdict. + */ + function f_serverWaitForAllClientsToStop() + runs on ServerSyncComp { + tc_sync.start; + alt { + [] all component.done { + tc_sync.stop; + log("**** f_serverWaitForAllClientsToStop: All sync clients have finished their execution. Sync server now terminating test case. ****") ; + } + [] tc_sync.timeout { + log("**** f_serverWaitForAllClientsToStop: Not all sync clients have finshed execution within the sync time limit. Sync server will stop test case! ****") ; + stop; + } + } // end alt + setverdict(pass); + } // end function f_serverWaitForAllClientsToStop + + } // end group serverRelated + + group clientRelated { + + /** + * @desc This function creates the connection needed to + * execute client synchronization functions + * @see LibCommon_Sync.f_clientSync + * @see LibCommon_Sync.f_clientSendStop + */ + function f_connect4ClientSync() + runs on ClientSyncComp { + connect(self:syncPort, mtc:syncPort); + }// end function f_connect4ClientSync + + /** + * @desc This function removes the connection needed + * to execute client synchronization functions + * @see LibCommon_Sync.f_clientSync + * @see LibCommon_Sync.f_clientSendStop + */ + function f_disconnect4ClientSync() + runs on ClientSyncComp { + disconnect(self:syncPort, mtc:syncPort); + }// end function f_disconnect4ClientSync + + /** + * @desc This function combines client verdict setting with its + * synchronization for use,e.g, after or within a + * test body implementation. + * Note that such premables can _not_ be reused in non- + * concurrent test cases. This can be achieved by using + * the f_selfOrClientSyncAndVerdict function instead. + * This function sets the client component verdict. + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @remark The use of this function requires prior connection + * of the client sync port! + * @see LibCommon_Sync.f_connect4ClientSync + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_VerdictControl.f_setVerdict + * @see LibCommon_Sync.f_selfOrClientSyncAndVerdict + */ + function f_clientSyncAndVerdict(in charstring p_syncId, + in FncRetCode p_ret) + runs on ClientSyncComp { + if(vc_testcaseStep == e_preamble) { + f_clientSyncAndVerdictPreamble(p_syncId, p_ret); + } else if(vc_testcaseStep == e_testBody) { + f_clientSyncAndVerdictTestBody(p_syncId, p_ret); + } + else { + f_clientSyncAndVerdictPostamble(p_syncId, p_ret); + } + } + + /** + * @desc This function combines client verdict setting with its + * synchronization for use after or within a preamble + * implementation. + * Note that such preambles can _not_ be reused in non- + * concurrent test cases. + * This function sets the client component verdict. + * @remark The use of this function requires prior connection + * of the client sync port! + * @see LibCommon_Sync.f_connect4ClientSync + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_VerdictControl.f_setVerdictPreamble + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + */ + function f_clientSyncAndVerdictPreamble(in charstring p_syncId , + FncRetCode p_ret) + runs on ClientSyncComp { + f_setVerdictPreamble(p_ret); + f_clientSync(p_syncId,p_ret); + vc_testcaseStep := e_testBody; + } + + /** + * @desc This function combines client verdict setting with its + * synchronization for use,e.g, after or within a + * test body implementation. + * Note that such premables can _not_ be reused in non- + * concurrent test cases. This can be achieved by using + * the f_selfOrClientSyncAndVerdict function instead. + * This function sets the client component verdict. + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @remark The use of this function requires prior connection + * of the client sync port! + * @see LibCommon_Sync.f_connect4ClientSync + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_VerdictControl.f_setVerdict + * @see LibCommon_Sync.f_selfOrClientSyncAndVerdict + */ + function f_clientSyncAndVerdictTestBody(in charstring p_syncId, + in FncRetCode p_ret) + runs on ClientSyncComp { + f_setVerdict(p_ret); + f_clientSync(p_syncId,p_ret); + vc_testcaseStep := e_postamble; + } + + /** + * @desc This function combines client verdict setting with its + * synchronization for use after or within a + * postamble implementation. + * Note that such prostambles can _not_ be reused in non- + * concurrent test cases. + * This function sets the client component verdict. + * @remark The use of this function requires prior connection + * of the client sync port! + * @see LibCommon_Sync.f_connect4ClientSync + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_VerdictControl.f_setVerdictPostamble + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + */ + function f_clientSyncAndVerdictPostamble(in charstring p_syncId , + in FncRetCode p_ret) + runs on ClientSyncComp { + f_setVerdictPostamble(p_ret); + f_clientSync(p_syncId,p_ret); + } + + /** + * @desc This function handles synchronization of a sync client + * with the server. In case of successful execution it sends + * a READY message to the server and waits the READY back. + * The time used for waiting is defined by PX_TSYNC_TIME_LIMIT. + * In case of a non successful execution status it + * sends a STOP message to the server. + * In both cases the receipt of a STOP message or no + * response from the server it will trigger the shutdown + * default (if activated). + * This function will set only the client verdict to INCONC + * (and stop its execution) if no STOP response is received + * from the server within the PX_TSYNC_TIME_LIMIT + * or if no shutdown default is activated. In all other + * cases the client verdict is NOT set. + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @remark The use of this function requires prior connection + * of the client sync port! + * @see LibCommon_Sync.f_connect4ClientSync + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.a_dummyShutDown + * @see LibCommon_Sync.f_clientSendStop + * @return Updated execution status + */ + function f_clientSync( in charstring p_syncId , + in FncRetCode p_ret ) + runs on ClientSyncComp + return FncRetCode{ + + if (p_ret == e_success){ + syncPort.send(m_syncClientReady(p_syncId)); + tc_sync.start; + alt{ + [] syncPort.receive(m_syncServerReady(p_syncId)){ + tc_sync.stop ; } + [] tc_sync.timeout{ + log("**** f_clientSync: Sync client did not receive message from sync server within the specified time limit - sync client will ask sync server to stop test case! ****") ; + f_clientSendStop(); } // function will not return! + } //end alt + } //end if + else { + log("**** f_clientSync: Execution status indicates that execution of test component behavior was not successful - sync client will ask sync server to stop test case! ****") ; + f_clientSendStop(); // function will not return! + } + if ( p_syncId == c_prDone ) { + log("**** f_clientSync: Sync client successfully passed PREAMBLE synchronization point. ****") ; + } else if ( p_syncId == c_tbDone ) { + log("**** f_clientSync: Sync client successfully passed TEST BODY synchronization point. ****") ; + } else { + log("**** f_clientSync: Sync client successfully passed synchronization point. ****") ; + } + return e_success ; + + } // end function f_clientSync + + /** + * @desc This function can be used to request the shutdown a + * multi component test case _prior_ to reaching a + * synchronization point. It sends a STOP message to + * the sync server and awaits then the STOP from the server + * which will trigger the shutdown default (if activated). + * This function will set the server verdict to INCONC (and + * stop the test case) if no shutdown default is activated. + * This function will set only the client verdict to INCONC + * (and stop its execution) if no STOP response is received + * from the server within the PX_TSYNC_TIME_LIMIT + * or if no shutdown default is activated. In all other + * cases the client verdict is NOT set. + * @remark The use of this function requires prior connection + * of the client sync port! + * @see LibCommon_Sync.f_connect4ClientSync + * @see LibCommon_Sync.f_connect4SelfOrClientSync + * @see LibCommon_Sync.PX_TSYNC_TIME_LIMIT + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_clientSendStop() + runs on ClientSyncComp { + log("**** f_clientSendStop: Sync client requesting from server to stop test case (including itself). ****") ; + syncPort.send(m_syncClientStop) ; + tc_sync.start; + alt{ + [] tc_sync.timeout{ + log("**** f_clientSendStop: Stopping sync client without shutdown - either no shutdown default active or no stop received from server. ****") ; + setverdict(inconc); + stop ; + } + }//end alt + tc_sync.stop; + stop; // stop here if shutdown default does not stop + } + + } // end group clientRelated + + } // end group advancedUserRelevantDefinitions + + group otherSyncModuleDefinitions { + + group syncModuleparams { + /** + * + * @desc Default time limit for a sync client to reach a + * synchronization point + */ + modulepar float PX_TSYNC_TIME_LIMIT := 120.0; + + /* + * @desc Default time limit for a sync client to finish + * its execution of the shutdown default + */ + modulepar float PX_TSHUT_DOWN_TIME_LIMIT := 120.0; + } + + group otherSyncTypes { + + type record of charstring SyncPointList; + + type record of ClientSyncComp ClientSyncCompList; + + } // end group otherSyncTypes + + group otherSelfSyncRelatedDefinitions { + + /** + * @desc This function creates the connection needed to + * execute self sync functions + * @see LibCommon_Sync.f_selfSync + * @see LibCommon_Sync.f_selfSyncStop + */ + function f_connect4SelfSync() + runs on SelfSyncComp { + connect(self:syncSendPort, self:syncPort); + }// end function f_connect4SelfSync + + /** + * @desc This function removes the connection needed + * to execute self sync functions + * @see LibCommon_Sync.f_selfSync + * @see LibCommon_Sync.f_selfSyncStop + */ + function f_disconnect4SelfSync() + runs on SelfSyncComp { + disconnect(self:syncSendPort, self:syncPort); + }// end function f_disconnect4SelfSync + + /** + * @desc This function combines MTC verdict setting with self + * synchronization for use in the preamble / test body / postamble + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_VerdictControl.f_setVerdict + * @see LibCommon_Sync.f_selfSync + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_selfSyncAndVerdict( in charstring p_syncId, + in FncRetCode p_ret ) + runs on SelfSyncComp { + if(vc_testcaseStep == e_preamble) { + f_selfSyncAndVerdictPreamble(p_syncId, p_ret); + } else if(vc_testcaseStep == e_testBody) { + f_selfSyncAndVerdictTestBody(p_syncId, p_ret); + } + else { + f_selfSyncAndVerdictPostamble(p_syncId, p_ret); + } + } + + /** + * @desc This function combines MTC verdict setting with self + * synchronization for use after the preamble. + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_VerdictControl.f_setVerdictPreamble + * @see LibCommon_Sync.f_selfSync + */ + function f_selfSyncAndVerdictPreamble( in charstring p_syncId, + in FncRetCode p_ret ) + runs on SelfSyncComp { + f_setVerdictPreOrPostamble(p_ret); + f_selfSync(p_syncId,p_ret); + vc_testcaseStep := e_testBody; + } + + /** + * @desc This function combines MTC verdict setting with self + * synchronization for use after the test body. + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_VerdictControl.f_setVerdict + * @see LibCommon_Sync.f_selfSync + */ + function f_selfSyncAndVerdictTestBody( in charstring p_syncId, + in FncRetCode p_ret ) + runs on SelfSyncComp { + f_setVerdict(p_ret); + f_selfSync(p_syncId,p_ret); + vc_testcaseStep := e_postamble; + } + + /** + * @desc This function combines MTC verdict setting with self + * synchronization for use after the postamble. + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @see LibCommon_VerdictControl.f_setVerdictPostamble + * @see LibCommon_Sync.f_selfSync + */ + function f_selfSyncAndVerdictPostamble( in charstring p_syncId , + in FncRetCode p_ret ) + runs on SelfSyncComp { + f_setVerdictPreOrPostamble(p_ret); + f_selfSync(p_syncId,p_ret); + } + + /** + * @desc This function synchronizes a MTC with itself. In case + * of a non successful execution status it sends a STOP + * message to itself and invokes that way the + * shutdown default (if activated). + * This function will set the server verdict to INCONC (and + * stop the test case) if no shutdown default is activated. + * Otherwise no verdict is set. + * @remark Sync ports should be connected prior to the invocation + * of this function! + * @param p_syncId Synchronization point name/id + * @param p_ret Current behavior execution status + * @return Updated execution status + * @see LibCommon_Sync.f_connect4SelfSync + * @see LibCommon_Sync.a_dummyShutDown + */ + function f_selfSync( in charstring p_syncId , + in FncRetCode p_ret ) + runs on SelfSyncComp + return FncRetCode{ + if (p_ret != e_success){ + f_selfSyncStop() ; // function will not return! + } + if ( p_syncId == c_prDone ) { + log("**** f_selfSync: Successfully passed PREAMBLE synchronization point. ****") ; + } else if ( p_syncId == c_tbDone ) { + log("**** f_selfSync: Successfully passed TEST BODY synchronization point. ****") ; + } else { + log("**** f_selfSync: Successfully passed synchronization point. ****") ; + } + return e_success ; + }// end function f_selfSync + + /** + * @desc This function can be used to shut down a test case _prior_ + * to reaching a synchronization point. it sends a STOP + * message to itself and invokes that way the + * shutdown default (if activated). + * This function will set the server verdict to INCONC (and + * stop the test case) if no shutdown default is activated. + * Otherwise no verdict is set. + * @remark Sync ports should be connected prior to the invocation + * of this function! + * @see LibCommon_Sync.f_connect4SelfSync + */ + function f_selfSyncStop() + runs on SelfSyncComp { + + log("**** f_selfSyncStop: MTC requests to stop test case (itself). ****") ; + syncSendPort.send(m_syncServerStop) ; // this MUST be _server_ for the default to catch! + tc_sync.start(PX_TSYNC_TIME_LIMIT); + alt{ + [] tc_sync.timeout{ + log("**** f_selfSyncStop: Stopping MTC without shutdown - either no shutdown default active or missing syncPort connection ****") ; + setverdict(inconc); + stop ; + } + }//end alt + tc_sync.stop; + stop; // if shutdown default is not activated or if it does not stop + } // end function f_selfSyncStop + + } // end group otherSelfSyncRelatedDefinitions + + /** + * + * @desc The sychronization protocol is conceptually based on + * named synchronization. Each synchronization point + * has it own specific synchronization message. This + * makes each synchronization unique, and allows, e.g., to + * ensure that a server synchronizes only clients which have + * reached the same synchronization point. + */ + group syncProtocolDefinition { + + type union SyncCmd { + ClientReady clientReady, + ServerReady serverReady, + ClientStop clientStop, + ServerStop serverStop + } + + type record ClientReady { + charstring syncPointId + } + + type record ServerReady { + charstring syncPointId + } + + type record ClientStop {} + + type record ServerStop {} + + } // end group syncProtocolDefinition + + group syncMessages { + template SyncCmd m_syncClientReady( template (present) charstring p_syncId ) := { + clientReady := { p_syncId } + } + + template SyncCmd m_syncServerReady( template (present) charstring p_syncId ) := { + serverReady := { p_syncId } + } + + template SyncCmd m_syncClientStop := { + clientStop := {} + } + + template SyncCmd m_syncServerStop := { + serverStop := {} + } + + } // end group syncMessages + + group otherSyncFunctions { + + /** + * @desc Makes server send a sync message to all known clients + * @param p_clientRefs List of client references to which the message is to be send + * @param p_syncCmd The actual synchronization message to be sent out + */ + function f_serverSendToAllClients( in ClientSyncCompList p_clientRefs, + in template (value) SyncCmd p_syncCmd) + runs on ServerSyncComp { + var integer i:=0; + for (i:=0; i< sizeof(p_clientRefs); i:=i+1 ){ + syncPort.send(p_syncCmd) to valueof(p_clientRefs[i]); + } + } // end function f_serverSendToAllClients + + /** + * @desc This function is intended only for use on server in concurrent + * TTCN-3 test cases. It waits for all components to shut down + * within the PX_TSHUT_DOWN_TIME_LIMIT. If a timeout occurs + * it aborts the test case (no matter how far clients got with their + * shutdown). + * This function sets the server verdict. + */ + function f_serverWaitForAllClientsToShutDown() + runs on ServerSyncComp { + + tc_shutDown.start(PX_TSHUT_DOWN_TIME_LIMIT); + alt { + [] syncPort.receive { + // clients may still try to send some sync message + } + [] all component.done { + tc_shutDown.stop; + log("**** f_serverWaitForAllClientsToShutDown: All components have properly shut down. Sync server will now terminate the test case. ****") ; + } + [] tc_shutDown.timeout { + log("**** f_serverWaitForAllClientsToShutDown: Not all clients have properly shutdown within the shut down time limit. Sync server will now terminate test case! ****") ; + } + } // end alt + // cover case that shut down default is NOT activated + setverdict(inconc); + //mtc.stop; + syncPort.send(m_syncServerStop) to self; // this MUST be _server_ for the default to catch! + tc_sync.start(PX_TSYNC_TIME_LIMIT); + alt{ + [] tc_sync.timeout{ + log("**** f_selfSyncStop: Stopping MTC without shutdown - either no shutdown default active or missing syncPort connection ****") ; + setverdict(inconc); + stop ; + } + }//end alt + tc_sync.stop; + stop; // if shutdown default is not activated or if it does not stop + } // end function f_serverWaitForAllClientsToShutDown + + function f_isPresentInArray(in ClientSyncComp p_clientRef, in ClientSyncCompList p_clientRefs) + return boolean { + var integer i; + for(i:=0; i < sizeof(p_clientRefs); i:=i+1) { + if(p_clientRefs[i] == p_clientRef) { + return true; + } + } + return false; + } + } // end group otherSyncFunctions + + } // end group otherSyncDefinitions + +} // end module LibCommon_Sync diff --git a/ttcn/patch_lib_config_and_trigger_titan/module.mk b/ttcn/patch_lib_config_and_trigger_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..55ba6b146ce786aee068ca85652a3db50168cdbd --- /dev/null +++ b/ttcn/patch_lib_config_and_trigger_titan/module.mk @@ -0,0 +1 @@ +sources := LibIms_UpperTester.ttcn \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/module.mk b/ttcn/patch_lib_diameter_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..110c113066397ce9f41418ef81d0b104fc9251f0 --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/module.mk @@ -0,0 +1,16 @@ +sources := \ + ttcn/LibDiameter_PIXITS.ttcn \ + ttcn/LibDiameter_Interface.ttcn \ + ttcn/LibDiameter_Steps.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_Base_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Templates.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_S6a_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_S9_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_RfRo_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_ShDh_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_TypesAndValues.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_Rx_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_CxDx_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_Types_Gx_AVPs.ttcn \ + ../patch_lib_diameter_titan/ttcn/LibDiameter_EncdecDeclarations.ttcn \ + diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_EncdecDeclarations.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_EncdecDeclarations.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..e53d0a4d015ea9f7c9ce5514f1248c40194b7526 --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_EncdecDeclarations.ttcn @@ -0,0 +1,281 @@ +module LibDiameter_EncdecDeclarations { + + //LibDiameter + import from LibDiameter_TypesAndValues all; + + external function fx_enc_CER_MSG(in CER_MSG p_CER_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_CER_MSG(inout bitstring pdu, out CER_MSG p_CER_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_CEA_MSG(in CEA_MSG p_CEA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_CEA_MSG(inout bitstring pdu, out CEA_MSG p_CEA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_RAR_MSG(in RAR_MSG p_RAR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_RAR_MSG(inout bitstring pdu, out RAR_MSG p_RAR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_RAA_MSG(in RAA_MSG p_RAA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_RAA_MSG(inout bitstring pdu, out RAA_MSG p_RAA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_ACR_MSG(in ACR_MSG p_ACR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_ACR_MSG(inout bitstring pdu, out ACR_MSG p_ACR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_ACA_MSG(in ACA_MSG p_ACA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_ACA_MSG(inout bitstring pdu, out ACA_MSG p_ACA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_ASR_MSG(in ASR_MSG p_ASR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_ASR_MSG(inout bitstring pdu, out ASR_MSG p_ASR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_ASA_MSG(in ASA_MSG p_ASA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_ASA_MSG(inout bitstring pdu, out ASA_MSG p_ASA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_STR_MSG(in STR_MSG p_STR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_STR_MSG(inout bitstring pdu, out STR_MSG p_STR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_STA_MSG(in STA_MSG p_STA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_STA_MSG(inout bitstring pdu, out STA_MSG p_STA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_DWR_MSG(in DWR_MSG p_DWR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_DWR_MSG(inout bitstring pdu, out DWR_MSG p_DWR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_DWA_MSG(in DWA_MSG p_DWA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_DWA_MSG(inout bitstring pdu, out DWA_MSG p_DWA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_DPR_MSG(in DPR_MSG p_DPR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_DPR_MSG(inout bitstring pdu, out DPR_MSG p_DPR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_DPA_MSG(in DPA_MSG p_DPA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_DPA_MSG(inout bitstring pdu, out DPA_MSG p_DPA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_UAR_MSG(in UAR_MSG p_UAR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_UAR_MSG(inout bitstring pdu, out UAR_MSG p_UAR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_UAA_MSG(in UAA_MSG p_UAA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_UAA_MSG(inout bitstring pdu, out UAA_MSG p_UAA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_SAR_MSG(in SAR_MSG p_SAR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_SAR_MSG(inout bitstring pdu, out SAR_MSG p_SAR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_SAA_MSG(in SAA_MSG p_SAA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_SAA_MSG(inout bitstring pdu, out SAA_MSG p_SAA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_LIR_MSG(in LIR_MSG p_LIR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_LIR_MSG(inout bitstring pdu, out LIR_MSG p_LIR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_LIA_MSG(in LIA_MSG p_LIA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_LIA_MSG(inout bitstring pdu, out LIA_MSG p_LIA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_MAR_MSG(in MAR_MSG p_MAR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_MAR_MSG(inout bitstring pdu, out MAR_MSG p_MAR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_MAA_MSG(in MAA_MSG p_MAA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_MAA_MSG(inout bitstring pdu, out MAA_MSG p_MAA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_RTR_MSG(in RTR_MSG p_RTR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_RTR_MSG(inout bitstring pdu, out RTR_MSG p_RTR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_RTA_MSG(in RTA_MSG p_RTA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_RTA_MSG(inout bitstring pdu, out RTA_MSG p_RTA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PPR_MSG(in PPR_MSG p_PPR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PPR_MSG(inout bitstring pdu, out PPR_MSG p_PPR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PPA_MSG(in PPA_MSG p_PPA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PPA_MSG(inout bitstring pdu, out PPA_MSG p_PPA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_UDR_MSG(in UDR_MSG p_UDR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_UDR_MSG(inout bitstring pdu, out UDR_MSG p_UDR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_UDA_MSG(in UDA_MSG p_UDA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_UDA_MSG(inout bitstring pdu, out UDA_MSG p_UDA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PUR_MSG(in PUR_MSG p_PUR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PUR_MSG(inout bitstring pdu, out PUR_MSG p_PUR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PUA_MSG(in PUA_MSG p_PUA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PUA_MSG(inout bitstring pdu, out PUA_MSG p_PUA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_SNR_MSG(in SNR_MSG p_SNR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_SNR_MSG(inout bitstring pdu, out SNR_MSG p_SNR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_SNA_MSG(in SNA_MSG p_SNA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_SNA_MSG(inout bitstring pdu, out SNA_MSG p_SNA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PNR_MSG(in PNR_MSG p_PNR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PNR_MSG(inout bitstring pdu, out PNR_MSG p_PNR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PNA_MSG(in PNA_MSG p_PNA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PNA_MSG(inout bitstring pdu, out PNA_MSG p_PNA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_CCR_MSG(in CCR_MSG p_CCR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_CCR_MSG(inout bitstring pdu, out CCR_MSG p_CCR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_CCA_MSG(in CCA_MSG p_CCA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_CCA_MSG(inout bitstring pdu, out CCA_MSG p_CCA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_AAR_MSG(in AAR_MSG p_AAR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_AAR_MSG(inout bitstring pdu, out AAR_MSG p_AAR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_AAA_MSG(in AAA_MSG p_AAA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_AAA_MSG(inout bitstring pdu, out AAA_MSG p_AAA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_ULR_MSG(in ULR_MSG p_ULR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_ULR_MSG(inout bitstring pdu, out ULR_MSG p_ULR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_ULA_MSG(in ULA_MSG p_ULA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_ULA_MSG(inout bitstring pdu, out ULA_MSG p_ULA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_AIR_MSG(in AIR_MSG p_AIR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_AIR_MSG(inout bitstring pdu, out AIR_MSG p_AIR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_AIA_MSG(in AIA_MSG p_AIA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_AIA_MSG(inout bitstring pdu, out AIA_MSG p_AIA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_CLR_MSG(in CLR_MSG p_CLR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_CLR_MSG(inout bitstring pdu, out CLR_MSG p_CLR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_CLA_MSG(in CLA_MSG p_CLA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_CLA_MSG(inout bitstring pdu, out CLA_MSG p_CLA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_IDR_MSG(in IDR_MSG p_IDR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_IDR_MSG(inout bitstring pdu, out IDR_MSG p_IDR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_IDA_MSG(in IDA_MSG p_IDA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_IDA_MSG(inout bitstring pdu, out IDA_MSG p_IDA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_DSR_MSG(in DSR_MSG p_DSR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_DSR_MSG(inout bitstring pdu, out DSR_MSG p_DSR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_DSA_MSG(in DSA_MSG p_DSA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_DSA_MSG(inout bitstring pdu, out DSA_MSG p_DSA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_RSR_MSG(in RSR_MSG p_RSR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_RSR_MSG(inout bitstring pdu, out RSR_MSG p_RSR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_RSA_MSG(in RSA_MSG p_RSA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_RSA_MSG(inout bitstring pdu, out RSA_MSG p_RSA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_NOR_MSG(in NOR_MSG p_NOR_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_NOR_MSG(inout bitstring pdu, out NOR_MSG p_NOR_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_NOA_MSG(in NOA_MSG p_NOA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_NOA_MSG(inout bitstring pdu, out NOA_MSG p_NOA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PUER_MSG(in PUER_MSG p_PUER_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PUER_MSG(inout bitstring pdu, out PUER_MSG p_PUER_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_PUEA_MSG(in PUEA_MSG p_PUEA_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_PUEA_MSG(inout bitstring pdu, out PUEA_MSG p_PUEA_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + + external function fx_enc_UNKNOWN_MSG(in UNKNOWN_MSG p_UNKNOWN_MSG) return bitstring + with {extension "prototype(convert) encode(DIAMETERCodec)"} + external function fx_dec_UNKNOWN_MSG(inout bitstring pdu, out UNKNOWN_MSG p_UNKNOWN_MSG) return integer + with {extension "prototype(sliding) decode(DIAMETERCodec)"} + +} // End of module LibDiameter_EncdecDeclarations \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Templates.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Templates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..abc56bf05097c0ee1874c93343846df310b2442a --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Templates.ttcn @@ -0,0 +1,3849 @@ +/** + * @author STF 434 + * @version $Id$ + * @desc This module defines Diameter Templates for message, header, and + * structured types.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Any additions to the templates shall follow the design rules + * and always modify base templates only; + */ + +module LibDiameter_Templates { + + //LibCommon + import from LibCommon_DataStrings all; + import from LibCommon_BasicTypesAndValues all; + + //LibDiameter + import from LibDiameter_Types_Base_AVPs all; + import from LibDiameter_Types_Gx_AVPs all; + import from LibDiameter_Types_CxDx_AVPs all; + import from LibDiameter_TypesAndValues all; + import from LibDiameter_PIXITS all; + import from LibDiameter_TypesAndValues all; + + group LowerLayerPrimitives { + + template Lower_Layer_Primitive m_llp_listen(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port) := { + ll_header := m_llh_listen(p_ETS_address, p_ETS_port, p_SUT_address, p_SUT_port), + pdu := omit + } + + template Lower_Layer_Primitive m_llp_connect(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port, template integer p_ETS_conn) := { + ll_header := m_llh_connect(p_ETS_address, p_ETS_port, p_SUT_address, p_SUT_port, p_ETS_conn), + pdu := omit + } + + template Lower_Layer_Primitive mw_llp_connectIndication(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port, template integer p_ETS_conn) := { + ll_header := mw_llh_connectIndication(p_ETS_address, p_ETS_port, p_SUT_address, p_SUT_port, p_ETS_conn), + pdu := * + } + + template Lower_Layer_Primitive mw_llp_connectConfirm(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port, template integer p_ETS_conn) := { + ll_header := mw_llh_connectConfirm(p_ETS_address, p_ETS_port, p_SUT_address, p_SUT_port, p_ETS_conn), + pdu := * + } + + template Lower_Layer_Primitive m_llp_disconnect(template integer p_ETS_conn) := { + ll_header := m_llh_disconnect(p_ETS_conn), + pdu := omit + } + + template Lower_Layer_Primitive mw_llp_disconnectIndication(template integer p_ETS_conn) := { + ll_header := mw_llh_disconnectIndication(p_ETS_conn), + pdu := * + } + + template Lower_Layer_Primitive m_llp_dataRequest( template integer p_ETS_conn, template DIAMETER_MSG p_pdu) := { + ll_header := m_llh_dataRequest(p_ETS_conn), + pdu := p_pdu + } + + template Lower_Layer_Primitive mw_llp_dataIndication(template integer p_ETS_conn, template DIAMETER_MSG p_pdu) := { + ll_header := mw_llh_dataIndication(p_ETS_conn), + pdu := p_pdu + } + + template Lower_Layer_Header m_llh_listen(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port) := { + primitive := LISTEN_REQUEST_E, + transport_used := c_defaultTransportProtocol, + ETS_address := p_ETS_address, + ETS_port := p_ETS_port, + SUT_address := p_SUT_address, + SUT_port := p_SUT_port, + ETS_conn := omit + } + + template Lower_Layer_Header m_llh_connect(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port, template integer p_ETS_conn) := { + primitive := CONNECT_REQUEST_E, + transport_used := c_defaultTransportProtocol, + ETS_address := p_ETS_address, + ETS_port := p_ETS_port, + SUT_address := p_SUT_address, + SUT_port := p_SUT_port, + ETS_conn := p_ETS_conn + } + + template Lower_Layer_Header mw_llh_connectIndication(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port, template integer p_ETS_conn) := { + primitive := CONNECT_INDICATION_E, + transport_used := c_defaultTransportProtocol, + ETS_address := p_ETS_address, + ETS_port := p_ETS_port, + SUT_address := p_SUT_address, + SUT_port := p_SUT_port, + ETS_conn := p_ETS_conn + } + + template Lower_Layer_Header mw_llh_connectConfirm(template charstring p_ETS_address, template integer p_ETS_port, template charstring p_SUT_address, template integer p_SUT_port, template integer p_ETS_conn) := { + primitive := CONNECT_CONFIRM_E, + transport_used := c_defaultTransportProtocol, + ETS_address := p_ETS_address, + ETS_port := p_ETS_port, + SUT_address := p_SUT_address, + SUT_port := p_SUT_port, + ETS_conn := p_ETS_conn + } + + template Lower_Layer_Header m_llh_disconnect(template integer p_ETS_conn) := { + primitive := DISCONNECT_REQUEST_E, + transport_used := c_defaultTransportProtocol, + ETS_address := omit, + ETS_port := omit, + SUT_address := omit, + SUT_port := omit, + ETS_conn := p_ETS_conn + } + + template Lower_Layer_Header mw_llh_disconnectIndication(template integer p_ETS_conn) := { + primitive := DISCONNECT_INDICATION_E, + transport_used := c_defaultTransportProtocol, + ETS_address := *, + ETS_port := *, + SUT_address := *, + SUT_port := *, + ETS_conn := p_ETS_conn + } + + template Lower_Layer_Header m_llh_dataRequest(template integer p_ETS_conn) := { + primitive := DATA_REQUEST_E, + transport_used := c_defaultTransportProtocol, + ETS_address := omit, + ETS_port := omit, + SUT_address := omit, + SUT_port := omit, + ETS_conn := p_ETS_conn + } + + template Lower_Layer_Header mw_llh_dataIndication(template integer p_ETS_conn) := { + primitive := DATA_INDICATION_E, + transport_used := c_defaultTransportProtocol, + ETS_address := *, + ETS_port := *, + SUT_address := *, + SUT_port := *, + ETS_conn := p_ETS_conn + } + + }//end group LowerLayerPrimitives + + //internal PIXITS if some + group ModuleParameters { + } //end group ModuleParameters + + group SubFields{ + + template Result_Code_Type/*integer*/ m_resultCode_diameterSuccess := DIAMETER_SUCCESS_E/*2001*/; + template Result_Code_Type/*integer*/ mw_resultCode_diameterSuccess := (DIAMETER_SUCCESS_E,DIAMETER_LIMITED_SUCCESS_E/*2000..2999*/); + + template AVP_Type mw_avpType(template (present) AVP_Header p_avpHeader) := { + aVP_Header := p_avpHeader, + aVP_Data := * + } + + } //end group SubFields + + group HeaderFieldTemplates{ + group DiameterHeaderGroup{ + template (value) Command_Flags m_cmdFlagsAns := { + r_bit := '0'B, + p_bit := '0'B, + e_bit := '0'B, + t_bit := '0'B, + reserved_bits := '0000'B + } + + template (value) Command_Flags m_cmdFlagsAnsProx modifies m_cmdFlagsAns:= { + p_bit := '1'B + } + + template (value) Command_Flags m_cmdFlagsReq modifies m_cmdFlagsAns:= { + r_bit := '1'B + } + + template (value) Command_Flags m_cmdFlagsReqDuplicated modifies m_cmdFlagsAns:= { + r_bit := '1'B, + t_bit := '1'B + } + + template Command_Flags mw_cmdFlags := { + r_bit := ?, + p_bit := ?, + e_bit := ?, + t_bit := ?, + reserved_bits := ? + } + + template (value) DiameterHeader m_diameterHeaderReq_dummy(Command_Code p_cmdcode, UInt32 p_applid) := { + version := c_versionId, + msglen := 0, //Message lenght with AVPs has to be calculated + cmdflags := m_cmdFlagsReq, //RPETrrrr + cmdcode := p_cmdcode, //Command code + applid := p_applid, //Diameter common messages =0, Vendor specific applications = 16777216 - 4294967294(0x01000000-0xfffffffe) -Gx=16777238,Rx=16777236, 3GPP Cx/Dx=13777216,3GPP Sh=16777217 + hopid := 0, + endid := 0 + } + + template (value) DiameterHeader m_diameterHeaderReqDuplicated_dummy(Command_Code p_cmdcode, UInt32 p_applid) modifies m_diameterHeaderReq_dummy := { + cmdflags := m_cmdFlagsReqDuplicated + } + + template DiameterHeader mw_diameterHeaderReq_dummy(Command_Code p_cmdcode, template (present) UInt32 p_applid) := { + version := c_versionId, + msglen := ?, //Message lenght with AVPs has to be calculated + cmdflags := mw_cmdFlags, //RPETrrrr + cmdcode := p_cmdcode, //Command code + applid := p_applid, //Diameter common messages =0, Vendor specific applications = 16777216 - 4294967294(0x01000000-0xfffffffe) -Gx=16777238,Rx=16777236, 3GPP Cx/Dx=13777216,3GPP Sh=16777217 + hopid := ?, + endid := ? + } + + template (value) DiameterHeader m_diameterHeaderAns_dummy(Command_Code p_cmdcode, UInt32 p_applid) := { + version := c_versionId, + msglen := 0, //Message lenght with AVPs has to be calculated + cmdflags := m_cmdFlagsAns, //RPETrrrr + cmdcode := p_cmdcode, //Command code + applid := p_applid, //Diameter common messages =0, Vendor specific applications = 16777216 - 4294967294(0x01000000-0xfffffffe) -Gx=16777238,Rx=16777236, 3GPP Cx/Dx=13777216,3GPP Sh=16777217 + hopid := 0, + endid := 0 + } + + template DiameterHeader mw_diameterHeaderAns_dummy(Command_Code p_cmdcode, template (present) UInt32 p_applid) := { + version := c_versionId, + msglen := ?, //Message lenght with AVPs has to be calculated + cmdflags := mw_cmdFlags, //RPETrrrr + cmdcode := p_cmdcode, //Command code + applid := p_applid, //Diameter common messages =0, Vendor specific applications = 16777216 - 4294967294(0x01000000-0xfffffffe) -Gx=16777238,Rx=16777236, 3GPP Cx/Dx=13777216,3GPP Sh=16777217 + hopid := ?, + endid := ? + } + + template (value) AVP_Flags m_avpFlags_Mbit1 := { + v_bit := '0'B, + m_bit := '1'B, + p_bit := '0'B, + reserved_bits := '00000'B + } + + template (value) AVP_Flags m_avpFlags_Mbit0 := { + v_bit := '0'B, + m_bit := '0'B, + p_bit := '0'B, + reserved_bits := '00000'B + } + + template (value) AVP_Flags m_avpFlags_VMbit1 := { + v_bit := '1'B, + m_bit := '1'B, + p_bit := '0'B, + reserved_bits := '00000'B + } + + template AVP_Flags mw_avpFlags_any := { + v_bit := ?, + m_bit := ?, + p_bit := ?, + reserved_bits := '00000'B + } + + template AVP_Flags mw_avpFlags_VMbits(template (present) Bit1 p_vbit, template (present) Bit1 p_mbit) := { + v_bit := p_vbit, + m_bit := p_mbit, + p_bit := ?, + reserved_bits := '00000'B + } + + template AVP_Header mw_aVP_Header_any := { + aVP_Code :=?, + aVP_flags := mw_avpFlags_any, + aVP_len := ?, + aVP_vid := * + } + + template AVP_Header mw_aVP_Header_any_Code (template (present) AVP_Code p_avpCode):= { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_any, + aVP_len := ?, + aVP_vid := * + } + + template AVP_Header mw_aVP_Header_Vbit0 (AVP_Code p_avpCode) := { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_VMbits('0'B, ?), + aVP_len := ?, + aVP_vid := * + } + + template AVP_Header mw_aVP_Header_Vbit0Mbit0 (AVP_Code p_avpCode) := { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_VMbits('0'B, '0'B), + aVP_len := ?, + aVP_vid := * + } + + template AVP_Header mw_aVP_Header_Vbit0Mbit1 (AVP_Code p_avpCode) := { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_VMbits('0'B, '1'B), + aVP_len := ?, + aVP_vid := * + } + + template AVP_Header mw_aVP_Header_Vbit1Mbit0 (AVP_Code p_avpCode) := { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_VMbits('1'B, '0'B), + aVP_len := ?, + aVP_vid := ? + } + + //Same template as mw_aVP_Header_VMbit1 but same name style as above templates mw_aVP_Header_VbitXMbitX + template AVP_Header mw_aVP_Header_Vbit1Mbit1 (AVP_Code p_avpCode) := { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_VMbits('1'B, '1'B), + aVP_len := ?, + aVP_vid := ? + } + + template AVP_Header mw_aVP_Header_VMbit1 (AVP_Code p_avpCode) := { + aVP_Code := p_avpCode, + aVP_flags := mw_avpFlags_VMbits('1'B, '1'B), + aVP_len := ?, + aVP_vid := ? + } + + template (value) AVP_Header m_aVP_Header_Mbit1(AVP_Code p_avpCode, AVP_Length p_dataLen:=0) := { + aVP_Code := p_avpCode, + aVP_flags := m_avpFlags_Mbit1, + aVP_len := f_aVP_len(8, p_dataLen, omit), + aVP_vid := omit + } + + template (value) AVP_Header m_aVP_Header_Mbit0(AVP_Code p_avpCode, AVP_Length p_dataLen:=0) := { + aVP_Code := p_avpCode, + aVP_flags := m_avpFlags_Mbit0, + aVP_len := f_aVP_len(8, p_dataLen, omit), + aVP_vid := omit + } + + /** + * @desc complete AVP header field template + * @param p_avpCode specific Code of the AVP parameter + * @param p_avpDataLen additional length caused if AVP data field is present + * @param p_avpVid vendor id if needed + */ + template (value) AVP_Header m_aVP_HeaderVid_Mbit0(AVP_Code p_avpCode, AVP_Length p_avpDataLen, template (omit) AVP_Vendor_ID p_avpVid := omit) := { + aVP_Code := p_avpCode, + aVP_flags := {v_bit := f_aVPvBit(p_avpVid), + m_bit := '0'B, + p_bit := '0'B, + reserved_bits := '00000'B}, + aVP_len :=f_aVP_len(8, p_avpDataLen, p_avpVid), // add length of avpData and optional 4 (if Vid is present) + aVP_vid := p_avpVid + } + + /** + * @desc complete AVP header field template + * @param p_avpCode specific Code of the AVP parameter + * @param p_avpDataLen additional length caused if AVP data field is present + * @param p_avpVid vendor id if needed + */ + template (value) AVP_Header m_aVP_HeaderVid_Mbit1(AVP_Code p_avpCode, AVP_Length p_avpDataLen, template (omit) AVP_Vendor_ID p_avpVid := omit) := { + aVP_Code := p_avpCode, + aVP_flags := {v_bit := f_aVPvBit(p_avpVid), + m_bit := '1'B, + p_bit := '0'B, + reserved_bits := '00000'B}, + aVP_len :=f_aVP_len(8, p_avpDataLen, p_avpVid), // add length of avpData and optional 4 (if Vid is present) + aVP_vid := p_avpVid + } + + /** + * @desc complete AVP header field receive template + * @param p_avpCode specific Code of the AVP parameter + * @param p_avpDataLen additional length caused if AVP data field is present + * @param p_avpVid vendor id if needed + */ + template (present) AVP_Header mw_aVP_HeaderVid_Mbit1( + in AVP_Code p_avpCode, + in template (present) AVP_Length p_avpDataLen := ?, + in template (present) AVP_Vendor_ID p_avpVid) := { + aVP_Code := p_avpCode, + aVP_flags := {v_bit := f_aVPvBit(p_avpVid), + m_bit := '1'B, + p_bit := ?, + reserved_bits := '00000'B}, + aVP_len := p_avpDataLen, + aVP_vid := p_avpVid + } + + function f_aVP_len(AVP_Length p_length8, AVP_Length p_avpDataLen, template AVP_Vendor_ID p_avpVid)return AVP_Length { + var AVP_Length v_sum; + v_sum := p_length8 + p_avpDataLen + f_lengthVid(p_avpVid); + return v_sum + } + + function f_lengthof_AVP(AVP_Header p_header) return AVP_Length { + var AVP_Length v_sum; + v_sum := f_aVP_len (8, p_header.aVP_len, p_header.aVP_vid); + return v_sum + } + + function f_getByteAlignedLength(template AVP_Length p_length) return AVP_Length { + return (valueof(p_length) + ((4-valueof(p_length) mod 4) mod 4)); + + } + + function f_lengthVid(template AVP_Vendor_ID p_avpVid) return AVP_Length { + if(isvalue(p_avpVid)){return 4} else{return 0} + } + + function f_aVPvBit(template AVP_Vendor_ID p_avpVid) return Bit1 { + if(isvalue(p_avpVid)){return '1'B} else{return '0'B} + } + + } //end group DiameterHeaderGroup + + group DummyAVPHeaders{ + + template (value) Origin_Host_AVP m_originHost_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_origin_Host_AVP_Code, 3), + aVP_Data := "abc" + } + + template (value) Origin_Realm_AVP m_originRealm_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_origin_Realm_AVP_Code, 3), + aVP_Data := "abc" + } + + template Vendor_Id_AVP m_vendorId_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_vendor_Id_AVP_Code, 4), + aVP_Data := 0 + } + + template Product_Name_AVP m_productName_dummy := { + aVP_Header := m_aVP_Header_Mbit0(c_product_Name_AVP_Code, 3), + aVP_Data := "abc" + } + + template Disconnect_Cause_AVP m_disconnectCause_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_disconnect_Cause_AVP_Code, 4), + aVP_Data := REBOOTING_E + } + + template Result_Code_AVP m_resultCode_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_result_Code_AVP_Code, 4), + aVP_Data := DIAMETER_DUMMY_E + } + + template (value) Destination_Host_AVP m_destinationHost_dummy := + { + aVP_Header := m_aVP_Header_Mbit1(c_destination_Host_AVP_Code, 3), + aVP_Data := "abc" + } + + template (value) Destination_Realm_AVP m_destinationRealm_dummy := + { + aVP_Header := m_aVP_Header_Mbit1(c_destination_Realm_AVP_Code, 3), + aVP_Data := "abc" + } + + template Termination_Cause_AVP m_terminationCause_dummy := + { + aVP_Header := m_aVP_Header_Mbit1(c_termination_Cause_AVP_Code, 4), + aVP_Data := DIAMETER_LOGOUT_E + } + + template (value) Session_Id_AVP m_sessionId_dummy := + { + aVP_Header := m_aVP_Header_Mbit1(c_session_Id_AVP_Code, 3), + aVP_Data := "abc" + } + + template (value) Auth_Application_Id_AVP m_authApplicationId_dummy := + { + aVP_Header := m_aVP_Header_Mbit1(c_auth_Application_Id_AVP_Code, 4), + aVP_Data := 0 + } + + template Accounting_Record_Type_AVP m_accounting_Record_Type_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_accounting_Record_Type_AVP_Code,4), + aVP_Data := EVENT_RECORD_E + } + + template Accounting_Record_Number_AVP m_accounting_Record_Number_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_accounting_Record_Number_AVP_Code,4), + aVP_Data := 0 + } + + template Auth_Session_State_AVP m_auth_Session_State_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_auth_Session_State_AVP_Code,4), + aVP_Data := STATE_MAINTAINED_E + } + + template Auth_Session_State_AVP m_auth_Session_State_no_maintained := { + aVP_Header := m_aVP_Header_Mbit1(c_auth_Session_State_AVP_Code,4), + aVP_Data := NO_STATE_MAINTAINED_E + } + + template SIP_AOR_AVP m_sIP_AOR_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_AOR_AVP_Code, 18, omit), + aVP_Data := f_DiameterURI_2_UTF8String(m_diameterURI_dummy) + } + + template (value) DiameterURI m_diameterURI_dummy := + { + scheme := "aaa", + diameterId_FQDN := "www.etsi.org", + portField := omit, + transport := omit, + protocol := omit + } + + template SIP_Visited_Network_Id_AVP m_sIP_Visited_Network_Id_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Visited_Network_Id_AVP_Code, 6, omit), + aVP_Data := "abcabc" + } + + template SIP_Digest_Authenticate_AVP m_sIP_Digest_Authenticate( + in template (value) Digest_Realm_AVP p_digest_Realm + ) := { + aVP_Header := m_aVP_Header_Mbit1(c_sIP_Digest_Authenticate_AVP_Code), + digest_Realm := p_digest_Realm, + digest_Algorithm := omit, + digest_QoP := omit, + digest_HA1 := omit, + aVP_Type := omit + } + + template SIP_User_Authorization_Type_AVP m_sIP_User_Authorization_Type( + in template (value) SIP_User_Auth_Ty_Type p_aVP_Data := REGISTRATION_E + ) := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_User_Authorization_Type_AVP_Code, 4, omit), + aVP_Data := p_aVP_Data + } + + template SIP_User_Data_Already_Available_AVP m_sIP_User_Data_Already_Available_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_User_Data_Already_Available_AVP_Code, 4, omit), + aVP_Data := USER_DATA_NOT_AVAILABLE_E + } + + template SIP_Server_Assignment_Type_AVP m_sIP_Server_Assignment_Type_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Server_Assignment_Type_AVP_Code, 4, omit), + aVP_Data := NO_ASSIGNMENT_E + } + + template SIP_User_Data_AVP m_sIP_User_Data_dummy := + { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_User_Data_AVP_Code, 0, omit), + sIP_User_Data_Type := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_User_Data_Type_AVP_Code, 3 ,omit), + aVP_Data := "abc" + }, + sIP_User_Data_Contents := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_User_Data_Contents_AVP_Code, 1, omit), + aVP_Data := '00'O + }, + aVP_Type := omit + } + + template SIP_Accounting_Information_AVP m_sIP_Accounting_Information_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Accounting_Information_AVP_Code, 0, omit), + sIP_Accounting_Server_URI := omit, + sIP_Credit_Control_Server_URI := omit, + aVP_Type := omit + } + + template SIP_Method_AVP m_sIP_Method_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Method_AVP_Code, 3, omit), + aVP_Data := "sip" + } + + template SIP_Deregistration_Reason_AVP m_sIP_Deregistration_Reason_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Deregistration_Reason_AVP_Code, 8, omit), + sIP_Reason_Code_AVP := m_sIP_Reason_Code_dummy, + sIP_Reason_Info_AVP := omit, + aVP_Type := omit + } + + template SIP_Reason_Code_AVP m_sIP_Reason_Code_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Reason_Code_AVP_Code, 4, omit), + aVP_Data := PERMANENT_TERMINATION_E + } + + template User_Name_AVP m_user_Name_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_user_Name_AVP_Code, 3), + aVP_Data := "dbo" + } + + template User_Identity_AVP m_user_Identity_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_user_Identity_AVP_Code, 0, c_vendId3gpp), + public_Identity_AVP := omit, + mSISDN_AVP := omit, + aVP_Type := omit + } + + template User_Data_AVP m_user_Data_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_user_Data_AVP_Code, 1, c_vendId3gpp), + aVP_Data := '00'O + } + + template CC_Request_Type_AVP m_cC_Request_Type_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_cC_Request_Type_AVP_Code,4, omit), + aVP_Data := INITIAL_REQUEST_E + } + + template CC_Request_Number_AVP m_cC_Request_Number_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_cC_Request_Number_AVP_Code,4, omit), + aVP_Data := 0 + } + + template Data_Reference_AVP m_data_Reference_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_data_Reference_AVP_Code, 4, c_vendId3gpp), + aVP_Data := REPOSITORY_DATA_E + } + + template (value) Server_Name_AVP m_server_name_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_server_Name_AVP_Code, 4, c_vendId3gpp), + aVP_Data := "sip_url" + } + + template Service_Indication_AVP m_service_Indication_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_service_Indication_AVP_Code, 4, c_vendId3gpp), + aVP_Data := '00'O + } + + template Vendor_Specific_Appl_Id_AVP m_vendor_Specific_Appl_Id_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_vendor_Specific_Appl_Id_AVP_Code), + vendor_Id := omit, + auth_Application_Id := omit, + acct_Application_Id := omit + } + + template Re_Auth_Request_Type_AVP m_re_Auth_Request_dummy := { + aVP_Header := m_aVP_Header_Mbit1(c_re_Auth_Request_Type_AVP_Code, 4), + aVP_Data := AUTHORIZE_ONLY_E + } + + template SIP_Number_Auth_Items_AVP m_sIPNumberAuthItems_RFC_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Number_Auth_Items_AVP_Code_RFC, 4, omit), + aVP_Data := 1 + } + + template SIP_Auth_Data_Item_RFC_AVP m_sIPAuthDataItem_dummy_RFC := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Auth_Data_Item_AVP_Code_RFC, 1, c_vendId3gpp), + sIP_Authentication_Scheme := m_sIPAuthenticationScheme_digest_RFC, + sIP_Item_Number := omit, + sIP_Authenticate := omit, + sIP_Authorization := omit, + sIP_Authentication_Info := omit, + aVP_Type := omit + } + + template SIP_Authentication_Scheme_AVP m_sIPAuthenticationScheme_digest_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC, 4, omit), + aVP_Data := DIGEST_E + } + } + + template SIP_Authentication_Scheme_AVP m_sIPAuthenticationScheme_unknown_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC, 4, omit), + aVP_Data := UNKNOWN_E + } + } + + template SIP_Authentication_Scheme_AVP m_sIPAuthenticationScheme_digest_aka_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC, 4, omit), + aVP_Data := DIGEST_AKAv1_MD5_E + } + } + + template SIP_Authentication_Scheme_AVP m_sIPAuthenticationScheme_nass_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC, 4, omit), + aVP_Data := NASS_BUNDLE_E + } + } + + template SIP_Authentication_Scheme_AVP m_sIPAuthenticationScheme_giga_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC, 4, omit), + aVP_Data := GIBA_E + } + } + + template Subs_Req_Type_AVP m_subs_Req_Type_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_subs_Req_Type_AVP_Code, 4, c_vendId3gpp), + aVP_Data := SUBSCRIBE_E + } + + } //end group DummyAVPHeaders + + group SpecificAVPHeaders { + + template Session_Id_AVP m_sessionId(UTF8String p_avpData) := + { + aVP_Header := m_aVP_Header_Mbit1(c_session_Id_AVP_Code, f_getUTF8StringLength(p_avpData)), + aVP_Data := p_avpData + } + + template Auth_Application_Id_AVP m_authApplicationId(UInt32 p_avpData):= + { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_auth_Application_Id_AVP_Code, 4, omit), + aVP_Data := p_avpData + } + + template Acct_Application_Id_AVP m_acctApplicationId(UInt32 p_avpData):= + { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_acct_Application_Id_AVP_Code, 4, omit), + aVP_Data := p_avpData + } + + template Disconnect_Cause_AVP m_disconnectCause(Disconnect_Cause_Type p_aVP_Data) := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_disconnect_Cause_AVP_Code, 4, omit ), + aVP_Data := p_aVP_Data + } + + template Host_IP_Address_AVP m_hostIPAddress(Address p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_host_IP_Address_AVP_Code, f_IPAdressLengthUInt24()), + aVP_Data := p_avpData + } + + template Origin_Host_AVP m_originHost(template(value) charstring p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_origin_Host_AVP_Code, f_getCharStringLength(valueof(p_avpData))), + aVP_Data := p_avpData + } + + template Origin_Realm_AVP m_originRealm(template(value) charstring p_avpData) := + { + aVP_Header := m_aVP_Header_Mbit1(c_origin_Realm_AVP_Code, f_getCharStringLength(valueof(p_avpData))), + aVP_Data := p_avpData + } + + template Destination_Host_AVP m_destinationHost(template(value) charstring p_avpData) := + { + aVP_Header := m_aVP_Header_Mbit1(c_destination_Host_AVP_Code, f_getCharStringLength(valueof(p_avpData))), + aVP_Data := p_avpData + } + + template Destination_Realm_AVP m_destinationRealm(template(value) charstring p_avpData) := + { + aVP_Header := m_aVP_Header_Mbit1(c_destination_Realm_AVP_Code, f_getCharStringLength(valueof(p_avpData))), + aVP_Data := p_avpData + } + + template Product_Name_AVP m_productName(template(value) UTF8String p_avpData) := + { + aVP_Header := m_aVP_Header_Mbit0(c_product_Name_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData + } + + template Result_Code_AVP m_resultCode(template (value) /*integer*/Result_Code_Type p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_result_Code_AVP_Code, 4), + aVP_Data := p_avpData + } + + template Vendor_Id_AVP m_supportedVendorId(template(value) UInt32 p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_supported_Vendor_Id_AVP_Code, 4), + aVP_Data := p_avpData + } + + template Vendor_Id_AVP m_vendorId(template(value) UInt32 p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_vendor_Id_AVP_Code, 4), + aVP_Data := p_avpData + } + + template Vendor_Specific_Appl_Id_AVP m_vendor_Specific_Appl_Id(UInt32 p_authApplicationId) := { + aVP_Header := m_aVP_Header_Mbit1(c_vendor_Specific_Appl_Id_AVP_Code, 24), + vendor_Id := {m_vendorId(c_vendId3gpp)}, + auth_Application_Id := {m_authApplicationId(p_authApplicationId)}, + acct_Application_Id := omit + } + + template Vendor_Specific_Appl_Id_AVP m_vendor_Specific_Acct_Id(UInt32 p_acctApplicationId) := { + aVP_Header := m_aVP_Header_Mbit1(c_vendor_Specific_Appl_Id_AVP_Code, 24), + vendor_Id := {m_vendorId(c_vendId3gpp)}, + auth_Application_Id := omit, + acct_Application_Id := {m_acctApplicationId(p_acctApplicationId)} + } + + template Auth_Application_Id_AVP mw_authApplicationId(UInt32 p_avpData) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_auth_Application_Id_AVP_Code), + aVP_Data := p_avpData + } + + template Acct_Application_Id_AVP mw_acctApplicationId(UInt32 p_avpData) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_acct_Application_Id_AVP_Code), + aVP_Data := p_avpData + } + + template QoS_Information_AVP mw_qosInformation_QosInfo_ARP := { + aVP_Header := mw_aVP_Header_VMbit1(c_qoS_Information_AVP_Code), // + qoS_Class_Identifier :=?, + max_Requested_Bandwidth_UL :=*, + max_Requested_Bandwidth_DL :=*, + guaranteed_Bitrate_UL :=*, + guaranteed_Bitrate_DL :=*, + bearer_Identifier :=*, + allocation_Retention_Priority :=?, + aPN_Aggregate_Max_Bitrate_UL :=*, + aPN_Aggregate_Max_Bitrate_DL :=*, + aVP_Type:=* + } + + template Result_Code_AVP mw_resultCode(template (present)/*integer*/Result_Code_Type p_avpData) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_result_Code_AVP_Code), + aVP_Data := p_avpData + } +// +// template Experimental_Result_AVP mw_experimentalResult(template (present)/*integer*/Experimental_Result_Code_AVP p_experimental_Result_Code) := { +// aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_experimental_Result_AVP_Code), +// vendor_Id := ?, +// experimental_Result_Code := p_experimental_Result_Code +// } + + template Experimental_Result_Code_AVP mw_experimentalResultCode(template (present)/*integer*/Experimental_Result_Type p_avpData) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_experimental_Result_Code_AVP_Code), + aVP_Data := p_avpData + } + + template Session_Release_Cause_AVP mw_sessReleaseCause(template (present) Session_Release_Cause p_avpData) := + { + aVP_Header := mw_aVP_Header_VMbit1(c_session_Release_Cause_AVP_Code), + aVP_Data := p_avpData + } + + template Supported_Features_AVP mw_supportedFeatures_dummy := { + aVP_Header := mw_aVP_HeaderVid_Mbit1(c_supported_Features_AVP_Code, ?, c_vendId3gpp), + vendor_Id := ?, + feature_list_Id := *, + feature_list := ?, + aVP_Data := * + } + + template Supported_Features_AVP m_supportedFeatures ( + template Vendor_Id_AVP p_vendorId, + template Feature_List_ID_AVP p_feature_list_Id, + template (value) Feature_List_AVP p_feature_list, + template Supported_Features_AVP.aVP_Data p_aVP_Data + ):= { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_supported_Features_AVP_Code, 1, c_vendId3gpp), + vendor_Id := m_vendorId(c_vendId3gpp), + feature_list_Id := p_feature_list_Id, + feature_list := p_feature_list, + aVP_Data := p_aVP_Data + } + + template Feature_List_AVP m_featureList(template (present) UInt32 p_avpData) := + { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_feature_List_AVP_Code, 1, c_vendId3gpp), + aVP_Data := p_avpData + } + + template Feature_List_ID_AVP m_featureListId(template (present) UInt32 p_avpData) := + { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_feature_List_ID_AVP_Code, 1, c_vendId3gpp), + aVP_Data := p_avpData + } + + template Failed_AVP mw_failed(template (present) Failed_AVP.aVP p_avpData) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_failed_AVP_Code), + aVP := p_avpData + } + + template SIP_Number_Auth_Items_AVP m_sIPNumberAuthItems_RFC (template (value) UInt32 p_avpData) := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Number_Auth_Items_AVP_Code_RFC, 4, omit), + aVP_Data := p_avpData + } + + template SIP_Authentication_Scheme_AVP m_sIPAuthenticationScheme_RFC(template (value) SIP_Auth_Schm_Type p_SIPAuthSchmType) := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC, 4, omit), + aVP_Data := p_SIPAuthSchmType + } + } + + template User_Name_AVP m_userName(template (value) UTF8String p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_user_Name_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData + } + + template SIP_Item_Number_AVP m_sIPItemNumber_RFC(template (value) UInt32 p_aVP_Data) := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Item_Number_AVP_Code_RFC, 4, omit), + aVP_Data := p_aVP_Data + } + + template SIP_Authorization_RFC_AVP m_sIP_Authorization_RFC( + template (value) Digest_Username_AVP p_digest_Username, + template (value) Digest_Realm_AVP p_digestRealm, + template (value) Digest_Nonce_AVP p_digestNonce, + template (value) Digest_URI_AVP p_digestUri, + template (value) Digest_Response_AVP p_digest_Response + ) := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_sIP_Authorization_AVP_Code_RFC, 4, omit), + digest_Username := p_digest_Username, + digest_Realm := p_digestRealm, + digest_Nonce := p_digestNonce, + digest_URI := p_digestUri, + digest_Response := p_digest_Response, + digest_Algorithm := omit, + digest_CNonce := omit, + digest_Opaque := omit, + digest_QoP := omit, + digest_Nonce_Count := omit, + digest_Method := omit, + digest_Entity_Body_Hash := omit, + digest_Auth_Param := omit, + aVP_Type := omit + } + + template SIP_Authorization_RFC_AVP m_sIP_Authorization_digest_aka_RFC( + template (value) Digest_Username_AVP p_digest_Username, + template (value) Digest_Realm_AVP p_digestRealm, + template (value) Digest_Nonce_AVP p_digestNonce, + template (value) Digest_URI_AVP p_digestUri, + template (value) Digest_Response_AVP p_digest_Response + ) modifies m_sIP_Authorization_RFC := { + // TODO How to pass RAND + AUX + } + + template Digest_Username_AVP m_digestUsername(template (value) UTF8String p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_digest_Username_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData +// Type := c_digest_Username_AVP_Code, +// Length := f_getUTF8StringLength(valueof(p_text)), +// Text := p_text + } + + template Digest_Realm_AVP m_digestRealm(template (value) UTF8String p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_digest_Realm_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData +// Type := c_digest_Realm_AVP_Code, +// Length := f_getUTF8StringLength(valueof(p_text)), +// Text := p_text + } + + template Digest_Nonce_AVP m_digestNonce(template (value) UTF8String p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_digest_Realm_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData +// Type := c_digest_Realm_AVP_Code, +// Length := f_getUTF8StringLength(valueof(p_text)), +// Text := p_text + } + + template Digest_URI_AVP m_digestUri(template (value) UTF8String p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_digest_URI_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData +// Type := c_digest_URI_AVP_Code, +// Length := f_getUTF8StringLength(valueof(p_text)), +// Text := p_text + } + + template Digest_Response_AVP m_digestResponse(template (value) UTF8String p_avpData) := { + aVP_Header := m_aVP_Header_Mbit1(c_digest_Response_AVP_Code, f_getUTF8StringLength(valueof(p_avpData))), + aVP_Data := p_avpData +// Type := c_digest_Response_AVP_Code, +// Length := f_getUTF8StringLength(valueof(p_text)), +// Text := p_text + } + + template User_Name_AVP mw_userName(template (present) UTF8String p_avpData) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_user_Name_AVP_Code), + aVP_Data := p_avpData + } + + + template User_Data_AVP m_user_Data_shData (octetstring p_ud) modifies m_user_Data_dummy := { + aVP_Header := m_aVP_HeaderVid_Mbit1(c_user_Data_Sh_AVP_Code, lengthof(p_ud), c_vendId3gpp), + aVP_Data := p_ud + } + + } //end group SpecificAVPHeaders + } //end group HeaderFieldTemplates + + /** Message templates for CER,CEA, DWR, DWA, AAA, AAR, .... methods */ + group MessageTemplates { + + group dummy_templates { + + template UNKNOWN_MSG mw_UNKNOWN_dummy := { + header := ?, + aVP_Type := * + } + group dummy_request_templates_send { + + template (value) AAR_MSG m_AAR_dummy := + { + header := m_diameterHeaderReq_dummy(AAR_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + aAR_Body := m_AAR_Body_dummy + } + + template (value) AAR_Body_AVP m_AAR_Body_dummy := + { + //dRMP := omit, + auth_Application_Id := m_authApplicationId_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + destination_Host := m_destinationHost_dummy, + iP_Domain := omit, + af_Application_Id := omit, + media_Component_Description := omit, + service_Info_Status := omit, + af_Charging_Identifier := omit, + sip_Forking_Indication := omit, + specific_Action := omit, + subscription_Id := omit, + //oC_Supported_Features := omit, + supported_Features := omit, + reservation_Priority := omit, + framed_IP_Address := omit, + framed_IPv6_Address := omit, + called_Station_Id := omit, + service_URN := omit, + sponsored_Connectivity_Data := omit, + mps_Identifier := omit, + gcs_Identifier := omit, + mcptt_Identifier := omit, + mCVideo_Identifier := omit, + iMS_Content_Identifier := omit, + iMS_Content_Type := omit, + rx_Request_Type := omit, + required_Access_Info := omit, + aF_Requested_Data := omit, + //reference_Id := omit, + pre_emption_Control_Info := omit, + user_Name := omit, + origin_State_Id := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) ACR_MSG m_ACR_dummy := { + header := m_diameterHeaderReq_dummy(ACR_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + aCR_Body := m_ACR_Body_dummy + } + + template (omit) ACR_Body_AVP m_ACR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + accounting_Record_Type := m_accounting_Record_Type_dummy, + accounting_Record_Number := m_accounting_Record_Number_dummy, + acct_Application_Id := omit, + vendor_Specific_Application_Id := omit, + user_Name := omit, + supported_Features := omit, + accounting_Sub_Session_Id := omit, + acct_Session_Id := omit, + acct_Multi_Session_Id := omit, + acct_Interim_Interval := omit, + accounting_Realtime_Required := omit, + origin_State_Id := omit, + event_Timestamp := omit, + proxy_Info := omit, + route_Record := omit, + service_Context_Id := omit, + service_Information := omit, + aVP_Type := omit + } + + template (value) ASR_MSG m_ASR_dummy := { + header := m_diameterHeaderReq_dummy(ASR_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + aSR_Body := m_ASR_Body_dummy + } + + template (value) ASR_Body_AVP m_ASR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + destination_Host := m_destinationHost_dummy, + auth_Application_Id := m_authApplicationId_dummy, + abort_cause := omit, + user_Name := omit, + origin_State_Id := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) CCR_MSG m_CCR_dummy := { + header := m_diameterHeaderReq_dummy(CCR_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + cCR_Body := m_CCR_Body_dummy + } + + template (omit) CCR_Body_AVP m_CCR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + auth_Application_Id := m_authApplicationId_dummy, + service_Context_Id := omit, + cC_Request_Type := m_cC_Request_Type_dummy, + cC_Request_Number := m_cC_Request_Number_dummy, + destination_Host := omit, + user_Name := omit, + cC_Sub_Session_Id := omit, + acct_Multi_Session_Id := omit, + origin_State_Id := omit, + event_Timestamp := omit, + subscription_Id := omit, + service_Identifier := omit, + termination_Cause := omit, + requested_Service_Unit := omit, + requested_Action := omit, + used_Service_Unit := omit, + aoc_Request_Type_AVP := omit, + multiple_Services_Indicator := omit, + multiple_Services_Credit_Control := omit, + service_Parameter_Info := omit, + cC_Correlation_Id := omit, + supported_Features := omit, + network_Request_Support := omit, + packet_Filter_Information := omit, + packet_Filter_Operation := omit, + bearer_Identifier := omit, + bearer_Operation := omit, + framed_IP_Address := omit, + framed_IPv6_Prefix := omit, + iP_CAN_Type := omit, + threeGPP_RAT_Type := omit, + rat_Type := omit, + qoS_Information := omit, + qoS_Negotiation := omit, + qoS_Upgrade := omit, + default_EPS_Bearer_QoS := omit, + aN_GW_Address := omit, + threeGPP_SGSN_MCC_MNC := omit, + threeGPP_SGSN_Address := omit, + threeGPP_SGSN_IPv6_Address := omit, + rAI := omit, + threeGPP_User_Location_Info := omit, + threeGPP_MS_TimeZone := omit, + called_Station_Id := omit, + pDN_Connection_ID := omit, + bearer_Usage := omit, + online := omit, + offline := omit, + tFT_Packet_Filter_Information := omit, + charging_Rule_Report := omit, + event_Trigger := omit, + event_Report_Indication := omit, + access_Network_Charging_Address := omit, + access_Network_Charging_Identifier_Gx := omit, + coA_Information := omit, + usage_Monitoring_Information := omit, + routing_Rule_Install := omit, + routing_Rule_Remove := omit, + maximum_Bandwidth := omit, + logical_Access_ID := omit, + physical_Access_ID := omit, + session_Linking_Indicator := omit, + qoS_Rule_Report := omit, + subsesion_Enforcement_Info := omit, + threeGPP2_BSID := omit, + multiple_BBERF_Action := omit, + user_CSG_Information := omit, + user_Equipment_Info := omit, + proxy_Info := omit, + route_Record := omit, + service_Information := omit, + aVP_Type := omit + } + + template (value) CER_MSG m_CER_dummy := { + header := m_diameterHeaderReq_dummy(CER_E, c_applIdCommonMsg), + cER_Body := m_CER_Body_dummy + } + + template (value) CER_Body_AVP m_CER_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + host_IP_Address := {m_hostIPAddress(c_address)}, // Address:{'0001'O, {ipv4 := {127, 0, 0,1}}})}, + vendor_Id := m_vendorId_dummy, + product_Name := m_productName_dummy, + origin_State_Id := omit, + supported_Vendor_Id := omit, + auth_Application_Id := omit, + inband_Security_Id := omit, + acct_Application_Id := omit, + vendor_Specific_Application_Id := omit, + firmware_Revision := omit, + aVP_Type := omit + } + + template (value) DWR_MSG m_DWR_dummy := { + header := m_diameterHeaderReq_dummy(DWR_E, c_applIdCommonMsg), + dWR_Body := m_DWR_Body_dummy + } + + template (value) DWR_Body_AVP m_DWR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + origin_State_Id := omit, + aVP_Type := omit + } + + template (value) DPR_MSG m_DPR_dummy := { + header := m_diameterHeaderReq_dummy(DPR_E, c_applIdCommonMsg), + dPR_Body := m_DPR_Body_dummy + } + + template (value) DPR_Body_AVP m_DPR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + disconnect_Cause := m_disconnectCause_dummy, + aVP_Type := omit + } + + template (value) LIR_MSG m_LIR_dummy := { + header := m_diameterHeaderReq_dummy(LIR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + lIR_Body := m_LIR_Body_dummy + } + + template (value) LIR_Body_AVP m_LIR_Body_dummy := + { + vendor_Specific_Application_Id := omit,//required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + sIP_AOR := m_sIP_AOR_dummy, + destination_Host := omit, + originating_Request := omit, //only TS129 229 + supported_Features := omit, //only TS129 229 + public_Identity := omit, //required only in TS129 229 + user_Authorization_Type := omit, //only TS129 229 + session_Priority := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) MAR_MSG m_MAR_dummy := { + header := m_diameterHeaderReq_dummy(MAR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + mAR_Body := m_MAR_Body_dummy + } + + template (value) MAR_Body_AVP m_MAR_Body_dummy := + { + vendor_Specific_Application_Id := omit,//required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + sIP_AOR := m_sIP_AOR_dummy, + sIP_Method := m_sIP_Method_dummy, + destination_Host := omit, + user_Name := omit, + supported_Features := omit, //only TS129 229 + public_Identity := omit, //required only in TS129 229 + sIP_Server_URI := omit, + sIP_Number_Auth_Items := omit, + sIP_Auth_Data_Item := omit, + server_Name := omit, //only TS129 229 + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) PNR_MSG m_PNR_dummy := { + header := m_diameterHeaderReq_dummy(PNR_E, c_applId3GPPShDh), + session_Id := m_sessionId_dummy, + pNR_Body := m_PNR_Body_dummy + } + + template (value) PNR_Body_AVP m_PNR_Body_dummy := + { + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Host := omit, + destination_Realm := m_destinationRealm_dummy, + supported_Features := omit, + user_Identity := m_user_Identity_dummy, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + user_Data := m_user_Data_dummy, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) PPR_MSG m_PPR_dummy := { + header := m_diameterHeaderReq_dummy(PPR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + pPR_Body := m_PPR_Body_dummy + } + + template (value) PPR_Body_AVP m_PPR_Body_dummy := + { + vendor_Specific_Application_Id := omit,//required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + user_Name := m_user_Name_dummy, + sIP_User_Data := omit, + sIP_Accounting_Information := m_sIP_Accounting_Information_dummy, + destination_Host := m_destinationHost_dummy, + authorization_Lifetime := omit, + auth_Grace_Period := omit, + supported_Features := omit, //only TS129 229 + user_Data := omit, //only TS129 229 + charging_Information := omit, //only TS129 229 + sIP_Auth_Data_Item := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) PUR_MSG m_PUR_dummy := { + header := m_diameterHeaderReq_dummy(PUR_E, c_applId3GPPShDh), + session_Id := m_sessionId_dummy, + pUR_Body := m_PUR_Body_dummy + } + + template (value) PUR_Body_AVP m_PUR_Body_dummy := + { + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Host := omit, + destination_Realm := m_destinationRealm_dummy, + supported_Features := omit, + user_Identity := m_user_Identity_dummy, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + data_Reference := {m_data_Reference_dummy}, + user_Data := m_user_Data_dummy, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) RAR_MSG m_RAR_dummy := { + header := m_diameterHeaderReq_dummy(RAR_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + rAR_Body := m_RAR_Body_dummy + } + + template (value) RAR_Body_AVP m_RAR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + destination_Host := m_destinationHost_dummy, + auth_Application_Id := m_authApplicationId_dummy, + specific_Action := omit, + re_Auth_Request_Type := m_re_Auth_Request_dummy, + user_Name := omit, + acc_nc_ident := omit, + acc_nc_addr := omit, + flows := omit, + subscription_Id := omit, + abort_Cause := omit, + ip_Can := omit, + rat_Type := omit, + sponsored_Connectivity_Data := omit, + origin_State_Id := omit, + class := omit, + session_Release_Cause := omit, + event_Trigger := omit, + event_Report_Indication := omit, + charging_Rule_Remove := omit, + charging_Rule_Install := omit, + default_EPS_Bearer_QoS := omit, + qoS_Information := omit, + revalidation_Time := omit, + usage_Monitoring_Information := omit, + qoS_Rule_Install := omit, + qoS_Rule_Remove := omit, + subsession_Decision_Info := omit, + aN_GW_Address := omit, + multiple_BBERF_Action := omit, + proxy_Info := omit, + route_Record := omit, + g_s_u_Pool_Identifier := omit, + service_Identifier := omit, + rating_Group := omit, + aVP_Type := omit + } + + template (value) RTR_MSG m_RTR_dummy := { + header := m_diameterHeaderReq_dummy(RTR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + rTR_Body := m_RTR_Body_dummy + } + + template (value) RTR_Body_AVP m_RTR_Body_dummy := + { + vendor_Specific_Application_Id := omit,//required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Host := m_destinationHost_dummy, + sIP_Deregistration_Reason := m_sIP_Deregistration_Reason_dummy, + destination_Realm := m_destinationRealm_dummy, + user_Name := omit, + sIP_AOR := omit, + associated_Identities := omit, //only TS129 229 + supported_Features := omit, //only TS129 229 + public_Identity := omit, //only TS129 229 + deregistration_Reason := omit, //required only in TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) SAR_MSG m_SAR_dummy := { + header := m_diameterHeaderReq_dummy(SAR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + sAR_Body := m_SAR_Body_dummy + } + + template (value) SAR_Body_AVP m_SAR_Body_dummy := + { + vendor_Specific_Application_Id := omit,//required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + sIP_Server_Assignment_Type := m_sIP_Server_Assignment_Type_dummy, + sIP_User_Data_Already_Available := m_sIP_User_Data_Already_Available_dummy, + destination_Host := omit, + user_Name := omit, + sIP_Server_URI := omit, + sIP_Supported_User_Data_Type := omit, + sIP_AOR := omit, + supported_Features := omit, //only in TS129 229 + public_Identity := omit, //only in TS129 229 + wildcarded_Public_Identity := omit, //only in TS129 229 + server_Name := omit, //required only in TS129 229 + server_Assignment_Type := omit, //required only in TS129 229 + user_Data_Already_Available := omit, //required only in TS129 229 + sCSCF_Restoration_Info := omit, //only in TS129 229 + multiple_Registration_Indication := omit,//only in TS129 229 + session_Priority := omit, //only in TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) SNR_MSG m_SNR_dummy := { + header := m_diameterHeaderReq_dummy(SNR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + sNR_Body := m_SNR_Body_dummy + } + + template (value) SNR_Body_AVP m_SNR_Body_dummy := + { + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy,//required only in TS129 229 + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Host := omit, + destination_Realm := m_destinationRealm_dummy, + supported_Features := omit, + user_Identity := m_user_Identity_dummy, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + service_Indication := omit, + send_Data_Indication := omit, + server_Name := omit, + subs_Req_Type := m_subs_Req_Type_dummy, + data_Reference := {m_data_Reference_dummy}, + identity_Set := omit, + expiry_Time := omit, + dSAI_Tag := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit, + user_Name := omit + } + + template (value) STR_MSG m_STR_dummy := + { + header := m_diameterHeaderReq_dummy(STR_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + sTR_Body := m_STR_Body_dummy + } + + template (value) STR_Body_AVP m_STR_Body_dummy := + { + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + auth_Application_Id := m_authApplicationId_dummy, + termination_Cause := m_terminationCause_dummy, + user_Name := omit, + destination_Host := omit, + class := omit, + origin_State_Id := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) UAR_MSG m_UAR_dummy := + { + header := m_diameterHeaderReq_dummy(UAR_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + uAR_Body := m_UAR_Body_dummy + } + + template (value) UAR_Body_AVP m_UAR_Body_dummy := + { + vendor_Specific_Application_Id := omit,//required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Realm := m_destinationRealm_dummy, + sIP_AOR := m_sIP_AOR_dummy, + destination_Host := omit, + user_Name := omit, + sIP_Visited_Network_Id := m_sIP_Visited_Network_Id_dummy, + sIP_User_Authorization_Type := m_sIP_User_Authorization_Type, + supported_Features := omit, + public_Identity := omit, + visited_Network_Identifier := omit, + user_Authorization_Type := omit, + uAR_Flags := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) UDR_MSG m_UDR_dummy := { + header := m_diameterHeaderReq_dummy(UDR_E, c_applId3GPPShDh), + session_Id := m_sessionId_dummy, + uDR_Body := m_UDR_Body_dummy + } + + template (value) UDR_Body_AVP m_UDR_Body_dummy := + { + vendor_Specific_Application_Id := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + destination_Host := omit, + destination_Realm := m_destinationRealm_dummy, + supported_Features := omit, + user_Identity := m_user_Identity_dummy, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + server_Name := omit, + service_Indication := omit, + data_Reference := {m_data_Reference_dummy}, + identity_Set := omit, + requested_Domain := omit, + current_Location := omit, + dSAI_Tag := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + }//end group dummy_request_templates_send + group dummy_request_templates_receive { + + template AAR_MSG mw_AAR_dummy := + { + header := mw_diameterHeaderReq_dummy(AAR_E, ?), + session_Id := ?, + aAR_Body := mw_AAR_Body_dummy + } + + template AAR_Body_AVP mw_AAR_Body_dummy := + { + //dRMP := *, + auth_Application_Id := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + destination_Host := *, + iP_Domain := *, + af_Application_Id := *, + media_Component_Description := *, + service_Info_Status := *, + af_Charging_Identifier := *, + sip_Forking_Indication := *, + specific_Action := *, + subscription_Id := *, + //oC_Supported_Features := *, + supported_Features := *, + reservation_Priority := *, + framed_IP_Address := *, + framed_IPv6_Address := *, + called_Station_Id := *, + service_URN := *, + sponsored_Connectivity_Data := *, + mps_Identifier := *, + gcs_Identifier := *, + mcptt_Identifier := *, + mCVideo_Identifier := *, + iMS_Content_Identifier := *, + iMS_Content_Type := *, + rx_Request_Type := *, + required_Access_Info := *, + aF_Requested_Data := *, + //reference_Id := omit, + pre_emption_Control_Info := *, + user_Name := *, + origin_State_Id := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template ACR_MSG mw_ACR_dummy := { + header := mw_diameterHeaderReq_dummy(ACR_E, ?), + session_Id := ?, + aCR_Body := mw_ACR_Body_dummy + } + + template ACR_Body_AVP mw_ACR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + accounting_Record_Type := ?, + accounting_Record_Number := ?, + acct_Application_Id := *, + vendor_Specific_Application_Id := *, + user_Name := *, + supported_Features := *, + accounting_Sub_Session_Id := *, + acct_Session_Id := *, + acct_Multi_Session_Id := *, + acct_Interim_Interval := *, + accounting_Realtime_Required := *, + origin_State_Id := *, + event_Timestamp := *, + proxy_Info := *, + route_Record := *, + service_Context_Id := *, + service_Information := *, + aVP_Type := * + } + + template ASR_MSG mw_ASR_dummy := { + header := mw_diameterHeaderReq_dummy(ASR_E, ?), + session_Id := ?, + aSR_Body := mw_ASR_Body_dummy + } + + template ASR_Body_AVP mw_ASR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + destination_Host := ?, + auth_Application_Id := ?, + abort_cause := *, + user_Name := *, + origin_State_Id := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template CCR_MSG mw_CCR_dummy := { + header := mw_diameterHeaderReq_dummy(CCR_E, ?), + session_Id := ?, + cCR_Body := mw_CCR_Body_dummy + } + + template CCR_Body_AVP mw_CCR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + auth_Application_Id := ?, + service_Context_Id := *, + cC_Request_Type := ?, + cC_Request_Number := ?, + destination_Host := *, + user_Name := *, + cC_Sub_Session_Id := *, + acct_Multi_Session_Id := *, + origin_State_Id := *, + event_Timestamp := *, + subscription_Id := *, + service_Identifier := *, + termination_Cause := *, + requested_Service_Unit := *, + requested_Action := *, + used_Service_Unit := *, + aoc_Request_Type_AVP := *, + multiple_Services_Indicator := *, + multiple_Services_Credit_Control := *, + service_Parameter_Info := *, + cC_Correlation_Id := *, + supported_Features := *, + network_Request_Support := *, + packet_Filter_Information := *, + packet_Filter_Operation := *, + bearer_Identifier := *, + bearer_Operation := *, + framed_IP_Address := *, + framed_IPv6_Prefix := *, + iP_CAN_Type := *, + threeGPP_RAT_Type := *, + rat_Type := *, + qoS_Information := *, + qoS_Negotiation := *, + qoS_Upgrade := *, + default_EPS_Bearer_QoS := *, + aN_GW_Address := *, + threeGPP_SGSN_MCC_MNC := *, + threeGPP_SGSN_Address := *, + threeGPP_SGSN_IPv6_Address := *, + rAI := *, + threeGPP_User_Location_Info := *, + threeGPP_MS_TimeZone := *, + called_Station_Id := *, + pDN_Connection_ID := *, + bearer_Usage := *, + online := *, + offline := *, + tFT_Packet_Filter_Information := *, + charging_Rule_Report := *, + event_Trigger := *, + event_Report_Indication := *, + access_Network_Charging_Address := *, + access_Network_Charging_Identifier_Gx := *, + coA_Information := *, + usage_Monitoring_Information := *, + routing_Rule_Install := *, + routing_Rule_Remove := *, + maximum_Bandwidth := *, + logical_Access_ID := *, + physical_Access_ID := *, + session_Linking_Indicator := *, + qoS_Rule_Report := *, + subsesion_Enforcement_Info := *, + threeGPP2_BSID := *, + multiple_BBERF_Action := *, + user_CSG_Information := *, + user_Equipment_Info := *, + proxy_Info := *, + route_Record := *, + service_Information := *, + aVP_Type := * + } + + template CER_MSG mw_CER_dummy := { + header := mw_diameterHeaderReq_dummy(CER_E, ?), + cER_Body := mw_CER_Body_dummy + } + + template CER_Body_AVP mw_CER_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + host_IP_Address := ?, + vendor_Id := ?, + product_Name := ?, + origin_State_Id := *, + supported_Vendor_Id := *, + auth_Application_Id := *, + inband_Security_Id := *, + acct_Application_Id := *, + vendor_Specific_Application_Id := *, + firmware_Revision := *, + aVP_Type := * + } + + template DWR_MSG mw_DWR_dummy := { + header := mw_diameterHeaderReq_dummy(DWR_E, ?), + dWR_Body := mw_DWR_Body_dummy + } + + template DWR_Body_AVP mw_DWR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + origin_State_Id := *, + aVP_Type := * + } + + template DPR_MSG mw_DPR_dummy := { + header := mw_diameterHeaderReq_dummy(DPR_E, ?), + dPR_Body := mw_DPR_Body_dummy + } + + template DPR_Body_AVP mw_DPR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + disconnect_Cause := ?, + aVP_Type := * + } + + template LIR_MSG mw_LIR_dummy := { + header := mw_diameterHeaderReq_dummy(LIR_E, ?), + session_Id := ?, + lIR_Body := mw_LIR_Body_dummy + } + + template LIR_Body_AVP mw_LIR_Body_dummy := + { + vendor_Specific_Application_Id := *, + auth_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + sIP_AOR := ?, + destination_Host := *, + originating_Request := *, //only TS129 229 + supported_Features := *, //only TS129 229 + public_Identity := *, //required only in TS129 229 + user_Authorization_Type := *, //only TS129 229 + session_Priority := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template MAR_MSG mw_MAR_dummy := { + header := mw_diameterHeaderReq_dummy(MAR_E, ?), + session_Id := ?, + mAR_Body := mw_MAR_Body_dummy + } + + template MAR_Body_AVP mw_MAR_Body_dummy := + { + vendor_Specific_Application_Id := *, + auth_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + sIP_AOR := ?, + sIP_Method := ?, + destination_Host := *, + user_Name := *, + supported_Features := *,//only TS129 229 + public_Identity := *, //required only in TS129 229 + sIP_Server_URI := *, + sIP_Number_Auth_Items := *, + sIP_Auth_Data_Item := *, + server_Name := *, //only TS129 229 + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template PNR_MSG mw_PNR_dummy := { + header := mw_diameterHeaderReq_dummy(PNR_E, ?), + session_Id := ?, + pNR_Body := mw_PNR_Body_dummy + } + + template PNR_Body_AVP mw_PNR_Body_dummy := + { + vendor_Specific_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Host := *, + destination_Realm := ?, + supported_Features := *, + user_Identity := ?, + wildcarded_PSI := *, + wildcarded_IMPU := *, + user_Data := ?, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template PPR_MSG mw_PPR_dummy := { + header := mw_diameterHeaderReq_dummy(PPR_E, ?), + session_Id := ?, + pPR_Body := mw_PPR_Body_dummy + } + + template PPR_Body_AVP mw_PPR_Body_dummy := + { + vendor_Specific_Application_Id := *, + auth_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Host := ?, + destination_Realm := ?, + user_Name := ?, + sIP_User_Data := *, + sIP_Accounting_Information := ?, + authorization_Lifetime := *, + auth_Grace_Period := *, + supported_Features := *, //only TS129 229 + user_Data := *, //only TS129 229 + charging_Information := *, //only TS129 229 + sIP_Auth_Data_Item := *, //only TS129 229 + proxy_Info := ?, + route_Record := ?, + aVP_Type := ? + } + + template PUR_MSG mw_PUR_dummy := { + header := mw_diameterHeaderReq_dummy(PUR_E, ?), + session_Id := ?, + pUR_Body := mw_PUR_Body_dummy + } + + template PUR_Body_AVP mw_PUR_Body_dummy := + { + vendor_Specific_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Host := *, + destination_Realm := ?, + supported_Features := *, + user_Identity := ?, + wildcarded_PSI := *, + wildcarded_IMPU := *, + data_Reference := ?, + user_Data := ?, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template RAR_MSG mw_RAR_dummy := { + header := mw_diameterHeaderReq_dummy(RAR_E, ?), + session_Id := ?, + rAR_Body := mw_RAR_Body_dummy + } + + template RAR_Body_AVP mw_RAR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + destination_Host := ?, + auth_Application_Id := ?, + specific_Action := *, + re_Auth_Request_Type := ?, + user_Name := *, + acc_nc_ident := *, + acc_nc_addr := *, + flows := *, + subscription_Id := *, + abort_Cause := *, + ip_Can := *, + rat_Type := *, + sponsored_Connectivity_Data := *, + origin_State_Id := *, + class := *, + session_Release_Cause := *, + event_Trigger := *, + event_Report_Indication := *, + charging_Rule_Remove := *, + charging_Rule_Install := *, + default_EPS_Bearer_QoS := *, + qoS_Information := *, + revalidation_Time := *, + usage_Monitoring_Information := *, + qoS_Rule_Install := *, + qoS_Rule_Remove := *, + subsession_Decision_Info := *, + aN_GW_Address := *, + multiple_BBERF_Action := *, + proxy_Info := *, + route_Record := *, + g_s_u_Pool_Identifier := *, + service_Identifier := *, + rating_Group := *, + aVP_Type := * + } + + template RTR_MSG mw_RTR_dummy := { + header := mw_diameterHeaderReq_dummy(RTR_E, ?), + session_Id := ?, + rTR_Body := mw_RTR_Body_dummy + } + + template RTR_Body_AVP mw_RTR_Body_dummy := + { + vendor_Specific_Application_Id := *,//required only in TS129 229 + auth_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Host := ?, + destination_Realm := ?, + sIP_Deregistration_Reason := ?, + user_Name := *, + sIP_AOR := *, + associated_Identities := *, //only TS129 229 + supported_Features := *, //only TS129 229 + public_Identity := *, //only TS129 229 + deregistration_Reason := *, //required only in TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template SAR_MSG mw_SAR_dummy := { + header := mw_diameterHeaderReq_dummy(SAR_E, ?), + session_Id := ?, + sAR_Body := mw_SAR_Body_dummy + } + + template SAR_Body_AVP mw_SAR_Body_dummy := + { + vendor_Specific_Application_Id :=*, //required only in TS129 229 + auth_Application_Id := ?, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + sIP_Server_Assignment_Type := ?, + sIP_User_Data_Already_Available := ?, + destination_Host := *, + user_Name := *, + sIP_Server_URI := *, + sIP_Supported_User_Data_Type := *, + sIP_AOR := *, + supported_Features := *, //only in TS129 229 + public_Identity := *, //only in TS129 229 + wildcarded_Public_Identity := *, //only in TS129 229 + server_Name := *, //required only in TS129 229 + server_Assignment_Type := *, //required only in TS129 229 + user_Data_Already_Available := *, //required only in TS129 229 + sCSCF_Restoration_Info := *, //only in TS129 229 + multiple_Registration_Indication := *,//only in TS129 229 + session_Priority := *, //only in TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template SNR_MSG mw_SNR_dummy := { + header := mw_diameterHeaderReq_dummy(SNR_E, ?), + session_Id := ?, + sNR_Body := mw_SNR_Body_dummy + } + + template SNR_Body_AVP mw_SNR_Body_dummy := + { + vendor_Specific_Application_Id := ?,//required only in TS129 229 + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Host := *, + destination_Realm := ?, + supported_Features := *, + user_Identity := ?, + wildcarded_PSI := *, + wildcarded_IMPU := *, + service_Indication := *, + send_Data_Indication := *, + server_Name := *, + subs_Req_Type := ?, + data_Reference := ?, + identity_Set := *, + expiry_Time := *, + dSAI_Tag := *, + proxy_Info := *, + route_Record := *, + aVP_Type := *, + user_Name := * + } + + template STR_MSG mw_STR_dummy := + { + header := mw_diameterHeaderReq_dummy(STR_E, ?), + session_Id := ?, + sTR_Body := mw_STR_Body_dummy + } + + template STR_Body_AVP mw_STR_Body_dummy := + { + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + auth_Application_Id := ?, + termination_Cause := ?, + user_Name := *, + destination_Host := *, + class := *, + origin_State_Id := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template UAR_MSG mw_UAR_dummy := { + header := mw_diameterHeaderReq_dummy(UAR_E, ?), + session_Id := ?, + uAR_Body := mw_UAR_Body_dummy + } + + template UAR_Body_AVP mw_UAR_Body_dummy := + { + vendor_Specific_Application_Id := *, + auth_Application_Id := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Realm := ?, + sIP_AOR := ?, + destination_Host := *, + user_Name := *, + sIP_Visited_Network_Id := ?, + sIP_User_Authorization_Type := ?, + supported_Features := *, + public_Identity := *, + visited_Network_Identifier := *, + user_Authorization_Type := *, + uAR_Flags := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template UDR_MSG mw_UDR_dummy := { + header := mw_diameterHeaderReq_dummy(UDR_E, ?), + session_Id := ?, + uDR_Body := mw_UDR_Body_dummy + } + + template UDR_Body_AVP mw_UDR_Body_dummy := + { + vendor_Specific_Application_Id := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + destination_Host := *, + destination_Realm := ?, + supported_Features := *, + user_Identity := ?, + wildcarded_PSI := *, + wildcarded_IMPU := *, + server_Name := *, + service_Indication := *, + data_Reference := ?, + identity_Set := *, + requested_Domain := *, + current_Location := *, + dSAI_Tag := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + }//end group dummy_request_templates_receive + group dummy_answer_templates_send { + + template (value) AAA_MSG m_AAA_dummy := + { + header := m_diameterHeaderAns_dummy(AAA_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + aAA_Body := m_AAA_Body_dummy + } + + template (value) AAA_Body_AVP m_AAA_Body_dummy := + { + //dRMP := omit, + auth_Application_Id := m_authApplicationId_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + result_Code := omit, + experimental_Result := omit, + auth_Session_State := omit, + access_network_charging_Identifier := omit, + access_network_charging_address := omit, + acceptable_service_info := omit, + aN_GW_Address := omit, + //aN_Trusted := omit, + service_Authorization_Info := omit, + ip_Can_Type := omit, + //netLoc_Access_Support := omit, + rat_Type := omit, + flows := omit, + //oC_Supported_Features := *, + //oC_OLR := *, + supported_Features := omit, + subscription_Id_AVP := omit, + user_Equipment_Info := omit, + threeGPP_SGSN_MCC_MNC := omit, + class_ := omit, + user_Name := omit, + error_Message := omit, + error_Reporting_Host := omit, + failed := omit, + retry_Interval := omit, + origin_State_Id := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + proxy_Info := omit, + // load:= omit, + aVP_Type := omit + } + + template (value) ACA_MSG m_ACA_dummy := { + header := m_diameterHeaderAns_dummy(ACA_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + aCA_Body := m_ACA_Body_dummy + } + + template (omit) ACA_Body_AVP m_ACA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + accounting_Record_Type := m_accounting_Record_Type_dummy, + accounting_Record_Number := m_accounting_Record_Number_dummy, + acct_Application_Id := omit, + vendor_Specific_Application_Id := omit, + user_Name := omit, + accounting_Sub_Session_Id := omit, + acct_Session_Id := omit, + acct_Multi_Session_Id := omit, + error_Reporting_Host := omit, + acct_Interim_Interval := omit, + accounting_Realtime_Required := omit, + origin_State_Id := omit, + event_Timestamp := omit, + proxy_Info := omit, + aVP_Type := omit + } + + template (value) ASA_MSG m_ASA_dummy := { + header := m_diameterHeaderAns_dummy(ASA_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + aSA_Body := m_ASA_Body_dummy + } + + template (value) ASA_Body_AVP m_ASA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + user_Name := omit, + origin_State_Id := omit, + error_Message := omit, + error_Reporting_Host := omit, + failed := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + proxy_Info := omit, + aVP_Type := omit + } + + template (value) CCA_MSG m_CCA_dummy := { + header := m_diameterHeaderAns_dummy(CCA_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + cCA_Body := m_CCA_Body_dummy + } + + template (omit) CCA_Body_AVP m_CCA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + auth_Application_Id := m_authApplicationId_dummy, + cC_Request_Type := m_cC_Request_Type_dummy, + cC_Request_Number := m_cC_Request_Number_dummy, + user_Name := omit, + cC_Session_Failover := omit, + cC_Sub_Session_Id := omit, + acct_Multi_Session_Id := omit, + origin_State_Id := omit, + event_Timestamp := omit, + granted_Service_Unit := omit, + multiple_Services_Credit_Control := omit, + cost_Information := omit, + final_Unit_Indication := omit, + check_Balance_Result := omit, + low_Balance_Indication := omit, + remaining_Balance := omit, + credit_Control_Failure_Handling := omit, + direct_Debiting_Failure_Handling := omit, + validity_Time := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + experimental_Result := omit, + supported_Features := omit, + bearer_Control_Mode := omit, + event_Trigger := omit, + charging_Rule_Remove := omit, + charging_Rule_Install := omit, + charging_Information := omit, + online := omit, + offline := omit, + qoS_Information := omit, + revalidation_Time := omit, + default_EPS_Bearer_QoS := omit, + bearer_Usage := omit, + threeGPP_User_Location_Info := omit, + usage_Monitoring_Information := omit, + cSG_Information_Reporting := omit, + user_CSG_Information := omit, + error_Message := omit, + error_Reporting_Host := omit, + qoS_Rule_Install := omit, + qoS_Rule_Remove := omit, + subsession_Decision_Info := omit, + aN_GW_Address := omit, + proxy_Info := omit, + route_Record := omit, + failed := omit, + service_Information := omit, + aVP_Type := omit + } + + template (value) CEA_MSG m_CEA_dummy := { + header := m_diameterHeaderAns_dummy(CEA_E, c_applIdCommonMsg), + cEA_Body := m_CEA_Body_dummy + } + + template (value) CEA_Body_AVP m_CEA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + host_IP_Address := {m_hostIPAddress(c_address)}, // Address:{'0001'O, {ipv4 := {127, 0, 0,1}}})}, + vendor_Id := m_vendorId_dummy, + product_Name := m_productName_dummy, + origin_State_Id := omit, + error_Message := omit, + failed := omit, + supported_Vendor_Id := omit, + auth_Application_Id := omit, + inband_Security_Id := omit, + acct_Application_Id := omit, + vendor_Specific_Application_Id := omit, + firmware_Revision := omit, + aVP_Type := omit + } + + template (value) DWA_MSG m_DWA_dummy := { + header := m_diameterHeaderAns_dummy(DWA_E, c_applIdCommonMsg), + dWA_Body := m_DWA_Body_dummy + } + + template (value) DWA_Body_AVP m_DWA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + error_Message := omit, + failed := omit, + origin_State_Id := omit, + aVP_Type := omit + } + + template (value) DPA_MSG m_DPA_dummy := { + header := m_diameterHeaderAns_dummy(DPA_E, c_applIdCommonMsg), + dPA_Body := m_DPA_Body_dummy + } + + template (value) DPA_Body_AVP m_DPA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + error_Message := omit, + failed := omit, + aVP_Type := omit + } + + template (value) LIA_MSG m_LIA_dummy := { + header := m_diameterHeaderAns_dummy(LIA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + lIA_Body := m_LIA_Body_dummy + } + + template (value) LIA_Body_AVP m_LIA_Body_dummy := + { + vendor_Specific_Application_Id := omit, //required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + sIP_Server_URI := omit, + sIP_Server_Capabilities := omit, + auth_Grace_Period := omit, + authorization_Lifetime := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + supported_Features := omit, //only TS129 229 + server_Name := omit, //only TS129 229 + server_Capabilities := omit, //only TS129 229 + wildcarded_Public_Identity := omit, //only TS129 229 + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) MAA_MSG m_MAA_dummy := { + header := m_diameterHeaderAns_dummy(MAA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + mAA_Body := m_MAA_Body_dummy + } + + template (value) MAA_Body_AVP m_MAA_Body_dummy := + { + vendor_Specific_Application_Id := omit, //required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + user_Name := omit, + supported_Features := omit, //required only in TS129 229 + public_Identity := omit, //only in RFC4740 + sIP_AOR := omit, + sIP_Number_Auth_Items := omit, + sIP_Auth_Data_Item := omit, + auth_Grace_Period := omit, + authorization_Lifetime := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) PNA_MSG m_PNA_dummy := { + header := m_diameterHeaderAns_dummy(PNA_E, c_applId3GPPShDh), + session_Id := m_sessionId_dummy, + pNA_Body := m_PNA_Body_dummy + } + + template (value) PNA_Body_AVP m_PNA_Body_dummy := + { + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + supported_Features := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + failed := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) PPA_MSG m_PPA_dummy := { + header := m_diameterHeaderAns_dummy(PPA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + pPA_Body := m_PPA_Body_dummy + } + + template (value) PPA_Body_AVP m_PPA_Body_dummy := + { + vendor_Specific_Application_Id := omit, //required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + supported_Features := omit, //only TS129 229 + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) PUA_MSG m_PUA_dummy := { + header := m_diameterHeaderAns_dummy(PUA_E, c_applId3GPPShDh), + session_Id := m_sessionId_dummy, + pUA_Body := m_PUA_Body_dummy + } + + template (value) PUA_Body_AVP m_PUA_Body_dummy := + { + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy, + result_Code := omit, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + repository_Data_Id := omit, + data_Reference := omit, + supported_Features := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + failed := omit, + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) RAA_MSG m_RAA_dummy := { + header := m_diameterHeaderAns_dummy(RAA_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + rAA_Body := m_RAA_Body_dummy + } + + template (value) RAA_Body_AVP m_RAA_Body_dummy := + { + result_Code := omit, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + experimental_Result := omit, + user_Name := omit, + media_Component_Description := omit, + service_URN := omit, + origin_State_Id := omit, + class := omit, + iP_CAN_Type := omit, + rat_Type := omit, + aN_GW_Address := omit, + threeGPP_SGSN_MCC_MNC := omit, + threeGPP_SGSN_Address := omit, + threeGPP_SGSN_IPv6_Address := omit, + rAI := omit, + threeGPP_User_Location_Info := omit, + threeGPP_MS_TimeZone := omit, + charging_Rule_Report := omit, + error_Message := omit, + error_Reporting_Host := omit, + failed := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + framed_IP_Address := omit, + framed_IPv6_Prefix := omit, + threeGPP2_BSID := omit, + qoS_Information := omit, + qoS_Rule_Report := omit, + subsesion_Enforcement_Info := omit, + user_CSG_Information := omit, + proxy_Info := omit, + aVP_Type := omit + } + + template (value) RTA_MSG m_RTA_dummy := { + header := m_diameterHeaderAns_dummy(RTA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + rTA_Body := m_RTA_Body_dummy + } + + template (value) RTA_Body_AVP m_RTA_Body_dummy := + { + vendor_Specific_Application_Id := omit, //required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + authorization_Lifetime := omit, + auth_Grace_Period := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + associated_Identities := omit, //only TS129 229 + supported_Features := omit, //only TS129 229 + identity_with_Emergency_Registration := omit, //only TS129 229 + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) SAA_MSG m_SAA_dummy := + { + header := m_diameterHeaderAns_dummy(SAA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + sAA_Body := m_SAA_Body_dummy + } + + template (value) SAA_Body_AVP m_SAA_Body_dummy := + { + vendor_Specific_Application_Id := omit, //required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + sIP_User_Data := {m_sIP_User_Data_dummy}, + sIP_Accounting_Information := m_sIP_Accounting_Information_dummy, + sIP_Supported_User_Data_Type := omit, + user_Name := omit, + auth_Grace_Period := omit, + authorization_Lifetime := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + supported_Features := omit, //only TS129 229 + user_Data := omit, //only TS129 229 + charging_Information := omit, //only TS129 229 + associated_Identities := omit, //only TS129 229 + loose_Route_Indication := omit, //only TS129 229 + sCSCF_Restoration_Info := omit, //only TS129 229 + associated_Registered_Identities := omit, //only TS129 229 + server_Name := omit, //only TS129 229 + wildcarded_Public_Identity := omit, //only TS129 229 + priviledged_Sender_Indication := omit, //only TS129 229 + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) SNA_MSG m_SNA_dummy := + { + header := m_diameterHeaderAns_dummy(SNA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + sNA_Body := m_SNA_Body_dummy + } + + template (value) SNA_Body_AVP m_SNA_Body_dummy := + { + + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy,//required only in TS129 229 + auth_Session_State := m_auth_Session_State_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + supported_Features := omit, + user_Data := omit, //only TS129 229 + expiry_Time := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + failed := omit, //only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) STA_MSG m_STA_dummy := + { + header := m_diameterHeaderAns_dummy(STA_E, c_applIdCommonMsg), + session_Id := m_sessionId_dummy, + sTA_Body := m_STA_Body_dummy + } + + template (value) STA_Body_AVP m_STA_Body_dummy := + { + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + user_Name := omit, + class := omit, + error_Message := omit, + error_Reporting_Host := omit, + failed := omit, + sponsored_Connectivity_Data := omit, + origin_State_Id := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + proxy_Info := omit, + aVP_Type := omit + } + + template (value) UAA_MSG m_UAA_dummy := { + header := m_diameterHeaderAns_dummy(UAA_E, c_applId3GPPCxDx), + session_Id := m_sessionId_dummy, + uAA_Body := m_UAA_Body_dummy + } + + template (value) UAA_Body_AVP m_UAA_Body_dummy := + { + vendor_Specific_Application_Id := omit, //required only in TS129 229 + auth_Application_Id := m_authApplicationId_dummy, + auth_Session_State := m_auth_Session_State_dummy, + result_Code := m_resultCode_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + sIP_Server_URI := omit, + sIP_Server_Capabilities := omit, + authorization_Lifetime := omit, + auth_Grace_Period := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + experimental_Result := omit,//only TS129 229 + supported_Features := omit,//only TS129 229 + server_Name := omit,//only TS129 229 + server_Capabilities := omit,//only TS129 229 + failed := omit,//only TS129 229 + proxy_Info := omit, + route_Record := omit, + aVP_Type := omit + } + + template (value) UDA_MSG m_UDA_dummy := { + header := m_diameterHeaderAns_dummy(UDA_E, c_applId3GPPShDh), + session_Id := m_sessionId_dummy, + uDA_Body := m_UDA_Body_dummy + } + + template (value) UDA_Body_AVP m_UDA_Body_dummy := + { + vendor_Specific_Application_Id := m_vendor_Specific_Appl_Id_dummy, + result_Code := m_resultCode_dummy, + experimental_Result := omit, + auth_Session_State := m_auth_Session_State_dummy, + origin_Host := m_originHost_dummy, + origin_Realm := m_originRealm_dummy, + supported_Features := omit, + wildcarded_PSI := omit, + wildcarded_IMPU := omit, + user_Data := omit, + redirect_Host := omit, + redirect_Host_Usage := omit, + redirect_Max_Cache_Time := omit, + aVP_Type := omit, + failed := omit, + proxy_Info := omit, + route_Record := omit + } + + }//end group dummy_answer_templates_send + group dummy_answer_templates_receive { + + template AAA_MSG mw_AAA_dummy := + { + header := mw_diameterHeaderAns_dummy(AAA_E, ?), + session_Id := ?, + aAA_Body := mw_AAA_Body_dummy + } + + template AAA_Body_AVP mw_AAA_Body_dummy := + { + //dRMP := *, + auth_Application_Id := ?, + origin_Host := ?, + origin_Realm := ?, + result_Code := *, + experimental_Result := *, + auth_Session_State :=*, + access_network_charging_Identifier := *, + access_network_charging_address := *, + acceptable_service_info := *, + aN_GW_Address := *, + //aN_Trusted := *, + service_Authorization_Info := *, + ip_Can_Type := *, + //netLoc_Access_Support := *, + rat_Type := *, + flows := *, + //oC_Supported_Features := *, + //oC_OLR := *, + supported_Features := *, + subscription_Id_AVP := *, + user_Equipment_Info := *, + threeGPP_SGSN_MCC_MNC := *, + class_ := *, + user_Name := *, + error_Message := *, + error_Reporting_Host := *, + failed := *, + retry_Interval := *, + origin_State_Id := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + proxy_Info := *, + // load:= *, + aVP_Type := * + } + + template ACA_MSG mw_ACA_dummy := { + header := mw_diameterHeaderAns_dummy(ACA_E, ?), + session_Id := ?, + aCA_Body := mw_ACA_Body_dummy + } + + template ACA_Body_AVP mw_ACA_Body_dummy := + { + result_Code := ?, + origin_Host := ?, + origin_Realm := ?, + accounting_Record_Type := ?, + accounting_Record_Number := ?, + acct_Application_Id := *, + vendor_Specific_Application_Id := *, + user_Name := *, + accounting_Sub_Session_Id := *, + acct_Session_Id := *, + acct_Multi_Session_Id := *, + error_Reporting_Host := *, + acct_Interim_Interval := *, + accounting_Realtime_Required := *, + origin_State_Id := *, + event_Timestamp := *, + proxy_Info := *, + aVP_Type := * + } + + template ASA_MSG mw_ASA_dummy := { + header := mw_diameterHeaderAns_dummy(ASA_E, ?), + session_Id := ?, + aSA_Body := mw_ASA_Body_dummy + } + + template ASA_Body_AVP mw_ASA_Body_dummy := + { + result_Code := ?, + origin_Host := ?, + origin_Realm := ?, + user_Name := *, + origin_State_Id := *, + error_Message := *, + error_Reporting_Host := *, + failed := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + proxy_Info := *, + aVP_Type := * + } + + template CCA_MSG mw_CCA_dummy := { + header := mw_diameterHeaderAns_dummy(CCA_E, ?), + session_Id := ?, + cCA_Body := mw_CCA_Body_dummy + } + + template CCA_Body_AVP mw_CCA_Body_dummy := + { + result_Code := *, + origin_Host := ?, + origin_Realm := ?, + auth_Application_Id := ?, + cC_Request_Type := ?, + cC_Request_Number := ?, + user_Name := *, + cC_Session_Failover := *, + cC_Sub_Session_Id := *, + acct_Multi_Session_Id := *, + origin_State_Id := *, + event_Timestamp := *, + granted_Service_Unit := *, + multiple_Services_Credit_Control := *, + cost_Information := *, + final_Unit_Indication := *, + check_Balance_Result := *, + low_Balance_Indication := *, + remaining_Balance := *, + credit_Control_Failure_Handling := *, + direct_Debiting_Failure_Handling := *, + validity_Time := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + experimental_Result := *, + supported_Features := *, + bearer_Control_Mode := *, + event_Trigger := *, + charging_Rule_Remove := *, + charging_Rule_Install := *, + charging_Information := *, + online := *, + offline := *, + qoS_Information := *, + revalidation_Time := *, + default_EPS_Bearer_QoS := *, + bearer_Usage := *, + threeGPP_User_Location_Info := *, + usage_Monitoring_Information := *, + cSG_Information_Reporting := *, + user_CSG_Information := *, + error_Message := *, + error_Reporting_Host := *, + qoS_Rule_Install := *, + qoS_Rule_Remove := *, + subsession_Decision_Info := *, + aN_GW_Address := *, + proxy_Info := *, + route_Record := *, + failed := *, + service_Information := *, + aVP_Type := * + } + + template CEA_MSG mw_CEA_dummy := { + header := mw_diameterHeaderAns_dummy(CEA_E, ?), + cEA_Body := mw_CEA_Body_dummy + } + + template CEA_Body_AVP mw_CEA_Body_dummy := + { + result_Code := ?, + origin_Host := ?, + origin_Realm := ?, + host_IP_Address := ?, + vendor_Id := ?, + product_Name := ?, + origin_State_Id := *, + error_Message := *, + failed := *, + supported_Vendor_Id := *, + auth_Application_Id := *, + inband_Security_Id := *, + acct_Application_Id := *, + vendor_Specific_Application_Id := *, + firmware_Revision := *, + aVP_Type := * + } + + template DWA_MSG mw_DWA_dummy := { + header := mw_diameterHeaderAns_dummy(DWA_E, ?), + dWA_Body := mw_DWA_Body_dummy + } + + template DWA_Body_AVP mw_DWA_Body_dummy := + { + result_Code := ?, + origin_Host := ?, + origin_Realm := ?, + error_Message := *, + failed := *, + origin_State_Id := *, + aVP_Type := * + } + + template DPA_MSG mw_DPA_dummy := { + header := mw_diameterHeaderAns_dummy(DPA_E, ?), + dPA_Body := mw_DPA_Body_dummy + } + + template DPA_Body_AVP mw_DPA_Body_dummy := + { + result_Code := ?, + origin_Host := ?, + origin_Realm := ?, + error_Message := *, + failed := *, + aVP_Type := * + } + + template LIA_MSG mw_LIA_dummy := { + header := mw_diameterHeaderAns_dummy(LIA_E, ?), + session_Id := ?, + lIA_Body := mw_LIA_Body_dummy + } + + template LIA_Body_AVP mw_LIA_Body_dummy := + { + vendor_Specific_Application_Id := *,//only TS129 229 + auth_Application_Id := ?, + result_Code := ?, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + sIP_Server_URI := *, + sIP_Server_Capabilities := *, + auth_Grace_Period := *, + authorization_Lifetime := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + supported_Features := *, //only TS129 229 + server_Name := *, //only TS129 229 + server_Capabilities := *, //only TS129 229 + wildcarded_Public_Identity := *, //only TS129 229 + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template MAA_MSG mw_MAA_dummy := { + header := mw_diameterHeaderAns_dummy(MAA_E, ?), + session_Id := ?, + mAA_Body := mw_MAA_Body_dummy + } + + template MAA_Body_AVP mw_MAA_Body_dummy := + { + vendor_Specific_Application_Id := *,//only TS129 229 + auth_Application_Id := ?, + result_Code := ?, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + user_Name := *, + supported_Features :=*, //required only in TS129 229 + public_Identity :=*, //only in RFC4740 + sIP_AOR := *, + sIP_Number_Auth_Items := *, + sIP_Auth_Data_Item := *, + auth_Grace_Period := *, + authorization_Lifetime := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template PNA_MSG mw_PNA_dummy := { + header := mw_diameterHeaderAns_dummy(PNA_E, ?), + session_Id := ?, + pNA_Body := mw_PNA_Body_dummy + } + + template PNA_Body_AVP mw_PNA_Body_dummy := + { + vendor_Specific_Application_Id := ?, + result_Code := ?, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + supported_Features := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + failed := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template PPA_MSG mw_PPA_dummy := { + header := mw_diameterHeaderAns_dummy(PPA_E, ?), + session_Id := ?, + pPA_Body := mw_PPA_Body_dummy + } + + template PPA_Body_AVP mw_PPA_Body_dummy := + { + vendor_Specific_Application_Id := *,//only TS129 229 + auth_Application_Id := ?, + result_Code := ?, + experimental_Result :=*, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + supported_Features := *, //only TS129 229 + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template PUA_MSG mw_PUA_dummy := { + header := mw_diameterHeaderAns_dummy(PUA_E, ?), + session_Id := ?, + pUA_Body := mw_PUA_Body_dummy + } + + template PUA_Body_AVP mw_PUA_Body_dummy := + { + vendor_Specific_Application_Id := ?, + result_Code := *, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + wildcarded_PSI := *, + wildcarded_IMPU := *, + repository_Data_Id := *, + data_Reference := *, + supported_Features := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + failed := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template RAA_MSG mw_RAA_dummy := { + header := mw_diameterHeaderAns_dummy(RAA_E, ?), + session_Id := ?, + rAA_Body := mw_RAA_Body_dummy + } + + template RAA_Body_AVP mw_RAA_Body_dummy := + { + result_Code := *, + origin_Host := ?, + origin_Realm := ?, + experimental_Result := *, + user_Name := *, + media_Component_Description := *, + service_URN := *, + origin_State_Id := *, + class := *, + iP_CAN_Type := *, + rat_Type := *, + aN_GW_Address := *, + threeGPP_SGSN_MCC_MNC := *, + threeGPP_SGSN_Address := *, + threeGPP_SGSN_IPv6_Address := *, + rAI := *, + threeGPP_User_Location_Info := *, + threeGPP_MS_TimeZone := *, + charging_Rule_Report := *, + error_Message := *, + error_Reporting_Host := *, + failed := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + framed_IP_Address := *, + framed_IPv6_Prefix := *, + threeGPP2_BSID := *, + qoS_Information := *, + qoS_Rule_Report := *, + subsesion_Enforcement_Info := *, + user_CSG_Information := *, + proxy_Info := *, + aVP_Type := * + } + + template RTA_MSG mw_RTA_dummy := { + header := mw_diameterHeaderAns_dummy(RTA_E, ?), + session_Id := ?, + rTA_Body := mw_RTA_Body_dummy + } + + template RTA_Body_AVP mw_RTA_Body_dummy := + { + vendor_Specific_Application_Id := *,//only TS129 229 + auth_Application_Id := ?, + result_Code := ?, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + authorization_Lifetime := *, + auth_Grace_Period := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + associated_Identities := *, //only TS129 229 + supported_Features := *, //only TS129 229 + identity_with_Emergency_Registration := *, //only TS129 229 + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template SAA_MSG mw_SAA_dummy := + { + header := mw_diameterHeaderAns_dummy(SAA_E, ?), + session_Id := ?, + sAA_Body := mw_SAA_Body_dummy + } + + template SAA_Body_AVP mw_SAA_Body_dummy := + { + vendor_Specific_Application_Id := omit,//only TS129 229 + auth_Application_Id := ?, + result_Code := ?, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + sIP_User_Data := ?, + sIP_Accounting_Information := ?, + sIP_Supported_User_Data_Type := *, + user_Name := *, + auth_Grace_Period := *, + authorization_Lifetime := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + supported_Features := *, //only TS129 229 + user_Data := *, //only TS129 229 + charging_Information := *, //only TS129 229 + associated_Identities := *, //only TS129 229 + loose_Route_Indication := *, //only TS129 229 + sCSCF_Restoration_Info := *, //only TS129 229 + associated_Registered_Identities := *, //only TS129 229 + server_Name := *, //only TS129 229 + wildcarded_Public_Identity := *, //only TS129 229 + priviledged_Sender_Indication := *, //only TS129 229 + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template SNA_MSG mw_SNA_dummy := + { + header := mw_diameterHeaderAns_dummy(SNA_E, ?), + session_Id := ?, + sNA_Body := mw_SNA_Body_dummy + } + + template SNA_Body_AVP mw_SNA_Body_dummy := + { + + vendor_Specific_Application_Id := ?,//required only in TS129 229 + auth_Session_State := ?, + result_Code := ?, + experimental_Result := *, + origin_Host := ?, + origin_Realm := ?, + wildcarded_PSI := *, + wildcarded_IMPU := *, + supported_Features := *, + user_Data := *, //only TS129 229 + expiry_Time := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + failed := *, //only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template STA_MSG mw_STA_dummy := + { + header := mw_diameterHeaderAns_dummy(STA_E, ?), + session_Id := ?, + sTA_Body := mw_STA_Body_dummy + } + + template STA_Body_AVP mw_STA_Body_dummy := + { + result_Code := *, + origin_Host := ?, + origin_Realm := ?, + user_Name := *, + class := *, + error_Message := *, + error_Reporting_Host := *, + failed := *, + sponsored_Connectivity_Data := *, + origin_State_Id := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + proxy_Info := *, + aVP_Type := * + } + + template UAA_MSG mw_UAA_dummy := { + header := mw_diameterHeaderAns_dummy(UAA_E, c_applIdCommonMsg), + session_Id := ?, + uAA_Body := mw_UAA_Body_dummy + } + + template UAA_Body_AVP mw_UAA_Body_dummy := + { + vendor_Specific_Application_Id := omit,//only TS129 229 + auth_Application_Id := ?, + auth_Session_State := ?, + result_Code := ?, + origin_Host := ?, + origin_Realm := ?, + sIP_Server_URI := *, + sIP_Server_Capabilities := *, + authorization_Lifetime := *, + auth_Grace_Period := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + experimental_Result := omit,//only TS129 229 + supported_Features := omit,//only TS129 229 + server_Name := omit,//only TS129 229 + server_Capabilities := omit,//only TS129 229 + failed := omit,//only TS129 229 + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + template UDA_MSG mw_UDA_dummy := { + header := mw_diameterHeaderAns_dummy(UDA_E, ?), + session_Id := ?, + uDA_Body := mw_UDA_Body_dummy + } + + template UDA_Body_AVP mw_UDA_Body_dummy := + { + vendor_Specific_Application_Id := ?, + result_Code := *, + experimental_Result := *, + auth_Session_State := ?, + origin_Host := ?, + origin_Realm := ?, + supported_Features := *, + wildcarded_PSI := *, + wildcarded_IMPU := *, + user_Data := *, + redirect_Host := *, + redirect_Host_Usage := *, + redirect_Max_Cache_Time := *, + failed := *, + proxy_Info := *, + route_Record := *, + aVP_Type := * + } + + }//end group dummy_answer_templates_receive + } //end group dummy_templates + group base_templates { + + group basic_request_templates_send { + + template (value) CER_MSG m_CER_basic( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm, + Address p_address) + modifies m_CER_dummy := { + cER_Body := { + origin_Host := p_originHost, + origin_Realm := p_originRealm, + host_IP_Address := {m_hostIPAddress(p_address)}, + vendor_Id := m_vendorId(c_vendId3gpp), + product_Name := m_productName("ETSI") + } + } + + template (value) DWR_MSG m_DWR_basic( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm) + modifies m_DWR_dummy := { + dWR_Body := { + origin_Host := p_originHost, + origin_Realm := p_originRealm + } + } + + template (value) DPR_MSG m_DPR_basic( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm) + modifies m_DPR_dummy := { + dPR_Body := { + origin_Host := p_originHost, + origin_Realm := p_originRealm, + disconnect_Cause := m_disconnectCause(REBOOTING_E) + } + } + + } // end group basic_request_templates_send + + group basic_request_templates_receive { + + template CER_MSG mw_CER_basic( + template Auth_Application_Id_AVP p_authApplicationId) + modifies mw_CER_dummy := { + cER_Body := { + auth_Application_Id := {p_authApplicationId} + } + } + + }//end group basic_request_templates_receive + + group basic_answer_templates_send { + template (value) CEA_MSG m_CEA_basic( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm, + Address p_address) + modifies m_CEA_dummy := { + cEA_Body := { + result_Code := m_resultCode(m_resultCode_diameterSuccess), + origin_Host := p_originHost, + origin_Realm := p_originRealm, + host_IP_Address := {m_hostIPAddress(p_address)}, + vendor_Id := m_vendorId(c_vendId3gpp), + product_Name := m_productName("ETSI") + } + } + + template (value) DWA_MSG m_DWA_basic( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm) + modifies m_DWA_dummy := { + dWA_Body := { + result_Code := m_resultCode(m_resultCode_diameterSuccess), + origin_Host := p_originHost, + origin_Realm := p_originRealm + } + } + + template (value) RAA_MSG m_RAA_basic( + template (value)Session_Id_AVP p_sessionId, + template (value)Origin_Host_AVP p_originHost, + template (value)Origin_Realm_AVP p_originRealm) + modifies m_RAA_dummy := { + session_Id := p_sessionId, + rAA_Body := { + result_Code := m_resultCode(m_resultCode_diameterSuccess), + origin_Host := p_originHost, + origin_Realm := p_originRealm + } + } + + }//end group basic_answer_templates_send + + group basic_answer_templates_receive { + }//end group basic_answer_templates_receive + + } //end group base_templates + group modified_templates { + + group modified_request_templates_send { + template (value) CER_MSG m_CER_AppId( + in template (value) Origin_Host_AVP p_originHost, + in template (value) Origin_Realm_AVP p_originRealm, + in Address p_address, + in UInt32 p_authApplicationId + ) modifies m_CER_basic := { + cER_Body := { + origin_Host := p_originHost, + origin_Realm := p_originRealm, + host_IP_Address := {m_hostIPAddress(p_address)}, + vendor_Id := m_vendorId(c_vendId3gpp), + product_Name := m_productName("ETSI"), + supported_Vendor_Id := {m_supportedVendorId(c_vendId3gpp)}, + vendor_Specific_Application_Id := {m_vendor_Specific_Appl_Id(p_authApplicationId)}, + auth_Application_Id := {m_authApplicationId(p_authApplicationId)} + } + } + + template (value) CER_MSG m_CER_AppId_acct_Application_Id( + in template (value) Origin_Host_AVP p_originHost, + in template (value) Origin_Realm_AVP p_originRealm, + in Address p_address, + in UInt32 p_acctApplicationId + ) modifies m_CER_basic := { + cER_Body := { + origin_Host := p_originHost, + origin_Realm := p_originRealm, + host_IP_Address := {m_hostIPAddress(p_address)}, + vendor_Id := m_vendorId(c_vendId3gpp), + product_Name := m_productName("ETSI"), + supported_Vendor_Id := {m_supportedVendorId(c_vendId3gpp)}, + vendor_Specific_Application_Id := {m_vendor_Specific_Acct_Id(p_acctApplicationId)}, + acct_Application_Id := {m_acctApplicationId(p_acctApplicationId)} + } + } + + } //end group modified_request_templates_send + + group modified_request_templates_receive { + + template User_Data_AVP mw_user_Data_dummy_RFC := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_user_Data_AVP_Code), + aVP_Data := ? + } + + template SIP_Auth_Data_Item_RFC_AVP mw_sIPAuthDataItem_dummy_RFC := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Auth_Data_Item_AVP_Code_RFC), + sIP_Authentication_Scheme := mw_sIPAuthenticationScheme_digest_RFC, + sIP_Item_Number := omit, + sIP_Authenticate := omit, + sIP_Authorization := omit, + sIP_Authentication_Info := omit, + aVP_Type := omit + } + + template (present) SIP_Auth_Data_Item_RFC_AVP mw_sIPAuthDataItem_RFC( + template (present) SIP_Authentication_Scheme_AVP p_sIP_Authentication_Scheme, + template (present) SIP_Item_Number_AVP p_sIP_Item_Number := ?, + template (present) SIP_Authenticate_AVP p_sIP_Authenticate := ?, + template SIP_Authorization_AVP p_sIP_Authorization := omit + ) modifies mw_sIPAuthDataItem_dummy_RFC := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Auth_Data_Item_AVP_Code_RFC), + sIP_Authentication_Scheme := p_sIP_Authentication_Scheme, + sIP_Item_Number := p_sIP_Item_Number, + sIP_Authenticate := p_sIP_Authenticate, + sIP_Authorization := p_sIP_Authorization + } + + template SIP_Authentication_Scheme_AVP mw_sIPAuthenticationScheme_digest_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC), + aVP_Data := ? + } + } + + template SIP_Authentication_Scheme_AVP mw_sIPAuthenticationScheme_digest_aka_RFC := { + sIP_Authentication_Scheme_RFC_AVP := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Authentication_Scheme_AVP_Code_RFC), + aVP_Data := DIGEST_AKAv1_MD5_E + } + } + + template SIP_Number_Auth_Items_AVP mw_sIPNumberAuthItems_RFC (template (present) UInt32 p_avpData := ?) := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Number_Auth_Items_AVP_Code_RFC), + aVP_Data := p_avpData + } + + template SIP_Authenticate_RFC_AVP mw_sIPAuthenticate_dummy := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Authenticate_AVP_Code_RFC), + digest_Realm := ?, + digest_Nonce := ?, + digest_Domain := *, + digest_Opaque := *, + digest_Stale := *, + digest_Algorithm := *, + digest_QoP := *, + digest_HA1 := *, + digest_Auth_Param := *, + aVP_Type := * + } + + template SIP_Authorization_RFC_AVP mw_sIPAuthorization_dummy_RFC := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_Authorization_AVP_Code_RFC), + digest_Username := ?, + digest_Realm := ?, + digest_Nonce := ?, + digest_URI := ?, + digest_Response := ?, + digest_Algorithm := *, + digest_CNonce := *, + digest_Opaque := *, + digest_QoP := *, + digest_Nonce_Count := *, + digest_Method := *, + digest_Entity_Body_Hash := *, + digest_Auth_Param := *, + aVP_Type := * + } + + template SIP_Authenticate_RFC_AVP mw_sIPAuthenticate_digest ( + template (present) Digest_Realm_AVP p_digest_Realm := ?, + template (present) Digest_QoP_AVP p_digest_QoP := ?, + template (present) Digest_HA1_AVP p_digest_HA1 := ? + ) modifies mw_sIPAuthenticate_dummy := { + digest_Realm := p_digest_Realm, + digest_QoP := p_digest_QoP, + digest_HA1 := p_digest_HA1 + } + + template (present) SIP_Authenticate_RFC_AVP mw_sIPAuthenticate_digest_aka ( + template (present) Digest_Realm_AVP p_digest_Realm := ?, + template (present) Digest_QoP_AVP p_digest_QoP := ?, + template (present) Digest_HA1_AVP p_digest_HA1 := ? + ) modifies mw_sIPAuthenticate_digest := { + digest_Opaque := ? + } + + template SIP_User_Data_AVP mw_sIP_User_Data_dummy := + { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_User_Data_AVP_Code), + sIP_User_Data_Type := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_User_Data_Type_AVP_Code), + aVP_Data := ? + }, + sIP_User_Data_Contents := { + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_sIP_User_Data_Contents_AVP_Code), + aVP_Data := ? + }, + aVP_Type := * + } + + template Framed_IP_Address_AVP mw_framed_IP_Address_dummy := { + // Ref: RFC4005 6.11.1 Framed_IP_Address AVP + aVP_Header := mw_aVP_Header_Vbit0Mbit1(c_framed_IP_Address_AVP_Code), + aVP_Data := ? + } + + } //end group modified_request_templates_receive + + group modified_answer_templates_send { + template (value) CEA_MSG m_CEA_AppId( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm, + Address p_address, + UInt32 p_authApplicationId) + modifies m_CEA_basic := { + cEA_Body := { + result_Code := m_resultCode(m_resultCode_diameterSuccess), + origin_Host := p_originHost, + origin_Realm := p_originRealm, + host_IP_Address := {m_hostIPAddress(p_address)}, + vendor_Id := m_vendorId(c_vendId3gpp), + product_Name := m_productName("ETSI "), + supported_Vendor_Id := {m_supportedVendorId(c_vendId3gpp)}, + vendor_Specific_Application_Id := {m_vendor_Specific_Appl_Id(p_authApplicationId)}, + auth_Application_Id := {m_authApplicationId(p_authApplicationId)} + } + } + + template (value) CEA_MSG m_CEA_AppId_all( + template (value) Origin_Host_AVP p_originHost, + template (value) Origin_Realm_AVP p_originRealm, + Address p_address) + modifies m_CEA_basic := { + cEA_Body := { + result_Code := m_resultCode(m_resultCode_diameterSuccess), + origin_Host := p_originHost, + origin_Realm := p_originRealm, + host_IP_Address := {m_hostIPAddress(p_address)}, + vendor_Id := m_vendorId(c_vendId3gpp), + product_Name := m_productName("ETSI "), + supported_Vendor_Id := {m_supportedVendorId(c_vendId3gpp)}, + vendor_Specific_Application_Id := {m_vendor_Specific_Appl_Id(c_applIdRx), + m_vendor_Specific_Appl_Id(c_applIdGx), + m_vendor_Specific_Appl_Id(c_applId3GPPCxDx), + m_vendor_Specific_Appl_Id(c_applIdRf), + m_vendor_Specific_Appl_Id(c_applIdRo) + //add new if needed + }, + auth_Application_Id := {m_authApplicationId(c_applIdRx), + m_authApplicationId(c_applIdGx), + m_authApplicationId(c_applId3GPPCxDx), + m_authApplicationId(c_applIdRf), + m_authApplicationId(c_applIdRo) + //add new if needed + } + } + } + + } //end group modified_answer_templates_send + + group modified_answer_templates_receive { + } //end group modified_answer_templates_receive + + } //end group modified_templates + } //end group MessageTemplates + + /** Type convertion functions to reduce warnings due to type mismaches */ + group FunctionsForTemplates { + + /** @desc Calculates the IP address length in bytes + */ + function f_IPAdressLengthUInt24 () + return UInt24 + {if (PX_IPv6) + {return(16+2) } //+2 address family + else {return(4+2) } + } + + /** @desc Calculates the Diameter-Identity length in bytes + */ + function f_getDiameterIdentityAvpLength(in Diameter_Identity p_avpData) return AVP_Length { + return lengthof(p_avpData); + } // End of function f_getDiameterIdentityAvpLength + + /** @desc Calculates the UTF8String AVP data length + */ + function f_getUTF8StringLength(in UTF8String p_avpData) return AVP_Length { + return lengthof(p_avpData); + } // End of function f_getUTF8StringLength + + /** @desc Calculates the charstring AVP data length + */ + function f_getCharStringLength(in charstring p_avpData) return AVP_Length { + return lengthof(p_avpData); + } // End of function f_getCharStringLength + + /** @desc Calculates the octetstring AVP data length + */ + function f_getOctetStringLength(in octetstring p_octetstring) return AVP_Length { + return lengthof(p_octetstring); + } // End of function f_getOctetStringLength + + /** @desc Returns the enumerated AVP data length + */ + function f_getEnumLength() return AVP_Length { + return 4; + } // End of function f_getEnumLength + + /** @desc Calculates the encoded playload length + */ + function f_getEncvalueLength(in bitstring p_bitstring) return AVP_Length { + return lengthof(p_bitstring) / 8; + } // End of function f_getEncvalueLength + + + /** @desc Calculates leghth of AVP with padded bytes (padded bytes are added in TA) + */ + function f_addPaddedBytes2Length(integer p_currLength) return integer { + var integer v_currLength; + + select(p_currLength mod 4){ + case (0) {v_currLength := p_currLength} + case (1) {v_currLength := p_currLength+3} + case (2) {v_currLength := p_currLength+2} + case (3) {v_currLength := p_currLength+1} + } + return v_currLength; + + } // End of f_addPaddedBytes2Length + + + /** @desc Converts DiameterURI to UTF8String + */ + function f_DiameterURI_2_UTF8String(in template DiameterURI p_diameterURI) return UTF8String { + var UTF8String v_utf8String; + var template charstring v_scheme, v_diameterId_FQDN, v_port, v_transport, v_protocol; + var integer v_portField; + var template charstring v_tailString := ""; + + + v_scheme := p_diameterURI.scheme; + v_diameterId_FQDN := p_diameterURI.diameterId_FQDN; + if (ispresent(p_diameterURI.portField)) + { + v_portField := valueof (p_diameterURI.portField); + v_port := int2char( v_portField ); + v_tailString := ":" & v_port; + } + if (ispresent(p_diameterURI.transport)) + { + v_transport := p_diameterURI.transport; + v_tailString := ";transport=" & v_transport; + } + + if (ispresent(p_diameterURI.protocol)) + { + v_protocol := p_diameterURI.protocol; + v_tailString := ";protocol=" & v_protocol; + } + v_utf8String := valueof(v_scheme) & "://" & valueof(v_diameterId_FQDN) & valueof(v_tailString); + + return v_utf8String; + + } // End of f_addPaddedBytes2Length + + /* Function f_char_to_BCD + * @desc: Returns BCD code in a hexstring converted from + * address digits (p_char) in charstring format + * Filler character '0'H is added where necessary + * End-of-Pulsing charater is added, if p_eop is TRUE + * Works for address lengths starting from 0 (i.e. empty string) + */ + function f_char_to_BCD(in charstring p_char, in boolean p_eop := false) return octetstring { + var integer v_string_length := lengthof(p_char); + var charstring v_address_char := p_char; + var octetstring v_address_oct; + var hexstring v_address_hex_ASCII; + + var integer i; + var hexstring v_address_hex_NUM := ''H; + + if (p_eop) // End of Pulsing required + { + + if (v_string_length mod 2 == 1) // odd number of digits + { + v_address_char := v_address_char & "O"; // instead of "?" + // add End of Pulsing, ASCII code of "O" = '4F'H + v_string_length := v_string_length + 1; + } + else // even number of digits + { + v_address_char := v_address_char & "O0"; // instead of "0?" + // add filler and End of Pulsing, ASCII code of "O" = '4F'H + v_string_length := v_string_length + 2; + } + } + else // End of Pulsing NOT required + { + if (v_string_length mod 2 == 1) // odd number of digits + { + v_address_char := v_address_char & "0"; + // add filler + v_string_length := v_string_length + 1; + } + } + + v_address_oct := (char2oct(v_address_char)); + v_address_hex_ASCII := oct2hex(v_address_oct); + /* Examples + "1234" -> '31323334'H + "12345O" -> '31323334353F' */ + + // fill hexstring with adequate number of hex digits + for (i := 0; i < v_string_length; i := i + 1) + { + v_address_hex_NUM := v_address_hex_NUM & '0'H; + } + // fill hexstring with address in BCD format + for (i := 0; i < v_string_length; i := i + 2) + { + v_address_hex_NUM[i] := v_address_hex_ASCII[2*i + 3]; + v_address_hex_NUM[i+1] := v_address_hex_ASCII[2*i + 1]; + } + + v_address_oct := hex2oct(v_address_hex_NUM); + return v_address_oct; + } // End function f_char_to_BCD + } // End group FunctionsForTemplates + +}//end module LibDiameter_Templates \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_TypesAndValues.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_TypesAndValues.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..b5d8d5585b8f3e02646babc497022c212cbc3f49 --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_TypesAndValues.ttcn @@ -0,0 +1,2912 @@ +/** + * @author STF 434 and Iskratel Research Development V&V + * @version $Id$ + * @desc This module defines message, header, structured and simple Diameter + * types as well constants used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new message and header types is ok; + * Existing message or header types shall not be changed or removed + */ +module LibDiameter_TypesAndValues { + + //LibCommmon + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_DataStrings all; + + //LibDiameter + import from LibDiameter_Types_Base_AVPs all; + import from LibDiameter_Types_Gx_AVPs all; + import from LibDiameter_Types_Rx_AVPs all; + import from LibDiameter_Types_S6a_AVPs all; + import from LibDiameter_Types_S9_AVPs all; + import from LibDiameter_Types_CxDx_AVPs all; + import from LibDiameter_Types_RfRo_AVPs all; + +group BasicTypesAndConstants{ + + group GlobalConstants{ + + // Default DIAMETER protocol : TCP + const charstring c_defaultTransportProtocol := "TCP"; + + const Address c_address := {'0001'O, {ipv4 := {127, 0, 0,1}}}; + + } + + group DiameterConstants{ + + const charstring c_sync1 := "sync1"; + const charstring c_sync2 := "sync2"; + const charstring c_sync3 := "sync3"; + + const UInt8 c_versionId := 1; + + const Oct2 c_ipv4AddressFamily := '0001'O; + const Oct2 c_ipv6AddressFamily := '0002'O; + + group ApplicationIdConstants { + const UInt32 c_applIdCommonMsg := 0; //For DWR, DWA + const UInt32 c_applId3GPPCxDx := 16777216; //For 3GPPCxDx messages 16777216 (Vendor specific applications = 16777216 - 4294967294(0x01000000-0xfffffffe)) + const UInt32 c_applId3GPPShDh := 16777217; //For 3GPPShDh messages + const UInt32 c_applIdRx := 16777236; //For Rx messages + const UInt32 c_applIdGx := 16777238; //For Gx messages + const UInt32 c_applIdGxx := 16777266; //For Gxx messages + const UInt32 c_applIdS6a:= 16777251; //For S6a messages- See ETSI TS 129 272 V10.8.0 (2013-07) Clause 7.1.8 Diameter Application Identifier + const UInt32 c_applIdS13:= 16777252; //For S6a messages- See ETSI TS 129 272 V10.8.0 (2013-07) Clause 7.1.8 Diameter Application Identifier + const UInt32 c_applIdS9:= 16777267; //For S9 messages + const UInt32 c_applIdCx:= 16777216; //For Cx messages + const UInt32 c_applIdDx:= 16777224; //For Dx messages + const UInt32 c_applIdRf:= 3;//16777218; //For Rf messages + const UInt32 c_applIdRo:= 4;//16777218; //For Ro messages + + } // End of group ApplicationIdConstants + group SMINetworkManagementPrivateEnterpriseCodes_VendorIDAVP { + const UInt32 c_vendId3gpp := 10415; //Vendor idFor 3GPP + const UInt32 c_vendIdETSI := 13019; //Vendor idFor ETSI + } // End of group SMINetworkManagementPrivateEnterpriseCodes_VendorIDAVP + group AVPCodeConstants { + group AVPCodeConstantsRFC3855{ + const integer c_accounting_Realtime_Required_AVP_Code := 483; //Ref: RFC3588 9.8.7. Accounting-Realtime-Required AVP + const integer c_accounting_Record_Number_AVP_Code := 485; //Ref: RFC3588 9.8.3. Accounting-Record-Number AVP + const integer c_accounting_Record_Type_AVP_Code := 480; //Ref: RFC3588 9.8.1. Accounting-Record-Type AVP + const integer c_accounting_Sub_Session_Id_AVP_Code := 287; //Ref: RFC3588 9.8.6. Accounting-Sub-Session-Id AVP + const integer c_acct_Application_Id_AVP_Code := 259; //Ref: RFC3588 6.9. Acct-Application-Id AVP + const integer c_acct_Interim_Interval_AVP_Code := 85; //Ref: RFC3588 9.8.2. Acct-Interim-Interval + const integer c_acct_Multi_Session_Id_AVP_Code := 50; //Ref: RFC3588 9.8.5. Acct-Multi-Session-Id AVP + const integer c_acct_Session_Id_AVP_Code := 44; //Ref: RFC3588 9.8.4. Acct-Session-Id AVP + const integer c_auth_Application_Id_AVP_Code := 258; //Ref: RFC3588 6.8. Auth-Application-Id AVP + const integer c_class_AVP_Code := 25; //Ref: RFC3588 8.20. Class AVP + const integer c_destination_Host_AVP_Code := 293; //Ref: RFC3588 6.5. Destination-Host AVP + const integer c_destination_Realm_AVP_Code := 283; //Ref: RFC3588 6.6. Destination-Realm AVP + const integer c_disconnect_Cause_AVP_Code := 273; //Ref: RFC3588 5.4.3. Disconnect-Cause AVP + const integer c_error_Message_AVP_Code := 281; //Ref: RFC3588 7.3. Error-Message AVP + const integer c_error_Reporting_Host_AVP_Code := 294; //Ref: RFC3588 7.4. Error-Reporting-Host AVP + const integer c_event_Timestamp_AVP_Code := 55; //Ref: RFC3588 8.21. Event-Timestamp AVP + const integer c_failed_AVP_Code := 279; //Ref: RFC3588 7.5. Failed-AVP AVP + const integer c_firmware_Revision_AVP_Code := 267; //Ref: RFC3588 5.3.4. Firmware-Revision AVP + const integer c_host_IP_Address_AVP_Code := 257; //Ref: RFC3588 5.3.5. Host-IP-Address AVP + const integer c_inband_Security_Id_AVP_Code := 299; //Ref: RFC3588 6.10. Inband-Security-Id AVP + const integer c_origin_Host_AVP_Code := 264; //Ref: RFC3588 6.3. Origin-Host AVP + const integer c_origin_Realm_AVP_Code := 296; //Ref: RFC3588 6.4. Origin-Realm AVP + const integer c_origin_State_Id_AVP_Code := 278; //Ref: RFC3588 8.16. Origin-State-Id AVP + const integer c_product_Name_AVP_Code := 269; //Ref: RFC3588 5.3.7. Product-Name AVP + const integer c_proxy_Host_AVP_Code := 280; //Ref: RFC3588 6.7.3. Proxy-Host AVP + const integer c_proxy_Info_AVP_Code := 284; //Ref: RFC3588 6.7.2. Proxy-Info AVP + const integer c_proxy_State_AVP_Code := 33; //Ref: RFC3588 6.7.4. Proxy-State AVP + const integer c_re_Auth_Request_Type_AVP_Code := 285; //Ref: RFC3588 8.12. Re-Auth-Request-Type AVP + const integer c_redirect_Host_AVP_Code := 292; //Ref: RFC3588 6.12. Redirect-Host AVP +// const integer c_redirect_Host_Cache_Time_AVP_Code := 9999; //NOTE Ref: RFC3588 Redirect_Host_Cache_Time_AVP_Code is NOT defined. + const integer c_redirect_Host_Usage_AVP_Code := 261; //Ref: RFC3588 6.13. Redirect-Host-Usage AVP + const integer c_result_Code_AVP_Code := 268; //Ref: RFC3588 7.1. Result-Code AVP + const integer c_route_Record_AVP_Code := 282; //Ref: RFC3588 6.7.1. Route-Record AVP + const integer c_session_Id_AVP_Code := 263; //Ref: RFC3588 8.8. Session-Id AVP + const integer c_supported_Vendor_Id_AVP_Code := 265; //Ref; RFC3588 5.3.6. Supported-Vendor-Id AVP + const integer c_termination_Cause_AVP_Code := 295; //Ref: RFC3588 8.15. Termination-Cause AVP + const integer c_user_Name_AVP_Code := 1; //Ref: RFC3588 8.14. User-Name AVP + const integer c_vendor_Id_AVP_Code := 266; //Ref: RFC3588 5.3.3. Vendor-Id AVP + const integer c_vendor_Specific_Appl_Id_AVP_Code := 260; //Ref: RFC3588 6.11. Vendor-Specific-Application-Id AVP + } // End of group AVPCodeConstantsRFC3855 + group AVPCodeConstantsRFC4740{ + /* ******** Cx *******/ + const integer c_auth_Grace_Period_AVP_Code := 276; //Ref: RFC3588 8.10. Auth-Grace-Period AVP + const integer c_auth_Session_State_AVP_Code := 277; //Ref: RFC3588 8.11. Auth-Session-State AVP + const integer c_authorization_Lifetime_AVP_Code := 291; //Ref: RFC3588 8.9. Authorization-Lifetime AVP + const integer c_redirect_Max_Cache_Time_AVP_Code := 262; //Ref: RFC3588 6.14. Redirect-Max-Cache-Time AVP + const integer c_sIP_Accounting_Information_AVP_Code := 368; //Ref: RFC4740 9.1. SIP-Accounting-Information AVP + const integer c_sIP_Accounting_Server_URI_AVP_Code := 369; //Ref: RFC4740 9.1.1. SIP-Accounting-Server-URI AVP + const integer c_sIP_AOR_AVP_Code := 122; //Ref: RFC4740 9.8. SIP-AOR AVP + const integer c_sIP_Auth_Data_Item_AVP_Code_RFC := 376; //Ref: RFC4740 9.5. SIP-Auth-Data-Item AVP + const integer c_sIP_Authenticate_AVP_Code_RFC := 379; //Ref: RFC4740 9.5.3. SIP-Authenticate AVP + const integer c_sIP_Authentication_Info_AVP_Code := 381; //Ref: RFC4740 9.5.5. SIP-Authentication-Info AVP + const integer c_sIP_Authentication_Scheme_AVP_Code_RFC := 377; //Ref: RFC4740 9.5.1. SIP-Authentication-Scheme AVP + const integer c_sIP_Authorization_AVP_Code_RFC := 380; //Ref: RFC4740 9.5.4. SIP-Authorization AVP + const integer c_sIP_Credit_Control_Server_URI_AVP_Code := 370; //Ref: RFC4740 9.1.2. SIP-Credit-Control-Server-URI AVP + const integer c_sIP_Deregistration_Reason_AVP_Code := 383; //Ref: RFC4740 9.5.5. SIP-Authentication-Info AVP + const integer c_sIP_Item_Number_AVP_Code_RFC := 378; //Ref: RFC4740 9.5.2 SIP-Item-Number AVP + const integer c_sIP_MandatoryCapability_AVP_Code := 373; //Ref: RFC4740 9.3.1. SIP-Mandatory-Capability AVP + const integer c_sIP_Method_AVP_Code := 393; //Ref: RFC4740 9.14. SIP-Method AVP + const integer c_sIP_Number_Auth_Items_AVP_Code_RFC := 382; //Ref: RFC4740 9.6. SIP-Number-Auth-Items AVP + const integer c_sIP_OptionalCapability_AVP_Code := 374; //Ref: RFC4740 9.3.2. SIP-Optional-Capability AVP + const integer c_sIP_Reason_Code_AVP_Code := 384; //Ref: RFC4740 9.7.1. SIP-Reason-Code AVP + const integer c_sIP_Reason_Info_AVP_Code := 385; //Ref: RFC4740 9.7.2. SIP-Reason-Info AVP + const integer c_sIP_Server_Assignment_Type_AVP_Code := 375; //Ref: RFC4740 9.4. SIP-Server-Assignment-Type AVP + const integer c_sIP_Server_Capabilities_AVP_Code := 372; //Ref: RFC4740 9.3. SIP-Server-Capabilities AVP + const integer c_sIP_Server_URI_AVP_Code := 371; //Ref: RFC4740 9.2 SIP-Server-URI AVP + const integer c_sIP_Supported_User_Data_Type_AVP_Code := 388; //Ref: RFC4740 9.12.1. SIP-User-Data-Type AVP + const integer c_sIP_User_Authorization_Type_AVP_Code := 387; //Ref: RFC4740 9.10. SIP-User-Authorization-Type AVP + const integer c_sIP_User_Data_Already_Available_AVP_Code := 392; //Ref: RFC4740 9.13. SIP-User-Data-Already-Available AVP + const integer c_sIP_User_Data_AVP_Code := 389; //Ref: RFC4740 9.12. SIP-User-Data AVP + const integer c_sIP_User_Data_Contents_AVP_Code := 391; //Ref: RFC4740 9.12.2. SIP-User-Data-Contents AVP + const integer c_sIP_User_Data_Type_AVP_Code := 390; //Ref: RFC4740 9.12.1. SIP-User-Data-Type AVP + const integer c_sIP_Visited_Network_Id_AVP_Code := 386; //Ref: RFC4740 9.9. SIP-Visited-Network-Id AVP + } // End of group AVPCodeConstantsRFC4740 + group AVPCodeConstantsRFC5580 { + const integer c_operator_Name_AVP_Code := 126; //Ref: RFC5580 Operator_Name_AVP + const integer c_location_Information_AVP_Code := 127; //Ref: RFC5580 Location_Information_AVP + const integer c_location_Data_AVP_Code := 128; //Ref: RFC5580 Location_Data_AVP + } // End of group AVPCodeConstantsRFC5580 + group AVPCodeConstantsCxDx_TS129_229{ + const integer c_visited_Network_Identifier_AVP_Code := 600; //Ref: TS 129.229 6.3.1 Visited_Network_Identifier + const integer c_public_Identity_AVP_Code := 601; //Ref: TS 129.229 6.3.2 Public_Identity + const integer c_server_Name_AVP_Code := 602; //Ref: TS 129.229 6.3.3 Server_Name + const integer c_server_Capabilities_AVP_Code := 603; //Ref: TS 129.229 6.3.4 Server_Capabilities + const integer c_mandatory_Capability_AVP_Code := 604; //Ref: TS 129.229 6.3.5 Mandatory_Capability + const integer c_optional_Capability_AVP_Code := 605; //Ref: TS 129.229 6.3.6 Optional_Capability + const integer c_user_Data_AVP_Code := 606; //Ref: TS 129.229 6.3.7 User_Data + const integer c_sIP_Number_Auth_Items_AVP_Code := 607; //Ref: TS 129.229 6.3.8 SIP-Number-Auth-Items AVP + const integer c_sIP_Authentication_Scheme_AVP_Code := 608; //Ref: TS 129.229 6.3.9. SIP-Authentication-Scheme AVP + const integer c_sIP_Authenticate_AVP_Code := 609; //Ref: TS 129.229 6.3.10 SIP-Authenticate AVP + const integer c_sIP_Authorization_AVP_Code := 610; //Ref: TS 129.229 6.3.11 SIP-Authorization AVP + const integer c_sIP_Authentication_Context_AVP_Code := 611; //Ref: TS 129.229 6.3.12 SIP_Authentication_Context + const integer c_sIP_Auth_Data_Item_AVP_Code := 612; //Ref: TS 129.229 6.3.13 SIP-Auth-Data-Item AVP + const integer c_sIP_Item_Number_AVP_Code := 613; //Ref: TS 129.229 6.3.14 SIP-Item-Number AVP + const integer c_server_Assignment_Type_AVP_Code := 614; //Ref: TS 129.229 6.3.15 Server_Assignment_Type + const integer c_deregistration_Reason_AVP_Code := 615; //Ref: TS 129.229 6.3.16 Deregistration_Reason + const integer c_reason_Code_AVP_Code := 616; //Ref: TS 129.229 6.3.17 Reason_Code + const integer c_reason_Info_AVP_Code := 617; //Ref: TS 129.229 6.3.18 Reason_Info + const integer c_user_Authorization_Type_AVP_Code := 623; //Ref: TS 129.229 6.3.24 User_Authorization_Type + const integer c_user_Data_Already_Available_AVP_Code := 624; //Ref: TS 129.229 6.3.26 User_Data_Already_Available + const integer c_confidentiality_Key_AVP_Code := 625; //Ref: TS 129.229 6.3.27 Confidentiality_Key + const integer c_integrity_Key_AVP_Code := 626; //Ref: TS 129.229 6.3.28 Integrity_Key + const integer c_supported_Features_AVP_Code := 628; //Ref: TS 129.229 6.3.29 Supported_Features + const integer c_feature_List_ID_AVP_Code := 629; //Ref: TS 129.229 6.3.30 Feature_List_ID + const integer c_feature_List_AVP_Code := 630; //Ref: TS 129.229 6.3.31 Feature_List + const integer c_supported_Applications_AVP_Code := 631; //Ref: TS 129.229 6.3.32 Supported_Applications + const integer c_associated_Identities_AVP_Code := 632; //Ref: TS 129.229 6.3.33 Associated_Identities + const integer c_originating_Request_AVP_Code := 633; //Ref: TS 129.229 6.3.34 Originating_Request + const integer c_wildcarded_Public_Identity_AVP_Code := 634; //Ref: TS 129.229 6.3.35 Wildcarded_Public_Identity + const integer c_sIP_Digest_Authenticate_AVP_Code := 635; //Ref: TS 129.229 6.3.36 SIP_Digest_Authenticate + const integer c_uAR_Flags_AVP_Code := 637; //Ref: TS 129.229 6.3.44 UAR_Flags + const integer c_loose_Route_Indication_AVP_Code := 638; //Ref: TS 129.229 6.3.45 Loose_Route_Indication + const integer c_sCSCF_Restoration_Info_AVP_Code := 639; //Ref: TS 129.229 6.3.46 SCSCF_Restoration_Info + const integer c_path_AVP_Code := 640; //Ref: TS 129.229 6.3.47 Path + const integer c_contact_AVP_Code := 641; //Ref: TS 129.229 6.3.48 Contact + const integer c_subscription_Info_AVP_Code := 642; //Ref: TS 129.229 6.3.49 Subscription_Info + const integer c_call_ID_SIP_Header_AVP_Code := 643; //Ref: TS 129.229 6.3.49.1 Call_ID_SIP_Header + const integer c_from_SIP_Header_AVP_Code := 644; //Ref: TS 129.229 6.3.49.2 From_SIP_Header + const integer c_to_SIP_Header_AVP_Code := 645; //Ref: TS 129.229 6.3.49.3 To_SIP_Header + const integer c_record_Route_AVP_Code := 646; //Ref: TS 129.229 6.3.49.4 Record_Route + const integer c_associated_Registered_Identities_AVP_Code := 647; //Ref: TS 129.229 6.3.50 Associated_Registered_Identities + const integer c_multiple_Registration_Indication_AVP_Code := 648; //Ref: TS 129.229 6.3.51 Multiple_Registration_Indication + const integer c_restoration_Info_AVP_Code := 649; //Ref: TS 129.229 6.3.52 Restoration_Info + const integer c_session_Priority_AVP_Code := 650; //Ref: TS 129.229 6.3.56 Session_Priority + const integer c_identity_with_Emergency_Registration_AVP_Code := 651; //Ref: TS 129.229 6.3.57 Identity_with_Emergency_Registration + const integer c_priviledged_Sender_Indication_AVP_Code := 652; //Ref: TS 129.229 6.3.58 Priviledged_Sender_Indication + } // End of group AVPCodeConstantsCxDx_TS129_229 + group AVPCodeConstantsDigest{ + const integer c_digest_Algorithm_AVP_Code := 111; //Ref: RFC4590 3.9. Digest-Algorithm Attribute + const integer c_digest_Auth_Param_AVP_Code := 117; //Ref: RFC4590 3.15. Digest-Auth-Param Attribute + const integer c_digest_CNonce_AVP_Code := 113; //Ref: RFC4590 3.11. Digest-CNonce Attribute + const integer c_digest_Domain_AVP_Code := 119; //Ref: RFC4590 3.17. Digest-Domain Attribute + const integer c_digest_Entity_Body_Hash_AVP_Code := 112; //Ref: RFC4590 3.10. Digest-Entity-Body-Hash Attribute + const integer c_digest_HA1_AVP_Code := 121; //Ref: RFC4590 3.19. Digest-HA1 Attribute + const integer c_digest_Method_AVP_Code := 108; //Ref: RFC4590 3.6. Digest-Method Attribute + const integer c_digest_Nextnonce_AVP_Code := 107; //Ref: RFC4590 + const integer c_digest_Nonce_AVP_Code := 105; //Ref: RFC4590 3.3. Digest-Nonce Attribute + const integer c_digest_Nonce_Count_AVP_Code := 114; //Ref: RFC4590 3.12. Digest-Nonce-Count Attribute + const integer c_digest_Opaque_AVP_Code := 116; //Ref: RFC4590 3.14. Digest-Opaque Attribute + const integer c_digest_QoP_AVP_Code := 110; //Ref: RFC4590 3.8. Digest-Qop Attribute + const integer c_digest_Realm_AVP_Code := 104; //Ref: RFC4590 3.2. Digest-Realm Attribute + const integer c_digest_Response_Auth_AVP_Code := 106; //Ref: RFC4590 + const integer c_digest_Response_AVP_Code := 103; //Ref: RFC4590 + const integer c_digest_Stale_AVP_Code := 120; //Ref: RFC4590 3.18. Digest-Stale Attribute + const integer c_digest_URI_AVP_Code := 109; //Ref: RFC4590 3.7. Digest-URI Attribute + const integer c_digest_Username_AVP_Code := 115; //Ref: RFC4590 3.13. Digest-Username Attribute + } // End of group AVPCodeConstantsDigest + group AVPCodeConstantsShDh_TS129_329{ + const integer c_current_Location_AVP_Code := 707; //Ref: 3GPP TS 29.329 6.3.8 Current-Location AVP + const integer c_data_Reference_AVP_Code := 703; //Ref: 3GPP TS 29.329 6.3.4 Data-Reference AVP + const integer c_dSAI_Tag_AVP_Code := 711; //Ref: 3GPP TS 29.329 6.3.18 DSAI-Tag AVP + const integer c_experimental_Result_AVP_Code := 297; //Ref: 3GPP TS 29.229 6.2 Result-Code AVP values // FUN 766300-PCL-030 : Experimental-Result AVP shall be used for Sh/Dh errors. + const integer c_experimental_Result_Code_AVP_Code := 298; //Ref: 3GPP TS 29.229 6.2 Result-Code AVP values + const integer c_expiry_Time_AVP_Code := 709; //Ref: 3GPP TS 29.329 6.3.16 Expiry-Time + const integer c_identity_Set_AVP_Code := 708; //Ref: 3GPP TS 29.329 6.3.10 Identity-Set AVP + const integer c_mSISDN_AVP_Code := 701; //Ref: 3GPP TS 29.329 6.3.2 MSISDN AVP + const integer c_repository_Data_Id_AVP_Code := 715 ; //Ref: 3GPP TS 29.329 6.3.24 + const integer c_requested_Domain_AVP_Code := 706; //Ref: 3GPP TS 29.329 6.3.7 Requested-Domain AVP + const integer c_send_Data_Indication_AVP_Code := 710; //Ref: 3GPP TS 29.329 6.3.17 Send-Data-Indication AVP + const integer c_service_Indication_AVP_Code := 704; //Ref: 3GPP TS 29.329 6.3.5 Service-Indication AVP + const integer c_sequence_Number_AVP_Code := 716 ; //Ref: 3GPP TS 29.329 6.3.25 + const integer c_subs_Req_Type_AVP_Code := 705; //Ref: 3GPP TS 29.329 6.3.6 Subs-Req-Type AVP + const integer c_user_Identity_AVP_Code := 700; //Ref: 3GPP TS 29.329 6.3.1 User-Identity AVP + const integer c_wildcarded_IMPU_AVP_Code := 636; //Ref: 3GPP TS 29.329 6.3.20 Wildcarded-IMPU AVP + const integer c_user_Data_Sh_AVP_Code := 702; //Ref: TS 129.329 6.3.3 User_Data + } // End of group AVPCodeConstantsShDh_TS129_329 + group AVPCodeConstantsRFC4005{ + const integer c_called_Station_Id_AVP_Code := 30; //Ref: RFC4005 4.5 Called_Station_Id AVP + const integer c_framed_IP_Address_AVP_Code := 8; //Ref: RFC4005 6.11.1 Framed_IP_Address AVP + const integer c_framed_IPv6_Prefix_AVP_Code := 97; //Ref: RFC4005 6.11.1 Framed_IPv6_Prefix AVP + } // End of group AVPCodeConstantsRFC4005 + group AVPCodeConstantsRFC4006{ + /* ***** Rf and Ro Ref: RFC4006 ***** */ + const integer c_rating_Group_AVP_Code := 433; //Ref: RFC4006 8.29. Rating-Group AVP + const integer c_tariff_Time_Change_AVP_Code := 451; //Ref: RFC4006 8.20. Tariff-Time-Change AVP + const integer c_cC_Correlation_Id_AVP_Code := 411; //Ref: RFC4006 8.1. CC-Correlation-Id AVP + const integer c_cC_Input_Octets_AVP_Code := 412; //Ref: RFC4006 8.24. CC-Input-Octets AVP + const integer c_cC_Money_AVP_Code := 413; //Ref: RFC4006 8.22. CC-Money AVP + const integer c_cC_Output_Octets_AVP_Code := 414; //Ref: RFC4006 8.25. CC-Output-Octets AVP + const integer c_cC_Request_Number_AVP_Code := 415; //Ref: RFC4006 8.2. CC-Request-Number AVP + const integer c_cC_Request_Type_AVP_Code := 416; //Ref: RFC4006 8.3. CC-Request-Type AVP + const integer c_cC_Service_Specific_Units_AVP_Code := 417; //Ref: RFC4006 8.26. CC-Service-Specific-Units AVP + const integer c_cC_Session_Failover_AVP_Code := 418; //Ref: RFC4006 8.4. CC-Session-Failover AVP + const integer c_cC_Sub_Session_Id_AVP_Code := 419; //Ref: RFC4006 8.5. CC-Sub-Session-Id AVP + const integer c_cC_Time_AVP_Code := 420; //Ref: RFC4006 8.21. CC-Time AVP + const integer c_cC_Total_Octets_AVP_Code := 421; //Ref: RFC4006 8.23. CC-Total-Octets AVP + const integer c_cC_Unit_Type_AVP_Code := 454; //Ref: RFC4006 8.32. CC-Unit-Type AVP + const integer c_check_Balance_Result_AVP_Code := 422; //Ref: RFC4006 8.6. Check-Balance-Result AVP 12.8. Check-Balance-Result AVP + const integer c_cost_Information_AVP_Code := 423; //Ref: RFC4006 8.7. Cost-Information AVP + const integer c_cost_Unit_AVP_Code := 424; //Ref: RFC4006 8.12. Cost-Unit AVP + const integer c_credit_Control_Failure_Handling_AVP_Code := 427; //Ref: RFC4006 8.14. Credit-Control-Failure-Handling AVP + const integer c_currency_Code_AVP_Code := 425; //Ref: RFC4006 8.11. Currency-Code AVP + const integer c_direct_Debiting_Failure_Handling_AVP_Code := 428; //Ref: RFC4006 8.15. Direct-Debiting-Failure-Handling AVP + const integer c_exponent_AVP_Code := 429; //Ref: RFC4006 8.9. Exponent AVP + const integer c_filter_Id_AVP_Code := 11; //Ref: RFC4005 6.7. Filter-Id AVP + const integer c_final_Unit_Action_AVP_Code := 449; //Ref: RFC4006 8.35. Final-Unit-Action AVP + const integer c_final_Unit_Indication_AVP_Code := 430; //Ref: RFC4006 8.34. Final-Unit-Indication AVP + const integer c_g_S_U_Pool_Identifier_AVP_Code := 453; //Ref: RFC4006 8.31. G-S-U-Pool-Identifier AVP + const integer c_g_S_U_Pool_Reference_AVP_Code := 457; //Ref: RFC4006 8.30. G-S-U-Pool-Reference AVP + const integer c_granted_Service_Unit_AVP_Code := 431; //Ref: RFC4006 8.17. Granted-Service-Unit AVP + const integer c_multiple_Services_Credit_Control_AVP_Code := 456; //Ref: RFC4006 8.16. Multiple-Services-Credit-Control AVP + const integer c_multiple_Services_Indicator_AVP_Code := 455; //Ref: RFC4006 8.40. Multiple-Services-Indicator AVP + const integer c_redirect_Address_Type_AVP_Code := 433; //Ref: RFC4006 8.38. Redirect-Address-Type AVP + const integer c_redirect_Server_Address_AVP_Code := 435; //Ref: RFC4006 8.39. Redirect-Server-Address AVP + const integer c_redirect_Server_AVP_Code := 434; //Ref: RFC4006 8.37. Redirect-Server AVP + const integer c_requested_Action_AVP_Code := 436; //Ref: RFC4006 8.41. Requested-Action AVP + const integer c_requested_Service_Unit_AVP_Code := 437; //Ref: RFC4006 8.18. Requested-Service-Unit AVP + const integer c_restriction_Filter_Rule_AVP_Code := 438; //Ref: RFC4006 8.36. Restriction-Filter-Rule AVP + const integer c_service_Context_Id_AVP_Code := 461; //Ref: RFC4006 8.42. Service-Context-Id AVP + const integer c_service_Identifier_AVP_Code := 439; //Ref: RFC4006 8.28. Service-Identifier AVP + const integer c_service_Parameter_Info_AVP_Code := 440; //Ref: RFC4006 8.43. Service-Parameter-Info AVP + const integer c_service_Parameter_Type_AVP_Code := 441; //Ref: RFC4006 8.44. Service-Parameter-Type AVP + const integer c_service_Parameter_Value_AVP_Code := 442; //Ref: RFC4006 8.45. Service-Parameter-Value AVP + const integer c_subscription_Id_AVP_Code := 443; //Ref: RFC4006 8.46. Subscription-Id AVP + const integer c_subscription_Id_Data_AVP_Code := 444; //Ref: RFC4006 + const integer c_subscription_Id_Type_AVP_Code := 450; //Ref: RFC4006 8.47. Subscription-Id-Type AVP + const integer c_tariff_Change_Usage_AVP_Code := 452; //Ref: RFC4006 8.27. Tariff-Change-Usage AVP + const integer c_unit_Value_AVP_Code := 445; //Ref: RFC4006 8.8. Unit-Value AVP + const integer c_used_Service_Unit_AVP_Code := 446; //Ref: RFC4006 8.19. Used-Service-Unit AVP + const integer c_user_Equipment_Info_AVP_Code := 458; //Ref: RFC4006 8.49. User-Equipment-Info AVP + const integer c_user_Equipment_Info_Type_AVP_Code := 459; //Ref: RFC4006 8.50. User-Equipment-Info-Type AVP + const integer c_user_Equipment_Info_Value_AVP_Code := 460; //Ref: RFC4006 8.51. User-Equipment-Info-Value AVP + const integer c_validity_Time_AVP_Code := 448; //Ref: RFC4006 8.33. Validity-Time AVP + const integer c_value_Digits_AVP_Code := 447; //Ref: RFC4006 8.10. Value-Digits AVP + } // End of group AVPCodeConstantsRFC4006 + group AVPCodeConstantsRxTS129_214{ + const integer c_acceptable_Service_Info_AVP_Code := 526; //Ref: ETSI TS 129 214 Acceptable_Service_Info_AVP + const integer c_access_Network_Charging_Address_AVP_Code := 501; //Ref: ETSI TS 129 214 Access_Network_Charging_Address AVP + const integer c_access_Network_Charging_Identifier_AVP_Code := 502; //Ref: ETSI TS 129 214 Access_Network_Charging_Identifier AVP + const integer c_access_Network_Charging_Identifier_Value_AVP_Code := 503;//Ref: ETSI TS 129 214 Access_Network_Charging_Identifier_Value AVP + const integer c_aF_Application_Identifier_AVP_Code := 504; //Ref: ETSI TS 129 214 AF_Application_Identifier AVP + const integer c_aF_Charging_Identifier_AVP_Code := 505; //Ref: ETSI TS 129 214 AF_Charging_Identifier AVP + const integer c_aF_Signalling_Protocol_AVP_Code := 529; //Ref: ETSI TS 129 214 AF_Signalling_Protocol AVP + const integer c_application_Service_Provider_Identity_AVP_Code := 532; //Ref: ETSI TS 129 214 Application_Service_Provider_Identity AVP + const integer c_codec_Data_AVP_Code := 524; //Ref: ETSI TS 129 214 Codec_data AVP + const integer c_flow_Description_AVP_Code := 507; //Ref: ETSI TS 129 214 Flow_Description AVP + const integer c_flow_Number_AVP_Code := 509; //Ref: ETSI TS 129 214 Flow_Number AVP + const integer c_flow_Status_AVP_Code := 511; //Ref: ETSI TS 129 214 Flow_Status AVP + const integer c_flow_Usage_AVP_Code := 512; //Ref: ETSI TS 129 214 Flow_Usage AVP + const integer c_flows_AVP_Code := 510; //Ref: ETSI TS 129 214 Flows_AVP + const integer c_max_Requested_Bandwidth_DL_AVP_Code := 515; //Ref: ETSI TS 129 214 FMax_Requested_Bandwidth_DL AVP + const integer c_max_Requested_Bandwidth_UL_AVP_Code := 516; //Ref: ETSI TS 129 214 FMax_Requested_Bandwidth_UL AVP + const integer c_media_Component_Description_AVP_Code := 517; //Ref: ETSI TS 129 214 Media_Component_Decription_AVP + const integer c_media_Component_Number_AVP_Code := 518; //Ref: ETSI TS 129 214 Media_Component_Number_AVP + const integer c_media_Sub_Component_AVP_Code := 519; //Ref: ETSI TS 129 214 Media_Sub_Component_AVP + const integer c_media_Type_AVP_Code := 520; //Ref: ETSI TS 129 214 Media_Type AVP + const integer c_mPS_Identifier_AVP_Code := 528; //Ref: ETSI TS 129 214 MPS_Identifier AVP + const integer c_reservation_Priority_AVP_Code := 458; //Ref: ETSI TS 129 214 Reservation_Priority AVP + const integer c_rR_Bandwidth_AVP_Code := 521; //Ref: ETSI TS 129 214 RR Bandwidth_AVP + const integer c_rS_Bandwidth_AVP_Code := 522; //Ref: ETSI TS 129 214 RS Bandwidth_AVP + const integer c_service_Info_Status_AVP_Code := 527; //Ref: ETSI TS 129 214 Service_Info AVP + const integer c_rx_Request_Type_AVP_Code := 533; //Ref: ETSI TS 129 214 Request_Type_AVP + const integer c_service_URN_AVP_Code := 525; //Ref: ETSI TS 129 214 Service_URN AVP + const integer c_sIP_Forking_Indication_AVP_Code := 523; //Ref: ETSI TS 129 214 SIP_Forking_Indication AVP + const integer c_specific_Action_AVP_Code := 513; //Ref: ETSI TS 129 214 Specific_Action AVP + const integer c_sponsor_Identity_AVP_Code := 531; //Ref: ETSI TS 129 214 Sponsor_Identity AVP + const integer c_sponsored_Connectivity_Data_AVP_Code := 530; //Ref: ETSI TS 129 214 Sponsored_Connectivity_Data AVP + const integer c_required_Access_Info_AVP := 536; //ref: TS129 214 5.3.34 + const integer c_abort_Cause_AVP_Code := 500; //Ref: ETSI TS 129 214 Abort Cause AVP + } // End of group AVPCodeConstantsRxTS129_214 + group AVPCodeConstantsS9_TS129_215 { + const integer c_subsession_Decision_Info_AVP_Code := 2200; // Ref: table 5.3.1 + const integer c_subsession_Enforcement_Info_AVP_Code := 2201; // Ref: table 5.3.1 + const integer c_subsession_Id_AVP_Code := 2202; // Ref: table 5.3.1 + const integer c_subsession_Operation_AVP_Code := 2203; // Ref: table 5.3.1 + const integer c_multiple_BBERF_Action_AVP_Code := 2204; // Ref: table 5.3.1 + } // End of group AVPCodeConstantsS9_TS129_215 + group AVPCodeConstantsGx_SdTS129_212{ + const integer c_access_Network_Charging_Identifier_Gx_AVP_Code := 1022; //Ref: ETSI TS 129 212 Access_Network_Charging_Identifier_Gx_AVP + const integer c_allocation_Retention_Priority_AVP_Code := 1034; //Ref: ETSI TS 129 212 Allocation_Retention_Priority_AVP + const integer c_aN_GW_Address_AVP_Code := 1050; //Ref: ETSI TS 129 212 AN_GW_Address_AVP + const integer c_aPN_Aggregate_Max_Bitrate_DL_AVP_Code := 1040; //Ref: ETSI TS 129 212 APN_Aggregate_Max_Bitrate_DL_AVP + const integer c_aPN_Aggregate_Max_Bitrate_UL_AVP_Code := 1041; //Ref: ETSI TS 129 212 Aggregate_Max_Bitrate_UL_AVP + const integer c_bearer_Control_Mode_AVP_Code := 1023; //Ref: ETSI TS 129 212 Bearer_Control_Mode_AVP + const integer c_bearer_Identifier_AVP_Code := 1020; //Ref: ETSI TS 129 212 Bearer_Identifier_AVP + const integer c_bearer_Operation_AVP_Code := 1021; //Ref: ETSI TS 129 212 Bearer_Operation_AVP + const integer c_bearer_Usage_AVP_Code := 1000; //Ref: ETSI TS 129 212 Bearer_Usage_AVP + const integer c_charging_Rule_Install_AVP_Code := 1001; //Ref: ETSI TS 129 212 Charging_Rule_Install_AVP + const integer c_charging_Rule_Remove_AVP_Code := 1002; //Ref: ETSI TS 129 212 Charging_Rule_Remove_AVP + const integer c_charging_Rule_Definition_AVP_Code := 1003; //Ref: ETSI TS 129 212 Charging_Rule_Definition_AVP + const integer c_charging_Rule_Base_Name_AVP_Code := 1004; //Ref: ETSI TS 129 212 Charging_Rule_Base_Name_AVP + const integer c_charging_Rule_Name_AVP_Code := 1005; //Ref: ETSI TS 129 212 Charging_Rule_Name_AVP + const integer c_charging_Rule_Report_AVP_Code := 1018; //Ref: ETSI TS 129 212 Charging_Rule_Report_AVP + const integer c_charging_Correlation_Indicator_AVP_Code := 1073; //Ref: ETSI TS 129 212 Charging_Correlation_Indicator_AVP + const integer c_coA_IP_Address_AVP_Code := 1035; //Ref: ETSI TS 129 212 CoA_IP_Address_AVP + const integer c_coA_Information_AVP_Code := 1039; //Ref: ETSI TS 129 212 CoA_Information_AVP + const integer c_cSG_Information_Reporting_AVP_Code := 1071; //Ref: ETSI TS 129 212 CSG_Information_Reporting_AVP + const integer c_default_EPS_Bearer_QoS_AVP_Code := 1049; //Ref: ETSI TS 129 212 Default_EPS_Bearer_QoS_AVP + const integer c_event_Report_Indication_AVP_Code := 1033; //Ref: ETSI TS 129 212 Event_Report_Indication_AVP + const integer c_event_Trigger_AVP_Code := 1006; //Ref: ETSI TS 129 212 Event_Trigger_AVP + const integer c_flow_Direction_AVP_Code := 1080; //Ref: ETSI TS 129 212 Flow_Direction_AVP + const integer c_flow_Information_AVP_Code := 1058; //Ref: ETSI TS 129 212 Flow_Information_AVP + const integer c_flow_Label_AVP_Code := 1057; //Ref: ETSI TS 129 212 Flow_Label_AVP + const integer c_iP_CAN_Type_AVP_Code := 1027; //Ref: ETSI TS 129 212 IP_CAN_Type_AVP + const integer c_guaranteed_Bitrate_DL_AVP_Code := 1025; //Ref: ETSI TS 129 212 Guaranteed_Bitrate_DL_AVP + const integer c_guaranteed_Bitrate_UL_AVP_Code := 1026; //Ref: ETSI TS 129 212 Guaranteed_Bitrate_UL_AVP + const integer c_maximum_Bandwidth_AVP_Code := 1082; //Ref: ETSI TS 129 212 Maximum_Bandwidth_AVP + const integer c_max_Supported_Bandwidth_DL_AVP_Code := 1083; //Ref: ETSI TS 129 212 Max_Supported_Bandwidth_DL_AVP + const integer c_max_Supported_Bandwidth_UL_AVP_Code := 1084; //Ref: ETSI TS 129 212 Max_Supported_Bandwidth_UL_AVP + const integer c_metering_Method_AVP_Code := 1007; //Ref: ETSI TS 129 212 Metering_Method_AVP + const integer c_monitoring_Key_AVP_Code := 1066; //Ref: ETSI TS 129 212 Monitoring_Key_AVP + const integer c_Network_Request_Support_AVP_Code := 1024; //Ref: ETSI TS 129 212 Network_Request_Support_AVP + const integer c_offline_AVP_Code := 1008; //Ref: ETSI TS 129 212 Offline_AVP + const integer c_online_AVP_Code := 1009; //Ref: ETSI TS 129 212 Online_AVP + const integer c_packet_Filter_Content_AVP_Code := 1059; //Ref: ETSI TS 129 212 Packet_Filter_Content_AVP + const integer c_packet_Filter_Identifier_AVP_Code := 1060; //Ref: ETSI TS 129 212 Packet_Filter_Identifier_AVP + const integer c_packet_Filter_Information_AVP_Code := 1061; //Ref: ETSI TS 129 212 Packet_Filter_Information_AVP + const integer c_packet_Filter_Operation_AVP_Code := 1062; //Ref: ETSI TS 129 212 Packet_Filter_Operation_AVP + const integer c_packet_Filter_Usage_AVP_Code := 1072; //Ref: ETSI TS 129 212 Packet_Filter_Usage_AVP + const integer c_pDN_Connection_ID_AVP_Code := 1065; //Ref: ETSI TS 129 212 PDN_Connection_ID_AVP + const integer c_precedence_AVP_Code := 1010; //Ref: ETSI TS 129 212 Precedence_AVP + const integer c_pre_emption_Capability_AVP_Code := 1047; //Ref: ETSI TS 129 212 Pre_emption_Capability_AVP + const integer c_pre_emption_Vulnerability_AVP_Code := 1048; //Ref: ETSI TS 129 212 Pre_emption_Vulnerability_AVP + const integer c_priority_Level_AVP_Code := 1046; //Ref: ETSI TS 129 212 Priority_Level_AVP + const integer c_reporting_Level_AVP_Code := 1011; //Ref: ETSI TS 129 212 Reporting_Level_AVP + const integer c_routing_Filter_AVP_Code := 1078; //Ref: ETSI TS 129 212 Routing_Filter_AVP + const integer c_routing_IP_Address_AVP_Code := 1079; //Ref: ETSI TS 129 212 Routing_IP_Address_AVP + const integer c_routing_Rule_Definition_AVP_Code := 1076; //Ref: ETSI TS 129 212 Routing_Rule_Definition_AVP + const integer c_routing_Rule_Identifier_AVP_Code := 1077; //Ref: ETSI TS 129 212 Routing_Rule_Identifier_AVP + const integer c_routing_Rule_Install_AVP_Code := 1081; //Ref: ETSI TS 129 212 Routing_Rule_Install_AVP + const integer c_routing_Rule_Remove_AVP_Code := 1075; //Ref: ETSI TS 129 212 Routing_Rule_Remove_AVP + const integer c_pCC_Rule_Status_AVP_Code := 1019; //Ref: ETSI TS 129 212 PCC_Rule_Status_AVP + const integer c_session_Release_Cause_AVP_Code := 1045; //Ref: ETSI TS 129 212 Session_Release_Cause_AVP + const integer c_qoS_Class_Identifier_AVP_Code := 1028; //Ref: ETSI TS 129 212 QoS_Class_Identifier_AVP + const integer c_qoS_Information_AVP_Code := 1016; //Ref: ETSI TS 129 212 QoS_Information_AVP + const integer c_qoS_Negotiation_AVP_Code := 1029; //Ref: ETSI TS 129 212 QoS_Negotiation_AVP + const integer c_qos_Upgrade_AVP_Code := 1030; //Ref: ETSI TS 129 212 Qos_Upgrade_AVP + const integer c_resource_Allocation_Notification_AVP_Code := 1063; //Ref: ETSI TS 129 212 Resource_Allocation_Notification_AVP + const integer c_rule_Failure_Code_AVP_Code := 1031; //Ref: ETSI TS 129 212 Rule_Failure_Code_AVP + const integer c_security_Parameter_Index_AVP_Code := 1056; //Ref: ETSI TS 129 212 Security_Parameter_Index_AVP + const integer c_tFT_Filter_AVP_Code := 1012; //Ref: ETSI TS 129 212 TFT_Filter_AVP + const integer c_tFT_Packet_Filter_Information_AVP_Code := 1013; //Ref: ETSI TS 129 212 TFT_Packet_Filter_Information_AVP + const integer c_toS_Traffic_Class_AVP_Code := 1014; //Ref: ETSI TS 129 212 ToS_Traffic_Class_AVP + const integer c_tunnel_Header_Filter_AVP_Code := 1036; //Ref: ETSI TS 129 212 Tunnel_Header_Filter_AVP + const integer c_tunnel_Header_Length_AVP_Code := 1037; //Ref: ETSI TS 129 212 Tunnel_Header_Length_AVP + const integer c_tunnel_Information_AVP_Code := 1038; //Ref: ETSI TS 129 212 Tunnel_Information_AVP + const integer c_rAT_Type_AVP_Code := 1032; //Ref: ETSI TS 129 212 RAT_Type_AVP + const integer c_revalidation_Time_AVP_Code := 1042; //Ref: ETSI TS 129 212 Revalidation_Time_AVP + const integer c_rule_Activation_Time_AVP_Code := 1043; //Ref: ETSI TS 129 212 Rule_Activation_Time_AVP + const integer c_usage_Monitoring_Information_AVP_Code := 1067; //Ref: ETSI TS 129 212 Usage_Monitoring_Information_AVP + const integer c_rule_DeActivation_Time_AVP_Code := 1044; //Ref: ETSI TS 129 212 Rule_DeActivation_Time_AVP + const integer c_usage_Monitoring_Level_AVP_Code := 1068; //Ref: ETSI TS 129 212 Usage_Monitoring_Level_AVP + const integer c_usage_Monitoring_Report_AVP_Code := 1069; //Ref: ETSI TS 129 212 Usage_Monitoring_Report_AVP + const integer c_usage_Monitoring_Support_AVP_Code := 1070; //Ref: ETSI TS 129 212 Usage_Monitoring_Support_AVP + const integer c_tdf_Application_Identifier_AVP := 1088; // Ref: TS129 212 5.3.77 + const integer c_tdf_Information_AVP := 1087; // Ref: TS129 212 5.3.78 + const integer c_tdf_Destination_Realm_AVP := 1090; // Ref: TS129 212 5.3.79 + const integer c_tdf_Destination_Host_AVP := 1089; // Ref: TS129 212 5.3.80 + const integer c_tdf_IP_Address_AVP := 1091; // Ref: TS129 212 5.3.81 + const integer c_appl_Detection_Info_AVP := 1098; // Ref: TS129 212 5.3.91 + const integer c_tdf_Application_Instance_Id_AVP := 2802; // Ref: TS129 212 5.3.92 + const integer c_henb_Local_IP_Address_AVP := 2804; // Ref: TS129 212 5.3.95 + const integer c_ue_Local_IP_Address_AVP := 2805; // Ref: TS129 212 5.3.96 + const integer c_udp_Source_Port_AVP := 2806; // Ref: TS129 212 5.3.97 + const integer c_an_GW_Status_AVP := 2811; // Ref: TS129 212 5.3.100 + } // End of group AVPCodeConstantsGx_SdTS129_212 + group AVPCodeConstantsGxx_TS129_212{ + const integer c_qos_Rule_Install_AVP := 1051; // Ref: TS129 212 5a.3.1 + const integer c_qos_Rule_Remove_AVP := 1052; // Ref: TS129 212 5a.3.2 + const integer c_qos_Rule_Definition_AVP := 1053; // Ref: TS129 212 5a.3.3 + const integer c_qos_Rule_Name_AVP := 1054; // Ref: TS129 212 5a.3.4 + const integer c_qos_Rule_Report_AVP := 1055; // Ref: TS129 212 5a.3.5 + const integer c_session_Linking_Indicator_AVP := 1064; // Ref: TS129 212 5a.3.6 + const integer c_qos_Rule_Base_Name_AVP := 1074; // Ref: TS129 212 5a.3.7 + } // End of group AVPCodeConstantsGxx_TS129_212 + group AVPCodeConstantsTS129_061{ + const integer c_rAI_AVP_Code := 909; //Ref: ETSI TS 129 061 RAI_AVP + const integer c_threeGPP_Charging_Id_AVP_Code := 2; //Ref: ETSI TS 129 061 ThreeGPP_Charging_Id_AVP + const integer c_threeGPP_PDP_Type_AVP_Code := 3; //Ref: ETSI TS 129 061 ThreeGPP_PDP_Type_AVP + const integer c_threeGPP_SGSN_Address_AVP_Code := 6; //Ref: ETSI TS 129 061 ThreeGPP_SGSN_Address_AVP + const integer c_threeGPP_IMSI_MCC_MNC_AVP_Code := 8; //Ref: ETSI TS 129 061 ThreeGPP_IMSI_MCC_MNC_AVP + const integer c_threeGPP_GGSN_MCC_MNC_AVP_Code := 9; //Ref: ETSI TS 129 061 ThreeGPP_GGSN_MCC_MNC_AVP + const integer c_threeGPP_NSAPI_AVP_Code := 10; //Ref: ETSI TS 129 061 ThreeGPP_NSAPI_AVP + const integer c_threeGPP_Session_Stop_Indicator_AVP_Code := 11; //Ref: ETSI TS 129 061 ThreeGPP_Session_Stop_Indicator_AVP + const integer c_threeGPP_Selection_Mode_AVP_Code := 12; //Ref: ETSI TS 129 061 ThreeGPP_Selection_Mode_AVP + const integer c_threeGPP_Charging_Characteristics_AVP_Code := 13; //Ref: ETSI TS 129 061 ThreeGPP_Charging_Characteristics_AVP + const integer c_threeGPP_SGSN_IPv6_Address_AVP_Code := 15; //Ref: ETSI TS 129 061 ThreeGPP_SGSN_IPv6_Address_AVP + const integer c_threeGPP_User_Location_Info_AVP_Code := 22; //Ref: ETSI TS 129 061 ThreeGPP_User_Location_Info_AVP + const integer c_threeGPP_MS_TimeZone_AVP_Code := 23; //Ref: ETSI TS 129 061 ThreeGPP_MS_TimeZone_AVP + const integer c_threeGPP_RAT_Type_AVP_Code := 21; //Ref: ETSI TS 129 061 ThreeGPP_RAT_Type_AVP + const integer c_threeGPP_SGSN_MCC_MNC_AVP_Code := 18; //Ref: ETSI TS 129 061 ThreeGPP_SGSN_MCC_MNC_AVP + const integer c_threeGPP_GGSN_Address_AVP := 7; // Ref: TS129 061 table 9a + const integer c_threeGPP_GGSN_IPv6_Address_AVP := 16; // Ref: TS129 061 table 9a + const integer c_twan_Identifier_AVP := 29; // Ref: TS129 061 table 9a + + } // End of group AVPCodeConstantsTS129_061 + group AVPCodeConstantsTS129_272{ + const integer c_trace_Data_AVP_Code := 1485; //Ref: ETSI TS 129 272 Trace_Data_AVP + const integer c_trace_Reference_AVP_Code := 1459; //Ref: ETSI TS 129 272 Trace_Reference_AVP + const integer c_trace_Depth_AVP_Code := 1462; //Ref: ETSI TS 129 272 Trace_Depth_AVP + const integer c_trace_NE_Type_List_AVP_Code := 1463; //Ref: ETSI TS 129 272 Trace_NE_Type_List_AVP + const integer c_trace_Event_List_AVP_Code := 1465; //Ref: ETSI TS 129 272 Trace_Event_List_AVP + const integer c_trace_Collection_Entity_AVP_Code := 1452; //Ref: ETSI TS 129 272 Trace_Data_AVP + const integer c_trace_Interface_List_AVP_Code := 1464; //Ref: ETSI TS 129 272 Trace_Interface_List_AVP + const integer c_oMC_Id_AVP_Code := 1466; //Ref: ETSI TS 129 272 OMC_Id_AVP + const integer c_mDT_Configuration_AVP_Code := 1622; //Ref: ETSI TS 129 272 MDT_Configuration_AVP + const integer c_Job_Type_AVP_Code := 1623; //Ref: ETSI TS 129 272 Job_Type_AVP + const integer c_area_Scope_AVP_Code := 1624; //Ref: ETSI TS 129 272 Area_Scope_AVP + const integer c_list_Of_Measurements_AVP_Code := 1625; //Ref: ETSI TS 129 272 List_Of_Measurements_AVP + const integer c_reporting_Trigger_AVP_Code := 1626; //Ref: ETSI TS 129 272 Reporting_Trigger_AVP + const integer c_report_Interval_AVP_Code := 1627; //Ref: ETSI TS 129 272 Report_Interval_AVP + const integer c_report_Amount_AVP_Code := 1628; //Ref: ETSI TS 129 272 Report_Amount_AVP + const integer c_event_Treshold_RSRP_AVP_Code := 1629; //Ref: ETSI TS 129 272 Event_Treshold_RSRP_AVP + const integer c_event_Treshold_RSRQ_AVP_Code := 1630; //Ref: ETSI TS 129 272 Event_Treshold_RSRQ_AVP + const integer c_logging_Interval_AVP_Code := 1631; //Ref: ETSI TS 129 272 Logging_Interval_AVP + const integer c_logging_Duration_AVP_Code := 1632; //Ref: ETSI TS 129 272 Logging_Duration_AVP + const integer c_cell_Global_Identity_AVP_Code := 1604; //Ref: ETSI TS 129 272 Cell_Global_Identity_AVP + const integer c_e_UTRAN_Cell_Global_Identity_AVP_Code := 1602; //Ref: ETSI TS 129 272 E_UTRAN_Cell_Global_Identity_AVP + const integer c_routing_Area_Identity_AVP_Code := 1605; //Ref: ETSI TS 129 272 Routing_Area_Identity_AVP + const integer c_location_Area_Identity_AVP_Code := 1606; //Ref: ETSI TS 129 272 Location_Area_Identity_AVP + const integer c_tracking_Area_Identity_AVP_Code := 1603; //Ref: ETSI TS 129 272 Tracking_Area_Identity_AVP + + } // End of group AVPCodeConstantsTS129_272 + group AVPCodeConstantsTS129_299{ + const integer c_charging_Information_AVP_Code := 618; //Ref: ETSI TS 129 299 Charging_Information_AVP + const integer c_primary_Event_Charging_Function_Name_AVP_Code := 619; //Ref: ETSI TS 129 299 Primary_Event_Charging_Function_Name_AVP + const integer c_secondary_Event_Charging_Function_Name_AVP_Code := 620; //Ref: ETSI TS 129 299 Secondary_Event_Charging_Function_Name_AVP + const integer c_primary_Charging_Collection_Function_Name_AVP_Code := 621; //Ref: ETSI TS 129 299 Primary_Charging_Collection_Function_Name_AVP + const integer c_secondary_Charging_Collection_Function_Name_AVP_Code := 622; //Ref: ETSI TS 129 299 Secondary_Charging_Collection_Function_Name_AVP + + } // End of group AVPCodeConstantsTS129_299 + group AVPCodeConstantsTS132_299 { + + const integer c_accounting_Input_Octets_AVP_Code := 363; //Ref ETSI TS 132 299 Accounting-Input-Octets + const integer c_accounting_Output_Octets_AVP_Code := 364; //Ref ETSI TS 132 299 Accounting-Output-Octets + const integer c_event_Type_AVP_Code := 823; //Ref ETSI TS 132 299 Event_Type_AVP + const integer c_event_AVP_Code := 825; //Ref ETSI TS 132 299 Event_AVP + const integer c_content_Type_AVP_Code := 826; //Ref ETSI TS 132 299 Content_Type_AVP + const integer c_content_Length_AVP_Code := 827; //Ref ETSI TS 132 299 Content_Length_AVP + const integer c_content_Disposition_AVP_Code := 828; //Ref ETSI TS 132 299 Content_Disposition_AVP + const integer c_role_Of_Node_AVP_Code := 829; //Ref ETSI TS 132 299 Role_Of_Node_AVP + const integer c_user_Session_Id_AVP_Code := 830; //Ref ETSI TS 132 299 User_Session_Id_AVP + const integer c_calling_Party_Address_AVP_Code := 831; //Ref ETSI TS 132 299 Calling_Party_Address_AVP + const integer c_called_Party_Address_AVP_Code := 832; //Ref ETSI TS 132 299 Called_Party_Address_AVP + const integer c_time_Stamps_AVP_Code := 833; //Ref ETSI TS 132 299 Time_Stamps_AVP + const integer c_sip_Request_Timestamp_AVP_Code := 834; //Ref ETSI TS 132 299 SIP_Request_Timestamp_AVP + const integer c_sip_Response_Timestamp_AVP_Code := 835; //Ref ETSI TS 132 299 SIP_Response_Timestamp_AVP + const integer c_application_Server_AVP_Code := 836; //Ref ETSI TS 132 299 Application_Server_AVP + const integer c_application_provided_Called_Party_Address_AVP_Code := 837; //Ref ETSI TS 132 299 Application_provided_Called_Party_Address_AVP + const integer c_inter_Operator_Identifier_AVP_Code := 838; //Ref ETSI TS 132 299 Inter_Operator_Identifier_AVP + const integer c_originating_IOI_AVP_Code := 839; //Ref ETSI TS 132 299 Originating_IOI_AVP + const integer c_terminating_IOI_AVP_Code := 840; //Ref ETSI TS 132 299 Terminating_IOI_AVP + const integer c_ims_Charging_Identifier_AVP_Code := 841; //Ref ETSI TS 132 299 IMS_Charging_Identifier_AVP + const integer c_sdp_Session_Description_AVP_Code := 842; //Ref ETSI TS 132 299 SDP_Session_Description_AVP + const integer c_sdp_Media_Component_AVP_Code := 843; //Ref ETSI TS 132 299 SDP_Media_Component_AVP + const integer c_sdp_Media_Name_AVP_Code := 844; //Ref ETSI TS 132 299 SDP_Media_Name_AVP + const integer c_sdp_Media_Description_AVP_Code := 845; //Ref ETSI TS 132 299 SDP_Media_Description_AVP + const integer c_cg_Address_AVP_Code := 846; //Ref ETSI TS 132 299 CG_Address_AVP + const integer c_ggsn_Address_AVP_Code := 847; //Ref ETSI TS 132 299 GGSN_Address_AVP + const integer c_application_Server_Information_AVP_Code := 850; //Ref ETSI TS 132 299 Application_Server_Information_AVP + const integer c_trunk_Group_ID_AVP_Code := 851; //Ref ETSI TS 132 299 Trunk_Group_ID_AVP_Code + const integer c_incoming_Trunk_Group_ID_AVP_Code := 852; //Ref ETSI TS 132 299 Incoming_Trunk_Group_ID_AVP + const integer c_outgoing_Trunk_Group_ID_AVP_Code := 853; //Ref ETSI TS 132 299 Outgoing_Trunk_Group_ID_AVP + const integer c_bearer_Service_AVP_Code := 854; //Ref ETSI TS 132 299 Bearer_Service_AVP + const integer c_service_Id_AVP_Code := 855; //Ref ETSI TS 132 299 Service_Id_AVP + const integer c_associated_URI_AVP_Code := 856; //Ref ETSI TS 132 299 Associated_URI_AVP + const integer c_cause_Code_AVP_Code := 861; //Ref ETSI TS 132 299 Cause_Code_AVP + const integer c_node_Functionality_AVP_Code := 862; //Ref ETSI TS 132 299 Node_Functionality_AVP + const integer c_service_Specific_Data_AVP_Code := 863; //Ref ETSI TS 132 299 Service_Specific_Data_AVP + const integer c_originator_AVP_Code := 864; //Ref ETSI TS 132 299 Originator_AVP + const integer c_ps_Furnish_Charging_Information_AVP_Code := 865; //Ref ETSI TS 132 299 PS_Furnish_Charging_Information_AVP_Code + const integer c_ps_Free_Format_Data_AVP_Code := 866; //Ref ETSI TS 132 299 PS_Free_Format_Data_AVP + const integer c_ps_Append_Free_Format_Data_AVP_Code := 867; //Ref ETSI TS 132 299 PS_Append_Free_Format_Data_AVP + const integer c_time_Quota_Threshold_AVP_Code := 868; //Ref ETSI TS 132 299 Time_Quota_Threshold_AVP + const integer c_volume_Quota_Threshold_AVP_Code := 869; //Ref ETSI TS 132 299 Volume_Quota_Threshold_AVP + const integer c_trigger_Type_AVP_Code := 870; //Ref ETSI TS 132 299 Trigger_Type_AVP + const integer c_quota_Holding_Time_AVP_Code := 871; //Ref ETSI TS 132 299 Quota_Holding_Time_AVP + const integer c_reporting_Reason_AVP_Code := 872; //Ref ETSI TS 132 299 Reporting_Reason_AVP + const integer c_service_Information_AVP_Code := 873; //Ref ETSI TS 132 299 Service_Information_AVP + const integer c_ps_Information_AVP_Code := 874; //Ref ETSI TS 132 299 PS_Information_AVP + const integer c_wlan_Information_AVP_Code := 875; //Ref ETSI TS 132 299 WLAN_Information_AVP + const integer c_ims_Information_AVP_Code := 876; //Ref ETSI TS 132 299 IMS_Information_AVP + const integer c_quota_Consumption_Time_AVP_Code := 881; //Ref ETSI TS 132 299 Quota_Consumption_Time_AVP + const integer c_media_Initiator_Flag_AVP_Code := 882; //Ref ETSI TS 132 299 Media_Initiator_Flag_AVP + const integer c_expires_AVP_Code := 888; //Ref ETSI TS 132 299 Expires_AVP + const integer c_message_Body_AVP_Code := 889; //Ref ETSI TS 132 299 Message_Body_AVP + const integer c_wag_Address_AVP_Code := 890; //Ref ETSI TS 132 299 WAG_Address_AVP + const integer c_wag_PLMN_Ids_AVP_Code := 891; //Ref ETSI TS 132 299 WAG_Address_AVP + const integer c_wlan_Radio_Container_AVP_Code := 892; //Ref ETSI TS 132 299 WLAN_Radio_Container + const integer c_wlan_Technology_AVP_Code := 893; //Ref ETSI TS 132 299 WLAN_Technology_AVP + const integer c_wlan_UE_Local_IPAddress_AVP_Code := 894; //Ref ETSI TS 132 299 WLAN_UE_Local_IPAddress_AVP + const integer c_pdg_Address_AVP_Code := 895; //Ref ETSI TS 132 299 PDG_Address_AVP + const integer c_pdg_Charging_Id_AVP_Code := 896; //Ref ETSI TS 132 299 PDG_Charging_Id_AVP + + const integer c_unit_Quota_Threshold_AVP_Code := 1226; //Ref ETSI TS 132 299 Unit_Quota_Threshold_AVP + const integer c_sgsn_Address_AVP_Code := 1228; //Ref ETSI TS 132 299 SGSN_Address_AVP + const integer c_wlan_Session_Id_AVP_Code := 1246; //Ref ETSI TS 132 299 WLAN_Session_Id_AVP + const integer c_pdp_Context_Type_AVP_Code := 1247; //Ref ETSI TS 132 299 PDP_Context_Type_AVP + const integer c_called_Asserted_Identity_AVP_Code := 1250; //Ref ETSI TS 132 299 Called_Asserted_Identity_AVP + const integer c_requested_Party_Address_AVP_Code := 1251; //Ref ETSI TS 132 299 Requested_Party_Address_AVP + const integer c_service_Generic_Information_AVP_Code := 1256; //Ref ETSI TS 132 299 Service_Generic_Information_AVP + const integer c_service_Specific_Type_AVP_Code := 1257; //Ref ETSI TS 132 299 Service_Specific_Type_AVP + const integer c_access_Network_Information_AVP_Code := 1263; //Ref ETSI TS 132 299 Access_Network_Information_AVP + const integer c_trigger_AVP_Code := 1264; //Ref ETSI TS 132 299 Trigger_AVP + const integer c_base_Time_Interval_AVP_Code := 1265; //Ref ETSI TS 132 299 Base_Time_Interval_AVP + const integer c_envelope_End_Time_AVP_Code := 1267; //Ref ETSI TS 132 299 Envelope_End_Time_AVP + const integer c_envelope_AVP_Code := 1266; //Ref ETSI TS 132 299 Envelope_AVP + const integer c_envelope_Start_Time_AVP_Code := 1269; //Ref ETSI TS 132 299 Envelope_Start_Time_AVP + const integer c_envelope_Reporting_AVP_Code := 1268; //Ref ETSI TS 132 299 Envelope_Reporting_AVP + const integer c_time_Quota_Mechanism_AVP_Code := 1270; //Ref ETSI TS 132 299 Time_Quota_Mechanism_AVP + const integer c_time_Quota_Type_AVP_Code := 1271; //Ref ETSI TS 132 299 Time_Quota_Type_AVP + const integer c_early_Media_Description_AVP_Code := 1272; //Ref ETSI TS 132 299 Early_Media_Description_AVP + const integer c_sdp_TimeStamps_AVP_Code := 1273; //Ref ETSI TS 132 299 SDP_TimeStamps_AVP + const integer c_sdp_Offer_Timestamp_AVP_Code := 1274; //Ref ETSI TS 132 299 SDP_Offer_Timestamp_AVP + const integer c_sdp_Answer_Timestamp_AVP_Code := 1275; //Ref ETSI TS 132 299 SDP_Answer_Timestamp_AVP + const integer c_af_Correlation_Information_AVP_Code := 1276; //Ref ETSI TS 132 299 AF_Correlation_Information_AVP + const integer c_offline_Charging_AVP_Code := 1278; //Ref ETSI TS 132 299 Offline_Charging_AVP + const integer c_alternate_Charged_Party_Address_AVP_Code := 1280; //Ref ETSI TS 132 299 Alternate_Charged_Party_Address_AVP + const integer c_ims_Communication_Service_Identifier_AVP_Code := 1281; //Ref ETSI TS 132 299 IMS_Communication_Service_Identifier_AVP + const integer c_media_Initiator_Party_AVP_Code := 1288; //Ref ETSI TS 132 299 Media_Initiator_Party_AVP + const integer c_cSG_Id_AVP_Code := 1437; //Ref: ETSI TS 132 299 CSG_Id_AVP + + const integer c_low_Balance_Indication_AVP_Code := 2020; //Ref ETSI TS 132 299 Low_Balance_Indication_AVP + const integer c_remaining_Balance_AVP_Code := 2021; //Ref ETSI TS 132 299 Remaining_Balance_AVP + const integer c_refund_Information_AVP_Code := 2022; //Ref ETSI TS 132 299 Refund_Information_AVP + const integer c_carrier_Select_Routing_Information_AVP_Code := 2023; //Ref ETSI TS 132 299 Carrier_Select_Routing_Information_AVP + const integer c_number_Portability_Routing_Information_AVP_Code := 2024; //Ref ETSI TS 132 299 Number_Portability_Routing_Information_AVP + const integer c_node_Id_AVP_Code := 2034; //Ref ETSI TS 132 299 Node_Id_AVP + const integer c_sdp_Type_AVP_Code := 2036; //Ref ETSI TS 132 299 SDP_Type_AVP + const integer c_change_Condition_AVP_Code := 2037; //Ref ETSI TS 132 299 Change_Condition_AVP + const integer c_change_Time_AVP_Code := 2038; //Ref ETSI TS 132 299 Change_Time_AVP + const integer c_diagnostics_AVP_Code := 2039; //Ref ETSI TS 132 299 Diagnostics_AVP + const integer c_service_Data_Container_AVP_Code := 2040; //Ref ETSI TS 132 299 Service_Data_Container_AVP + const integer c_start_Time_AVP_Code := 2041; //Ref ETSI TS 132 299 Start_Time_AVP + const integer c_stop_Time_AVP_Code := 2042; //Ref ETSI TS 132 299 Stop_Time_AVP + const integer c_time_First_Usage_AVP_Code := 2043; //Ref ETSI TS 132 299 Time_First_Usage_AVP + const integer c_time_Last_Usage_AVP_Code := 2044; //Ref ETSI TS 132 299 Time_Last_Usage_AVP + const integer c_time_Usage_Usage_AVP_Code := 2045; //Ref ETSI TS 132 299 Time_Usage_AVP + const integer c_traffic_Data_Volumes_AVP_Code := 2046; //Ref ETSI TS 132 299 Traffic_Data_Volumes_AVP + const integer c_serving_Node_Type_AVP_Code := 2047; //Ref ETSI TS 132 299 Serving_Node_Type_AVP + const integer c_pdn_Connection_Charging_ID_AVP_Code := 2050; //Ref ETSI TS 132 299 PDN_Connection_Charging_ID_AVP + const integer c_dynamic_Address_Flag_AVP_Code := 2051; //Ref ETSI TS 132 299 + const integer c_accumulated_Cost_AVP_Code := 2052; //Ref ETSI TS 132 299 Accumulated_Cost_AVP + const integer c_aoc_Cost_Information_AVP_Code := 2053; //Ref ETSI TS 132 299 AoC_Cost_Information_AVP + const integer c_aoc_Information_AVP_Code := 2054; //Ref ETSI TS 132 299 AoC_Information_AVP + const integer c_aoc_Request_Type_AVP_Code := 2055; //Ref ETSI TS 132 299 AoC_Request_Type_AVP + const integer c_current_Tariff_AVP_Code := 2056; //Ref ETSI TS 132 299 Current_Tariff_AVP + const integer c_next_Tariff_AVP_Code := 2057; //Ref ETSI TS 132 299 Next_Tariff_AVP + const integer c_rate_Element_AVP_Code := 2058; //Ref ETSI TS 132 299 Rate_Element_AVP + const integer c_scale_Factor_AVP_Code := 2059; //Ref ETSI TS 132 299 Scale_Factor_AVP + const integer c_tariff_Information_AVP_Code := 2060; //Ref ETSI TS 132 299 Tariff_Information_AVP + const integer c_incremental_Cost_AVP_Code := 2062; //Ref ETSI TS 132 299 Incremental_Cost_AVP + const integer c_local_Sequence_Number_AVP_Code := 2063; //Ref ETSI TS 132 299 Local_Sequence_Number_AVP_Code + const integer c_unit_Cost_AVP_Code := 2061; //Ref ETSI TS 132 299 Unit_Cost_AVP + const integer c_sgw_Change_AVP_Code := 2065; //Ref ETSI TS 132 299 SGW_Change_AVP + const integer c_charging_Characteristics_Selection_Mode_AVP_Code:= 2066; //Ref ETSI TS 132 299 Charging_Characteristics_Selection_Mode_AVP + const integer c_sgw_Address_AVP_Code := 2067; //Ref ETSI TS 132 299 SGW_Address_AVP + const integer c_dynamic_Address_Flag_Extension_AVP_Code := 2068; //Ref ETSI TS 132 299 Dynamic_Address_Flag_Extension_AVP + + const integer c_application_Server_ID_AVP_Code := 2101; //Ref ETSI TS 132 299 Application_Server_ID_AVP + const integer c_application_Service_Type_AVP_Code := 2102; //Ref ETSI TS 132 299 Application_Service_Type_AVP + const integer c_application_Session_ID_AVP_Code := 2103; //Ref ETSI TS 132 299 Application_Session_ID_AVP + const integer c_delivery_Status_AVP_Code := 2104; //Ref ETSI TS 132 299 Delivery_Status_AVP + + const integer c_sip_Request_Timestamp_Fraction_AVP_Code := 2301;//Ref: ETSI TS 132 299 SIP_Request_Timestamp_Fraction_AVP + const integer c_sip_Response_Timestamp_Fraction_AVP_Code := 2302;//Ref: ETSI TS 132 299 SIP_Response_Timestamp_Fraction_AVP + const integer c_online_Charging_Flag_AVP_Code := 2303;//Ref: ETSI TS 132 299 Online_Charging_Flag_AVP + const integer c_real_Time_Tariff_Information_AVP_Code:= 2305;//Ref: ETSI TS 132 299 Real_Time_Tariff_Information_AVP + const integer c_imsi_Unauthenticated_Flag_AVP_Code := 2308;//Ref: ETSI TS 132 299 IMSI_Unauthenticated_Flag_AVP + const integer c_account_Expiration_AVP_Code := 2309;//Ref: ETSI TS 132 299 Account_Expiration_AVP + const integer c_aoc_Format_AVP_Code := 2310;//Ref: ETSI TS 132 299 AoC_Format_AVP + const integer c_aoc_Service_AVP_Code := 2311;//Ref: ETSI TS 132 299 AoC_Service_AVP + const integer c_aoc_Service_Obligatory_Type_AVP_Code := 2312;//Ref: ETSI TS 132 299 AoC_Service_Obligatory_Type_AVP + const integer c_aoc_Service_Type_AVP_Code := 2313;//Ref: ETSI TS 132 299 AoC_Service_Type_AVP + const integer c_aoc_Subscription_Information_AVP_Code:= 2314;//Ref: ETSI TS 132 299 AoC_Subscription_Information_AVP + const integer c_preferred_AoC_Currency_AVP_Code := 2315;//Ref: ETSI TS 132 299 Preferred_AoC_Currency_AVP + const integer c_cSG_Access_Mode_AVP_Code := 2317; //Ref: ETSI TS 132 299 CSG_Access_Mode_AVP + const integer c_cSG_Membership_Indication_AVP_Code := 2318;//Ref: ETSI TS 132 299 CSG_Membership_Indication_AVP + const integer c_user_CSG_Information_AVP_Code := 2319; //Ref: ETSI TS 132 299 User_CSG_Information_AVP + const integer c_initial_IMS_Charging_Identifier_AVP_Code := 2321; //Ref: ETSI TS 132 299 Initial_IMS_Charging_Identifier_AVP + const integer c_ims_Emergency_Indicator_AVP_Code := 2322; //Ref: ETSI TS 132 299 IMS_Emergency_Indicator_AVP + const integer c_tariff_XML_AVP_Code := 2326; //Ref: ETSI TS 132 299 Tariff_XML_AVP + const integer c_outgoing_Session_Id_AVP_Code := 2330; //Ref: ETSI TS 132 299 Outgoing_Session_Id_AVP + const integer c_low_Priority_Indicator_AVP_Code := 2602;//Ref: ETSI TS 132 299 Low_Priority_Indicator + const integer c_ip_Realm_Default_Indication_AVP_Code:= 2603;//Ref: ETSI TS 132 299 IP_Realm_Default_Indication_AVP + const integer c_local_GW_Inserted_Indication_AVP_Code:= 2604;//Ref: ETSI TS 132 299 Local_GW_Inserted_Indication_AVP + const integer c_transcoder_Inserted_Indication_AVP_Code:= 2605;//Ref: ETSI TS 132 299 Transcoder_Inserted_Indication_AVP + const integer c_pdp_Address_Prefix_Length_AVP_Code := 2606;//Ref: ETSI TS 132 299 PDP_Address_Prefix_Length_AVP + + } // End of group AVPCodeConstantsTS132_299 + group AVPCodeConstantsX_S0057_1{ + + const integer c_threeGPP2_BSID_AVP_Code := 5535; //Ref: X.S0057-1 ThreeGPP2_BSID_AVP + + } // End of group AVPCodeConstantsX_S0057_1 + group AVPCodeConstantsTS283_034{ + + const integer c_logical_Access_ID_AVP_Code := 302; //Ref: TS283_034 ThreeGPP2_BSID_AVP + const integer c_physical_Access_ID_AVP_Code := 313; //Ref: TS283_034 Physical_Access_ID_AVP + + } // End of group AVPCodeConstantsTS283_034 + + } // End of group AVPCodeConstants + } + +} // End of group BasicTypes + + group HeaderAndBodyTypes + { + group HeaderTypes{ + /* This group contains the type definitions of the messages. */ + + + // Diameter Header Record. + type record DiameterHeader { + UInt8 version, + UInt24 msglen, //message length + Command_Flags cmdflags, //command flags + Command_Code cmdcode, //command code + UInt32 applid, //application id + UInt32 hopid, //hop_by_hop_id previous optional + UInt32 endid //end_to_end_id previous optional + } + + } // End of group HeaderTypes + + group MessageTypes{ + + /* Ref: RFC3588 p.3 */ + type record Command_Flags{ + Bit1 r_bit, //Request + Bit1 p_bit, //Proxiable + Bit1 e_bit, //Error + Bit1 t_bit, //Potentialy re-transmited message + Bit4 reserved_bits +// } +// with { +// variant (r_bit) "intTag='r_bit'" + } + + /* Ref: RFC3588 p.3.1 */ + type enumerated Command_Code{ + CER_E, // Capabilities-Exchange-Request CER (257) + CEA_E, // Capabilities-Exchange-Answer CEA (257) + RAR_E, // Re-Auth-Request RAR (258) + RAA_E, // Re-Auth-Answer RAA (258) + /**/ + ACR_E, // Accounting-Request ACR(271) + ACA_E, // Accounting-Answer ACA (271) + /**/ + ASR_E, // Abort-Session-Request ASR (274) + ASA_E, // Abort-Sesion-Answer ASA (274) + STR_E, // Session-Termination-Request STR (275) + STA_E, // Session-Termination-Answer STA (275) + /**/ + DWR_E, // Device-Watchdog-Request DWR (280) + DWA_E, // Device-Watchdog-Answer DWA (280) + DPR_E, // Disconnect-Peer-Requst DPR (282) + DPA_E, // Disconnect-Peer-Answer DPA (282) + + /* Codes on Cx */ + UAR_E, // User-Authorization-Request UAR (283 in RFC4740 or 300 in TS 129 229) + UAA_E, // User-Authorizdatio-Response UAA (283 in RFC4740 or 300 in TS 129 229) + SAR_E, // Server-Assignment-Request SAR (284 in RFC4740 or 301 in TS 129 229) + SAA_E, // Server-Assignment-Answer SAA (284 in RFC4740 or 301 in TS 129 229) + LIR_E, // Location-Info-Request LIR (285 in RFC4740 or 302 in TS 129 229) + LIA_E, // Location-Info-Answer LIA (285 in RFC4740 or 302 in TS 129 229) + MAR_E, // Multimedia-Auth-Request MAR (286 in RFC4740 or 303 in TS 129 229) + MAA_E, // Multimedia-Auth-Answer MAA (286 in RFC4740 or 303 in TS 129 229) + RTR_E, // Registration-Termination-Request RTR (287 in RFC4740 or 304 in TS 129 229) + RTA_E, // Registration-Termination-Answer RTA (287 in RFC4740 or 304 in TS 129 229) + PPR_E, // Push-Profile-Request PPR (288 in RFC4740 or 305 in TS 129 229) + PPA_E, // Push-Profile-Answer PPA (288 in RFC4740 or 305 in TS 129 229) + + /* Codes on Sh/Dh interface */ + UDR_E, // UDR User-Data-Request AS->HSS UDR (306) + UDA_E, // UDA User-Data-Answer HSS->AS UDA (306) + PUR_E, // PUR Profile-Update-Request AS->HSS PUR (307) + PUA_E, // PUA Profile-Update-Answer HSS->AS PUA (307) + SNR_E, // SNR Subscribe-Notifications-Request AS->HSS SNR (308) + SNA_E, // SNA Subscribe-Notifications-Answer HSS->AS SNA (308) + PNR_E, // PNR Profile-Notification-Request HSS->AS PNR (309) + PNA_E, // PNA Profile-Notification-Answer AS->HSS PNA (309) + + /* Codes on Rx interface */ + AAR_E, // AAR Auth-Accounting-Request AAR (265) + AAA_E, // AAA Auth-Accounting-Request AAA (265) + + /* Codes on Gx interface - RFC4006 and TS 129 212 */ + CCR_E, // CCR Credit-Control-Request CCR (272) + CCA_E, // CCA Credit-Control-Request CCA (272) + + /* Codes on S6a interface - TS 129 272 */ + ULR_E, // Update-Location-Request ULR (316)- Ref: TS 129 272 7.2.3 + ULA_E, // Update-Location-Answer ULA (316)- Ref: TS 129 272 7.2.4 + CLR_E, // Cancel-Location-Request CLR (317)- Ref: TS 129 272 7.2.7 + CLA_E, // Cancel-Location-Answer CLA (317)- Ref: TS 129 272 7.2.8 + AIR_E, // Authentication-Information-Request AIR (318)- Ref: TS 129 272 7.2.5 + AIA_E, // Authentication-Information-Answer AIA (318)- Ref: TS 129 272 7.2.6 + IDR_E, // Insert-Subscriber-Data-Request IDR (319)- Ref: TS 129 272 7.2.9 + IDA_E, // Insert-Subscriber-Data-Answer IDA (319)- Ref: TS 129 272 7.2.10 + DSR_E, // Delete-Subscriber-Data-Request DSR (320)- Ref: TS 129 272 7.2.11 + DSA_E, // Delete-Subscriber-Data-Answer DSA (320)- Ref: TS 129 272 7.2.12 + PUER_E, // Purge-UE-Request PUR (321)- Ref: TS 129 272 7.2.13 + PUEA_E, // Purge-UE-Answer PUA (321)- Ref: TS 129 272 7.2.14 + RSR_E, // Reset-Request DSR (322)- Ref: TS 129 272 7.2.15 + RSA_E, // Reset-Answer DSA (322)- Ref: TS 129 272 7.2.16 + NOR_E, // Notify-Request NOR (323)- Ref: TS 129 272 7.2.17 + NOA_E // Notify-Answer NOA (323)- Ref: TS 129 272 7.2.18 +// } +// with { +// variant "length=24;use=com.testingtech.ttcn.tci.codec.CodecHelper;encode=CodecHelper.encodeCommandCode();decode=CodecHelper.decodeCommandCode()" + } + //RFC3588, chapter 3. Diameter Header: The Command-Code field is three octets + + + type union DIAMETER_MSG { + CER_MSG cER_MSG, + CEA_MSG cEA_MSG, + RAR_MSG rAR_MSG, + RAA_MSG rAA_MSG, + ACR_MSG aCR_MSG, + ACA_MSG aCA_MSG, + ASR_MSG aSR_MSG, + ASA_MSG aSA_MSG, + STR_MSG sTR_MSG, + STA_MSG sTA_MSG, + DWR_MSG dWR_MSG, + DWA_MSG dWA_MSG, + DPR_MSG dPR_MSG, + DPA_MSG dPA_MSG, + //RFC4740 + UAR_MSG uAR_MSG, + UAA_MSG uAA_MSG, + SAR_MSG sAR_MSG, + SAA_MSG sAA_MSG, + LIR_MSG lIR_MSG, + LIA_MSG lIA_MSG, + MAR_MSG mAR_MSG, + MAA_MSG mAA_MSG, + RTR_MSG rTR_MSG, + RTA_MSG rTA_MSG, + PPR_MSG pPR_MSG, + PPA_MSG pPA_MSG, + //Sh interface + UDR_MSG uDR_MSG, + UDA_MSG uDA_MSG, + PUR_MSG pUR_MSG, + PUA_MSG pUA_MSG, + SNR_MSG sNR_MSG, + SNA_MSG sNA_MSG, + PNR_MSG pNR_MSG, + PNA_MSG pNA_MSG, + //RFC4006 and TS 129 212 + CCR_MSG cCR_MSG, + CCA_MSG cCA_MSG, + //Rx interface + AAR_MSG aAR_MSG, + AAA_MSG aAA_MSG, + // S6a interface + ULR_MSG uLR_MSG, + ULA_MSG uLA_MSG, + AIR_MSG aIR_MSG, + AIA_MSG aIA_MSG, + CLR_MSG cLR_MSG, + CLA_MSG cLA_MSG, + IDR_MSG iDR_MSG, + IDA_MSG iDA_MSG, + DSR_MSG dSR_MSG, + DSA_MSG dSA_MSG, + + PUER_MSG pUER_MSG, // Purge-UE-Request: PUR (321)- Ref: TS 129 272 7.2.13 + PUEA_MSG pUEA_MSG, // Purge-UE-Answer: PUA (321)- Ref: TS 129 272 7.2.14 + + RSR_MSG rSR_MSG, + RSA_MSG rSA_MSG, + NOR_MSG nOR_MSG, + NOA_MSG nOA_MSG, + + UNKNOWN_MSG uNKNOWN_MSG + } + + /* ***** Diameter Message types ***** */ + group RFC3588{ + + type record UNKNOWN_MSG { + DiameterHeader header, + set of AVP_Type aVP_Type optional //changed +// } +// with { +// variant "present=!bytes(4, 257, 258)" +// variant "present=!bytes(4, 271, 275)" +// variant "present=!bytes(4, 280)" +// variant "present=!bytes(4, 282, 288)" +// variant "present=!bytes(4, 306, 309)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record CER_MSG{ + //Ref: RFC3588 5.3.1. Capabilities-Exchange-Request + DiameterHeader header,// ::= < Diameter Header: 257, REQ > + CER_Body_AVP cER_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 257)" //The Capabilities-Exchange-Request (CER), indicated by the Command-Code set to 257 and the Command Flags' 'R' bit set + } + + type set CER_Body_AVP { + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + set length (1..infinity) of Host_IP_Address_AVP host_IP_Address, + Vendor_Id_AVP vendor_Id, + Product_Name_AVP product_Name,//required + Origin_State_Id_AVP origin_State_Id optional, //set of removed due to RFC3588 + set of Supported_Vendor_Id_AVP supported_Vendor_Id optional, + set of Auth_Application_Id_AVP auth_Application_Id optional, + set of Inband_Security_Id_AVP inband_Security_Id optional, + set of Acct_Application_Id_AVP acct_Application_Id optional, + set of Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Firmware_Revision_AVP firmware_Revision optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (host_IP_Address) "fieldPresent=bytes(4, 257)" //presence check for inline defined lists +// variant (origin_State_Id) "fieldPresent=bytes(4, 278)" //presence check for inline defined optional lists +// variant (supported_Vendor_Id) "fieldPresent=bytes(4, 265)" //presence check for inline defined optional lists +// variant (auth_Application_Id) "fieldPresent=bytes(4, 258)" //presence check for inline defined optional lists +// variant (inband_Security_Id) "fieldPresent=bytes(4, 299)" //presence check for inline defined optional lists +// variant (acct_Application_Id) "fieldPresent=bytes(4, 259)" //presence check for inline defined optional lists +// variant (vendor_Specific_Application_Id) "fieldPresent=bytes(4, 260)" //presence check for inline defined optional lists +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record CEA_MSG{ + //Ref: RFC3588 5.3.2. Capabilities-Exchange-Answer + DiameterHeader header,// ::= < Diameter Header: 257 > + CEA_Body_AVP cEA_Body +// } with { +// variant "present=bits(32,1,0) && bytes(5,3, 257)" //The Capabilities-Exchange-Request (CEA), indicated by the Command-Code set to 257 and the Command Flags' 'R' bit clear + } + + type set CEA_Body_AVP { + Result_Code_AVP result_Code,//required + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + set length (1..infinity) of Host_IP_Address_AVP host_IP_Address, + Vendor_Id_AVP vendor_Id, + Product_Name_AVP product_Name,//required + Origin_State_Id_AVP origin_State_Id optional, + Error_Message_AVP error_Message optional, + set of Failed_AVP failed optional, + set of Supported_Vendor_Id_AVP supported_Vendor_Id optional, + set of Auth_Application_Id_AVP auth_Application_Id optional, + set of Inband_Security_Id_AVP inband_Security_Id optional, + set of Acct_Application_Id_AVP acct_Application_Id optional, + set of Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Firmware_Revision_AVP firmware_Revision optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (host_IP_Address) "fieldPresent=bytes(4, 257)" //presence check for inline defined lists +// variant (failed) "fieldPresent=bytes(4, 278)" +// variant (supported_Vendor_Id) "fieldPresent=bytes(4, 279)" +// variant (auth_Application_Id) "fieldPresent=bytes(4, 265)" +// variant (inband_Security_Id) "fieldPresent=bytes(4, 299)" +// variant (acct_Application_Id) "fieldPresent=bytes(4, 259)" +// variant (vendor_Specific_Application_Id) "fieldPresent=bytes(4, 260)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record RAR_MSG{ + //Ref: RFC3588 8.3.1. Re-Auth-Request + DiameterHeader header,// ::= < Diameter Header: 258, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. //RFC3588 & TS 129 214 & TS 129 212 + RAR_Body_AVP rAR_Body +// } with { +// variant "present=bits(32,1,1) && bytes(5,3, 258)" //The RAR, indicated by the Command-Code set to 258 and the Command Flags' 'R' bit set + } + + type set RAR_Body_AVP { + Origin_Host_AVP origin_Host,//required //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Origin_Realm_AVP origin_Realm, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Destination_Realm_AVP destination_Realm, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Destination_Host_AVP destination_Host, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Auth_Application_Id_AVP auth_Application_Id, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Specific_Action_AVP specific_Action optional, // TS 129 214 required + Re_Auth_Request_Type_AVP re_Auth_Request_Type optional, //RFC3588req & TS 129 214NOT present & TS 129 212req & TS129 215 req + User_Name_AVP user_Name optional, //RFC3588 + set of Access_Network_Charging_Identifier_AVP acc_nc_ident optional, // TS 129 214 + Access_Network_Charging_Address_AVP acc_nc_addr optional, // TS 129 214 + set of Flows_AVP flows optional, // TS 129 214 + set of Subscription_Id_AVP subscription_Id optional, // TS 129 214 + Abort_Cause_AVP abort_Cause optional, // TS 129 214 + IP_CAN_Type_AVP ip_Can optional, // TS 129 214 + RAT_Type_AVP rat_Type optional, // TS 129 214 + Sponsored_Connectivity_Data_AVP sponsored_Connectivity_Data optional,// TS 129 214 + Origin_State_Id_AVP origin_State_Id optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + set of Class_AVP class optional, // TS 129 214 + Session_Release_Cause_AVP session_Release_Cause optional, // TS 129 212 & TS129 215 + set of Event_Trigger_AVP event_Trigger optional, // TS 129 212 & TS129 215 + Event_Report_Indication_AVP event_Report_Indication optional, // TS 129 212 + set of Charging_Rule_Remove_AVP charging_Rule_Remove optional, // TS 129 212 + set of Charging_Rule_Install_AVP charging_Rule_Install optional, // TS 129 212 + Default_EPS_Bearer_QoS_AVP default_EPS_Bearer_QoS optional, // TS 129 212 + set of QoS_Information_AVP qoS_Information optional, // TS 129 212 & TS129 215 + Revalidation_Time_AVP revalidation_Time optional, // TS 129 212 + set of Usage_Monitoring_Information_AVP usage_Monitoring_Information optional, // TS 129 212 + set of QoS_Rule_Install_AVP qoS_Rule_Install optional, //S9 (TS129 215) only + set of QoS_Rule_Remove_AVP qoS_Rule_Remove optional, //S9 (TS129 215) only + set of Subses_Decision_Info_AVP subsession_Decision_Info optional, //S9 (TS129 215) only + set length (0..2) of AN_GW_Addr_AVP aN_GW_Address optional, //S9 (TS129 215) only + Multiple_BBERF_Action_AVP multiple_BBERF_Action optional, //S9 (TS129 215) only + set of Proxy_Info_AVP proxy_Info optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + set of Route_Record_AVP route_Record optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + G_S_U_Pool_Identifier_AVP g_s_u_Pool_Identifier optional, //TS132 299 only + Service_Identifier_AVP service_Identifier optional, //TS132 299 only + Rating_Group_AVP rating_Group optional, //TS132 299 only + set of AVP_Type aVP_Type optional //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 +// } +// with { +// variant (acc_nc_ident) "fieldPresent=bytes(4, 502)" +// variant (flows) "fieldPresent=bytes(4, 510)" +// variant (subscription_Id) "fieldPresent=bytes(4, 443)" +// variant (class) "fieldPresent=bytes(4, 25)" +// variant (event_Trigger) "fieldPresent=bytes(4, 1006)" +// variant (charging_Rule_Remove) "fieldPresent=bytes(4, 1002)" +// variant (charging_Rule_Install) "fieldPresent=bytes(4, 1001)" +// variant (qoS_Information) "fieldPresent=bytes(4, 1016)" +// variant (usage_Monitoring_Information) "fieldPresent=bytes(4, 1067)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record RAA_MSG{ + //Ref: RFC3588 8.3.2. Re-Auth-Answer + DiameterHeader header,// ::= < Diameter Header: 258, PXY > + Session_Id_AVP session_Id,//fixed pos. //RFC3588 & TS 129 214 & TS 129 212 + RAA_Body_AVP rAA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 258)" + } + + type set RAA_Body_AVP { + Result_Code_AVP result_Code optional, //RFC3588req & TS 129 214opt & TS 129 212opt & TS129 215opt + Origin_Host_AVP origin_Host, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Origin_Realm_AVP origin_Realm,//required //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Experimental_Result_AVP experimental_Result optional, //TS 129 214 & TS 129 212 & TS129 215 + User_Name_AVP user_Name optional, //RFC3588 + set of Media_Component_Description_AVP media_Component_Description optional,//TS 129 214 + Service_URN_AVP service_URN optional, //TS 129 214 + Origin_State_Id_AVP origin_State_Id optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + set of Class_AVP class optional, //TS 129 214 + IP_CAN_Type_AVP iP_CAN_Type optional, //TS 129 212 & TS129 215 + RAT_Type_AVP rat_Type optional, //TS 129 212 & TS129 215 + record length (0..2) of AN_GW_Address_AVP aN_GW_Address optional, //TS 129 212 & TS129 215 + ThreeGPP_SGSN_MCC_MNC_AVP threeGPP_SGSN_MCC_MNC optional, //TS 129 212 & TS129 215 + ThreeGPP_SGSN_Address_AVP threeGPP_SGSN_Address optional, //TS 129 212 & TS129 215 + ThreeGPP_SGSN_IPv6_Address_AVP threeGPP_SGSN_IPv6_Address optional,//TS 129 212 & TS129 215 + RAI_AVP rAI optional, //TS 129 212 & TS129 215 + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional,//TS 129 212 & TS129 215 + ThreeGPP_MS_TimeZone_AVP threeGPP_MS_TimeZone optional, //TS 129 212 & TS129 215 + set of Charging_Rule_Report_AVP charging_Rule_Report optional, //TS 129 212 + Error_Message_AVP error_Message optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + Error_Reporting_Host_AVP error_Reporting_Host optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + set of Failed_AVP failed optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + set of Redirect_Host_AVP redirect_Host optional, //RFC3588 & TS 129 214 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC3588 & TS 129 214 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC3588 & TS 129 214 + Framed_IP_Address_AVP framed_IP_Address optional, //S9 (TS129 215) only + Framed_IPv6_Prefix_AVP framed_IPv6_Prefix optional, //S9 (TS129 215) only + ThreeGPP2_BSID_AVP threeGPP2_BSID optional, //S9 (TS129 215) only + QoS_Information_AVP qoS_Information optional, //S9 (TS129 215) only + set of QoS_Rule_Report_AVP qoS_Rule_Report optional, //S9 (TS129 215) only + set of Subses_Enforcement_Info_AVP subsesion_Enforcement_Info optional, //S9 (TS129 215) only + User_CSG_Information_AVP user_CSG_Information optional, //S9 (TS129 215) only + set of Proxy_Info_AVP proxy_Info optional, //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 + set of AVP_Type aVP_Type optional //RFC3588 & TS 129 214 & TS 129 212 & TS129 215 +// } +// with { +// variant (media_Component_Description) "fieldPresent=bytes(4, 517)" +// variant (class) "fieldPresent=bytes(4, 25)" +// variant (aN_GW_Address) "fieldPresent=bytes(4, 1050)" +// variant (charging_Rule_Report) "fieldPresent=bytes(4, 1018)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (redirect_Host) "fieldPresent=bytes(4, 292)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record ACR_MSG{ + //Ref: RFC3588 9.7.1. Accounting-Request + DiameterHeader header,// ::= < Diameter Header: 271, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + ACR_Body_AVP aCR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 271)" + } + + type set ACR_Body_AVP { + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Destination_Realm_AVP destination_Realm, + Accounting_Record_Type_AVP accounting_Record_Type, + Accounting_Record_Number_AVP accounting_Record_Number,//required + Acct_Application_Id_AVP acct_Application_Id optional,//optional + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + User_Name_AVP user_Name optional, + set of Supported_Features_AVP supported_Features optional, //specified in RFC4006 + Accounting_Sub_Session_Id_AVP accounting_Sub_Session_Id optional, + Acct_Session_Id_AVP acct_Session_Id optional, + Acct_Multi_Session_Id_AVP acct_Multi_Session_Id optional, + Acct_Interim_Interval_AVP acct_Interim_Interval optional, + Accounting_Realtime_Required_AVP accounting_Realtime_Required optional, + Origin_State_Id_AVP origin_State_Id optional, + Event_Timestamp_AVP event_Timestamp optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + Service_Context_Id_AVP service_Context_Id optional, //TS132 299 only + Service_Information_AVP service_Information optional, //TS132 299 only + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record ACA_MSG{ + //Ref: RFC3588 9.7.2. Accounting-Answer + DiameterHeader header ,// ::= < Diameter Header: 271, PXY > + Session_Id_AVP session_Id,//fixed pos. + ACA_Body_AVP aCA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 271)" + } + + type set ACA_Body_AVP { + Result_Code_AVP result_Code,//required + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Accounting_Record_Type_AVP accounting_Record_Type, + Accounting_Record_Number_AVP accounting_Record_Number,//required + Acct_Application_Id_AVP acct_Application_Id optional,//optional + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + User_Name_AVP user_Name optional, + Accounting_Sub_Session_Id_AVP accounting_Sub_Session_Id optional, + Acct_Session_Id_AVP acct_Session_Id optional, + Acct_Multi_Session_Id_AVP acct_Multi_Session_Id optional, + Error_Reporting_Host_AVP error_Reporting_Host optional, + Acct_Interim_Interval_AVP acct_Interim_Interval optional, + Accounting_Realtime_Required_AVP accounting_Realtime_Required optional, + Origin_State_Id_AVP origin_State_Id optional, + Event_Timestamp_AVP event_Timestamp optional, + set of Proxy_Info_AVP proxy_Info optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record ASR_MSG{ + //Ref: RFC3588 8.5.1. Abort-Session-Request + DiameterHeader header ,// ::= < Diameter Header: 274, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + ASR_Body_AVP aSR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 274)" + } + + type set ASR_Body_AVP { + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Destination_Realm_AVP destination_Realm, + Destination_Host_AVP destination_Host, + Auth_Application_Id_AVP auth_Application_Id, + Abort_Cause_AVP abort_cause optional,//present in ETSI TS 129 214 p.5.6.7 + User_Name_AVP user_Name optional, + Origin_State_Id_AVP origin_State_Id optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record ASA_MSG{ + //Ref: RFC3588 8.5.2. Abort-Session-Answer + DiameterHeader header,// ::= < Diameter Header: 274, PXY > + Session_Id_AVP session_Id,//fixed pos. + ASA_Body_AVP aSA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 274)" + } + + type set ASA_Body_AVP { + Result_Code_AVP result_Code,//required + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + User_Name_AVP user_Name optional, + Origin_State_Id_AVP origin_State_Id optional, + Error_Message_AVP error_Message optional, + Error_Reporting_Host_AVP error_Reporting_Host optional, + set of Failed_AVP failed optional, + set of Redirect_Host_AVP redirect_Host optional, + Redirect_Host_Usage_AVP redirect_Host_Usage optional, + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, + set of Proxy_Info_AVP proxy_Info optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (redirect_Host) "fieldPresent=bytes(4, 292)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record STR_MSG{ + //Ref: RFC3588 8.4.1. Session-Termination-Request + DiameterHeader header,// ::= < Diameter Header: 275, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + STR_Body_AVP sTR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 275)" + } + + type set STR_Body_AVP { + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Destination_Realm_AVP destination_Realm, + Auth_Application_Id_AVP auth_Application_Id, + Termination_Cause_AVP termination_Cause,//requ. + User_Name_AVP user_Name optional, + Destination_Host_AVP destination_Host optional, + set of Class_AVP class optional, + Origin_State_Id_AVP origin_State_Id optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (class) "fieldPresent=bytes(4, 25)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record STA_MSG{ + //Ref: RFC3588 8.4.2. Session-Termination-Answer + DiameterHeader header,// ::= < Diameter Header: 275, PXY > + Session_Id_AVP session_Id,//fixed pos. + STA_Body_AVP sTA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 275)" + } + + type set STA_Body_AVP { + Result_Code_AVP result_Code optional,//required + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + User_Name_AVP user_Name optional, + set of Class_AVP class optional, + Error_Message_AVP error_Message optional, + Error_Reporting_Host_AVP error_Reporting_Host optional, + set of Failed_AVP failed optional, + Sponsored_Connectivity_Data_AVP sponsored_Connectivity_Data optional,//present in ETSI TS 129 214 p.5.6.6 + Origin_State_Id_AVP origin_State_Id optional, + set of Redirect_Host_AVP redirect_Host optional, + Redirect_Host_Usage_AVP redirect_Host_Usage optional, + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, + set of Proxy_Info_AVP proxy_Info optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (class) "fieldPresent=bytes(4, 25)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (redirect_Host) "fieldPresent=bytes(4, 292)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + /**/ + type record DWR_MSG{ + //Ref: RFC3588 5.5.1. Device-Watchdog-Request + DiameterHeader header,// ::= < Diameter Header: 280, REQ > + DWR_Body_AVP dWR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 280)" + } + + type set DWR_Body_AVP { + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Origin_State_Id_AVP origin_State_Id optional, + set of AVP_Type aVP_Type optional //to await or send some unexpected AVPs +// } +// with { +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record DWA_MSG{ + //Ref: RFC3588 5.5.2. Device-Watchdog-Answer + DiameterHeader header,// ::= < Diameter Header: 280 > + DWA_Body_AVP dWA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 280)" + } + + type set DWA_Body_AVP { + Result_Code_AVP result_Code,//required + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm,//required + Error_Message_AVP error_Message optional, + set of Failed_AVP failed optional, + Origin_State_Id_AVP origin_State_Id optional, + set of AVP_Type aVP_Type optional //to await or send some unexpected AVPs +// } +// with { +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record DPR_MSG{ + // Ref: RFC3588 5.4.1. Disconnect-Peer-Request + DiameterHeader header,// ::= < Diameter Header: 282, REQ > + DPR_Body_AVP dPR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 282)" + } + + type set DPR_Body_AVP { + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Disconnect_Cause_AVP disconnect_Cause,//requ. + set of AVP_Type aVP_Type optional //to await or send some unexpected AVPs +// } +// with { +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record DPA_MSG{ + //Ref: RFC3588 5.4.2. Disconnect-Peer-Answer + DiameterHeader header,// ::= < Diameter Header: 282 > + DPA_Body_AVP dPA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 282)" + } + + type set DPA_Body_AVP { + Result_Code_AVP result_Code,//required + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm,//required + Error_Message_AVP error_Message optional, + set of Failed_AVP failed optional, + set of AVP_Type aVP_Type optional //to await or send some unexpected AVPs +// } +// with { +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + } // End of group RFC3588 + group RFC4740{ + + /* Codes on Cx_Dx */ + type record UAR_MSG{ + //Ref: TS 129 229 6.1.1. User-Authorization-Request(UAR:300) Command + //Ref: RFC4740 8.1. User-Authorization-Request(UAR:283) Command + DiameterHeader header,// ::= < Diameter Header: 283 or 300, PXY > + Session_Id_AVP session_Id,//fixed pos. + UAR_Body_AVP uAR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 283)" + } + + type set UAR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Destination_Realm_AVP destination_Realm, //RFC4740 & TS129 229 + SIP_AOR_AVP sIP_AOR optional, //required only inRFC4740 + Destination_Host_AVP destination_Host optional, //RFC4740 & TS129 229 + User_Name_AVP user_Name optional, //RFC4740 & required in TS129 229 + SIP_Visited_Network_Id_AVP sIP_Visited_Network_Id optional, //required only in RFC4740 + SIP_User_Authorization_Type_AVP sIP_User_Authorization_Type optional, //required only in RFC4740 + set of Supported_Features_AVP supported_Features optional, //only in TS129 229 + Public_Identity_AVP public_Identity optional, //required only in TS129 229 + Visited_Network_Identifier_AVP visited_Network_Identifier optional, //required only in TS129 229 + User_Authorization_Type_AVP user_Authorization_Type optional, //only in TS129 229 + UAR_Flags_AVP uAR_Flags optional, //only in TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 + set of Route_Record_AVP route_Record optional, //RFC4740 + set of AVP_Type aVP_Type optional //RFC4740 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record UAA_MSG{ + //Ref: TS 129 229 6.1.2. User-Authorization-Answer (UAA:300) Command + //Ref: RFC4740 8.2. User-Authorization-Answer (UAA:283) Command + DiameterHeader header,// ::= < Diameter Header: 283 or 300, PXY > + Session_Id_AVP session_Id,//fixed pos. + UAA_Body_AVP uAA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 283)" + } + + type set UAA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Result_Code_AVP result_Code optional, //RFC4740 & TS129 229 + Experimental_Result_AVP experimental_Result optional, //only TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //required in RFC4740 & TS129 229 + SIP_Server_URI_AVP sIP_Server_URI optional, //RFC4740 + SIP_Server_Capabilities_AVP sIP_Server_Capabilities optional, //RFC4740 + Authorization_Lifetime_AVP authorization_Lifetime optional, //RFC4740 + Auth_Grace_Period_AVP auth_Grace_Period optional, //RFC4740 + Redirect_Host_AVP redirect_Host optional, //RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC4740 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + Server_Name_AVP server_Name optional, //only TS129 229 + Server_Capabilities_AVP server_Capabilities optional, //only TS129 229 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record SAR_MSG{ + //Ref: TS 129 229 6.1.3. Server-Assignment-Request (SAR:301) Command + //Ref: RFC4740 8.3. Server-Assignment-Request (SAR:284) Command + DiameterHeader header,// ::= < Diameter Header: 284 or 301, PXY > + Session_Id_AVP session_Id,//fixed pos. + SAR_Body_AVP sAR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 284)" + } + + type set SAR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Destination_Realm_AVP destination_Realm, //RFC4740 & TS129 229 + SIP_Server_Assignment_Type_AVP sIP_Server_Assignment_Type optional, //required only in RFC4740 + SIP_User_Data_Already_Available_AVP sIP_User_Data_Already_Available optional,//required only in RFC4740 + Destination_Host_AVP destination_Host optional, //RFC4740 & TS129 229 + User_Name_AVP user_Name optional, //RFC4740 & TS129 229 + SIP_Server_URI_AVP sIP_Server_URI optional, //only in RFC4740 + set of SIP_Supported_User_Data_Type_AVP sIP_Supported_User_Data_Type optional, //only in RFC4740 + set of SIP_AOR_AVP sIP_AOR optional, //only in RFC4740 + set of Supported_Features_AVP supported_Features optional, //only in TS129 229 + set of Public_Identity_AVP public_Identity optional, //only in TS129 229 + Wildcarded_Public_Identity_AVP wildcarded_Public_Identity optional, //only in TS129 229 + Server_Name_AVP server_Name optional, //required only in TS129 229 + Server_Assignment_Type_AVP server_Assignment_Type optional, //required only in TS129 229 + User_Data_Already_Available_AVP user_Data_Already_Available optional, //required only in TS129 229 + SCSCF_Restoration_Info_AVP sCSCF_Restoration_Info optional, //only in TS129 229 + Multiple_Registration_Indication_AVP multiple_Registration_Indication optional,//only in TS129 229 + Session_Priority_AVP session_Priority optional, //only in TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 + set of Route_Record_AVP route_Record optional, //RFC4740 + set of AVP_Type aVP_Type optional //RFC4740 +// } +// with { +// variant (sIP_Supported_User_Data_Type) "fieldPresent=bytes(4, 375)" +// variant (sIP_AOR) "fieldPresent=bytes(4, 122)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record SAA_MSG{ + //Ref: TS 129 229 6.1.4. Server-Assignment-Answer (SAA:301) Command + // Ref: RFC4740 8.4. Server-Assignment-Answer (SAA:284) Command + DiameterHeader header ,// ::= < Diameter Header: 284 or 301, PXY > + Session_Id_AVP session_Id,//fixed pos. + SAA_Body_AVP sAA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 284)" + } + + type set SAA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Result_Code_AVP result_Code optional, //RFC4740 & TS129 229 + Experimental_Result_AVP experimental_Result optional, //only TS129 229 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + set of SIP_User_Data_AVP sIP_User_Data optional, //required only in RFC4740 + SIP_Accounting_Information_AVP sIP_Accounting_Information optional, //required only in RFC4740 + set of SIP_Supported_User_Data_Type_AVP sIP_Supported_User_Data_Type optional, //only in RFC4740 + User_Name_AVP user_Name optional, //RFC4740 & TS129 229 + Auth_Grace_Period_AVP auth_Grace_Period optional, //only in RFC4740 + Authorization_Lifetime_AVP authorization_Lifetime optional, //only in RFC4740 + Redirect_Host_AVP redirect_Host optional, //only in RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //only in RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //only in RFC4740 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + User_Data_AVP user_Data optional, //only TS129 229 + Charging_Information_AVP charging_Information optional, //only TS129 229 + Associated_Identities_AVP associated_Identities optional, //only TS129 229 + Loose_Route_Indication_AVP loose_Route_Indication optional, //only TS129 229 + set of SCSCF_Restoration_Info_AVP sCSCF_Restoration_Info optional, //only TS129 229 + Associated_Registered_Identities_AVP associated_Registered_Identities optional, //only TS129 229 + Server_Name_AVP server_Name optional, //only TS129 229 + Wildcarded_Public_Identity_AVP wildcarded_Public_Identity optional, //only TS129 229 + Priviledged_Sender_Indication_AVP priviledged_Sender_Indication optional, //only TS129 229 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (sIP_User_Data) "fieldPresent=bytes(4, 389)" //presence check for inline defined lists +// variant (sIP_Supported_User_Data_Type) "fieldPresent=bytes(4, 388)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record LIR_MSG{ + //Ref: TS 129 229 6.1.5. Location-Info-Request (LIR:302) Command + //Ref: RFC4740 8.5. Location-Info-Request (LIR:285) Command + DiameterHeader header ,// ::= < Diameter Header: 285 or 302, PXY > + Session_Id_AVP session_Id,//fixed pos. + LIR_Body_AVP lIR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 285)" + } + + type set LIR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Destination_Realm_AVP destination_Realm, //RFC4740 & TS129 229 + SIP_AOR_AVP sIP_AOR optional, //required only in RFC4740 + Destination_Host_AVP destination_Host optional, //RFC4740 & TS129 229 + Originating_Request_AVP originating_Request optional, //only TS129 229 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + Public_Identity_AVP public_Identity optional, //required only in TS129 229 + User_Authorization_Type_AVP user_Authorization_Type optional, //only TS129 229 + Session_Priority_AVP session_Priority optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record LIA_MSG{ + //Ref: TS 129 229 6.1.6. Location-Info-Answer (LIA:302) Command + //Ref: RFC4740 8.6. Location-Info-Answer (LIA:285) Command + DiameterHeader header ,// ::= < Diameter Header: 285 or 302, PXY > + Session_Id_AVP session_Id,//fixed pos. + LIA_Body_AVP lIA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 285)" + } + + type set LIA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Result_Code_AVP result_Code optional, //RFC4740 & TS129 229 + Experimental_Result_AVP experimental_Result optional, //only TS129 229 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + SIP_Server_URI_AVP sIP_Server_URI optional, //only in RFC4740 + SIP_Server_Capabilities_AVP sIP_Server_Capabilities optional, //only in RFC4740 + Auth_Grace_Period_AVP auth_Grace_Period optional, //only in RFC4740 + Authorization_Lifetime_AVP authorization_Lifetime optional, //only in RFC4740 + Redirect_Host_AVP redirect_Host optional, //only in RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //only in RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //only in RFC4740 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + Server_Name_AVP server_Name optional, //only TS129 229 + Server_Capabilities_AVP server_Capabilities optional, //only TS129 229 + Wildcarded_Public_Identity_AVP wildcarded_Public_Identity optional, //only TS129 229 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record MAR_MSG{ + //Ref: TS 129 229 6.1.7. Multimedia-Auth-Request (MAR:303) Command + //Ref: RFC4740 8.7. Multimedia-Auth-Request (MAR:286) Command + DiameterHeader header ,// ::= < Diameter Header: 286 or 303, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + MAR_Body_AVP mAR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 286)" + } + + type set MAR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Destination_Realm_AVP destination_Realm, //RFC4740 & TS129 229 + SIP_AOR_AVP sIP_AOR optional, //required in RFC4740 + SIP_Method_AVP sIP_Method optional, //required in RFC4740 + Destination_Host_AVP destination_Host optional, //RFC4740 & TS129 229 + User_Name_AVP user_Name optional, //RFC4740 & required in TS129 229 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + Public_Identity_AVP public_Identity optional, //required only in TS129 229 + SIP_Server_URI_AVP sIP_Server_URI optional, //only in RFC4740 + SIP_Number_Auth_Items_AVP sIP_Number_Auth_Items optional, //RFC4740 & required in TS129 229 + SIP_Auth_Data_Item_AVP sIP_Auth_Data_Item optional, //required in TS129 229 + Server_Name_AVP server_Name optional, //only TS129 229 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + + type record MAA_MSG{ + //Ref: TS 129 229 6.1.8. Multimedia-Auth-Answer (MAA:303) Command + //Ref: RFC4740 8.8. Multimedia-Auth-Answer (MAA:286) Command + DiameterHeader header ,// ::= < Diameter Header: 286 or 303, PXY > + Session_Id_AVP session_Id,//fixed pos. + MAA_Body_AVP mAA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 286)" + } + + type set MAA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Result_Code_AVP result_Code optional, //RFC4740 & TS129 229 + Experimental_Result_AVP experimental_Result optional, //only TS129 229 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + User_Name_AVP user_Name optional, //RFC4740 & TS129 229 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + Public_Identity_AVP public_Identity optional, //required only in TS129 229 + SIP_AOR_AVP sIP_AOR optional, //only in RFC4740 + SIP_Number_Auth_Items_AVP sIP_Number_Auth_Items optional, //RFC4740 & TS129 229 + set of SIP_Auth_Data_Item_AVP sIP_Auth_Data_Item optional, //TS129 229 + Auth_Grace_Period_AVP auth_Grace_Period optional, //only in RFC4740 + Authorization_Lifetime_AVP authorization_Lifetime optional, //only in RFC4740 + Redirect_Host_AVP redirect_Host optional, //only in RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //only in RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //only in RFC4740 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (sIP_Auth_Data_Item) "fieldPresent=bytes(4, 376)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record RTR_MSG{ + //Ref: TS 129 229 6.1.9. Registration-Termination-Request (RTR:304) Command + //Ref: RFC4740 8.9. Registration-Termination-Request (RTR:287) Command + DiameterHeader header ,// ::= < Diameter Header: 287 or 304, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + RTR_Body_AVP rTR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 287)" + } + + type set RTR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Destination_Host_AVP destination_Host, //RFC4740 & TS129 229 + Destination_Realm_AVP destination_Realm, //RFC4740 & TS129 229 + SIP_Deregistration_Reason_AVP sIP_Deregistration_Reason optional, //required only in RFC4740 + User_Name_AVP user_Name optional, //RFC4740 & required in TS129 229 + set of SIP_AOR_AVP sIP_AOR optional, //only in RFC4740 + Associated_Identities_AVP associated_Identities optional, //only TS129 229 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + set of Public_Identity_AVP public_Identity optional, //only TS129 229 + Deregistration_Reason_AVP deregistration_Reason optional, //required only in TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (sIP_AOR) "fieldPresent=bytes(4, 122)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record RTA_MSG{ + //Ref: TS 129 229 6.1.10. Registration-Termination-Answer (RTA:304) Command + //Ref: RFC4740 8.10. Registration-Termination-Answer (RTA:287) Command + DiameterHeader header ,// ::= < Diameter Header: 287 or 304, PXY > + Session_Id_AVP session_Id,//fixed pos. + RTA_Body_AVP rTA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 287)" + } + + type set RTA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Result_Code_AVP result_Code optional, //RFC4740 & TS129 229 + Experimental_Result_AVP experimental_Result optional, //only TS129 229 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Authorization_Lifetime_AVP authorization_Lifetime optional, //only in RFC4740 + Auth_Grace_Period_AVP auth_Grace_Period optional, //only in RFC4740 + Redirect_Host_AVP redirect_Host optional, //only in RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //only in RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //only in RFC4740 + Associated_Identities_AVP associated_Identities optional, //only TS129 229 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + set of Identity_with_Emergency_Registration_AVP identity_with_Emergency_Registration optional, //only TS129 229 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record PPR_MSG{ + //Ref: TS 129 229 6.1.11. Push-Profile-Request (PPR:305) Command + //Ref: RFC4740 8.11. Push-Profile-Request (PPR:288) Command + DiameterHeader header ,// ::= < Diameter Header: 288 or 305, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + PPR_Body_AVP pPR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 288)" + } + + type set PPR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Destination_Host_AVP destination_Host, //RFC4740 & TS129 229 + Destination_Realm_AVP destination_Realm, //RFC4740 & TS129 229 + User_Name_AVP user_Name , //RFC4740 & TS129 229 + set of SIP_User_Data_AVP sIP_User_Data optional, //only in RFC4740 + SIP_Accounting_Information_AVP sIP_Accounting_Information optional, //only in RFC4740 + Authorization_Lifetime_AVP authorization_Lifetime optional, //only in RFC4740 + Auth_Grace_Period_AVP auth_Grace_Period optional, //only in RFC4740 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + User_Data_AVP user_Data optional, //only TS129 229 + Charging_Information_AVP charging_Information optional, //only TS129 229 + SIP_Auth_Data_Item_AVP sIP_Auth_Data_Item optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (sIP_User_Data) "fieldPresent=bytes(4, 289)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record PPA_MSG{ + //Ref: TS 129 229 6.1.12. Push-Profile-Answer (PPA: 305) Command + //Ref: RFC4740 8.12. Push-Profile-Answer (PPA: 288) Command + DiameterHeader header ,// ::= < Diameter Header: 288 or 305, PXY > + Session_Id_AVP session_Id,//fixed pos. + PPA_Body_AVP pPA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 288)" + } + + type set PPA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional,//required only in TS129 229 + Auth_Application_Id_AVP auth_Application_Id optional, //required only in RFC4740 + Result_Code_AVP result_Code optional, //RFC4740 & TS129 229 + Experimental_Result_AVP experimental_Result optional, //only TS129 229 + Auth_Session_State_AVP auth_Session_State, //RFC4740 & TS129 229 + Origin_Host_AVP origin_Host, //RFC4740 & TS129 229 + Origin_Realm_AVP origin_Realm, //RFC4740 & TS129 229 + Redirect_Host_AVP redirect_Host optional, //only in RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //only in RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //only in RFC4740 + set of Supported_Features_AVP supported_Features optional, //only TS129 229 + set of Failed_AVP failed optional, //only TS129 229 + set of Proxy_Info_AVP proxy_Info optional, //RFC4740 & TS129 229 + set of Route_Record_AVP route_Record optional, //RFC4740 & TS129 229 + set of AVP_Type aVP_Type optional //RFC4740 & TS129 229 +// } +// with { +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + }// End of group RFC4740 + + group Sh_Intf{ + /* Codes on Sh */ + type record UDR_MSG{ + // Ref: 3GPP TS 29.329 6.1.1 User-Data-Request (UDR) Command + DiameterHeader header ,//< User-Data-Request> ::= < Diameter Header: 306, REQ, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + UDR_Body_AVP uDR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 306)" + } + + type set UDR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + User_Identity_AVP user_Identity optional,//requi. but for testing set to optional TP_Sh_HSS_MS_01 + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + Server_Name_AVP server_Name optional, + set of Service_Indication_AVP service_Indication optional, + set of Data_Reference_AVP data_Reference,//requi. + set of Identity_Set_AVP identity_Set optional, + Requested_Domain_AVP requested_Domain optional, + Current_Location_AVP current_Location optional, + set of DSAI_Tag_AVP dSAI_Tag optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (service_Indication) "fieldPresent=bytes(4, 704)" +// variant (data_Reference) "fieldPresent=bytes(4, 703)" +// variant (identity_Set) "fieldPresent=bytes(4, 708)" +// variant (dSAI_Tag) "fieldPresent=bytes(4, 711)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record UDA_MSG{ + // Ref: 3GPP TS 29.329 6.1.2 User-Data-Answer (UDA) Command + DiameterHeader header ,//< Diameter Header: 306, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + UDA_Body_AVP uDA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 306)" + } + + type set UDA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + User_Data_AVP user_Data optional, + Redirect_Host_AVP redirect_Host optional, //RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC4740 + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record PUR_MSG{ + // Ref: 3GPP TS 29.329 6.1.3 Profile-Update-Request (PUR) Command + DiameterHeader header ,//< Diameter Header: 307, REQ, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + PUR_Body_AVP pUR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 307)" + } + + type set PUR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + User_Identity_AVP user_Identity,//requi. + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + set of Data_Reference_AVP data_Reference, //ETSI TS 129 329 + User_Data_AVP user_Data,//Requi. + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record PUA_MSG{ + // Ref: 3GPP TS 29.329 6.1.4 Profile-Update-Answer (PUA) Command + DiameterHeader header ,//< Diameter Header: 307, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + PUA_Body_AVP pUA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 307)" + } + + type set PUA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + Repository_Data_ID_AVP repository_Data_Id optional, + Data_Reference_AVP data_Reference optional, //ETSI TS 129 329 + set of Supported_Features_AVP supported_Features optional, + Redirect_Host_AVP redirect_Host optional, //RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC4740 + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record SNR_MSG{ + // Ref: 3GPP TS 29.329 6.1.5 Subscribe-Notifications-Request (SNR) Command + DiameterHeader header ,//< Diameter Header: 308, REQ, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + SNR_Body_AVP sNR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 308)" + } + + type set SNR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + User_Identity_AVP user_Identity,//requi. + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + set of Service_Indication_AVP service_Indication optional, + Send_Data_Indication_AVP send_Data_Indication optional, + Server_Name_AVP server_Name optional, + Subs_Req_Type_AVP subs_Req_Type, + set of Data_Reference_AVP data_Reference, + set of Identity_Set_AVP identity_Set optional, + Expiry_Time_AVP expiry_Time optional, + set of DSAI_Tag_AVP dSAI_Tag optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional, + User_Name_AVP user_Name optional //RFC4740 & required in TS129 229 +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (service_Indication) "fieldPresent=bytes(4, 704)" +// variant (data_Reference) "fieldPresent=bytes(4, 703)" +// variant (identity_Set) "fieldPresent=bytes(4, 708)" +// variant (dSAI_Tag) "fieldPresent=bytes(4, 711)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record SNA_MSG{ + // Ref: 3GPP TS 29.329 6.1.6 Subscribe-Notifications-Answer (SNA) Command + DiameterHeader header ,//< Diameter Header: 308, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + SNA_Body_AVP sNA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 308)" + } + + type set SNA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Auth_Session_State_AVP auth_Session_State,//requi. + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + set of Supported_Features_AVP supported_Features optional, + User_Data_AVP user_Data optional, + Expiry_Time_AVP expiry_Time optional, + Redirect_Host_AVP redirect_Host optional, //RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC4740 + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record PNR_MSG{ + // Ref: 3GPP TS 29.329 6.1.7 Push-Notification-Request (PNR) Command + DiameterHeader header ,//< Diameter Header: 309, REQ, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + PNR_Body_AVP pNR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 309)" + } + + type set PNR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + User_Identity_AVP user_Identity,//requi. + Wildcarded_PSI_AVP wildcarded_PSI optional, + Wildcarded_IMPU_AVP wildcarded_IMPU optional, + User_Data_AVP user_Data,//Requi. + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record PNA_MSG{ + // Ref: 3GPP TS 29.329 6.1.8 Push-Notifications-Answer (PNA) Command + DiameterHeader header ,//< Diameter Header: 309, PXY, 16777217 > + Session_Id_AVP session_Id,//fixed pos. + PNA_Body_AVP pNA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 309)" + } + + type set PNA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + Redirect_Host_AVP redirect_Host optional, //RFC4740 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC4740 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC4740 + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + } // End of group Sh_Intf + + group RFC4006{ + /* Codes on Ro and Rf interface */ + //ACR ACA message is defined in RFC3588 group + + + type record CCR_MSG{ + // Ref: RFC4006 3.1. Credit-Control-Request (CCR) Command + DiameterHeader header ,//< Diameter Header: 272, REQ, PXY> + Session_Id_AVP session_Id,//fixed pos. //RFC4006 & TS129 212 + CCR_Body_AVP cCR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 272)" + } + + type set CCR_Body_AVP { + Origin_Host_AVP origin_Host,//requi. //RFC4006 & TS129 212 & TS129 215 + Origin_Realm_AVP origin_Realm,//requi. //RFC4006 & TS129 212 & TS129 215 + Destination_Realm_AVP destination_Realm,//requi. //RFC4006 & TS129 212 & TS129 215 + Auth_Application_Id_AVP auth_Application_Id, //RFC4006 & TS129 212 & TS129 215 + Service_Context_Id_AVP service_Context_Id optional, //RFC4006 + CC_Request_Type_AVP cC_Request_Type, //RFC4006 & TS129 212 & TS129 215 + CC_Request_Number_AVP cC_Request_Number, //RFC4006 & TS129 212 & TS129 215 + Destination_Host_AVP destination_Host optional, //RFC4006 & TS129 212 & TS129 215 + User_Name_AVP user_Name optional, //RFC4006 + CC_Sub_Session_Id_AVP cC_Sub_Session_Id optional, //RFC4006 + Acct_Multi_Session_Id_AVP acct_Multi_Session_Id optional, //RFC4006 + Origin_State_Id_AVP origin_State_Id optional, //RFC4006 & TS129 212 & TS129 215 + Event_Timestamp_AVP event_Timestamp optional, //RFC4006 + set of Subscription_Id_AVP subscription_Id optional, //RFC4006 & TS129 212 & TS129 215 + Service_Identifier_AVP service_Identifier optional, //RFC4006 + Termination_Cause_AVP termination_Cause optional, //RFC4006 & TS129 212 & TS129 215 + Requested_Service_Unit_AVP requested_Service_Unit optional, //RFC4006 + Requested_Action_AVP requested_Action optional, //RFC4006 + set of Used_Service_Unit_AVP used_Service_Unit optional, //RFC4006 + AoC_Request_Type_AVP aoc_Request_Type_AVP optional, //TS132 299 only + Multiple_Services_Indicator_AVP multiple_Services_Indicator optional, //RFC4006 + set of Multiple_Services_Credit_Control_AVP multiple_Services_Credit_Control optional, //RFC4006 + set of Service_Parameter_Info_AVP service_Parameter_Info optional, //RFC4006 + CC_Correlation_Id_AVP cC_Correlation_Id optional, //RFC4006 + set of Supported_Features_AVP supported_Features optional, //TS129 212 & TS129 215 + Network_Request_Support_AVP network_Request_Support optional, //TS129 212 & TS129 215 + set of Packet_Filter_Information_AVP packet_Filter_Information optional,//TS129 212 & TS129 215 + Packet_Filter_Operation_AVP packet_Filter_Operation optional, //TS129 212 & TS129 215 + Bearer_Identifier_AVP bearer_Identifier optional, //TS129 212 only + Bearer_Operation_AVP bearer_Operation optional, //TS129 212 only + Framed_IP_Address_AVP framed_IP_Address optional, //TS129 212 & TS129 215 + Framed_IPv6_Prefix_AVP framed_IPv6_Prefix optional, //TS129 212 & TS129 215 + IP_CAN_Type_AVP iP_CAN_Type optional, //TS129 212 & TS129 215 + ThreeGPP_RAT_Type_AVP threeGPP_RAT_Type optional, //TS129 212 only + RAT_Type_AVP rat_Type optional, //TS129 212 & TS129 215 + QoS_Information_AVP qoS_Information optional, //TS129 212 & TS129 215 + QoS_Negotiation_AVP qoS_Negotiation optional, //TS129 212 & TS129 215 + QoS_Upgrade_AVP qoS_Upgrade optional, //TS129 212 & TS129 215 + Default_EPS_Bearer_QoS_AVP default_EPS_Bearer_QoS optional, //TS129 212 only + record length (0..2) of AN_GW_Address_AVP aN_GW_Address optional, //TS129 212 & TS129 215 + ThreeGPP_SGSN_MCC_MNC_AVP threeGPP_SGSN_MCC_MNC optional, //TS129 212 & TS129 215 + ThreeGPP_SGSN_Address_AVP threeGPP_SGSN_Address optional, //TS129 212 & TS129 215 + ThreeGPP_SGSN_IPv6_Address_AVP threeGPP_SGSN_IPv6_Address optional, //TS129 212 & TS129 215 + RAI_AVP rAI optional, //TS129 212 & TS129 215 + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, //TS129 212 & TS129 215 + ThreeGPP_MS_TimeZone_AVP threeGPP_MS_TimeZone optional, //TS129 212 & TS129 215 + Called_Station_Id_AVP called_Station_Id optional, //TS129 212 only + PDN_Connection_ID_AVP pDN_Connection_ID optional, //TS129 212 only + Bearer_Usage_AVP bearer_Usage optional, //TS129 212 only + Online_AVP online optional, //TS129 212 only + Offline_AVP offline optional, //TS129 212 only + set of TFT_Packet_Filter_Information_AVP tFT_Packet_Filter_Information optional, //TS129 212 only + set of Charging_Rule_Report_AVP charging_Rule_Report optional, //TS129 212 only + set of Event_Trigger_AVP event_Trigger optional, //TS129 212 & TS129 215 + Event_Report_Indication_AVP event_Report_Indication optional, //TS129 212 only + Access_Network_Charging_Address_AVP access_Network_Charging_Address optional, //TS129 212 only + set of Access_Network_Charging_Identifier_Gx_AVP access_Network_Charging_Identifier_Gx optional,//TS129 212 only + set of CoA_Information_AVP coA_Information optional, //TS129 212 only + set of Usage_Monitoring_Information_AVP usage_Monitoring_Information optional, //TS129 212 only + Routing_Rule_Install_AVP routing_Rule_Install optional, //TS129 212 only + Routing_Rule_Remove_AVP routing_Rule_Remove optional, //TS129 212 only + Maximum_Bandwidth_AVP maximum_Bandwidth optional, //TS129 212 only + Logical_Access_ID_AVP logical_Access_ID optional, //TS129 212 only + Physical_Access_ID_AVP physical_Access_ID optional, //TS129 212 only + Session_Linking_Indicator_AVP session_Linking_Indicator optional,//Gxx TS129 212 only + set of QoS_Rule_Report_AVP qoS_Rule_Report optional, //S9 (TS129 215) & Gxx (TS129 212) + set of Subses_Enforcement_Info_AVP subsesion_Enforcement_Info optional, //S9 (TS129 215) only + ThreeGPP2_BSID_AVP threeGPP2_BSID optional, //S9 (TS129 215) & Gxx (TS129 212) + Multiple_BBERF_Action_AVP multiple_BBERF_Action optional, //S9 (TS129 215) only + User_CSG_Information_AVP user_CSG_Information optional, //S9 (TS129 215) & Gxx (TS129 212) + User_Equipment_Info_AVP user_Equipment_Info optional, //RFC4006 & TS129 212 & TS129 215 + set of Proxy_Info_AVP proxy_Info optional, //RFC4006 & TS129 212 & TS129 215 + set of Route_Record_AVP route_Record optional, //RFC4006 & TS129 212 & TS129 215 + Service_Information_AVP service_Information optional, //TS132 299 only + set of AVP_Type aVP_Type optional //RFC4006 & TS129 212 & TS129 215 +// } +// with { +// variant (subscription_Id) "fieldPresent=bytes(4, 443)" +// variant (used_Service_Unit) "fieldPresent=bytes(4, 446)" +// variant (multiple_Services_Credit_Control) "fieldPresent=bytes(4, 456)" +// variant (service_Parameter_Info) "fieldPresent=bytes(4, 440)" +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (packet_Filter_Information) "fieldPresent=bytes(4, 1061)" +// variant (aN_GW_Address) "fieldPresent=bytes(4, 1050)" +// variant (tFT_Packet_Filter_Information) "fieldPresent=bytes(4, 1013)" +// variant (charging_Rule_Report) "fieldPresent=bytes(4, 1018)" +// variant (event_Trigger) "fieldPresent=bytes(4, 1006)" +// variant (access_Network_Charging_Identifier_Gx) "fieldPresent=bytes(4, 1022)" +// variant (coA_Information) "fieldPresent=bytes(4, 1039)" +// variant (usage_Monitoring_Information) "fieldPresent=bytes(4, 1067)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record CCA_MSG{ + // Ref: RFC4006 3.2. Credit-Control-Answer (CCA) Command + DiameterHeader header ,//< Diameter Header: 272, PXY> + Session_Id_AVP session_Id,//fixed pos. //RFC4006 & TS129 212 + CCA_Body_AVP cCA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 272)" + } + + type set CCA_Body_AVP { + Result_Code_AVP result_Code optional, //RFC4006 & TS129 212 & TS129 215 + Origin_Host_AVP origin_Host,//requi. //RFC4006 & TS129 212 & TS129 215 + Origin_Realm_AVP origin_Realm,//requi. //RFC4006 & TS129 212 & TS129 215 + Auth_Application_Id_AVP auth_Application_Id, //RFC4006 & TS129 212 & TS129 215 + CC_Request_Type_AVP cC_Request_Type, //RFC4006 & TS129 212 & TS129 215 + CC_Request_Number_AVP cC_Request_Number, //RFC4006 & TS129 212 & TS129 215 + User_Name_AVP user_Name optional, //RFC4006 + CC_Session_Failover_AVP cC_Session_Failover optional, //RFC4006 + CC_Sub_Session_Id_AVP cC_Sub_Session_Id optional, //RFC4006 + Acct_Multi_Session_Id_AVP acct_Multi_Session_Id optional, //RFC4006 + Origin_State_Id_AVP origin_State_Id optional, //RFC4006 & TS129 212 & TS129 215 + Event_Timestamp_AVP event_Timestamp optional, //RFC4006 + Granted_Service_Unit_AVP granted_Service_Unit optional, //RFC4006 + set of Multiple_Services_Credit_Control_AVP multiple_Services_Credit_Control optional, //RFC4006 + Cost_Information_AVP cost_Information optional, //RFC4006 + Final_Unit_Indication_AVP final_Unit_Indication optional, //RFC4006 + Check_Balance_Result_AVP check_Balance_Result optional, //RFC4006 + Low_Balance_Indication_AVP low_Balance_Indication optional, //TS132 299 only + Remaining_Balance_AVP remaining_Balance optional, //TS132 299 only + Credit_Control_Failure_Handling_AVP credit_Control_Failure_Handling optional, //RFC4006 + Direct_Debiting_Failure_Handling_AVP direct_Debiting_Failure_Handling optional, //RFC4006 + Validity_Time_AVP validity_Time optional, //RFC4006 + set of Redirect_Host_AVP redirect_Host optional, //RFC4006 & TS129 212 + Redirect_Host_Usage_AVP redirect_Host_Usage optional, //RFC4006 & TS129 212 + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, //RFC4006 & TS129 212 + Experimental_Result_AVP experimental_Result optional, //TS129 212 & TS129 215 + set of Supported_Features_AVP supported_Features optional, //TS129 212 & TS129 215 + Bearer_Control_Mode_AVP bearer_Control_Mode optional, //TS129 212 & TS129 215 + set of Event_Trigger_AVP event_Trigger optional, //TS129 212 & TS129 215 + set of Charging_Rule_Remove_AVP charging_Rule_Remove optional, //TS129 212 only + set of Charging_Rule_Install_AVP charging_Rule_Install optional, //TS129 212 only + Charging_Information_AVP charging_Information optional, //TS129 212 & TS129 215 + Online_AVP online optional, //TS129 212 only + Offline_AVP offline optional, //TS129 212 only + set of QoS_Information_AVP qoS_Information optional, //TS129 212 & TS129 215 + Revalidation_Time_AVP revalidation_Time optional, //TS129 212 only + Default_EPS_Bearer_QoS_AVP default_EPS_Bearer_QoS optional, //TS129 212 only + Bearer_Usage_AVP bearer_Usage optional, //TS129 212 only + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, //TS129 212 only + set of Usage_Monitoring_Information_AVP usage_Monitoring_Information optional, //TS129 212 only + set of CSG_Information_Reporting_AVP cSG_Information_Reporting optional,//TS129 212 & TS129 215 + User_CSG_Information_AVP user_CSG_Information optional, //TS129 212 only + Error_Message_AVP error_Message optional, //TS129 212 & TS129 215 + Error_Reporting_Host_AVP error_Reporting_Host optional, //TS129 212 & TS129 215 + set of QoS_Rule_Install_AVP qoS_Rule_Install optional, //S9 (TS129 215) only + set of QoS_Rule_Remove_AVP qoS_Rule_Remove optional, //S9 (TS129 215) only + set of Subses_Decision_Info_AVP subsession_Decision_Info optional, //S9 (TS129 215) only + set length (0..2) of AN_GW_Addr_AVP aN_GW_Address optional, //S9 (TS129 215) only + set of Proxy_Info_AVP proxy_Info optional, //RFC4006 & TS129 212 & TS129 215 + set of Route_Record_AVP route_Record optional, //RFC4006 & TS129 212 & TS129 215 + set of Failed_AVP failed optional, //RFC4006 & TS129 212 & TS129 215 + Service_Information_AVP service_Information optional, //TS132 299 only + set of AVP_Type aVP_Type optional //RFC4006 & TS129 212 & TS129 215 +// } +// with { +// variant (multiple_Services_Credit_Control) "fieldPresent=bytes(4, 456)" +// variant (redirect_Host) "fieldPresent=bytes(4, 292)" +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (event_Trigger) "fieldPresent=bytes(4, 1006)" +// variant (charging_Rule_Remove) "fieldPresent=bytes(4, 1002)" +// variant (charging_Rule_Install) "fieldPresent=bytes(4, 1001)" +// variant (qoS_Information) "fieldPresent=bytes(4, 1016)" +// variant (usage_Monitoring_Information) "fieldPresent=bytes(4, 1067)" +// variant (cSG_Information_Reporting) "fieldPresent=bytes(4, 1071)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + } // End of group RFC4006 + + group Rx_Intf{ + + type record AAR_MSG{ + //Ref: ETSI TS 129 214 5.6.1 -Request + DiameterHeader header ,// ::= < Diameter Header: 265, REQ, PXY > + Session_Id_AVP session_Id,//fixed pos. + AAR_Body_AVP aAR_Body +// } +// with { +// variant "present=bits(32,1,1) && bytes(5,3, 265)" + } + + type set AAR_Body_AVP { + //DRMP dRMP optional, //ETSI TS 129 214 V15.5 from RFC 7944 + Auth_Application_Id_AVP auth_Application_Id, + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Destination_Realm_AVP destination_Realm, + Destination_Host_AVP destination_Host optional, + IP_Domain_AVP iP_Domain optional, //ETSI TS 129 214 V15.5 + AF_Application_Identifier_AVP af_Application_Id optional,//present in ETSI TS 129 214 p.5.6.7 + set of Media_Component_Description_AVP media_Component_Description optional, + Service_Info_Status_AVP service_Info_Status optional, + AF_Charging_Identifier_AVP af_Charging_Identifier optional, + SIP_Forking_Indication_AVP sip_Forking_Indication optional, + set of Specific_Action_AVP specific_Action optional, + set of Subscription_Id_AVP subscription_Id optional, + //OC_Supported_Features_AVP oC_Supported_Features optional, //ETSI TS 129 214 V15.5 from RFC7583 + set of Supported_Features_AVP supported_Features optional, + Reservation_Priority_AVP reservation_Priority optional, + Framed_IP_Address_AVP framed_IP_Address optional, + Framed_IPv6_Prefix_AVP framed_IPv6_Address optional, + Called_Station_Id_AVP called_Station_Id optional, + Service_URN_AVP service_URN optional, + Sponsored_Connectivity_Data_AVP sponsored_Connectivity_Data optional, + MPS_Identifier_AVP mps_Identifier optional, + GCS_Identifier_AVP gcs_Identifier optional, //ETSI TS 129 214 V15.5 + MCPTT_Identifier_AVP mcptt_Identifier optional, //ETSI TS 129 214 V15.5 + MCVideo_Identifier_AVP mCVideo_Identifier optional, //ETSI TS 129 214 V15.5 + IMS_Content_Identifier_AVP iMS_Content_Identifier optional, //ETSI TS 129 214 V15.5 + IMS_Content_Type_AVP iMS_Content_Type optional, //ETSI TS 129 214 V15.5 + Rx_Request_Type_AVP rx_Request_Type optional, //ETSI TS 129 214 V15.5 + set of Required_Access_Info_AVP required_Access_Info optional, //ETSI TS 129 214 V15.5 + AF_Requested_Data_AVP aF_Requested_Data optional, //ETSI TS 129 214 V15.5 + //Reference_Id_AVP reference_Id optional, //ETSI TS 129 214 V15.5 from TS 129 154 + Pre_emption_Control_Info_AVP pre_emption_Control_Info optional, //ETSI TS 129 214 V15.5 + User_Name_AVP user_Name optional, + Origin_State_Id_AVP origin_State_Id optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant (media_Component_Description) "fieldPresent=bytes(4, 517)" +// variant (specific_Action) "fieldPresent=bytes(4, 513)" +// variant (subscription_Id) "fieldPresent=bytes(4, 443)" +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (route_Record) "fieldPresent=bytes(4, 282)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + type record AAA_MSG{ + //Ref: ETSI TS 129 214 5.6.2 -> Answer + DiameterHeader header,// ::= < Diameter Header: 265, PXY > + Session_Id_AVP session_Id,//fixed pos. + AAA_Body_AVP aAA_Body +// } +// with { +// variant "present=bits(32,1,0) && bytes(5,3, 265)" + } + + type set AAA_Body_AVP { + //DRMP dRMP optional, //ETSI TS 129 214 V15.5 from RFC 7944 + Auth_Application_Id_AVP auth_Application_Id, + Origin_Host_AVP origin_Host,//required + Origin_Realm_AVP origin_Realm, + Result_Code_AVP result_Code optional,//required + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State optional, //ETSI TS 129 214 V15.5 + set of Access_Network_Charging_Identifier_AVP access_network_charging_Identifier optional, + Access_Network_Charging_Address_AVP access_network_charging_address optional, + Acceptable_Service_Info_AVP acceptable_service_info optional, + set length (0..2) of AN_GW_Addr_AVP aN_GW_Address optional, //ETSI TS 129 214 V15.5 + //AN_Trusted_AVP aN_Trusted optional, //ETSI TS 129 214 V15.5 from TS 129 273 + Service_Authorization_Info_AVP service_Authorization_Info optional, //ETSI TS 129 214 V15.5 + IP_CAN_Type_AVP ip_Can_Type optional, + //NetLoc_Access_Support_AVP netLoc_Access_Support optional, //ETSI TS 129 214 V15.5 from TS 129 212 + RAT_Type_AVP rat_Type optional, + set of Flows_AVP flows optional, //ETSI TS 129 214 V15.5 + //OC_Supported_Features_AVP oC_Supported_Features optional, //ETSI TS 129 214 V15.5 from RFC7683 + //OC_OLR_AVP oC_OLR optional, //ETSI TS 129 214 V15.5 from RFC7683 + set of Supported_Features_AVP supported_Features optional, + set of Subscription_Id_AVP subscription_Id_AVP optional, //ETSI TS 129 214 V15.5 + User_Equipment_Info_AVP user_Equipment_Info optional, //ETSI TS 129 214 V15.5 + ThreeGPP_SGSN_MCC_MNC_AVP threeGPP_SGSN_MCC_MNC optional, //ETSI TS 129 214 V15.5 + set of Class_AVP class_ optional, + User_Name_AVP user_Name optional, + Error_Message_AVP error_Message optional, + Error_Reporting_Host_AVP error_Reporting_Host optional, + Failed_AVP failed optional, + Retry_Interval_AVP retry_Interval optional, //ETSI TS 129 214 V15.5 + Origin_State_Id_AVP origin_State_Id optional, + set of Redirect_Host_AVP redirect_Host optional, + Redirect_Host_Usage_AVP redirect_Host_Usage optional, + Redirect_Max_Cache_Time_AVP redirect_Max_Cache_Time optional, + set of Proxy_Info_AVP proxy_Info optional, + //set of Load_AVP load optional, //ETSI TS 129 214 V15.5 + set of AVP_Type aVP_Type optional +// } +// with { +// variant (access_network_charging_Identifier) "fieldPresent=bytes(4, 502)" +// variant (supported_Features) "fieldPresent=bytes(4, 628)" +// variant (class) "fieldPresent=bytes(4, 25)" +// variant (failed) "fieldPresent=bytes(4, 279)" +// variant (redirect_Host) "fieldPresent=bytes(4, 292)" +// variant (proxy_Info) "fieldPresent=bytes(4, 284)" +// variant (aVP_Type) "fieldPresent=!isEOF" + } + + } // End of group Rx + + group S6a_Intf { + // Update-Location-Request (ULR) Command - Ref: TS 129 272 7.2.3 + type record ULR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 316, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + ULR_Body_AVP uLR_Body + } + + type set of Supported_Features_AVP Supported_Features_AVPs; + + type set ULR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm, + User_Name_AVP user_Name, + Supported_Features_AVPs supported_Features optional, + Terminal_Information_AVP terminal_Information optional, + RAT_Type_AVP rat_Type, + ULR_Flags_AVP ulr_Flags, + UE_SRVCC_Capability_AVP ue_SRVCC_Capability optional, + Visited_PLMN_Id_AVP visited_PLMN_Id, + SGSN_Number_AVP sgsn_Number optional, + Homogeneous_Support_AVP homogeneous_Support optional, + GMLC_Address_AVP gmlc_Address optional, + Active_APN_AVP active_APN optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Update-Location-Answer (ULA) Command - Ref: TS 129 272 7.2.4 + type record ULA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 316, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + ULA_Body_AVP uLA_Body + } + type set ULA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Error_Diagnostic_AVP error_Diagnostic optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + set of Supported_Features_AVP supported_Features optional, + ULA_Flags_AVP ula_Flags optional, + Subscription_Data_AVP subscription_Data optional, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Authentication-Information-Request (AIR) Command - Ref: TS 129 272 7.2.5 + type record AIR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 318, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + AIR_Body_AVP aIR_Body + } + type set AIR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm, + User_Name_AVP user_Name, + set of Supported_Features_AVP supported_Features optional, + Req_EUTRAN_Auth_Info_AVP req_EUTRAN_Auth_Info optional, + Req_UTRAN_GERAN_Auth_Info_AVP req_UTRAN_GERAN_Auth_Info optional, + Visited_PLMN_Id_AVP visited_PLMN_Id, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Authentication-Information-Answer (AIA) Command - Ref: TS 129 272 7.2.6 + type record AIA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 318, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + AIA_Body_AVP aIA_Body + } + type set AIA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Error_Diagnostic_AVP error_Diagnostic optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + set of Supported_Features_AVP supported_Features optional, + Authentication_Info_AVP authentication_Info optional, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Cancel-Location-Request (CLR) Command - Ref: TS 129 272 7.2.7 + type record CLR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 317, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + CLR_Body_AVP cLR_Body + } + type set CLR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host, + Destination_Realm_AVP destination_Realm, + User_Name_AVP user_Name, + set of Supported_Features_AVP supported_Features optional, + Cancellation_Type_AVP cancellation_Type, + CLR_Flags_AVP cLR_Flags optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Cancel-Location-Answer (CLA) Command - Ref: TS 129 272 7.2.8 + type record CLA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 317, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + CLA_Body_AVP cLA_Body + } + type set CLA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + set of Supported_Features_AVP supported_Features optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Insert-Subscriber-Data-Request (IDR) Command - Ref: TS 129 272 7.2.9 + type record IDR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 319, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + IDR_Body_AVP iDR_Body + } + type set IDR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host, + Destination_Realm_AVP destination_Realm, + User_Name_AVP user_Name, + set of Supported_Features_AVP supported_Features optional, + Subscription_Data_AVP subscription_Data, + IDR_Flags_AVP iDR_Flags optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Insert-Subscriber-Data-Answer (IDA) Command - Ref: TS 129 272 7.2.10 + type record IDA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 319, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + IDA_Body_AVP iDA_Body + } + type set IDA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + set of Supported_Features_AVP supported_Features optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + IMS_Voice_PS_Sessions_Support_AVP iMS_Voice_PS_Sessions_Support optional, + Last_UE_Activity_Time_AVP last_UE_Activity_Time_AVP optional, + RAT_Type_AVP rat_Type optional, + IDA_Flags_AVP iDA_Flags optional, + EPS_User_State_AVP ePS_User_State optional, + EPS_Location_Information_AVP ePS_Location_Information optional, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Delete-Subscriber-Data-Request (DSR) Command - Ref: TS 129 272 7.2.11 + type record DSR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 320, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + DSR_Body_AVP dSR_Body + } + type set DSR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host, + Destination_Realm_AVP destination_Realm, + User_Name_AVP user_Name, + set of Supported_Features_AVP supported_Features optional, + DSR_Flags_AVP dSR_Flags, + set of Context_Identifier_AVP context_Identifier optional, + Trace_Reference_AVP trace_Reference optional, + set of TS_Code_AVP tS_Code optional, + set of SS_Code_AVP sS_Code optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Delete-Subscriber-Data-Answer (DSA) Command - Ref: TS 129 272 7.2.12 + type record DSA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 320, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + DSA_Body_AVP dSA_Body + } + type set DSA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + set of Supported_Features_AVP supported_Features optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Error_Diagnostic_AVP error_Diagnostic optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + DSA_Flags_AVP dSA_Flags optional, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Purge-UE-Request (PUR) Command - Ref: TS 129 272 7.2.13 + type record PUER_MSG { + DiameterHeader header, + // ::= < Diameter Header: 321, REQ, PXY, 16777251 > + Session_Id_AVP session_Id, + // + PUER_Body_AVP pUER_Body + } + + type set PUER_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm,//requi. + set of Supported_Features_AVP supported_Features optional, + User_Name_AVP user_Name,//Requi. + PUER_Flags_AVP pUER_Flags optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Purge-UE-Answer (PUA) Command - Ref: TS 129 272 7.2.14 + type record PUEA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 321, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + PUEA_Body_AVP pUEA_Body + } + + type set PUEA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State,//requi. + Origin_Host_AVP origin_Host,//requi. + Origin_Realm_AVP origin_Realm,//requi. + PUEA_Flags_AVP pUEA_Flags optional, + set of Supported_Features_AVP supported_Features optional, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Reset-Request (RSR) Command - Ref: TS 129 272 7.2.15 + type record RSR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 322, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + RSR_Body_AVP rSR_Body + } + type set RSR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host, + Destination_Realm_AVP destination_Realm, + set of Supported_Features_AVP supported_Features optional, + set of User_Id_AVP user_Id optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Reset-Answer (RSA) Command - Ref: TS 129 272 7.2.16 + type record RSA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 322, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + RSA_Body_AVP rSA_Body + } + type set RSA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + set of Supported_Features_AVP supported_Features optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Notify-Request (NOR) Command - Ref: TS 129 272 7.2.17 + type record NOR_MSG { + DiameterHeader header, + // ::= < Diameter Header: 323, REQ, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + NOR_Body_AVP nOR_Body + } + type set NOR_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + Destination_Host_AVP destination_Host optional, + Destination_Realm_AVP destination_Realm, + User_Name_AVP user_Name, + set of Supported_Features_AVP supported_Features optional, + Terminal_Information_AVP terminal_Information optional, + MIP6_Agent_Info_AVP mIP6_Agent_Info optional, + Visited_Network_Identifier_AVP visited_Network_Identifier optional, + Context_Identifier_AVP context_Identifier optional, + Service_Selection_AVP service_Selection optional, + Alert_Reason_AVP alert_Reason optional, + UE_SRVCC_Capability_AVP uE_SRVCC_Capability optional, + NOR_Flags_AVP nOR_Flags optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + // Notify-Answer (NOA) Command - Ref: TS 129 272 7.2.18 + type record NOA_MSG { + DiameterHeader header, + // ::= < Diameter Header: 323, PXY, 16777251 > + + Session_Id_AVP session_Id, + // + NOA_Body_AVP nOA_Body + } + type set NOA_Body_AVP { + Vendor_Specific_Appl_Id_AVP vendor_Specific_Application_Id optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + Auth_Session_State_AVP auth_Session_State, + Origin_Host_AVP origin_Host, + Origin_Realm_AVP origin_Realm, + set of Supported_Features_AVP supported_Features optional, + set of Failed_AVP failed optional, + set of Proxy_Info_AVP proxy_Info optional, + set of Route_Record_AVP route_Record optional, + set of AVP_Type aVP_Type optional + } + + } // End of group S6a + + + } // End of group MessageTypes + with{ + encode "DIAMETERCodec" + } + + group Other{ + + // Diameter Message Record(Header and Body(AVP's)). + type record Lower_Layer_Primitive { + Lower_Layer_Header ll_header, + DIAMETER_MSG pdu optional + } + //Abstract Service Primitive ist, Layer (TE) to Layer (SA) + + type record Lower_Layer_Header{ + ASP_type primitive, + charstring transport_used, + charstring ETS_address optional, + integer ETS_port optional, + charstring SUT_address optional, + integer SUT_port optional, + integer ETS_conn optional + } + //Abstract Service Primitive ist, Layer (TE) to Layer (SA) + + // ASP type definition. + type enumerated ASP_type { + CONNECT_REQUEST_E(1), + CONNECT_INDICATION_E(2), + CONNECT_CONFIRM_E(3), + DISCONNECT_REQUEST_E(4), + DISCONNECT_INDICATION_E(5), + DATA_REQUEST_E(6), + DATA_INDICATION_E(7), + LISTEN_REQUEST_E(8) + } + //Abstract Service Primitive ist, Layer (TE) to Layer (SA) + + } // End of group Other + + }//End group HeaderAndBodyTypes + +} with { + encode "DIAMETERCodec"; variant "" +} // End module LibDiameter_TypesAndValues diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Base_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Base_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..4a9bef32ba277d213bc9d5e3a35dbd0d10139b10 --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Base_AVPs.ttcn @@ -0,0 +1,4179 @@ +/** + * @author STF 466 + * @version $Id$ + * @desc This module defines Diameter Base AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new Base AVP types is ok; + */ +module LibDiameter_Types_Base_AVPs { + + // LibCommon + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_DataStrings all; + + // LibDiameter + // import from LibDiameter_Types_RfRo_AVPs all; + // import from LibDiameter_Types_Gx_AVPs all; + // import from LibDiameter_Types_CxDx_AVPs all; + + group AVPTypes{ + group AVP_Base_Types{ + //AVP Data Union(Integer,String,Record of and Grouped). + + type record GROUPED{ + AVP_Header aVP_Header, + set of AVP_Type aVP_Type + }; + + type union AVP_Data { + /* Ref: RFC3588 p.4.1 Basic Avp Data Formats */ + octetstring oCTETSTRING, + charstring cHARSTRING, + Int32 iNTEGER32, + Int64 iNTEGER64, + UInt32 uNSIGNED32, + UInt64 uNSIGNED64, + FLOAT32 fLOAT32, + FLOAT64 fLOAT64, + GROUPED gROUPED + } + + /* Ref: FRC3588 p.4.3 Derived Avp Data Formats */ + //changed addressFamily added ! + type record Address{ + Oct2 addressFamily, + IpAddress ipAddress + } + type union IpAddress { + IPv4Addr ipv4, + IPv6Addr ipv6 + } + //RFC3588 chapter 4.3: + // The Address format is derived from the OctetString AVP Base + // Format. It is a discriminated union, representing, for example a + // 32-bit (IPv4) [IPV4] or 128-bit (IPv6) [IPV6] address, most + // significant octet first. The first two octets of the Address + // AVP represents the AddressType, which contains an Address Family + // defined in [IANAADFAM]. The AddressType is used to discriminate + // the content and format of the remaining octets. + // -> check if IPv4(1) or IPv6(2) (http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml) + + type UInt32 Time; + + /* Diameter_Identity is FQDN - Fully Qualified Domain Name. + * host + * | 2nd level domain + * | | top level domain + * www.something.com + * host + * | 2nd level domain + * | | 3rd level domain + * | | | top level domain + * www.somtehing1.something2.com + * host + */ + type charstring Diameter_Identity; +// with { +// variant "use=com.testingtech.ttcn.tci.codec.CodecHelper;encode=CodecHelper.encodeCharstringWithPadding();decode=CodecHelper.decodeCharstringWithPadding()" +// variant "length=getIntTag('aVP_len')" +// } + type record GenericParam{ + /* pid : ";transport=" or ";protocol=" + * paramValue : + * - for pid ";transport=" paramValue can be "tcp" / "udp" / "sctp" + * - for pid ";protocol=" paramValue can be "diameter" / "radius" / "tacacs+" + * */ + charstring pid optional, + charstring paramValue optional + } + + type set of GenericParam SemicolonParam_List; + type record DiameterURI{ + /* The DiameterURI MUST follow the Uniform Resource Identifiers (URI) + * syntax [URI] rules specified below: + * No transport security used : "aaa://" FQDN [ port ] [ transport ] [ protocol ] + * Transport security used : "aaas://" FQDN [ port ] [ transport ] [ protocol ] + * - port = ":" 1*DIGIT (If absent, the default Diameter port (3868) is assumed.) + * - transport = ";transport=" transport-protocol + * transport-protocol = ( "tcp" / "sctp" / "udp" ) + * - protocol = ";protocol=" aaa-protocol (If absent, the default AAA protocol is diameter.) + * aaa-protocol = ( "diameter" / "radius" / "tacacs+" ) + * Examples: + * aaa://host.example.com;transport=tcp + * aaa://host.example.com;protocol=diameter + * aaa://host.example.com:6666;protocol=diameter + * aaa://host.example.com:6666;transport=tcp;protocol=diameter + * aaa://host.example.com:1813;transport=udp;protocol=radius + */ +// charstring scheme, // "aaa://" +// UserInfo userInfo, +// HostPort hostPort optional, +// SemicolonParam_List urlParameters optional + + //charstring scheme, // "aaa://" + //charstring diameterId_FQDN, + //UInt16 portField optional, + //SemicolonParam_List uriParameters optional + charstring scheme ("aaa", "aaas"), + charstring diameterId_FQDN, + integer portField optional,//eg: 3868 + charstring transport ("transport=tcp", "transport=sctp", "transport=udp") optional, + charstring protocol ("protocol=diameter", "protocol=radius", "protocol=tacacs+") optional + } + + type record IP_AddressMask{ + UTF8String addr, + UTF8String mask optional, + UTF8String ports optional + } + + type record IPFilterRule_Type{ + //RFC3588 +/* Action actions permit - Allow packets that match the rule. + deny - Drop packets that match the rule. + + Dir dir "in" is from the terminal, "out" is to the + terminal. + + Proto proto An IP protocol specified by number. The "ip" + keyword means any protocol will match. + Aaddr_mask + src and dst
[ports] +*/ + UTF8String action_, + UTF8String direction, + UTF8String proto, + IP_AddressMask src, //including optional ports + IP_AddressMask dst, //including optional ports + UTF8String options optional + } + //TODO Parser and Codec needed here (first version do not include this) +// with { +// variant "use=com.testingtech.ttcn.tci.codec.CodecHelper;encode=CodecHelper.encodeIPFilterRule_Type();decode=CodecHelper.decodeIPFilterRule_Type()" +// } + + type UInt32 AVP_Code (1..c_uInt32Max); + + //type Bit8 AVP_Flags; + type record AVP_Flags{ + Bit1 v_bit, + Bit1 m_bit, + Bit1 p_bit, + Bit5 reserved_bits + } + + type UInt24 AVP_Length; + type UInt32 AVP_Vendor_ID; + + type record AVP_Header{ + AVP_Code aVP_Code, + AVP_Flags aVP_flags, + AVP_Length aVP_len, + AVP_Vendor_ID aVP_vid optional + } + + type record AVP_Type { + AVP_Header aVP_Header, + AVP_Data aVP_Data optional + } + }//end group AVP_Base_Types + + group RFC_AVP3588_Types{ + + type enumerated Result_Code_Type{ + DIAMETER_DUMMY_E (0), + + DIAMETER_MULTI_ROUND_AUTH_E (1001), + + DIAMETER_SUCCESS_E (2001), + DIAMETER_LIMITED_SUCCESS_E (2002), + + DIAMETER_COMMAND_UNSUPPORTED_E (3001), + DIAMETER_UNABLE_TO_DELIVER_E (3002), + DIAMETER_REALM_NOT_SERVED_E (3003), + DIAMETER_TOO_BUSY_E (3004), + DIAMETER_LOOP_DETECTED_E (3005), + DIAMETER_REDIRECT_INDICATION_E (3006), + DIAMETER_APPLICATION_UNSUPPORTED_E (3007), + DIAMETER_INVALID_HDR_BITS_E (3008), + DIAMETER_INVALID_AVP_BITS_E (3009), + DIAMETER_UNKNOWN_PEER_E (3010), + + DIAMETER_AUTHENTICATION_REJECTED_E (4001), + DIAMETER_OUT_OF_SPACE_E (4002), + DIAMETER_ELECTION_LOST_E (4003), + + DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE_E (4181), + + DIAMETER_AVP_UNSUPPORTED_E (5001), + DIAMETER_UNKNOWN_SESSION_ID_E (5002), + DIAMETER_AUTHORIZATION_REJECTED_E (5003), + DIAMETER_INVALID_AVP_VALUE_E (5004), + DIAMETER_MISSING_AVP_E (5005), + DIAMETER_RESOURCES_EXCEEDED_E (5006), + DIAMETER_CONTRADICTING_AVPS_E (5007), + DIAMETER_AVP_NOT_ALLOWED_E (5008), + DIAMETER_AVP_OCCURS_TOO_MANY_TIMES_E (5009), + DIAMETER_NO_COMMON_APPLICATION_E (5010), + DIAMETER_UNSUPPORTED_VERSION_E (5011), + DIAMETER_UNABLE_TO_COMPLY_E (5012), + DIAMETER_INVALID_BIT_IN_HEADER_E (5013), + DIAMETER_INVALID_AVP_LENGTH_E (5014), + DIAMETER_INVALID_MESSAGE_LENGTH_E (5015), + DIAMETER_INVALID_AVP_BIT_COMBO_E (5016), + DIAMETER_NO_COMMON_SECURITY_E (5017), + DIAMETER_ERROR_SUBSESSION_E (5470) + } +// with { +// variant "length=32" +// } + + type enumerated Re_Auth_Req_Type{ + //Ref: RFC3588 8.12. Re-Auth-Request-Type AVP + AUTHORIZE_ONLY_E (0), + AUTHORIZE_AUTHENTICATE_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Redirect_Host_Usage_Type{ + DONT_CACHE_E (0), + ALL_SESSION_E (1), + ALL_REALM_E (2), + REALM_AND_APPLICATION_E (3), + ALL_APPLICATION_E (4), + ALL_HOST_E (5), + ALL_USER_E (6) + } +// with { +// variant "length=32" +// } + type enumerated Acc_Record_Type{ + EVENT_RECORD_E (1), + START_RECORD_E (2), + INTERIM_RECORD_E (3), + STOP_RECORD_E (4) + } +// with { +// variant "length=32" +// } + type enumerated Acc_Realtime_Req_Type{ + DELIVER_AND_GRANT_E (1), + GRANT_AND_STORE_E (2), + GRANT_AND_LOSE_E (3) + } +// with { +// variant "length=32" +// } + + type enumerated Termination_Cause_Type{ + DIAMETER_LOGOUT_E (1), + DIAMETER_SERVICE_NOT_PROVIDED_E (2), + DIAMETER_BAD_ANSWER_E (3), + DIAMETER_ADMINISTRATIVE_E (4), + DIAMETER_LINK_BROKEN_E (5), + DIAMETER_AUTH_EXPIRED_E (6), + DIAMETER_USER_MOVED_E (7), + DIAMETER_SESSION_TIMEOUT_E (8) + } +// with { +// variant "length=32" +// } + type enumerated Disconnect_Cause_Type{ + REBOOTING_E (0), + BUSY_E (1), + DO_NOT_WANT_TO_TALK_TO_YOU_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Auth_Session_State_Type{ + STATE_MAINTAINED_E (0), + NO_STATE_MAINTAINED_E (1) + } +// with { +// variant "length=32" +// } + //type DiameterURI SIP_AOR_Type;// RFC 4740 sec. 9.8 + type enumerated SIP_User_Auth_Ty_Type{ + //Ref: RFC4740, section 9.10 + REGISTRATION_E (0), + DEREGISTRATION_E (1), + REGISTRATION_AND_CAPABILITIES_E (2) + } +// with { +// variant "length=32" +// } + type enumerated SIP_Srv_Assgmt_Type{ + NO_ASSIGNMENT_E (0), + REGISTRATION_E (1), + RE_REGISTRATION_E (2), + UNREGISTERED_USER_E (3), + TIMEOUT_DEREGISTRATION_E (4), + USER_DEREGISTRATION_E (5), + TIMEOUT_DEREGISTRATION_STORE_SERVER_NAME_E (6), + USER_DEREGISTRATION_STORE_SERVER_NAME_E (7), + ADMINISTRATIVE_DEREGISTRATION_E (8), + AUTHENTICATION_FAILURE_E (9), + AUTHENTICATION_TIMEOUT_E (10), + DEREGISTRATION_TOO_MUCH_DATA_E (11) + } +// with { +// variant "length=32" +// } + + type enumerated SIP_Usr_Dat_Al_Av_Type{ + USER_DATA_NOT_AVAILABLE_E (0), + USER_DATA_ALREADY_AVAILABLE_E (1) + } +// with { +// variant "length=32" +// } + type enumerated SIP_Auth_Schm_Type{ + DIGEST_E (0), // RFC4740 Clause 9.5.1. SIP-Authentication-Scheme AVP + DIGEST_AKAv1_MD5_E (1), // TODO CHeck the value are correct + NASS_BUNDLE_E (2), // TODO CHeck the value are correct + GIBA_E (3), // TODO CHeck the value are correct + UNKNOWN_E + } +// with { +// variant "length=32" +// } + type enumerated SIP_Reason_Code_Type{ + PERMANENT_TERMINATION_E (0), + NEW_SIP_SERVER_ASSIGNED_E (1), + SIP_SERVER_CHANGE_E (2), + REMOVE_SIP_SERVER_E (3) + } +// with { +// variant "length=32" +// } + /* Types on Sh interface */ + type enumerated Data_Reference_Type{ + REPOSITORY_DATA_E (0), + IMS_PUBLIC_IDENTITY_E (10), + IMS_USER_STATE_E (11), + S_CSCF_NAME_E (12), + INITIAL_FILTER_CRITERIA_E (13), + LOCATION_INFORMATION_E (14), + USER_STATE_E (15), + CHARGING_INFORMATION_E (16), + MSISDN (17), + PSI_ACTIVATION_E (18), + DSAI_E (19), + SERVICE_LEVEL_TRACE_INFO_E (21), + IP_ADDRESS_SECURE_BINDING_INFORMATION_E (22), + SERVICE_PRIORITY_LEVEL_E (23), + SMS_REGISTRATION_INFO_E (24), + UE_REACHABILITY_FOR_IP_E (25), + TADS_INFORMATION_E (26), + STN_SR_E (27), + UE_SRVCC_CAPABILITY_E (28), + EXTENDED_PRIORITY_E (29), + CSRN_E (30), + REFERENCE_LOCATION_INFORMATION (31), + IMSI (32), + IMS_PRIVATE_USER_IDENTITY_E (33) + } +// with { +// variant "length=32" +// } + type enumerated Subs_Req_Ty_Type{ + SUBSCRIBE_E (0), + UNSUBSCRIBE_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Request_Domain_Type{ + CS_DOMAIN_E (0), + PS_DOMAIN_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Current_Location_Type{ + DO_NOT_NEED_INITIATE_ACTIVATE_LOCATION_RETRIEVAL_E (0), + INITIATE_ACTIVATE_LOCATION_RETRIEVAL_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Identity_Set_Type{ + ALL_IDENTITIES_E (0), + REGISTERED_IDENTITIES_E (1), + IMPLICIT_IDENTITIES_E (2), + ALIAS_IDENTITIES_E (3) + } +// with { +// variant "length=32" +// } + type enumerated Send_Data_Indication_Type{ + USER_DATA_NOT_REQUESTED_E (0), + USER_DATA_REQUESTED_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Experimental_Result_Type{ // See http://diameter-protocol.blogspot.fr/2012/10/list-of-experimental-result-codes.html + DIAMETER_FIRST_REGISTRATION_E (2001), + DIAMETER_SUBSEQUENT_REGISTRATION_E (2002), + DIAMETER_UNREGISTERED_SERVICE_E (2003), // due to TS 129 299 Clause 6.2.1.3 + DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED_E (2004), + //DIAMETER_UNREGISTERED_SERVICE_E (2005), // deleted because belongs to Result-Code AVP and not Experimental Result Code see: RFC 4740 Diameter SIP Application Clause 10.1.1. Success Result-Code AVP Values + DIAMETER_AUTHENTICATION_DATA_UNAVAILABLE_E (4181), + DIAMETER_ERROR_USER_UNKNOWN_E (5001), + DIAMETER_ERROR_IDENTITIES_DONT_MATCH_E (5002), + DIAMETER_ERROR_IDENTITY_NOT_REGISTERED_E (5003), + DIAMETER_ERROR_ROAMING_NOT_ALLOWED_E (5004), + DIAMETER_ERROR_IDENTITY_ALREADY_REGISTERED_E (5005), + DIAMETER_ERROR_AUTH_SCHEME_NOT_SUPPORTED_E (5006), + DIAMETER_ERROR_IN_ASSIGNMENT_TYPE_E (5007), + DIAMETER_ERROR_TOO_MUCH_DATA_E (5008), + DIAMETER_ERROR_NOT_SUPPORTED_USER_DATA_E (5009), + // Ref: ETSI TS 129 214 5.5 + INVALID_SERVICE_INFORMATION_E (5061), + FILTER_RESTRICTIONS_E (5062), + REQUESTED_SERVICE_NOT_AUTHORIZED_E (5063), + DUPLICATED_AF_SESSION_E (5064), + IP_CAN_SESSION_NOT_AVAILABLE_E (5065), + UNAUTHORIZED_NON_EMERGENCY_SESSION_E (5066), + UNAUTHORIZED_SPONSORED_DATA_CONNECTIVITY_E (5067), + + // Ref: ETSI TS 129 329 + DIAMETER_ERROR_USER_DATA_NOT_RECOGNIZED_E (5100), + DIAMETER_ERROR_OPERATION_NOT_ALLOWED_E (5101), + DIAMETER_ERROR_USER_DATA_CANNOT_BE_READ_E (5102), + DIAMETER_ERROR_USER_DATA_CANNOT_BE_MODIFIED_E (5103), + DIAMETER_ERROR_USER_DATA_CANNOT_BE_NOTIFIED_E (5104), + DIAMETER_ERROR_TRANSPARENT_DATA_OUT_OF_SYNC_E (5105), + DIAMETER_ERROR_SUBS_DATA_ABSENT(5106), + DIAMETER_ERROR_DSAI_NOT_AVAILABLE_E (5108), + DIAMETER_USER_DATA_NOT_AVAILABLE_E (4100), + DIAMETER_PRIOR_UPDATE_IN_PROGRESS_E (4101), + + + + + + DIAMETER_ERROR_INITIAL_PARAMETERS_E (5140), + DIAMETER_ERROR_TRIGGER_EVENT_E (5141), + DIAMETER_PCC_RULE_EVENT_E (5142), + DIAMETER_ERROR_BEARER_NOT_AUTHORIZED_E (5143), + DIAMETER_ERROR_TRAFFIC_MAPPING_INFO_REJECTED_E (5144), + DIAMETER_ERROR_CONFLICTING_REQUEST_E (5147), + // Ref: 3GPP TS 29.215 + DIAMETER_ERROR_SUBSESSION_E (5470), + DIAMETER_ERROR_UNKNOWN_EPS_SUBSCRIPTION_E (5420),//(9990), // Set the correct error code value - See ETSI TS 129 272 Clause 5.2.1.1.3 Detailed behaviour of the HSS + DIAMETER_ERROR_RAT_NOT_ALLOWED_E (5421),//(9991), // Set the correct error code value - See ETSI TS 129 272 Clause 5.2.1.1.3 Detailed behaviour of the HSS + DIAMETER_ERROR_EQUIPMENT_UNKNOWN_E (5422), //See ETSI TS 129 272 Clause 7.4.3 + DIAMETER_ERROR_UNKOWN_SERVING_NODE_E (5423),//See ETSI TS 129 272 Clause 7.4.3 + unknown + } +// with { +// variant "use=com.testingtech.ttcn.tci.codec.CodecHelper;length=32;decode=CodecHelper.decodeExperimental_Result_Type()" +// } + + type enumerated CC_Request_Ty_Type{ + // Ref: RFC4006 8.3. CC-Request-Type AVP + INITIAL_REQUEST_E (1), + UPDATE_REQUEST_E (2), + TERMINATION_REQUEST_E (3), + EVENT_REQUEST_E (4) + } +// with { +// variant "length=32" +// } + + type enumerated Subscription_Id_Ty_Type{ + // Ref: RFC4006 8.47. Subscription-Id-Type AVP + END_USER_E164_E (0), + END_USER_IMSI_E (1), + END_USER_SIP_URI_E (2), + END_USER_NAI_E (3), + END_USER_PRIVATE_E (4) + } +// with { +// variant "length=32" +// } + type enumerated Requested_Action_Type{ + // Ref: RFC4006 8.41. Requested-Action AVP + DIRECT_DEBITING_E (0), + REFUND_ACCOUNT_E (1), + CHECK_BALANCE_E (2), + PRICE_ENQUIRY_E (3) + } +// with { +// variant "length=32" +// } + type enumerated Tariff_Change_Usage_Type{ + // Ref: RFC4006 8.27. Tariff-Change-Usage AVP + UNIT_BEFORE_TARIFF_CHANGE_E (0), + UNIT_AFTER_TARIFF_CHANGE_E (1), + UNIT_INDETERMINATE_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Multiple_Serv_Indi_Type{ + // Ref: RFC4006 8.40. Multiple-Services-Indicator AVP + MULTIPLE_SERVICES_NOT_SUPPORTED_E (0), + MULTIPLE_SERVICES_SUPPORTED_E (1) + } +// with { +// variant "length=32" +// } + type enumerated CC_Unit_Ty_Type { + // Ref: RFC4006 8.31. G-S-U-Pool-Identifier AVP + TIME_E (0), + MONEY_E (1), + TOTAL_OCTETS_E (2), + INPUT_OCTETS_E (3), + OUTPUT_OCTETS_E (4), + SERVICE_SPECIFIC_UNITS_E (5) + } +// with { +// variant "length=32" +// } + + type enumerated Final_Unit_Action_Type{ + // Ref: RFC4006 8.35. Final-Unit-Action AVP + TERMINATE_E (0), + REDIRECT_E (1), + RESTRICT_ACCESS_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Redirect_Address_Ty_Type{ + // Ref: RFC4006 8.38. Redirect-Address-Type AVP + IPV4_ADDRESS_E (0), + IPV6_ADDRESS_E (1), + URL_E (2), + SIP_URI_E (3) + } +// with { +// variant "length=32" +// } + type enumerated User_Equipment_Info_Ty_Type { + // Ref: RFC4006 8.50. User-Equipment-Info-Type AVP + IMEISV_E (0), + MAC_E (1), + EUI64_E (2), + MODIFIED_EUI64_E (3) + } +// with { +// variant "length=32" +// } + type enumerated CC_Session_Failover_Type{ + // Ref: RFC4006 8.4. CC-Session-Failover AVP + FAILOVER_NOT_SUPPORTED_E (0), + FAILOVER_SUPPORTED_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Check_Balance_Result_Type{ + // Ref: RFC4006 8.6. Check-Balance-Result AVP + ENOUGH_CREDIT_E (0), + NO_CREDIT_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Credit_Cont_Fail_Hand_Type{ + // Ref: RFC4006 8.14. Credit-Control-Failure-Handling AVP + TERMINATE_E (0), + CONTINUE_E (1), + RETRY_AND_TERMINATE_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Direct_Debi_Fail_Hand_Type{ + // Ref: RFC4006 8.15. Direct-Debiting-Failure-Handling AVP + TERMINATE_OR_BUFFER_E (0), + CONTINUE_E (1) + } +// with { +// variant "length=32" +// } + }//end group RFC3588 types + + group AVP_GxFrom132_299_Types{ + + type enumerated CSG_Access_Mode{ + // Ref: ETSI TS 132 299 7.2.46A + CLOSED_MODE_E (0), + HYBRID_MODE_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated CSG_Membership_Indication{ + // Ref: ETSI TS 132 299 7.2.46B + NOT_CSG_MEMBER_E (0), + CSG_MEMBER_E (1) + } +// with { +// variant "length=32" +// } + + }//end group AVP_GxFrom132_299_Types + + group AVP_GxFrom132_422_Types{ + + type enumerated Job_Type{ + // Ref: ETSI TS 132 422 5.10.1 + IMMEDIATE_MDT_ONLY_E (0), + LOGGED_MDT_ONLY_E (1), + TRACE_ONLY_E (2), + IMMEDIATE_MDT_AND_TRACE_E (3) + } +// with { +// variant "length=32" +// } + + type enumerated Report_Interval{ + // Ref: ETSI TS 132 422 5.10.5 + REPORT_INTERVAL_250MS_E (0), + REPORT_INTERVAL_500MS_E (1), + REPORT_INTERVAL_1000MS_E (2), + REPORT_INTERVAL_2000MS_E (3), + REPORT_INTERVAL_3000MS_E (4), + REPORT_INTERVAL_4000MS_E (5), + REPORT_INTERVAL_6000MS_E (6), + REPORT_INTERVAL_8000MS_E (7), + REPORT_INTERVAL_12000MS_E (8), + REPORT_INTERVAL_16000MS_E (9), + REPORT_INTERVAL_20000MS_E (10), + REPORT_INTERVAL_24000MS_E (11), + REPORT_INTERVAL_28000MS_E (12), + REPORT_INTERVAL_32000MS_E (13), + REPORT_INTERVAL_64000MS_E (14), + REPORT_INTERVAL_120MS_E (15), + REPORT_INTERVAL_240MS_E (16), + REPORT_INTERVAL_480MS_E (17), + REPORT_INTERVAL_640MS_E (18), + REPORT_INTERVAL_1024MS_E (19), + REPORT_INTERVAL_2048MS_E (20), + REPORT_INTERVAL_5120MS_E (21), + REPORT_INTERVAL_10240MS_E (22), + REPORT_INTERVAL_60000MS_E (23), + REPORT_INTERVAL_360000MS_E (24), + REPORT_INTERVAL_720000MS_E (25), + REPORT_INTERVAL_1800000MS_E (26), + REPORT_INTERVAL_3600000MS_E (27) + } +// with { +// variant "length=32" +// } + + type enumerated Report_Amount{ + // Ref: ETSI TS 132 422 5.10.6 + AMOUNT_1_E (0), + AMOUNT_2_E (1), + AMOUNT_4_E (2), + AMOUNT_8_E (3), + AMOUNT_16_E (4), + AMOUNT_32_E (5), + AMOUNT_64_E (6), + AMOUNT_INFINITY_E (7) + } +// with { +// variant "length=32" +// } + + type enumerated Logging_Interval{ + // Ref: ETSI TS 132 422 5.10.8 + LOGGING_INTERVAL_1_28_E (0), + LOGGING_INTERVAL_2_56_E (1), + LOGGING_INTERVAL_3_12_E (2), + LOGGING_INTERVAL_10_24_E (3), + LOGGING_INTERVAL_20_49_E (4), + LOGGING_INTERVAL_30_72_E (5), + LOGGING_INTERVAL_40_96_E (6), + LOGGING_INTERVAL_61_44_E (7) + } +// with { +// variant "length=32" +// } + + type enumerated Logging_Duration{ + // Ref: ETSI TS 132 422 5.10.9 + LOGGING_DURATION_600SEC_E (0), + LOGGING_DURATION_1200SEC_E (1), + LOGGING_DURATION_2400SEC_E (2), + LOGGING_DURATION_3600SEC_E (3), + LOGGING_DURATION_5400SEC_E (4), + LOGGING_DURATION_7200SEC_E (5) + } +// with { +// variant "length=32" +// } + + type enumerated Trace_Depth{ + // Ref: ETSI TS 132 422 5.3 + MINIMUM_E (0), + MEDIUM_E (1), + MAXIMUM_E (2), + MINIMUM_WITHOUT_VENDOR_SPECIFIC_EXTENSION_E (3), + MEDIUM_WITHOUT_VENDOR_SPECIFIC_EXTENSION_E (4), + MAXIMUM_WITHOUT_VENDOR_SPECIFIC_EXTENSION_E (5) + } +// with { +// variant "length=32" +// } + + type record Sponsor_Identity_AVP{ + //Ref: ETSI TS 129 214 Sponsor_Identity AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 531);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + }//end group AVP_GxFrom132_422_Types + + }//end group AVP_Types + group AVPs{ + /* AVPNs */ + group RFC3588_AVPs{ + type record Origin_Host_AVP{ + //Ref: RFC3588 6.3. Origin-Host AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 264);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Origin_Realm_AVP{ + //Ref: RFC3588 6.4. Origin-Realm AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 296);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Host_IP_Address_AVP{ + //Ref: RFC3588 5.3.5. Host-IP-Address AVP + AVP_Header aVP_Header,// + Address aVP_Data + } +// with { +// variant "present=bytes(4, 257);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Vendor_Id_AVP{ + //Ref: RFC3588 5.3.3. Vendor-Id AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 266)&&CodecHelper.isAvailable();use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Product_Name_AVP{ + //Ref: RFC3588 5.3.7. Product-Name AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 269);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Origin_State_Id_AVP{ + //Ref: RFC3588 8.16. Origin-State-Id AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 278);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Supported_Vendor_Id_AVP{ + //Ref; 5.3.6. Supported-Vendor-Id AVP + AVP_Header aVP_Header,// + Int32 aVP_Data + } +// with { +// variant "present=bytes(4, 265);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Auth_Application_Id_AVP{ + //Ref: RFC3588 6.8. Auth-Application-Id AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 258)&&CodecHelper.isAvailable();use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Inband_Security_Id_AVP{ + //Ref: RFC3588 6.10. Inband-Security-Id AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 299);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Acct_Application_Id_AVP{ + //Ref: RFC3588 6.9. Acct-Application-Id AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 259)&&CodecHelper.isAvailable();use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Vendor_Specific_Appl_Id_AVP{ + //Ref: RFC3588 6.11. Vendor-Specific-Application-Id AVP + AVP_Header aVP_Header,// ::= < AVP Header: 260 > + set of Vendor_Id_AVP vendor_Id optional, + set of Auth_Application_Id_AVP auth_Application_Id optional, + set of Acct_Application_Id_AVP acct_Application_Id optional + } +// with { +// variant "present=bytes(4, 260);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (vendor_Id) "fieldPresent=bytes(4, 266)&&CodecHelper.isAvailable()" +// variant (auth_Application_Id) "fieldPresent=bytes(4, 258)&&CodecHelper.isAvailable()" +// variant (acct_Application_Id) "fieldPresent=bytes(4, 259)&&CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Firmware_Revision_AVP{ + //Ref: RFC3588 5.3.4. Firmware-Revision AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 267);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Result_Code_AVP{ + //Ref: RFC3588 7.1. Result-Code AVP + AVP_Header aVP_Header,// + //UInt32 + Result_Code_Type aVP_Data + } +// with { +// variant "present=bytes(4, 268);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Error_Message_AVP{ + //Ref: RFC3588 7.3. Error-Message AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 281);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Failed_AVP{ + //Ref: RFC3588 7.5. Failed-AVP AVP + AVP_Header aVP_Header,// + set of AVP_Type aVP + } +// with { +// variant "present=bytes(4, 279);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP) "condition=CodecHelper.leaveScope()" +// } + type record Session_Id_AVP{ + //Ref: RFC3588 8.8. Session-Id AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 263);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Destination_Realm_AVP{ + //Ref: RFC3588 6.6. Destination-Realm AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 283);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Destination_Host_AVP{ + //Ref: RFC3588 6.5. Destination-Host AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 293);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Re_Auth_Request_Type_AVP{ + //Ref: RFC3588 8.12. Re-Auth-Request-Type AVP + AVP_Header aVP_Header,// + Re_Auth_Req_Type aVP_Data + } +// with { +// variant "present=bytes(4, 285);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record User_Name_AVP{ + //Ref: RFC3588 8.14. User-Name AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 1);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Proxy_Host_AVP{ + //Ref: RFC3588 6.7.3. Proxy-Host AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 280);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Proxy_State_AVP{ + //Ref: RFC3588 6.7.4. Proxy-State AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 33);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type record Proxy_Info_AVP{ + //Ref: RFC3588 6.7.2. Proxy-Info AVP + AVP_Header aVP_Header,// + Proxy_Host_AVP proxy_Host,//requi. + Proxy_State_AVP proxy_State,//requi. + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 284);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Route_Record_AVP{ + //Ref: RFC3588 6.7.1. Route-Record AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 282);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Error_Reporting_Host_AVP{ + //Ref: RFC3588 7.4. Error-Reporting-Host AVP + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 294);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Redirect_Host_AVP{ + /* Ref: RFC3588 6.12. Redirect-Host AVP + NOTE: In Ref aVP_Data type is not defined, I presume it should be Diameter_Identity as the other xxx_Host_AVPs */ + AVP_Header aVP_Header,// + Diameter_Identity aVP_Data + } +// with { +// variant "present=bytes(4, 292);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Redirect_Host_Usage_AVP{ + //Ref: RFC3588 6.13. Redirect-Host-Usage AVP + AVP_Header aVP_Header,// + Redirect_Host_Usage_Type aVP_Data + } +// with { +// variant "present=bytes(4, 261);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + +// type record Redirect_Host_Cache_Time_AVP{ +// // NOTE Ref: RFC3588 Redirect_Host_Cache_Time_AVP is NOT defined. +// // I presume it should be Time type. rmag +// AVP_Header aVP_Header,// +// Time aVP_Data +// }; + type record Accounting_Record_Type_AVP{ + //Ref: RFC3588 9.8.1. Accounting-Record-Type AVP + AVP_Header aVP_Header,// + Acc_Record_Type aVP_Data + } +// with { +// variant "present=bytes(4, 480);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Accounting_Record_Number_AVP{ + //Ref: RFC3588 9.8.3. Accounting-Record-Number AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 485);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Accounting_Sub_Session_Id_AVP{ + //Ref: RFC3588 9.8.6. Accounting-Sub-Session-Id AVP + AVP_Header aVP_Header,// + UInt64 aVP_Data + } +// with { +// variant "present=bytes(4, 287);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Acct_Session_Id_AVP{ + //Ref: RFC3588 9.8.4. Acct-Session-Id AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 44);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type record Acct_Multi_Session_Id_AVP{ + //Ref: RFC3588 9.8.5. Acct-Multi-Session-Id AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 50);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Acct_Interim_Interval_AVP{ + //Ref: RFC3588 9.8.2. Acct-Interim-Interval + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 85);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Accounting_Realtime_Required_AVP{ + //Ref: RFC3588 9.8.7. Accounting-Realtime-Required AVP + AVP_Header aVP_Header,// + Acc_Realtime_Req_Type aVP_Data + } +// with { +// variant "present=bytes(4, 283);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Event_Timestamp_AVP{ + //Ref: RFC3588 8.21. Event-Timestamp AVP + AVP_Header aVP_Header,// + Time aVP_Data + } +// with { +// variant "present=bytes(4, 55);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Termination_Cause_AVP{ + //Ref: RFC3588 8.15. Termination-Cause AVP + AVP_Header aVP_Header,// + Termination_Cause_Type aVP_Data + } +// with { +// variant "present=bytes(4, 295);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Class_AVP{ + //Ref: RFC3588 8.20. Class AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 25);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type record Disconnect_Cause_AVP{ + //Ref: RFC3588 5.4.3. Disconnect-Cause AVP + AVP_Header aVP_Header,// + Disconnect_Cause_Type aVP_Data + } +// with { +// variant "present=bytes(4, 273);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + }//enf of group RFC3855_AVPs + group RFC4740_AVPs{ + /* ******** Cx *******/ + type record Auth_Session_State_AVP{ + // Ref: RFC3588 8.11. Auth-Session-State AVP + AVP_Header aVP_Header,// + Auth_Session_State_Type aVP_Data + } +// with { +// variant "present=bytes(4, 277);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_AOR_AVP{ + // Ref: RFC4740 9.8. SIP-AOR AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data //DiameterURI/SIP_AOR_Type replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } +// with { +// variant "present=bytes(4, 122);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// variant (aVP_Data) "encode=CodecHelper.encodeDiameterURI();decode=CodecHelper.decodeDiameterURI()" +// } + type record SIP_Visited_Network_Id_AVP{ + // Ref: RFC4740 9.9. SIP-Visited-Network-Id AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 386);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_User_Authorization_Type_AVP{ + // Ref: RFC4740 9.10. SIP-User-Authorization-Type AVP + AVP_Header aVP_Header,// + SIP_User_Auth_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 387);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_Server_URI_AVP{ + // Ref: RFC4740 9.2 SIP-Server-URI AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 371);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_MandatoryCapability_AVP{ + //Ref: RFC4740 9.3.1. SIP-Mandatory-Capability AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 373);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_OptionalCapability_AVP{ + //Ref: RFC4740 9.3.2. SIP-Optional-Capability AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 374);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_Server_Capabilities_AVP{ + //Ref: RFC4740 9.3. SIP-Server-Capabilities AVP + AVP_Header aVP_Header,// + set of SIP_MandatoryCapability_AVP sIP_MandatoryCapability optional, + set of SIP_OptionalCapability_AVP sIP_OptionalCapability optional, + set of SIP_Server_URI_AVP sIPServerURI optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 372);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (sIP_MandatoryCapability) "fieldPresent=bytes(4, 373)&&CodecHelper.isAvailable()" +// variant (sIP_OptionalCapability) "fieldPresent=bytes(4, 374)&&CodecHelper.isAvailable()" +// variant (sIPServerURI) "fieldPresent=bytes(4, 371)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + type record Authorization_Lifetime_AVP{ + //Ref: RFC35888.9. Authorization-Lifetime AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 291);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Auth_Grace_Period_AVP{ + //Ref: RFC35888.10. Auth-Grace-Period AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 276);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Redirect_Max_Cache_Time_AVP { + //Ref: RFC3588 6.14. Redirect-Max-Cache-Time AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 262);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_Server_Assignment_Type_AVP{ + //Ref: RFC4740 9.4. SIP-Server-Assignment-Type AVP + AVP_Header aVP_Header,// + SIP_Srv_Assgmt_Type aVP_Data + } +// with { +// variant "present=bytes(4, 375);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_User_Data_Already_Available_AVP{ + //Ref: RFC4740 9.13. SIP-User-Data-Already-Available AVP + AVP_Header aVP_Header,// + SIP_Usr_Dat_Al_Av_Type aVP_Data + } +// with { +// variant "present=bytes(4, 392);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_Supported_User_Data_Type_AVP{ + //Ref: RFC4740 9.12.1. SIP-User-Data-Type AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 388);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_User_Data_Type_AVP{ + // Ref: RFC4740 9.12.1. SIP-User-Data-Type AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 390);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_User_Data_Contents_AVP{ + // Ref: RFC4740 9.12.2. SIP-User-Data-Contents AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 391);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type record SIP_User_Data_AVP{ + //Ref: RFC4740 9.12. SIP-User-Data AVP + AVP_Header aVP_Header,// < AVP Header: 389 > + SIP_User_Data_Type_AVP sIP_User_Data_Type,//req. + SIP_User_Data_Contents_AVP sIP_User_Data_Contents,//req. + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 389);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record SIP_Accounting_Information_AVP{ + //Ref: RFC4740 9.1. SIP-Accounting-Information AVP + AVP_Header aVP_Header,// + set of SIP_Accounting_Server_URI_AVP sIP_Accounting_Server_URI optional, + set of SIP_Credit_Control_Server_URI_AVP sIP_Credit_Control_Server_URI optional, + set of AVP_Type aVP_Type optional + } + +// with { +// variant "present=bytes(4, 368);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (sIP_Accounting_Server_URI) "fieldPresent=bytes(4, 369)&&CodecHelper.isAvailable()" +// variant (sIP_Credit_Control_Server_URI) "fieldPresent=bytes(4, 370)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + type record SIP_Accounting_Server_URI_AVP{ + //Ref: RFC4740 9.1.1. SIP-Accounting-Server-URI AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data //DiameterURI replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } +// with { +// variant "present=bytes(4, 369);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// encode (aVP_Data) "SipNist" +// variant (aVP_Data) "externalEncode;externalDecode;condition=CodecHelper.leaveScope()" +// variant (aVP_Data) "encode=CodecHelper.encodeDiameterURI();decode=CodecHelper.decodeDiameterURI()" +// } + + type record SIP_Credit_Control_Server_URI_AVP{ + //Ref: RFC4740 9.1.2. SIP-Credit-Control-Server-URI AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data //DiameterURI replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } +// with { +// variant "present=bytes(4, 370);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// encode (aVP_Data) "SipNist" +// variant (aVP_Data) "externalEncode;externalDecode;condition=CodecHelper.leaveScope()" +// variant (aVP_Data) "encode=CodecHelper.encodeDiameterURI();decode=CodecHelper.decodeDiameterURI()" +// } + type record SIP_Method_AVP{ + //Ref: RFC4740 9.14. SIP-Method AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 393);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_Number_Auth_Items_AVP{ + //Ref: RFC4740 9.6. SIP-Number-Auth-Items AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 382);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type union SIP_Auth_Data_Item_AVP { + SIP_Auth_Data_Item_RFC_AVP sIP_Auth_Data_Item_RFC_AVP, //RFC type definition + SIP_Auth_Data_Item_3GPP_AVP sIP_Auth_Data_Item_3GPP_AVP //3GPP type definition + } + + /** + * ETSI TS 129 229 V10.5.0 (2013-04) Clause 6.3.13 SIP-Auth-Data-Item AVP + */ + type record SIP_Auth_Data_Item_3GPP_AVP { + AVP_Header aVP_Header, //SIP-Auth-Data-Item ::= < AVP Header: 612 > + SIP_Authentication_Scheme_AVP sIP_Authentication_Scheme optional, + SIP_Item_Number_AVP sIP_Item_Number optional, + SIP_Authenticate_AVP sIP_Authenticate optional, + SIP_Authorization_AVP sIP_Authorization optional, + SIP_Authentication_Context_AVP sIP_Authentication_Context optional, + SIP_Digest_Authenticate_AVP sIP_Digest_Authenticate optional, + Confidentiality_Key_AVP confidentiality_Key optional, + Integrity_Key_AVP integrity_Key optional, + Framed_IP_Address_AVP framed_IP_Address optional, + Framed_IPv6_Prefix_AVP framed_IPv6_Prefix optional, + Framed_Interface_Id_AVP framed_Interface_Id optional, + Line_Identifier_AVP line_Identifier optional, + set of AVP_Type aVP_Type optional + } + + type record Integrity_Key_AVP { //ref: 7.3.58 + AVP_Header aVP_Header, //Integrity-Key ::= + octetstring aVP_Data + } + + type record Confidentiality_Key_AVP { //ref: 7.3.57 + AVP_Header aVP_Header, //Confidentiality-Key ::= + octetstring aVP_Data + } + + type record SIP_Digest_Authenticate_AVP{ + //Ref: RFC4740 9.5.3. SIP-Digest-Authenticate AVP + AVP_Header aVP_Header,//SIP-Digest-Authenticate ::= < AVP Header: 635 > + Digest_Realm_AVP digest_Realm,//requ. + Digest_Algorithm_AVP digest_Algorithm optional, + Digest_QoP_AVP digest_QoP optional, + Digest_HA1_AVP digest_HA1 optional, + set of AVP_Type aVP_Type optional + } + + type record Line_Identifier_AVP { //ref: ETSI TS 129 229 V10.5.0 (2013-04) 6.3.42 + AVP_Header aVP_Header, //Line_Identifier-Key ::= + octetstring aVP_Data + } + + type record SIP_Auth_Data_Item_RFC_AVP{ + //Ref: RFC4740 9.5. SIP-Auth-Data-Item AVP + AVP_Header aVP_Header,//SIP-Auth-Data-Item ::= < AVP Header: 376 > + SIP_Authentication_Scheme_AVP sIP_Authentication_Scheme,//requ. + SIP_Item_Number_AVP sIP_Item_Number optional, + SIP_Authenticate_AVP sIP_Authenticate optional, + SIP_Authorization_AVP sIP_Authorization optional, + SIP_Authentication_Info_AVP sIP_Authentication_Info optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 376);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type union SIP_Authentication_Scheme_AVP{ + SIP_Authentication_Scheme_RFC_AVP sIP_Authentication_Scheme_RFC_AVP, + SIP_Authentication_Scheme_3GPP_AVP sIP_Authentication_Scheme_3GPP_AVP + } + + type record SIP_Authentication_Scheme_RFC_AVP{ + //Ref: RFC4740 9.5.1. SIP-Authentication-Scheme AVP + AVP_Header aVP_Header,// + SIP_Auth_Schm_Type aVP_Data + } +// with { +// variant "present=bytes(4, 377);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_Item_Number_AVP{ + //Ref: RFC4740 9.5.2 SIP-Item-Number AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 378);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_Authenticate_3GPP_AVP{ + // Ref: 129 229 6.3.10. SIP-Authenticate AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } + + type union SIP_Authenticate_AVP { + SIP_Authenticate_RFC_AVP sIP_Authenticate_RFC_AVP, //RFC type definition + SIP_Authenticate_3GPP_AVP sIP_Authenticate_3GPP_AVP //3GPP type definition + } + + /** + * ETSI TS 129 229 Clause 6.3.9 SIP-Authentication-Scheme AVP + */ + type record SIP_Authentication_Scheme_3GPP_AVP{ + //Ref: RFC4740 9.5.1. SIP-Authentication-Scheme AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } + + type record SIP_Authorization_3GPP_AVP{ + // Ref: 129 229 6.3.11. SIP-Authorization AVP + AVP_Header aVP_Header,//SIP-Authorization ::= < AVP Header: 610 > + octetstring aVP_Data + } + + type record SIP_Authenticate_RFC_AVP{ + //Ref: RFC4740 9.5.3. SIP-Authenticate AVP + AVP_Header aVP_Header,//SIP-Authenticate ::= < AVP Header: 379 > + Digest_Realm_AVP digest_Realm,//requ. + Digest_Nonce_AVP digest_Nonce,//requ. + Digest_Domain_AVP digest_Domain optional, + Digest_Opaque_AVP digest_Opaque optional, + Digest_Stale_AVP digest_Stale optional, + Digest_Algorithm_AVP digest_Algorithm optional, + Digest_QoP_AVP digest_QoP optional, + Digest_HA1_AVP digest_HA1 optional, + set of Digest_Auth_Param_AVP digest_Auth_Param optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 379);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (digest_Auth_Param) "fieldPresent=bytes(1, 117)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type union SIP_Authorization_AVP { + SIP_Authorization_RFC_AVP sIP_Authorization_RFC_AVP, //RFC type definition + SIP_Authorization_3GPP_AVP sIP_Authorization_3GPP_AVP //3GPP type definition + } + + type record SIP_Authorization_RFC_AVP{ + // Ref: RFC4740 9.5.4. SIP-Authorization AVP + AVP_Header aVP_Header,//SIP-Authorization ::= < AVP Header: 380 > + Digest_Username_AVP digest_Username,//requi. + Digest_Realm_AVP digest_Realm, + Digest_Nonce_AVP digest_Nonce, + Digest_URI_AVP digest_URI, + Digest_Response_AVP digest_Response,//requi. + Digest_Algorithm_AVP digest_Algorithm optional, + Digest_CNonce_AVP digest_CNonce optional, + Digest_Opaque_AVP digest_Opaque optional, + Digest_QoP_AVP digest_QoP optional, + Digest_Nonce_Count_AVP digest_Nonce_Count optional, + Digest_Method_AVP digest_Method optional, + Digest_Entity_Body_Hash_AVP digest_Entity_Body_Hash optional, + set of Digest_Auth_Param_AVP digest_Auth_Param optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 380);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (digest_Auth_Param) "fieldPresent=bytes(1, 117)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record SIP_Authentication_Info_AVP{ + // Ref: RFC4740 9.5.5. SIP-Authentication-Info AVP + AVP_Header aVP_Header,//SIP-Authentication-Info ::= < AVP Header: 381 > + Digest_Nextnonce_AVP digest_Nextnonce optional, + Digest_QoP_AVP digest_QoP optional, + Digest_Response_Auth_AVP digest_Response_Auth optional, + Digest_CNonce_AVP digest_CNonce optional, + Digest_Nonce_Count_AVP digest_Nonce_Count optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 381);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + + type record SIP_Reason_Info_AVP{ + //Ref: RFC4740 9.7.2. SIP-Reason-Info AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 385);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record SIP_Deregistration_Reason_AVP{ + // Ref: RFC4740 9.5.5. SIP-Authentication-Info AVP + AVP_Header aVP_Header,//SIP-Deregistration-Reason ::= < AVP Header: 383 > + SIP_Reason_Code_AVP sIP_Reason_Code_AVP,//requi. + SIP_Reason_Info_AVP sIP_Reason_Info_AVP optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 383);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record SIP_Reason_Code_AVP{ + // Ref: RFC4740 .7.1. SIP-Reason-Code AVP + AVP_Header aVP_Header,// + SIP_Reason_Code_Type aVP_Data + } +// with { +// variant "present=bytes(4, 384);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + }//end of group RFC4740_AVPs + + /* ******** Digest AVPs ********* */ + group Digest_AVPs{ + //type UInt8 Digest_Ty_Type; + + type record Digest_Realm_AVP{ + //Ref:RFC4590 3.2. Digest-Realm Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of type system +// Digest_Ty_Type Type,//104 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 104)" +// variant (Length) "intTag='aVP_len', value-2" +// } + + type record Digest_Nonce_AVP{ + //Ref:RFC4590 3.3. Digest-Nonce Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//105 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 105)" +// variant (Length) "intTag='aVP_len', value-2" +// } + + type record Digest_Domain_AVP{ + //Ref:RFC4590 3.17. Digest-Domain Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//119 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 119)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Opaque_AVP{ + //Ref:RFC4590 3.14. Digest-Opaque Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//116 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 116)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Stale_AVP{ + //Ref:RFC4590 3.18. Digest-Stale Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//120 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 120)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Algorithm_AVP{ + //Ref:RFC4590 3.9. Digest-Algorithm Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//111 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 111)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_QoP_AVP{ + //Ref:RFC4590 3.8. Digest-Qop Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type, //110 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 110)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_HA1_AVP{ + //Ref:RFC4590 3.19. Digest-HA1 Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//121 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 121)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Auth_Param_AVP{ + //Ref:RFC4590 3.15. Digest-Auth-Param Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//117 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 117);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (Length) "intTag='aVP_len', value-2" +// variant (Text) "condition=CodecHelper.leaveScope()" +// } + type record Digest_Username_AVP{ + //Ref:RFC4590 3.13. Digest-Username Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type, //115 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 115)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_URI_AVP{ + //Ref:RFC4590 3.7. Digest-URI Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type, //109 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 109)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Response_AVP{ + //Ref:RFC4590 + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//103 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 103)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_CNonce_AVP{ + //Ref:RFC4590 3.11. Digest-CNonce Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type, //113 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 113)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Nonce_Count_AVP{ + //Ref:RFC4590 3.12. Digest-Nonce-Count Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//114 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 114)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Method_AVP{ + //Ref:RFC4590 3.6. Digest-Method Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type, //108 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 108)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Entity_Body_Hash_AVP{ + //Ref:RFC4590 3.10. Digest-Entity-Body-Hash Attribute + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//112 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 112)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Nextnonce_AVP{ + //Ref:RFC4590 + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//107 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 107)" +// variant (Length) "intTag='aVP_len', value-2" +// } + type record Digest_Response_Auth_AVP{ + //Ref:RFC4590 + AVP_Header aVP_Header,// + UTF8String aVP_Data +// Changed due to the common syntax of Diameter data type system +// Digest_Ty_Type Type,//106 +// UInt8 Length, +// UTF8String Text + } +// with { +// variant "present=bytes(1, 106)" +// variant (Length) "intTag='aVP_len', value-2" +// } + /* ************ end of Digest AVPs************ */ + }//end of Digest AVPs + /* ***** Sh Ref: 3GPP TS 29.329 Table 6.3.1: Diameter Multimedia Application AVPs ***** + User_Identity (700), + MSISDN (701), + Data_Reference (703), + Service_Indication (704), + Subs_Req_Type (705), + Requested-Domain (706), + Current-Location (707), + Identity-Set (708), + Expiry-Time (709), + Send-Data-Indication (710), + Server-Name (602), + Supported-Features (628), + Feature-List-ID (629), + Feature-List (630), + Supported-Applications (631), + Public-Identity (601), + DSAI-Tag (711), + Wildcarded-PSI (634), + Wildcarded-IMPU (636) */ + group Sh_AVPs{ + type record Public_Identity_AVP{ + // Ref: 3GPP TS 29.329 6.3.15 Public-Identity AVP + // 3GPP TS 29.229 6.3.2 Public-Identity AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 601);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type set of Public_Identity_AVP Public_Identity_AVPs; + + type record User_Identity_AVP{ + // Ref: 3GPP TS 29.329 6.3.1 User-Identity AVP + AVP_Header aVP_Header,// + Public_Identity_AVP public_Identity_AVP optional, + MSISDN_AVP mSISDN_AVP optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 700);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record MSISDN_AVP{ + // Ref: 3GPP TS 29.329 6.3.2 MSISDN AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 700);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Data_Reference_AVP{ + // Ref: 3GPP TS 29.3296.3.4 Data-Reference AVP + AVP_Header aVP_Header,// + Data_Reference_Type aVP_Data + } +// with { +// variant "present=bytes(4, 703);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Service_Indication_AVP{ + // Ref: 3GPP TS 29.329 6.3.5 Service-Indication AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 704);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + + type record Subs_Req_Type_AVP{ + // Ref: 3GPP TS 29.329 6.3.6 Subs-Req-Type AVP + AVP_Header aVP_Header,// + Subs_Req_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 705);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Requested_Domain_AVP{ + // Ref: 3GPP TS 29.329 6.3.7 Requested-Domain AVP + AVP_Header aVP_Header,// + Request_Domain_Type aVP_Data + } +// with { +// variant "present=bytes(4, 706);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Current_Location_AVP{ + // Ref: 3GPP TS 29.329 6.3.8 Current-Location AVP + AVP_Header aVP_Header,// + Current_Location_Type aVP_Data + } +// with { +// variant "present=bytes(4, 707);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Identity_Set_AVP{ + // Ref: 3GPP TS 29.329 6.3.10 Identity-Set AVP + AVP_Header aVP_Header,// + Identity_Set_Type aVP_Data + } +// with { +// variant "present=bytes(4, 708);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Expiry_Time_AVP{ + // Ref: 3GPP TS 29.329 6.3.16 Expiry-Time + AVP_Header aVP_Header,// + Time aVP_Data + } +// with { +// variant "present=bytes(4, 709);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Send_Data_Indication_AVP{ + // Ref: 3GPP TS 29.329 6.3.17 Send-Data-Indication AVP + AVP_Header aVP_Header,// + Send_Data_Indication_Type aVP_Data + } +// with { +// variant "present=bytes(4, 710);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Repository_Data_ID_AVP { + //ref: TS129 328 6.3.24 + AVP_Header aVP_Header, //Repository Data ID ::= + Service_Indication_AVP service_Indication, + Sequence_Number_AVP sequence_Number, + set of AVP_Type aVP_Type optional + } + + type record Sequence_Number_AVP{ + //Ref: TS129 328 6.3.25 + AVP_Header aVP_Header,// + UInt32 aVP_Data + } + + type record Server_Name_AVP{ + // Ref: 3GPP TS 29.329 6.3.9 Server-Name AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 602);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Supported_Features_AVP{ + // Ref: 3GPP TS 29.329 6.3.11 Supported-Features AVP (See 3GPP TS 29.229, clause 6.3.29) + AVP_Header aVP_Header,// + Vendor_Id_AVP vendor_Id, + Feature_List_ID_AVP feature_list_Id optional, + Feature_List_AVP feature_list, + set of AVP_Type aVP_Data optional //other parameters. + } +// with { +// variant "present=bytes(4, 628);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + type record Feature_List_ID_AVP{ + // Ref: 3GPP TS 29.229, clause 6.3.30 + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 629);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Feature_List_AVP{ + // Ref: 3GPP TS 29.229, clause 6.3.31 + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 630);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Wildcarded_PSI_AVP{ + // Ref: 3GPP TS 29.329 6.3.19 Wildcarded-PSI AVP , 3GPP TS 29.229 + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 634);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Wildcarded_IMPU_AVP{ + // Ref: 3GPP TS 29.329 6.3.20 Wildcarded-IMPU AVP , 3GPP TS 29.229 + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 636);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record DSAI_Tag_AVP{ + // Ref: 3GPP TS 29.329 6.3.18 DSAI-Tag AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 711);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type record Experimental_Result_Code_AVP{ + // Ref: 3GPP TS 29.229 6.2 Result-Code AVP values + AVP_Header aVP_Header,// + Experimental_Result_Type aVP_Data + } +// with { +// variant "present=bytes(4, 298);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Experimental_Result_AVP{ + // Ref: 3GPP TS 29.229 6.2 Result-Code AVP values + // FUN 766300-PCL-030 : Experimental-Result AVP shall be used for Sh/Dh errors. + // This is a grouped AVP which contains the 3GPP Vendor ID in the Vendor-Id AVP, and the error code in + // the Experimental-Result-Code AVP. + AVP_Header aVP_Header,// + Vendor_Id_AVP vendor_Id, + Experimental_Result_Code_AVP experimental_Result_Code + } +// with { +// variant "present=bytes(4, 297);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (experimental_Result_Code) "condition=CodecHelper.leaveScope()" +// } + type record User_Data_AVP{ + // Ref: 3GPP TS 29.229 6.3.7 User-Data AVP + // Ref: + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 606);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + } + + group RFC4005_AVPs{ + group NAS_Session_AVPs{ + + type record Called_Station_Id_AVP{ + // Ref: RFC4005 4.5 Called_Station_Id AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 30);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + }//end group NAS_Session_AVPs + + group IP_Access_Authorization_AVPs { + + type record Framed_IP_Address_AVP{ + // Ref: RFC4005 6.11.1 Framed_IP_Address AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 8);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Framed_IPv6_Prefix_AVP{ + // Ref: RFC4005 6.11.1 Framed_IPv6_Prefix AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 97);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Framed_Interface_Id_AVP{ + // Ref: RFC4005 6.11.5. Framed-Interface-Id AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 97);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + }//end group IP_Access_Authorization_AVPs + + }//end group RFC4005_AVPs + + /* ***** Rf and Ro Ref: RFC4006 ***** */ + group RFC4006_AVPs{ + type record Service_Context_Id_AVP{ + // Ref: RFC4006 8.42. Service-Context-Id AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 461);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Request_Type_AVP{ + // Ref: RFC4006 8.3. CC-Request-Type AVP + AVP_Header aVP_Header,// + CC_Request_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 416);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Request_Number_AVP{ + // Ref: RFC4006 8.2. CC-Request-Number AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 415);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Sub_Session_Id_AVP{ + // Ref: RFC4006 8.5. CC-Sub-Session-Id AVP + AVP_Header aVP_Header,// + UInt64 aVP_Data + } +// with { +// variant "present=bytes(4, 419);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Subscription_Id_Type_AVP{ + // Ref: RFC4006 8.47. Subscription-Id-Type AVP + AVP_Header aVP_Header,// + Subscription_Id_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 450);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Subscription_Id_Data_AVP{ + // Ref: RFC4006 + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 444);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Subscription_Id_AVP{ + // Ref: RFC4006 8.46. Subscription-Id AVP + AVP_Header aVP_Header,//< AVP Header: 443 > + Subscription_Id_Type_AVP subscription_Id_Type, + Subscription_Id_Data_AVP subscription_Id_Data + } +// with { +// variant "present=bytes(4, 443);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (subscription_Id_Data) "condition=CodecHelper.leaveScope()" +// } + type record Service_Identifier_AVP{ + // Ref: RFC4006 8.28. Service-Identifier AVP + AVP_Header aVP_Header,//< AVP Header: 439 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 439);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Time_AVP{ + // Ref: RFC4006 8.21. CC-Time AVP + AVP_Header aVP_Header,//< AVP Header: 420 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 420);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Value_Digits_AVP{ + // Ref: RFC4006 8.10. Value-Digits AVP + AVP_Header aVP_Header,//< AVP Header: 447 > + Int64 aVP_Data + } +// with { +// variant "present=bytes(4, 447);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Exponent_AVP{ + // Ref: RFC4006 8.9. Exponent AVP + AVP_Header aVP_Header,//< AVP Header: 429 > + Int32 aVP_Data + } +// with { +// variant "present=bytes(4, 429);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Unit_Value_AVP{ + // Ref: RFC4006 8.8. Unit-Value AVP + AVP_Header aVP_Header,//< AVP Header: 445 > + Value_Digits_AVP value_Digits, + Exponent_AVP exponent optional + } +// with { +// variant "present=bytes(4, 445);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (exponent) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + type record Currency_Code_AVP{ + // Ref: RFC4006 8.11. Currency-Code AVP + AVP_Header aVP_Header,//< AVP Header: 425 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 425);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type set CC_Money_AVP{ + // Ref: RFC4006 8.22. CC-Money AVP + AVP_Header aVP_Header,//< AVP Header: 413 > + Unit_Value_AVP unit_Value, + Currency_Code_AVP currency_Code optional + } +// with { +// variant "present=bytes(4, 413);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (currency_Code) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record CC_Total_Octets_AVP{ + // Ref: RFC4006 8.23. CC-Total-Octets AVP + AVP_Header aVP_Header,//< AVP Header: 421 > + UInt64 aVP_Data + } +// with { +// variant "present=bytes(4, 421);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Input_Octets_AVP{ + // Ref: RFC4006 8.24. CC-Input-Octets AVP + AVP_Header aVP_Header,//< AVP Header: 412 > + UInt64 aVP_Data + } +// with { +// variant "present=bytes(4, 412);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Output_Octets_AVP{ + // Ref: RFC4006 8.25. CC-Output-Octets AVP + AVP_Header aVP_Header,//< AVP Header: 414 > + UInt64 aVP_Data + } +// with { +// variant "present=bytes(4, 414);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record CC_Service_Specific_Units_AVP{ + // Ref: RFC4006 8.26. CC-Service-Specific-Units AVP + AVP_Header aVP_Header,//< AVP Header: 417 > + UInt64 aVP_Data + } +// with { +// variant "present=bytes(4, 417);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type set Requested_Service_Unit_AVP{ + // Ref: RFC4006 8.18. Requested-Service-Unit AVP + AVP_Header aVP_Header,//< AVP Header: 437 > + CC_Time_AVP cC_Time optional, + CC_Money_AVP cC_Money optional, + CC_Total_Octets_AVP cC_Total_Octets optional, + CC_Input_Octets_AVP cC_Input_Octets optional, + CC_Output_Octets_AVP cC_Output_Octets optional, + CC_Service_Specific_Units_AVP cC_Service_Specific_Units optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 437);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (cC_Money) "fieldPresent=bytes(4, 413);decode=CodecHelper.decodeCC_Money_AVP()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + type record Requested_Action_AVP{ + // Ref: RFC4006 8.41. Requested-Action AVP + AVP_Header aVP_Header,//< AVP Header: 436 > + Requested_Action_Type aVP_Data + } +// with { +// variant "present=bytes(4, 436);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Tariff_Change_Usage_AVP{ + // Ref: RFC4006 8.27. Tariff-Change-Usage AVP + AVP_Header aVP_Header,//< AVP Header: 452 > + Tariff_Change_Usage_Type aVP_Data + } +// with { +// variant "present=bytes(4, 452);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + /** + * @desc The Quota-Holding-Time AVP (AVP code 872) + * @member aVP_Header Header AVP + * @member aVP_Data Specifies the reason for usage reporting for one or more types of quota for a particular category + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.175 Reporting-Reason AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Reporting_Reason_AVP { + AVP_Header aVP_Header,// + Reporting_Reason aVP_Data + } // End of type Reporting_Reason_AVP + + /** + * @desc The Reporting_Reason enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.175 Reporting-Reason AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Reporting_Reason { + THRESHOLD_E (0), + QHT_E (1), + FINAL_E (2), + QUOTA_EXHAUSTED_E (3), + VALIDITY_TIME_E (4), + OTHER_QUOTA_TYPE_E (5), + RATING_CONDITION_CHANGE_E (6), + FORCED_REAUTHORISATION_E (7), + POOL_EXHAUSTED_E (8) +// } with { +// variant "length=32" + } // End of type Reporting_Reason + + type set Used_Service_Unit_AVP{ + // Ref: RFC4006 8.19. Used-Service-Unit AVP + AVP_Header aVP_Header,//< AVP Header: 446 > + Reporting_Reason_AVP reporting_Reason optional, // TS 132 299 + Tariff_Change_Usage_AVP tariff_Change_Usage optional, + CC_Time_AVP cC_Time optional, + CC_Money_AVP cC_Money optional, + CC_Total_Octets_AVP cC_Total_Octets optional, + CC_Input_Octets_AVP cC_Input_Octets optional, + CC_Output_Octets_AVP cC_Output_Octets optional, + CC_Service_Specific_Units_AVP cC_Service_Specific_Units optional, + Event_Charging_TimeStamp_AVP event_Charging_TimeStamp optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 446);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (cC_Money) "fieldPresent=bytes(4, 413);decode=CodecHelper.decodeCC_Money_AVP()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + /** + * @desc Event-Charging-TimeStamp_AVP (AVP code 1258) + * @member aVP_Header Header AVP + * @member Time Holds the type Time - timestamp of the event reported in the CC-Service-Specific-Units AVP + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.64 Event-Charging-TimeStamp_AVP + */ + type record Event_Charging_TimeStamp_AVP{ + AVP_Header aVP_Header,//< AVP Header: 1258 > + Time aVP_Data + } + + type record Multiple_Services_Indicator_AVP{ + // Ref: RFC4006 8.40. Multiple-Services-Indicator AVP + AVP_Header aVP_Header,//< AVP Header: 455 > + Multiple_Serv_Indi_Type aVP_Data + } +// with { +// variant "present=bytes(4, 455);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Tariff_Time_Change_AVP{ + // Ref: RFC4006 8.20. Tariff-Time-Change AVP + AVP_Header aVP_Header,//< AVP Header: 451 > + Time aVP_Data + } +// with { +// variant "present=bytes(4, 451);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type set Granted_Service_Unit_AVP{ + // Ref: RFC4006 8.17. Granted-Service-Unit AVP + AVP_Header aVP_Header,//< AVP Header: 431 > + Tariff_Time_Change_AVP tariff_Time_Change optional, + CC_Time_AVP cC_Time optional, + CC_Money_AVP cC_Money optional, + CC_Total_Octets_AVP cC_Total_Octets optional, + CC_Input_Octets_AVP cC_Input_Octets optional, + CC_Output_Octets_AVP cC_Output_Octets optional, + CC_Service_Specific_Units_AVP cC_Service_Specific_Units optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 431);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (cC_Money) "fieldPresent=bytes(4, 413);decode=CodecHelper.decodeCC_Money_AVP()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Rating_Group_AVP{ + // Ref: RFC4006 8.29. Rating-Group AVP + AVP_Header aVP_Header,//< AVP Header: 433 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 433);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record G_S_U_Pool_Identifier_AVP{ + // Ref: RFC4006 8.31. G-S-U-Pool-Identifier AVP + AVP_Header aVP_Header,//< AVP Header: 453 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 453);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record CC_Unit_Type_AVP{ + // Ref: RFC4006 8.32. CC-Unit-Type AVP + AVP_Header aVP_Header,//< AVP Header: 454 > + CC_Unit_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 454);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type set G_S_U_Pool_Reference_AVP{ + // Ref: RFC4006 8.30. G-S-U-Pool-Reference AVP + AVP_Header aVP_Header,//< AVP Header: 457 > + G_S_U_Pool_Identifier_AVP g_S_U_Pool_Identifier, + CC_Unit_Type_AVP cC_Unit_Type, + Unit_Value_AVP unit_Value + } +// with { +// variant "present=bytes(4, 457);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (unit_Value) "condition=CodecHelper.leaveScope()" +// } + type record Validity_Time_AVP{ + // Ref: RFC4006 8.33. Validity-Time AVP + AVP_Header aVP_Header,//< AVP Header: 448 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 448);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Final_Unit_Action_AVP{ + // Ref: RFC4006 8.35. Final-Unit-Action AVP + AVP_Header aVP_Header,//< AVP Header: 449 > + Final_Unit_Action_Type aVP_Data + } +// with { +// variant "present=bytes(4, 449);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Restriction_Filter_Rule_AVP{ + // Ref: RFC4006 8.36. Restriction-Filter-Rule AVP + AVP_Header aVP_Header,//< AVP Header: 438 > + IPFilterRule_Type aVP_Data + } +// with { +// variant "present=bytes(4, 438);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Filter_Id_AVP{ + // Ref: RFC4005 6.7. Filter-Id AVP + AVP_Header aVP_Header,//< AVP Header: 11 > + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 11);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Redirect_Address_Type_AVP{ + // Ref: RFC4006 8.38. Redirect-Address-Type AVP + AVP_Header aVP_Header,//< AVP Header: 433 > + Redirect_Address_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 433);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Redirect_Server_Address_AVP{ + // Ref: RFC4006 8.39. Redirect-Server-Address AVP + AVP_Header aVP_Header,//< AVP Header: 435 > + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 435);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Redirect_Server_AVP{ + // Ref: RFC4006 8.37. Redirect-Server AVP + AVP_Header aVP_Header,//< AVP Header: 434 > + Redirect_Address_Type_AVP redirect_Address_Type, + Redirect_Server_Address_AVP redirect_Server_Address + } +// with { +// variant "present=bytes(4, 434);use=com.testingtech.ttcn.tci.codec.CodecHelper" + // variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type set Final_Unit_Indication_AVP{ + // Ref: RFC4006 8.34. Final-Unit-Indication AVP + AVP_Header aVP_Header,//< AVP Header: 430 > + Final_Unit_Action_AVP final_Unit_Action, + set of Restriction_Filter_Rule_AVP restriction_Filter_Rule optional, + set of Filter_Id_AVP filter_Id optional, + Redirect_Server_AVP redirect_Server optional + } +// with { +// variant "present=bytes(4, 430);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (restriction_Filter_Rule) "fieldPresent=bytes(4, 438)&&CodecHelper.isAvailable()" +// variant (filter_Id) "fieldPresent=bytes(4, 11)&&CodecHelper.isAvailable()" +// variant (redirect_Server) "condition=CodecHelper.leaveScope()" +// } + + type set Multiple_Services_Credit_Control_AVP{ + // Ref: RFC4006 8.16. Multiple-Services-Credit-Control AVP + // Ref: TS 132 299 Clause 7.1.9 Multiple-Services-Credit-Control + AVP_Header aVP_Header,//< AVP Header: 456 > + Granted_Service_Unit_AVP granted_Service_Unit optional, + Requested_Service_Unit_AVP requested_Service_Unit optional, + set of Used_Service_Unit_AVP used_Service_Unit optional, + Tariff_Change_Usage_AVP tariff_Change_Usage optional, + set of Service_Identifier_AVP service_Identifier optional, + Rating_Group_AVP rating_Group optional, + set of G_S_U_Pool_Reference_AVP g_S_U_Pool_Reference optional, + Validity_Time_AVP validity_Time optional, + Result_Code_AVP result_Code optional, + Final_Unit_Indication_AVP final_Unit_Indication optional, + Time_Quota_Threshold_AVP time_Quota_Threshold optional, // TS 132 299 + Volume_Quota_Threshold_AVP volume_Quota_Threshold optional, // TS 132 299 + Unit_Quota_Threshold_AVP unit_Quota_Threshold optional, // TS 132 299 + Quota_Holding_Time_AVP quota_Holding_Time optional, // TS 132 299 + Quota_Consumption_Time_AVP quota_Consumption_Time optional, // TS 132 299 + set of Reporting_Reason_AVP reporting_Reason optional, // TS 132 299 + Trigger_AVP trigger_ optional, // TS 132 299 + PS_Furnish_Charging_Information_AVP ps_Furnish_Charging_Information optional, // TS 132 299 + Refund_Information_AVP refund_Information optional, // TS 132 299 + set of AF_Correlation_Information_AVP aF_Correlation_Information optional, // TS 132 299 + set of Envelope_AVP envelope optional, // TS 132 299 + Envelope_Reporting_AVP envelope_Reporting optional, // TS 132 299 + Time_Quota_Mechanism_AVP time_Quota_Mechanism optional, // TS 132 299 + set of Service_Specific_Info_AVP service_Specific_Info optional, // TS 132 299 + QoS_Information_AVP qoS_Information optional, // TS 132 299 + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 456);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (used_Service_Unit) "fieldPresent=bytes(4, 446)&&CodecHelper.isAvailable()" +// variant (service_Identifier) "fieldPresent=bytes(4, 439)&&CodecHelper.isAvailable()" +// variant (g_S_U_Pool_Reference) "fieldPresent=bytes(4, 457)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + /** + * @desc The Time-Quota-Mechanism AVP (AVP code 1270) + * @member aVP_Header Header AVP + * @member aVP_Data_Quota_Type TODO + * @member base_Time_Interval TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.228 Time-Quota-Mechanism + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Time_Quota_Mechanism_AVP { + AVP_Header aVP_Header,// + Time_Quota_Type_AVP time_Quota_Type optional, + Base_Time_Interval_AVP base_Time_Interval optional + } // End of type Time_Quota_Mechanism_AVP + + /** + * @desc Base-Time-Interval AVP (AVP code 1265) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the length of the base time interval, for controlling the consumption of time quota, in seconds + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.29 Base-Time-Interval AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Base_Time_Interval_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Base_Time_Interval_AVP + + /** + * @desc The Time-Quota-Type AVP (AVP code 1271) + * @member aVP_Header Header AVP + * @member aVP_Data Indicate which time quota consumption mechanism shall be used for the associated Rating Group + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.230 Time-Quota-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Time_Quota_Type_AVP { + AVP_Header aVP_Header,// + Time_Quota_Type aVP_Data + } // End of type Time_Quota_Type_AVP + + /** + * @desc The Time-Quota-Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.230 Time-Quota-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Time_Quota_Type { + DISCRETE_TIME_PERIOD_E (0), + CONTINUOUS_TIME_PERIOD_E (1) +// } with { +// variant "length=32" + } // End of type Time_Quota_Type + + /** + * @desc The AF-Correlation-Information AVP (AVP code 1276) + * @member aVP_Header Header AVP + * @member af_Charging_Identifier TODO + * @member flows Flow identifiers generated by the AF and received by P-GW over Rx/Gx as defined in TS 29.214 [214] and TS 29.212 [215] + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.11 AF-Correlation-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AF_Correlation_Information_AVP { + AVP_Header aVP_Header,// + AF_Charging_Identifier_AVP af_Charging_Identifier optional, + set of Flows_AVP flows optional + } // End of type AF_Correlation_Information_AVP + + type record AF_Signalling_Protocol_AVP{ + //Ref: ETSI TS 129 214 AF_Signalling_Protocol AVP + AVP_Header aVP_Header,// + AF_Signalling_Protocol_Type aVP_Data + } +// with { +// variant "present=bytes(4, 529);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type enumerated AF_Signalling_Protocol_Type{ + // Ref: ETSI TS 129 214 5.3.26 + NO_INFORMATION_E (0), + SIP_E (1) + } +// with { +// variant "length=32" +// } + + type record Flows_AVP{ + //Ref: ETSI TS 129 214 Flows_AVP + AVP_Header aVP_Header,// + Media_Component_Number_AVP media_component_number, + set of Flow_Number_AVP flow_Number optional, + Final_Unit_Action_AVP final_unit_action optional + } + // with { +// variant "present=bytes(4, 510);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (flow_Number) "fieldPresent=bytes(4, 509)&&CodecHelper.isAvailable()" +// variant (final_unit_action) "condition=CodecHelper.leaveScope()" +// } + + type record Flow_Status_AVP{ + //Ref: ETSI TS 129 214 Flow_Status AVP + AVP_Header aVP_Header,// + Flow_Status_Type aVP_Data + } +// with { +// variant "present=bytes(4, 511);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Flow_Description_AVP{ + //Ref: ETSI TS 129 214 Flow_Description AVP + AVP_Header aVP_Header,// + IPFilterRule_Type aVP_Data + } + // with { + // variant "present=bytes(4, 507);use=com.testingtech.ttcn.tci.codec.CodecHelper" + // variant (aVP_Data) "condition=CodecHelper.leaveScope()" + // } + + type record Flow_Number_AVP{ + //Ref: ETSI TS 129 214 Flow_Number AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 509);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type enumerated Flow_Status_Type{ + // Ref: ETSI TS 129 214 5.3.11 + ENABLED_UPLINK_E (0), + ENABLED_DOWNLINK_E (1), + ENABLED_E (2), + DISABLED_E (3), + REMOVED_E (4) + } +// with { +// variant "length=32" +// } + + type record Media_Component_Number_AVP{ + //Ref: ETSI TS 129 214 Media_Component_Number_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 518);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record AF_Charging_Identifier_AVP{ + //Ref: ETSI TS 129 214 AF_Charging_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 505);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + /** + * @desc Envelope AVP (AVP code 1266) + * @member aVP_Header Header AVP + * @member envelope_Start_Time TODO + * @member envelope_End_Time TODO + * @member cC_Total_Octets TODO + * @member cC_Input_Octets TODO + * @member cC_Output_Octets TODO + * @member cC_Service_Specific_Units TODO + * @member aVP_Type TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.59 Envelope AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Envelope_AVP { + AVP_Header aVP_Header,// + Envelope_Start_Time_AVP envelope_Start_Time, + Envelope_End_Time_AVP envelope_End_Time optional, + CC_Total_Octets_AVP cC_Total_Octets optional, + CC_Input_Octets_AVP cC_Input_Octets optional, + CC_Output_Octets_AVP cC_Output_Octets optional, + CC_Service_Specific_Units_AVP cC_Service_Specific_Units optional, + set of AVP_Type aVP_Type optional + } // End of type Envelope_AVP + + /** + * @desc The Envelope-End-Time AVP (AVP code 1267) + * @member aVP_Header Header AVP + * @member aVP_Data Indicate the time of the end of the time envelope + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.62 Envelope-End-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Envelope_End_Time_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type Envelope_End_Time_AVP + + /** + * @desc The Envelope-Start-Time AVP (AVP code 1269) + * @member aVP_Header Header AVP + * @member aVP_Data Indicate the time of the packet of user data which caused the time envelope to start + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.62 Envelope-Start-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Envelope_Start_Time_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type Envelope_Start_Time_AVP + + /** + * @desc The Refund-Information AVP (AVP code 2022) + * @member aVP_Header Header AVP + * @member aVP_Data Conveys relevant information for the OCS application relative to refund mechanism + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.171 Refund-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Refund_Information_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type Refund_Information_AVP + + /** + * @desc The Trigger AVP (AVP code 1264) + * @member aVP_Header Header AVP + * @member trigger_Type Holds the trigger types + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.235 Trigger AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Trigger_AVP { + AVP_Header aVP_Header,// + set of Trigger_Type_AVP trigger_Type + } // End of type Trigger_AVP + + /** + * @desc The Trigger-Type AVP (AVP code 870) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates a single re-authorisation event type + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.236 Trigger-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Trigger_Type_AVP { + AVP_Header aVP_Header,// + Trigger_Type aVP_Data + } // End of type Trigger_Type_AVP + + /** + * @desc The Trigger_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.235 Trigger AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Trigger_Type { + CHANGE_IN_SGSN_IP_ADDRESS_E (1), + CHANGE_IN_QOS_E (2), + CHANGE_IN_LOCATION_E (3), + CHANGE_IN_RAT_E (4), + CHANGE_IN_UE_TIMEZONE_E (5), + CHANGEINQOS_TRAFFIC_CLASS_E (10), + CHANGEINQOS_RELIABILITY_CLASS_E (11), + CHANGEINQOS_DELAY_CLASS_E (12), + CHANGEINQOS_PEAK_THROUGHPUT_E (13), + CHANGEINQOS_PRECEDENCE_CLASS_E (14), + CHANGEINQOS_MEAN_THROUGHPUT_E (15), + CHANGEINQOS_MAXIMUM_BIT_RATE_FOR_UPLINK_E (16), + CHANGEINQOS_MAXIMUM_BIT_RATE_FOR_DOWNLINK_E (17), + CHANGEINQOS_RESIDUAL_BER_E (18), + CHANGEINQOS_SDU_ERROR_RATIO_E (19), + CHANGEINQOS_TRANSFER_DELAY_E (20), + CHANGEINQOS_TRAFFIC_HANDLING_PRIORITY_E (21), + CHANGEINQOS_GUARANTEED_BIT_RATE_FOR_UPLINK_E (22), + CHANGEINQOS_GUARANTEED_BIT_RATE_FOR_DOWNLINK_E (23), + CHANGEINLOCATION_MCC_E (30), + CHANGEINLOCATION_MNC_E (31), + CHANGEINLOCATION_RAC_E (32), + CHANGEINLOCATION_LAC_E (33), + CHANGEINLOCATION_CellId_E (34), + CHANGEINLOCATION_TAC_E (35), + CHANGEINLOCATION_ECGI_E (36), + CHANGE_IN_MEDIA_COMPOSITION_E (40), + CHANGE_IN_PARTICIPANTS_NMB_E (50), + CHANGE_IN_THRSHLD_OF_PARTICIPANTS_NMB_E (51), + CHANGE_IN_USER_PARTICIPATING_TYPE_E (52), + CHANGE_IN_SERVICE_CONDITION_E (60), + CHANGE_IN_SERVING_NODE_E (61), + CHANGE_IN_USER_CSG_INFORMATION_E (70), + CHANGE_IN_HYBRID_SUBSCRIBED_USER_CSG_INFORMATION_E (71), + CHANGE_IN_HYBRID_UNSUBSCRIBED_USER_CSG_INFORMATION_E (72) +// } with { +// variant "length=32" + } // End of type Trigger_Type + + /** + * @desc The Envelope-Reporting AVP (AVP code 1268) + * @member aVP_Header Header AVP + * @member aVP_Data Indicate whether the client shall report the start and end of each time envelope, in those cases in which quota is consumed in envelopes + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.61 Envelope-Reporting AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Envelope_Reporting_AVP { + AVP_Header aVP_Header,// + Envelope_Reporting aVP_Data + } // End of type Envelope_Reporting_AVP + + /** + * @desc The Envelope-Reporting enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.61 Envelope-Reporting AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Envelope_Reporting { + DO_NOT_REPORT_ENVELOPES_E (0), + REPORT_ENVELOPES_E (1), + REPORT_ENVELOPES_WITH_VOLUME_E (2), + REPORT_ENVELOPES_WITH_EVENTS_E (3), + REPORT_ENVELOPES_WITH_VOLUME_AND_EVENTS_E (4) +// } with { +// variant "length=32" + } // End of type Envelope_Reporting + + /** + * @desc The Service-Specific-Info AVP (AVP code 1249) + * @member aVP_Header Header AVP + * @member reason Contains the reason for closing a container and the addition of a new container + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.195 Service-Specific-Info AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Service_Specific_Info_AVP { + AVP_Header aVP_Header,// + Service_Specific_Data_AVP service_Specific_Data, + Service_Specific_Type_AVP service_Specific_Type + } // End of type Service_Specific_Info_AVP + + /** + * @desc Service-Specific-Type AVP (AVP code 1257) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the type of the Service-Specific-Data + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.196 Service-Specific-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Service_Specific_Type_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Service_Specific_Type_AVP + + /** + * @desc The Service-Specific-Data AVP (AVP code 863) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the value of the Service-Specific-Data + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.194 Service-Specific-Data AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Service_Specific_Data_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Service_Specific_Data_AVP + + type record QoS_Information_AVP{ + //Ref: ETSI TS 129 212 QoS_Information_AVP + AVP_Header aVP_Header, // + QoS_Class_Identifier_AVP qoS_Class_Identifier optional, + Max_Requested_Bandwidth_UL_AVP max_Requested_Bandwidth_UL optional, + Max_Requested_Bandwidth_DL_AVP max_Requested_Bandwidth_DL optional, + Guaranteed_Bitrate_UL_AVP guaranteed_Bitrate_UL optional, + Guaranteed_Bitrate_DL_AVP guaranteed_Bitrate_DL optional, + Bearer_Identifier_AVP bearer_Identifier optional, + Allocation_Retention_Priority_AVP allocation_Retention_Priority optional, + APN_Aggregate_Max_Bitrate_UL_AVP aPN_Aggregate_Max_Bitrate_UL optional, + APN_Aggregate_Max_Bitrate_DL_AVP aPN_Aggregate_Max_Bitrate_DL optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1016);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Allocation_Retention_Priority_AVP{ + //Ref: ETSI TS 129 212 Allocation_Retention_Priority_AVP + AVP_Header aVP_Header, // + Priority_Level_AVP priority_Level, + Pre_emption_Capability_AVP pre_emption_Capability optional, + Pre_emption_Vulnerability_AVP pre_emption_Vulnerability optional + } +// with { +// variant "present=bytes(4, 1034);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (pre_emption_Vulnerability) "condition=CodecHelper.leaveScope()" +// } + + type record Pre_emption_Capability_AVP{ + //Ref: ETSI TS 129 212 Pre_emption_Capability_AVP + AVP_Header aVP_Header,// + Pre_emption_Capability aVP_Data + } +// with { +// variant "present=bytes(4, 1047);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type enumerated Pre_emption_Capability{ + // Ref: ETSI TS 129 212 5.3.46 + PRE_EMPTION_CAPABILITY_ENABLED_E (0), + PRE_EMPTION_CAPABILITY_DISABLED_E (1) + } +// with { +// variant "length=32" +// } + + type record Pre_emption_Vulnerability_AVP{ + //Ref: ETSI TS 129 212 Pre_emption_Vulnerabilitye_AVP + AVP_Header aVP_Header,// + Pre_emption_Vulnerability aVP_Data + } + // with { + // variant "present=bytes(4, 1048);use=com.testingtech.ttcn.tci.codec.CodecHelper" + // variant (aVP_Data) "condition=CodecHelper.leaveScope()" + // } + + type enumerated Pre_emption_Vulnerability{ + // Ref: ETSI TS 129 212 5.3.47 + PRE_EMPTION_VULNERABILITY_ENABLED_E (0), + PRE_EMPTION_VULNERABILITY_DISABLED_E (1) + } +// with { +// variant "length=32" +// } + + type record Priority_Level_AVP{ + //Ref: ETSI TS 129 212 Priority_Level_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1046);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Bearer_Identifier_AVP{ + //Ref: ETSI TS 129 212 Bearer_Identifier_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1020);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Guaranteed_Bitrate_DL_AVP{ + //Ref: ETSI TS 129 212 Guaranteed_Bitrate_DL_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1025);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Guaranteed_Bitrate_UL_AVP{ + //Ref: ETSI TS 129 212 Guaranteed_Bitrate_UL_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1026);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Max_Requested_Bandwidth_UL_AVP{ + //Ref: ETSI TS 129 214 FMax_Requested_Bandwidth_UL AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 516);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Max_Requested_Bandwidth_DL_AVP{ + //Ref: ETSI TS 129 214 FMax_Requested_Bandwidth_DL AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 515);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record QoS_Class_Identifier_AVP{ + //Ref: ETSI TS 129 212 QoS_Class_Identifier_AVP + AVP_Header aVP_Header,// + QoS_Class_Identifier aVP_Data + } +// with { +// variant "present=bytes(4, 1028);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type enumerated QoS_Class_Identifier{ + // Ref: ETSI TS 129 212 5.3.17 + Reserved1_E ( 0), + QCI_1_E (1),//examle service=conversational voice + QCI_2_E (2),//examle service=conversational video + QCI_3_E (3),//examle service=real time gaming + QCI_4_E (4),//examle service=non-conversational video + QCI_5_E (5),//examle service=IMS signalling + QCI_6_E (6),//examle service=video(TCP based) + QCI_7_E (7),//examle service=voice,video(life streaming) + QCI_8_E (8),//examle service=video(buffered streaming) + QCI_9_E (9),//examle service=video(buffered streaming) + Reserved2_E ( 10), // .. 127 + OperatorSpecific_E (128), // .. 254 + Reserved3_E (255) + } +// with { +// variant "length=32" +// } + + type record APN_Aggregate_Max_Bitrate_UL_AVP{ + //Ref: ETSI TS 129 212 APN_Aggregate_Max_Bitrate_UL_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1041);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record APN_Aggregate_Max_Bitrate_DL_AVP{ + //Ref: ETSI TS 129 212 APN_Aggregate_Max_Bitrate_DL_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1040);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + /** + * @desc The PS-Furnish-Charging-Information AVP (AVP code 865) + * @member aVP_Header Header AVP + * @member threeGPP_Charging_Id TODO + * @member ps_Free_Format_Data TODO + * @member ps_Append_Free_Format_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.157 PS-Furnish-Charging-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PS_Furnish_Charging_Information_AVP { + AVP_Header aVP_Header,// + ThreeGPP_Charging_Id_AVP threeGPP_Charging_Id, + PS_Free_Format_Data_AVP ps_Free_Format_Data, + PS_Append_Free_Format_Data_AVP ps_Append_Free_Format_Data optional + } // End of type PS_Furnish_Charging_Information_AVP + + /** + * @desc The PS-Append-Free-Format-Data AVP (AVP code 867) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates if the information sent in the PS-Free-Format-Data AVP must be appended to the PS-free-format-data stored for the online-session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.155 PS-Append-Free-Format-Data AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PS_Append_Free_Format_Data_AVP { + AVP_Header aVP_Header,// + PS_Append_Free_Format_Data aVP_Data + } // End of type PS_Append_Free_Format_Data_AVP + + /** + * @desc The PS-Append-Free-Format-Data enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.155 PS-Append-Free-Format-Data AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PS_Append_Free_Format_Data { + APPEND_E (0), + OVERWRITE_E (1) +// } with { +// variant "length=32" + } // End of type PS_Append_Free_Format_Data + + /** + * @desc The PS-Furnish-Charging-Information AVP (AVP code 866) + * @member aVP_Header Header AVP + * @member aVP_Data Holds online charging session specific data + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.156 PS-Free-Format-Data AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PS_Free_Format_Data_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type PS_Free_Format_Data_AVP + + /** + * @desc The Quota-Holding-Time AVP (AVP code 871) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the quota holding time in seconds + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.160 Quota-Holding-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Quota_Holding_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Quota_Holding_Time_AVP + + /** + * @desc The Quota-Consumption-Time AVP (AVP code 881) + * @member aVP_Header Header AVP + * @member aVP_Data Contains an idle traffic aVP_Data time in seconds + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.159 Quota-Consumption-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Quota_Consumption_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Quota_Consumption_Time_AVP + + /** + * @desc The Time-Quota-Threshold AVP (AVP code 868) + * @member aVP_Header Header AVP + * @member aVP_Data Contains a threshold value in seconds + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.229 Time-Quota-Threshold AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Time_Quota_Threshold_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Time_Quota_Threshold_AVP + + /** + * @desc The Volume-Quota-Threshold AVP (AVP code 869) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the session identifier + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.243 Volume-Quota-Threshold AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Volume_Quota_Threshold_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Volume_Quota_Threshold_AVP + + /** + * @desc The Unit-Quota-Threshold AVP (AVP code 1226) + * @member aVP_Header Header AVP + * @member aVP_Data Threshold value in service specific units + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.240 Unit-Quota-Threshold AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Unit_Quota_Threshold_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Unit_Quota_Threshold_AVP + + type record Service_Parameter_Type_AVP{ + // Ref: RFC4006 8.44. Service-Parameter-Type AVP + AVP_Header aVP_Header,//< AVP Header: 441 > + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 441);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Service_Parameter_Value_AVP{ + // Ref: RFC4006 8.45. Service-Parameter-Value AVP + AVP_Header aVP_Header,//< AVP Header: 442 > + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 442);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type set Service_Parameter_Info_AVP{ + // Ref: RFC4006 8.43. Service-Parameter-Info AVP + AVP_Header aVP_Header,//< AVP Header: 440 > + Service_Parameter_Type_AVP service_Parameter_Type, + Service_Parameter_Value_AVP service_Parameter_Value + } +// with { +// variant "present=bytes(4, 440);use=com.testingtech.ttcn.tci.codec.CodecHelper" + // variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record CC_Correlation_Id_AVP{ + // Ref: RFC4006 8.1. CC-Correlation-Id AVP + AVP_Header aVP_Header,//< AVP Header: 411 > + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 411);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record User_Equipment_Info_Type_AVP{ + // Ref: RFC4006 8.50. User-Equipment-Info-Type AVP + AVP_Header aVP_Header,//< AVP Header: 459 > + User_Equipment_Info_Ty_Type aVP_Data + } +// with { +// variant "present=bytes(4, 459);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record User_Equipment_Info_Value_AVP{ + // Ref: RFC4006 8.51. User-Equipment-Info-Value AVP + AVP_Header aVP_Header,//< AVP Header: 460 > + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 460);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type set User_Equipment_Info_AVP{ + // Ref: RFC4006 8.49. User-Equipment-Info AVP + AVP_Header aVP_Header,//< AVP Header: 458 > + User_Equipment_Info_Type_AVP user_Equipment_Info_Type, + User_Equipment_Info_Value_AVP user_Equipment_Info_Value + } +// with { +// variant "present=bytes(4, 458);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (user_Equipment_Info_Value) "condition=CodecHelper.leaveScope()" +// } + type record CC_Session_Failover_AVP{ + // Ref: RFC4006 8.4. CC-Session-Failover AVP + AVP_Header aVP_Header,//< AVP Header: 418 > + CC_Session_Failover_Type aVP_Data + } +// with { +// variant "present=bytes(4, 418);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Cost_Unit_AVP{ + // Ref: RFC4006 8.12. Cost-Unit AVP + AVP_Header aVP_Header,//< AVP Header: 424 > + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 424);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type set Cost_Information_AVP{ + // Ref: RFC4006 8.7. Cost-Information AVP + AVP_Header aVP_Header,//< AVP Header: 423 > + Unit_Value_AVP unit_Value, + Currency_Code_AVP currency_Code, + Cost_Unit_AVP cost_Unit optional + } +// with { +// variant "present=bytes(4, 423);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (cost_Unit) "condition=CodecHelper.leaveScope()" +// } + type record Check_Balance_Result_AVP{ + // Ref: RFC4006 8.6. Check-Balance-Result AVP 12.8. Check-Balance-Result AVP + AVP_Header aVP_Header,//< AVP Header: 422 > + Check_Balance_Result_Type aVP_Data + } +// with { +// variant "present=bytes(4, 422);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Credit_Control_Failure_Handling_AVP{ + // Ref: RFC4006 8.14. Credit-Control-Failure-Handling AVP + AVP_Header aVP_Header,//< AVP Header: 427 > + Credit_Cont_Fail_Hand_Type aVP_Data + } +// with { +// variant "present=bytes(4, 427);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Direct_Debiting_Failure_Handling_AVP{ + // Ref: RFC4006 8.15. Direct-Debiting-Failure-Handling AVP + AVP_Header aVP_Header,//< AVP Header: 428 > + Direct_Debi_Fail_Hand_Type aVP_Data + } +// with { +// variant "present=bytes(4, 428);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + }//end of group RFC4006_AVPa + + group RFC5580_AVPS { + + /** + * @desc The Operator-Name Attribute (AVP code 126) + * @member aVP_Header Header AVP + * @member namespace_Id Namespace ID + * @member operator_Name Contains the operator namespace identifier AND an Access Network Operator Name + * + * @see RFC5580 Clause 4.1. Operator-Name Attribute + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Operator_Name_AVP { + AVP_Header aVP_Header,// + UInt8 namespace_Id, + UTF8String operator_Name + } // End of type Operator_Name_AVP + + /** + * @desc The Operator-Name Attribute (AVP code 127) + * @member aVP_Header Header AVP + * @member index Allows this attribute to provide information relating to the information included in the Location- Data Attribute to which it refers (via the Index) + * @member code Indicates the content of the location profile carried in the Location-Data Attribute + * @member entity Refers to as an unsigned 8-bit integer value + * @member sighting_Time Indicates when the location information was accurate + * @member time_to_Live Gives a hint regarding for how long location information should be considered current + * @member method Describes the way that the location information was determined + * + * @see RFC5580 Clause 4.2. Location-Information Attribute + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Location_Information_AVP { + AVP_Header aVP_Header,// + UInt16 index, + UInt8 code, + UInt8 entity, + UInt64 sighting_Time, + UInt64 time_to_Live, + UTF8String method + } // End of type Location_Information_AVP + + /** + * @desc The Location-Data Attribute (AVP code 128) + * @member aVP_Header Header AVP + * @member index TODO + * @member aVP_Data TODO + * + * @see RFC5580 Clause 4.3. Location-Data Attribute + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Location_Data_AVP { + AVP_Header aVP_Header,// + UInt16 index, + UTF8String aVP_Data + } // End of type Location_Data_AVP + + } // End of group RFC5580_AVPS + + // FIXME Can be moved in TTCN-3 module LibDiameter_Types_GiSGi_AVPs if GiSGi interface will be ddeveloped + group TS129_061_AVPSGiSGi{ + + type record RAI_AVP{ + //Ref: ETSI TS 129 061 RAI_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 909);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record ThreeGPP_SGSN_Address_AVP{ + //Ref: ETSI TS 129 061 3GPP_SGSN_Address + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 6);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record ThreeGPP_SGSN_IPv6_Address_AVP{ + //Ref: ETSI TS 129 061 3GPP_SGSN_Address + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 15);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record ThreeGPP_User_Location_Info_AVP{ + //Ref: ETSI TS 129 061 ThreeGPP_User_Location_Info_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 22);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record ThreeGPP_MS_TimeZone_AVP{ + //Ref: ETSI TS 129 061 ThreeGPP_MS_TimeZone_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 23);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record ThreeGPP_RAT_Type_AVP{ + //Ref: ETSI TS 129 061 ThreeGPP_RAT_Type_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 21);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record ThreeGPP_SGSN_MCC_MNC_AVP{ + //Ref: ETSI TS 129 061 ThreeGPP_SGSN_MCC_MNC_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 18);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_IMSI_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_IMSI_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_Charging_Id_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type ThreeGPP_Charging_Id_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_PDP_Type_AVP { + AVP_Header aVP_Header,// + ThreeGPP_PDP_Type aVP_Data + } // End of type ThreeGPP_PDP_Type_AVP + + /** + * @desc PDP context ot type + * + * @see ETSI TS 129 061 V10.12.0 Table 7: List of the 3GPP Vendor-Specific sub-attributes + */ + type enumerated ThreeGPP_PDP_Type { + IP (0), + PPP (1), + IPv4 (2), + IPv6 (3), + IPv4v6 (4) + } +// } with { +// variant "length=32" +// } // End of type ThreeGPP_PDP_Type + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_IMSI_MCC_MNC_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_IMSI_MCC_MNC_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_GGSN_MCC_MNC_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_GGSN_MCC_MNC_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_NSAPI_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_NSAPI_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_Session_Stop_Indicator_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_Session_Stop_Indicator_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_Selection_Mode_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_Selection_Mode_AVP + + /** + * @desc TODO + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 129 061 V10.12.0 Table 9a: Gi/SGi specific AVPs + */ + type record ThreeGPP_Charging_Characteristics_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type ThreeGPP_Charging_Characteristics_AVP + + }//end of group TS129_061_AVPSGiSGi + + group TS129_272_AVPs{ + + type UTF8String IMEI length (14..15); + type record IMEI_AVP { //ref: 7.3.4 + AVP_Header aVP_Header, //IMEI ::= + IMEI aVP_Data //14 digits, 8-digit Type Allocation Code (TAC) + 6-digit Serial Number (SNR). + //It may also include a 15th digit + } + + type UTF8String SVN length (2); + type record Sofware_Version_AVP { //ref: 7.3.5 + AVP_Header aVP_Header, //Software-Version ::= + SVN aVP_Data //2-digit Software Version Number (SVN) + } + + type record Terminal_Information_AVP { //ref: 7.3.3 + AVP_Header aVP_Header, //Terminal Information ::= + IMEI_AVP imei optional, + ThreeGPP2_MEID_AVP meid optional, + Sofware_Version_AVP sofware_Version optional, + set of AVP_Type aVP_Type optional + } + + type octetstring ThreeGPP2_MEID length (8); + type record ThreeGPP2_MEID_AVP { //ref: 7.3.6 + AVP_Header aVP_Header, //3GPP2-MEID ::= + ThreeGPP2_MEID aVP_Data + } + + type record Trace_Data_AVP{ + //Ref: ETSI TS 129 272 Trace_Data_AVP + AVP_Header aVP_Header, // + Trace_Reference_AVP trace_Reference, + Trace_Depth_AVP trace_Depth, + Trace_NE_Type_List_AVP trace_NE_Type_List, + Trace_Event_List_AVP trace_Event_List, + Trace_Collection_Entity_AVP trace_Collection_Entityt, + Trace_Interface_List_AVP trace_Interface_List optional, + OMC_Id_AVP oMC_Id optional, + MDT_Configuration_AVP mDT_Configuration optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1485);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Trace_Reference_AVP{ + //Ref: ETSI TS129 272 Trace_Reference_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1459);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Trace_Depth_AVP{ + //Ref: ETSI TS129 272 Trace_Depth_AVP + AVP_Header aVP_Header, // + Trace_Depth aVP_Data + } +// with { +// variant "present=bytes(4, 1462);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + + type record Trace_NE_Type_List_AVP{ + //Ref: ETSI TS129 272 Trace_NE_Type_List_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1463);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Trace_Event_List_AVP{ + //Ref: ETSI TS129 272 Trace_Event_List_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1465);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Trace_Collection_Entity_AVP{ + //Ref: ETSI TS129 272 Trace_Collection_Entity_AVP + AVP_Header aVP_Header, // + Address aVP_Data + } +// with { +// variant "present=bytes(4, 1452);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Trace_Interface_List_AVP{ + //Ref: ETSI TS129 272 Trace_Interface_List_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1464);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record OMC_Id_AVP{ + //Ref: ETSI TS129 272 OMC_Id_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1466);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record MDT_Configuration_AVP{ + //Ref: ETSI TS129 272 MDT_Configuration_AVP + AVP_Header aVP_Header, // + Job_Type_AVP job_Type, + Area_Scope_AVP area_Scope optional, + List_Of_Measurements_AVP list_Of_Measurements optional, + Reporting_Trigger_AVP reporting_Trigger optional, + Report_Interval_AVP report_Interval optional, + Report_Amount_AVP report_Amount optional, + Event_Treshold_RSRP_AVP event_Treshold_RSRP optional, + Event_Treshold_RSRQ_AVP event_Treshold_RSRQ optional, + Logging_Interval_AVP logging_Interval optional, + Logging_Duration_AVP logging_Duration optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1622);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Job_Type_AVP{ + //Ref: ETSI TS129 272 Job_Type_AVP + AVP_Header aVP_Header, // + Job_Type aVP_Data + } +// with { +// variant "present=bytes(4, 1623);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Area_Scope_AVP{ + //Ref: ETSI TS129 272 Area_Scope_AVP + AVP_Header aVP_Header, // + set of Cell_Global_Identity_AVP cell_Global_Identity optional, + set of E_UTRAN_Cell_Global_Identity_AVP e_UTRAN_Cell_Global_Identity_AVP optional, + set of Routing_Area_Identity_AVP routing_Area_Identity optional, + set of Location_Area_Identity_AVP location_Area_Identity optional, + set of Tracking_Area_Identity_AVP tracking_Area_Identity optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1624);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (cell_Global_Identity) "fieldPresent=bytes(4, 1604)&&CodecHelper.isAvailable()" +// variant (e_UTRAN_Cell_Global_Identity_AVP) "fieldPresent=bytes(4, 1602)&&CodecHelper.isAvailable()" +// variant (routing_Area_Identity) "fieldPresent=bytes(4, 1605)&&CodecHelper.isAvailable()" +// variant (location_Area_Identity) "fieldPresent=bytes(4, 1606)&&CodecHelper.isAvailable()" +// variant (tracking_Area_Identity) "fieldPresent=bytes(4, 1603)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record List_Of_Measurements_AVP{ + //Ref: ETSI TS129 272 List_Of_Measurements_AVP + AVP_Header aVP_Header, // + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1625);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Reporting_Trigger_AVP{ + //Ref: ETSI TS129 272 Reporting_Trigger_AVP + AVP_Header aVP_Header, // + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1626);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record Report_Interval_AVP{ + //Ref: ETSI TS129 272 Report_Interval_AVP + AVP_Header aVP_Header, // + Report_Interval aVP_Data + } +// with { +// variant "present=bytes(4, 1627);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Report_Amount_AVP{ + //Ref: ETSI TS129 272 Report_Amount_AVP + AVP_Header aVP_Header, // + Report_Amount aVP_Data + } +// with { +// variant "present=bytes(4, 1628);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Event_Treshold_RSRP_AVP{ + //Ref: ETSI TS129 272 Event_Treshold_RSRP_AVP + AVP_Header aVP_Header, // + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1629);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Event_Treshold_RSRQ_AVP{ + //Ref: ETSI TS129 272 Event_Treshold_RSRQ_AVP + AVP_Header aVP_Header, // + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1630);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Logging_Interval_AVP{ + //Ref: ETSI TS129 272 Logging_Interval_AVP + AVP_Header aVP_Header, // + Logging_Interval aVP_Data + } +// with { +// variant "present=bytes(4, 1631);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Logging_Duration_AVP{ + //Ref: ETSI TS129 272 Logging_Duration_AVP + AVP_Header aVP_Header, // + Logging_Duration aVP_Data + } +// with { +// variant "present=bytes(4, 1632);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Cell_Global_Identity_AVP{ + //Ref: ETSI TS129 272 Cell_Global_Identity_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1604);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record E_UTRAN_Cell_Global_Identity_AVP{ + //Ref: ETSI TS129 272 E_UTRAN_Cell_Global_Identity_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1602);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Routing_Area_Identity_AVP{ + //Ref: ETSI TS129 272 Routing_Area_Identity_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1605);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Location_Area_Identity_AVP{ + //Ref: ETSI TS129 272 Location_Area_Identity_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1606);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Tracking_Area_Identity_AVP{ + //Ref: ETSI TS129 272 Tracking_Area_Identity_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1603);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + }//end of group TS129_272_AVPs + + group TS129_299_AVPs{ + + type record Charging_Information_AVP{ + //Ref: ETSI TS 129 299 Charging_Information_AVP + AVP_Header aVP_Header, // + Primary_Event_Charging_Function_Name_AVP primary_Event_Charging_Function_Name optional, + Secondary_Event_Charging_Function_Name_AVP secondary_Event_Charging_Function_Name optional, + Primary_Charging_Collection_Function_Name_AVP primary_Charging_Collection_Function_Name optional, + Secondary_Charging_Collection_Function_Name_AVP secondary_Charging_Collection_Function_Name optional, + set of AVP_Type aVP_Type optional + } + + type record Primary_Event_Charging_Function_Name_AVP{ + //Ref: ETSI TS 129 299 Primary_Event_Charging_Function_Name_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data //DiameterURI replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } + + type record Secondary_Event_Charging_Function_Name_AVP{ + //Ref: ETSI TS 129 299 Secondary_Event_Charging_Function_Name_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data //DiameterURI replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } + + type record Primary_Charging_Collection_Function_Name_AVP{ + //Ref: ETSI TS 129 299 Primary_Charging_Collection_Function_Name_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data //DiameterURI replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } + + type record Secondary_Charging_Collection_Function_Name_AVP{ + //Ref: ETSI TS 129 299 Secondary_Charging_Collection_Function_Name_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data //DiameterURI replaced with UTF8String - UTF8String to DiameterURI function done in LibDiameterSteps + } + + }//end of group TS129_299_AVPs + + group TS132_299_AVPs{ + //Types were moved to LibDiameter_Types_RfRo_AVPs + }//end of group TS132_299_AVPs + + group X_S0057_1_AVPs{ + type record ThreeGPP2_BSID_AVP{ + //Ref: Draft X.S0057-1 ThreeGPP2_BSID_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 621);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + }//end of group X_S0057_1_AVPs + + group TS283_034_AVPs{ + type record Logical_Access_ID_AVP{ + //Ref: Draft TS283_034 Logical_Access_ID_AVP + AVP_Header aVP_Header, // + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 302);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Physical_Access_ID_AVP{ + //Ref: Draft TS283_034 Physical_Access_ID_AVP + AVP_Header aVP_Header, // + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 313);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + }//end of group TS283_034_AVPs + + type record Application_Service_Provider_Identity_AVP{ + //Ref: ETSI TS 129 214 Application_Service_Provider_Identity AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } + // with { + // variant "present=bytes(4, 532);use=com.testingtech.ttcn.tci.codec.CodecHelper" + // variant (aVP_Data) "condition=CodecHelper.leaveScope()" + // } + + type record Access_Network_Charging_Identifier_Value_AVP{ + //Ref: ETSI TS 129 214 Access_Network_Charging_Identifier_Value AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 503);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record PDP_Address_AVP { //ref: TS 132 299 7.2.137 + AVP_Header aVP_Header, //PDP-Address ::= + Address aVP_Data + } + + type record Charging_Rule_Base_Name_AVP { + //Ref: ETSI TS 129 212 Charging_Rule_Base_Name_AVP AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data + } +// with { +// variant "present=bytes(4, 1004);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Session_Priority_AVP{ + //Ref: ETSI TS 129 229 6.3.56 Multiple_Registration_Indication AVP + AVP_Header aVP_Header,// + Session_Prio_Code aVP_Data +// } +// with { +// variant "present=bytes(4,650);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type enumerated Session_Prio_Code{ + PRIORITY_0 (0), + PRIORITY_1 (1), + PRIORITY_2 (2), + PRIORITY_3 (3), + PRIORITY_4 (4) +// } +// with { +// variant "length=32" + } + + type record Served_Party_IP_Address_AVP { //ref: TS 132 299 7.2.187 + AVP_Header aVP_Header, //Served-Party-IP-Address ::= + Address aVP_Data + } + + type record User_CSG_Information_AVP{ + //Ref: ETSI TS 132 299 User_CSG_Information_AVP + AVP_Header aVP_Header, // + CSG_Id_AVP cSG_Id, + CSG_Access_Mode_AVP cSG_Access_Mode, + CSG_Membership_Indication_AVP CSG_Membership_Indication_AVP optional + } + + type record CSG_Id_AVP{ + //Ref: ETSI TS 132 299 & TS129 272 CSG_Id_AVP + AVP_Header aVP_Header, // + UInt32 aVP_Data + } + + type record CSG_Access_Mode_AVP{ + //Ref: ETSI TS 132 299 CSG_Access_Mode_AVP + AVP_Header aVP_Header, // + CSG_Access_Mode aVP_Data + } + + type record CSG_Membership_Indication_AVP{ + //Ref: ETSI TS 132 299 CSG_Membership_Indication_AVP + AVP_Header aVP_Header, // + CSG_Membership_Indication aVP_Data + } + + group TS129_229Cx_Dx_AVPS{ + type record SIP_Authentication_Context_AVP{ + // Ref: ETSI TS 129 229 V10.5.0 (2013-04) 6.3.13 SIP-Authentication-Context AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } + + type record Server_Capabilities_AVP{ + // Ref: ETSI TS 129 229 6.3.4 Server-Capabilities AVP + AVP_Header aVP_Header,// + set of MandatoryCapability_AVP mandatoryCapability optional, + set of OptionalCapability_AVP optionalCapability optional, + set of Server_Name_AVP server_Name optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 603);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (mandatoryCapability) "fieldPresent=bytes(4, 604)&&CodecHelper.isAvailable()" +// variant (optionalCapability) "fieldPresent=bytes(4, 605)&&CodecHelper.isAvailable()" +// variant (server_Name) "fieldPresent=bytes(4, 602)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record MandatoryCapability_AVP{ + //Ref: ETSI TS 129 229 6.3.5. Mandatory-Capability AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data +// } +// with { +// variant "present=bytes(4, 604);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record OptionalCapability_AVP{ + //Ref: ETSI TS 129 229 6.3.6. Optional-Capability AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data +// } +// with { +// variant "present=bytes(4, 605);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + }//end group TS129_229Cx_Dx_AVPS + + group TS129_212Gx_AVPs{ + + type record RAT_Type_AVP{ + //Ref: ETSI TS 129 212 RAT Type AVP + AVP_Header aVP_Header,// + RAT_Type aVP_Data + } +// with { +// variant "present=bytes(4, 1032);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type enumerated RAT_Type{ + // Ref: ETSI TS 129 212 5.3.31 + WLAN_E (0), + VIRTUAL_E (1), + UTRAN_E (1000), + GERAN_E (1001), + GAN_E (1002), + HSPA_EVOLUTION_E (1003), + EUTRAN_E (1004), + CDMA2000_IX_E (2000), + HRPD_E(2001), + UMB_E(2002), + EHRPD_E(2003) + } +// with { +// variant "length=32" +// } + + }//end group TS129_212Gx_AVPs + + }//end group AVPs + + + + group NumberTypes { + + type float FLOAT32; + + //not supported so far but not used as well + type float FLOAT64; + + type record length (4) of UInt8 IPv4Addr; + + type record length (8) of UInt16 IPv6Addr; + + type universal charstring UTF8String; + + }// end group NumberTypes + +} with { + encode "DIAMETERCodec"; variant ""; +} //end module LibDiameter_Types_Base_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_CxDx_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_CxDx_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..72652b74f4cc4b783b4735ae7e787b681323eef4 --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_CxDx_AVPs.ttcn @@ -0,0 +1,389 @@ +/** + * @author STF 480 + * @version $Id$ + * @desc This module defines Diameter Cx and Dx AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new Rx AVP types is ok; + */ +module LibDiameter_Types_CxDx_AVPs { + + import from LibCommon_BasicTypesAndValues all; + + //import from LibDiameter_TypesAndValues all; + import from LibDiameter_Types_Base_AVPs all; + + group AVPCodeConstants { + + /** + * ETSI TS 129 229 V10.5.0 (2013-04) Clause 6.3.42 Line-Identifier AVP + */ + const integer c_line_Identifier_AVP_Code := 500; + + } + + group AVPTypes{ + + group Enum_AVP_Cx_Dx_Types{ + + type enumerated User_Authorization_Type_Code{ + // Ref: ETSI TS 129 299 6.3.24 + REGISTRATION (0), + DE_REGISTRATION (1), + REGISTRATION_AND_CAPABILITIES (2) +// } +// with { +// variant "length=32" + } + + type enumerated Srv_Assgmt_Type_Code{ + NO_ASSIGNMENT_E (0), + REGISTRATION_E (1), + RE_REGISTRATION_E (2), + UNREGISTERED_USER_E (3), + TIMEOUT_DEREGISTRATION_E (4), + USER_DEREGISTRATION_E (5), + TIMEOUT_DEREGISTRATION_STORE_SERVER_NAME_E (6), + USER_DEREGISTRATION_STORE_SERVER_NAME_E (7), + ADMINISTRATIVE_DEREGISTRATION_E (8), + AUTHENTICATION_FAILURE_E (9), + AUTHENTICATION_TIMEOUT_E (10), + DEREGISTRATION_TOO_MUCH_DATA_E (11), + AAA_USER_DATA_REQUEST (12), + PGW_UPDATE (13) +// } +// with { +// variant "length=32" + } + + type enumerated Usr_Dat_Al_Av_Code{ + USER_DATA_NOT_AVAILABLE_E (0), + USER_DATA_ALREADY_AVAILABLE_E (1) +// } +// with { +// variant "length=32" + } + + type enumerated Multiple_Reg_Id_Code{ + NOT_MULTIPLE_REGISTRATION (0), + MULTIPLE_REGISTRATION (1) +// } +// with { +// variant "length=32" + } + + type enumerated Loose_Route_Ind_Code{ + LOOSE_ROUTE_NOT_REQUIRED (0), + LOOSE_ROUTE_REQUIRED (1) +// } +// with { +// variant "length=32" + } + + type enumerated Priviledged_Sender_Ind_Code{ + NOT_PRIVILEDGED_SENDER (0), + PRIVILEDGED_SENDER (1) +// } +// with { +// variant "length=32" + } + + type enumerated Originating_Request_Code{ + ORIGINATING (0) +// } +// with { +// variant "length=32" + } + + type enumerated Reason_Code_Type{ + PERMANENT_TERMINATION_E (0), + NEW_SERVER_ASSIGNED_E (1), + SERVER_CHANGE_E (2), + REMOVE_S_CSCF_E (3) +// } +// with { +// variant "length=32" + } + + }//end group Enum_AVP_Cx_Dx_Types + + }//end group AVP_Types + group AVPs{ + group TS129_229Cx_Dx_AVPS{ + + type record Visited_Network_Identifier_AVP{ + // Ref: ETSI TS 129 229 6.3.1 Visited-Network-Id AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 600);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record UAR_Flags_AVP{ + //Ref: ETSI TS 129 229 6.3.44 UAR_Flags_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data +// } +// with { +// variant "present=bytes(4, 637);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record User_Authorization_Type_AVP{ + //Ref: ETSI TS 129 229 6.3.24 User_Authorization_Type AVP + AVP_Header aVP_Header,// + User_Authorization_Type_Code aVP_Data +// } +// with { +// variant "present=bytes(4, 520);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Wildcarded_Public_Identity_AVP{ + //Ref: ETSI TS 129 229 6.3.35 Wildcarded_Public_Identity AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data +// } +// with { +// variant "present=bytes(4, 634);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Server_Assignment_Type_AVP{ + //Ref: ETSI TS 129 229 6.3.15 Server-Assignment-Type AVP + AVP_Header aVP_Header,// + Srv_Assgmt_Type_Code aVP_Data +// } +// with { +// variant "present=bytes(4, 614);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record User_Data_Already_Available_AVP{ + //Ref: ETSI TS 129 229 6.3.26 User_Data_Already_Available AVP + AVP_Header aVP_Header,// + Usr_Dat_Al_Av_Code aVP_Data +// } +// with { +// variant "present=bytes(4,624);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record SCSCF_Restoration_Info_AVP{ + //Ref: ETSI TS 129 229 6.3.46 SCSCF_Restoration_Info AVP + AVP_Header aVP_Header,// < AVP Header: 639 > + set length (1..infinity) of Restoration_Info_AVP restoration_Info, + SIP_Authentication_Scheme_AVP sIP_Authentication_Scheme, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 639);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record Restoration_Info_AVP{ + //Ref: ETSI TS 129 229 6.3.52 Restoration_Info AVP + AVP_Header aVP_Header,// < AVP Header: 649 > + Path_AVP path, + Contact_AVP contact, + Subscription_Info_AVP subscription_Info optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 649);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record Path_AVP{ + // Ref: ETSI TS 129 229 6.3.47 Path AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 640);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Subscription_Info_AVP{ + //Ref: ETSI TS 129 229 6.3.49 Subscription_Info AVP + AVP_Header aVP_Header,// < AVP Header: 642 > + Call_ID_SIP_Header_AVP call_ID_SIP_Header, + From_SIP_Header_AVP from_SIP_Header, + To_SIP_Header_AVP to_SIP_Header, + Record_Route_AVP record_Route, + Contact_AVP contact, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 642);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record Contact_AVP{ + // Ref: ETSI TS 129 229 6.3.48 Contact AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 641);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Call_ID_SIP_Header_AVP{ + // Ref: ETSI TS 129 229 6.3.49.1 Call_ID_SIP_Header AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 643);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record From_SIP_Header_AVP{ + // Ref: ETSI TS 129 229 6.3.49.2 From_SIP_Header AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 644);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record To_SIP_Header_AVP{ + // Ref: ETSI TS 129 229 6.3.49.3 To_SIP_Header AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 645);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Record_Route_AVP{ + // Ref: ETSI TS 129 229 6.3.49.4 Record_Route AVP + AVP_Header aVP_Header,// + octetstring aVP_Data +// } +// with { +// variant "present=bytes(4, 646);use=com.testingtech.ttcn.tci.codec.CodecHelper;" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Multiple_Registration_Indication_AVP{ + //Ref: ETSI TS 129 229 6.3.51 Multiple_Registration_Indication AVP + AVP_Header aVP_Header,// + Multiple_Reg_Id_Code aVP_Data +// } +// with { +// variant "present=bytes(4,648);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Associated_Identities_AVP{ + //Ref: ETSI TS 129 229 6.3.33 Subscription_Info AVP + AVP_Header aVP_Header,// < AVP Header: 632 > + User_Name_AVP user_Name optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 632);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record Associated_Registered_Identities_AVP{ + //Ref: ETSI TS 129 229 6.3.50 Subscription_Info AVP + AVP_Header aVP_Header,// < AVP Header: 647 > + User_Name_AVP user_Name optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 647);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record Loose_Route_Indication_AVP{ + //Ref: ETSI TS 129 229 6.3.45 Multiple_Registration_Indication AVP + AVP_Header aVP_Header,// + Loose_Route_Ind_Code aVP_Data +// } +// with { +// variant "present=bytes(4,638);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Priviledged_Sender_Indication_AVP{ + //Ref: ETSI TS 129 229 6.3.58 Multiple_Registration_Indication AVP + AVP_Header aVP_Header,// + Priviledged_Sender_Ind_Code aVP_Data +// } +// with { +// variant "present=bytes(4,652);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Originating_Request_AVP{ + //Ref: ETSI TS 129 229 6.3.58 Multiple_Registration_Indication AVP + AVP_Header aVP_Header,// + Originating_Request_Code aVP_Data +// } +// with { +// variant "present=bytes(4,652);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Deregistration_Reason_AVP{ + //Ref: ETSI TS 129 229 6.3.16 Deregistration_Reason AVP + AVP_Header aVP_Header,//SIP-Deregistration-Reason ::= < AVP Header: 615 > + Reason_Code_AVP reason_Code,//requi. + Reason_Info_AVP reason_Info optional, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 615);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + type record Reason_Code_AVP{ + //Ref: ETSI TS 129 229 6.3.17 Reason_Code AVP + AVP_Header aVP_Header,// + Reason_Code_Type aVP_Data +// } +// with { +// variant "present=bytes(4, 616);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Reason_Info_AVP{ + //Ref: ETSI TS 129 229 6.3.18 Reason_Info AVP + AVP_Header aVP_Header,// + UTF8String aVP_Data +// } +// with { +// variant "present=bytes(4, 617);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + } + + type record Identity_with_Emergency_Registration_AVP{ + //Ref: ETSI TS 129 229 6.3.57 Identity_with_Emergency_Registration AVP + AVP_Header aVP_Header,//SIP-Deregistration-Reason ::= < AVP Header: 651 > + User_Name_AVP user_Name, + Public_Identity_AVP public_Identity, + set of AVP_Type aVP_Type optional +// } +// with { +// variant "present=bytes(4, 651);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" + } + + }//end of group TS129_229Cx_Dx_AVPs + + }//end group AVPs + + +} with { + encode "DIAMETERCodec"; variant ""; +} //end module LibDiameter_Types_Cx_Dx_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Gx_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Gx_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..b194f540d38272200c52f5e49102acd994319a8d --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Gx_AVPs.ttcn @@ -0,0 +1,1015 @@ +/** + * @author STF 466 + * @version $Id$ + * @desc This module defines Diameter Gx and Gxx AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new Gx and Gxx AVP types is ok; + */ +module LibDiameter_Types_Gx_AVPs { + + import from LibCommon_BasicTypesAndValues all; + + //import from LibDiameter_TypesAndValues all; + import from LibDiameter_Types_Base_AVPs all; + //import from LibDiameter_Types_Rx_AVPs all; + //mport from LibDiameter_Types_RfRo_AVPs all; + + group AVPTypes{ + group AVP_Gx_Types{ + + type enumerated IP_CAN_Type{ + // Ref: ETSI TS 129 212 5.3.27 + ThreeGPP_GPRS_E (0), + DOCSIS_E (1), + XDSL_E (2), + WIMAX_E (3), + ThreeGPP2_E (4), + ThreeGPP_EPS_E (5), + NON_3GPP_EPS_E (6) + } +// with { +// variant "length=32" +// } + + type enumerated Bearer_Control_Mode{ + // Ref: ETSI TS 129 212 5.3.23 + UE_ONLY_E (0), + RESERVED_E (1), + UE_NW_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Bearer_Operation{ + // Ref: ETSI TS 129 212 5.3.21 + TERMINATION_E (0), + ESTABLISHMENT_E (1), + MODIFICATION_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Bearer_Usage{ + // Ref: ETSI TS 129 212 5.3.1 + GENERAL_E (0), + IMS_SIGNALLING_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Charging_Correlation_Indicator{ + // Ref: ETSI TS 129 212 5.3.67 + CHARGING_IDENTIFIER_REQUIRED_E (0) + } +// with { +// variant "length=32" +// } + type enumerated CSG_Information_Reporting{ + // Ref: ETSI TS 129 212 5.3.64 + CHANGE_CSG_CELL_E (0), + CHANGE_CSG_SUBSCRIBED_HYBRID_CELL_E (1), + CHANGE_CSG_UNSUBSCRIBED_HYBRID_CELL_E (2) + } +// with { +// variant "length=32" +// } + + type enumerated Event_Trigger{ + // Ref: ETSI TS 129 212 5.3.7 + SGSN_CHANGE_E (0), + QOS_CHANGE_E (1), + RAT_CHANGE_E (2), + TFT_CHANGE_E (3), + PLMN_CHANGE_E (4), + LOSS_OF_BEARER_E (5), + RECOVERY_OF_BEARER_E (6), + IP_CAN_CHANGE_E (7), + QOS_CHANGE_EXCEEDING_AUTHORIZATION_E (11), + RAI_CHANGE_E (12), + USER_LOCATION_CHANGE_E (13), + NO_EVENT_TRIGGERS_E (14), + OUT_OF_CREDIT_E (15), + REALLOCATION_OF_CREDIT_E (16), + REVALIDATION_TIMEOUT_E (17), + UE_IP_ADDRESS_ALLOCATE_E (18), + UE_IP_ADDRESS_RELEASE_E (19), + DEFAULT_EPS_BEARER_QOS_CHANGE_E (20), + AN_GW_CHANGE_E (21), + SUCCESSFUL_RESOURCE_ALLOCATION_E (22), + RESOURCE_MODIFICATION_REQUEST_E (23), + PGW_TRACE_CONTROL_E (24), + UE_TIME_ZONE_CHANGE_E (25), + TAI_CHANGE_E (26), + ECGI_CHANGE_E (27), + CHARGING_CORRELATION_EXCHANGE_E (28), + APN_AMBR_MODIFICATION_FAILURE_E (29), + USER_CSG_INFORMATION_CHANGE_E (30), + USAGE_REPORT_E (33), + DEFAULT_EPS_BEARER_QOS_MODIFICATION_FAILURE_E (34), + USER_CSG_HYBRID_SUBSCRIBED_INFORMATION_CHANGE_E (35), + USER_CSG_HYBRID_UNSUBSCRIBED_INFORMATION_CHANGE_E (36), + ROUTING_RULE_CHANGE_E (37), + MAX_MBR_APN_AMBR_CHANGE_E (38) + } +// with { +// variant "length=32" +// } + type enumerated Flow_Direction{ + // Ref: ETSI TS 129 212 5.3.65 + UNSPECIFIED_E (0), + DOWNLINK_E (1), + UPLINK_E (2), + BIDIRECTIONAL_E (3) + } +// with { +// variant "length=32" +// } + type enumerated Metering_Method{ + // Ref: ETSI TS 129 212 5.3.8 + DURATION_E (0), + VOLUME_E (1), + DURATION_VOLUME_E (2) + } +// with { +// variant "length=32" +// } + type enumerated Network_Request_Support{ + // Ref: ETSI TS 129 212 5.3.24 + NETWORK_REQUEST_NOT_SUPPORTED_E (0), + NETWORK_REQUEST_SUPPORTED_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Offline{ + // Ref: ETSI TS 129 212 5.3.9 + DISABLE_OFFLINE_E (0), + ENABLE_OFFLINE_E (1) + } +// with { +// variant "length=32" +// } + type enumerated Online{ + // Ref: ETSI TS 129 212 5.3.10 + DISABLE_ONLINE_E (0), + ENABLE_ONLINE_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated Packet_Filter_Operation{ + // Ref: ETSI TS 129 212 5.3.57 + DELETION_E (0), + ADDITION_E (1), + MODIFICATION_E (2) + } +// with { +// variant "length=32" +// } + + type enumerated Packet_Filter_Usage{ + // Ref: ETSI TS 129 212 5.3.66 + SEND_TO_UE_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated Reporting_Level{ + // Ref: ETSI TS 129 212 5.3.12 + SERVICE_IDENTIFIER_LEVEL_E (0), + RATING_GROUP_LEVEL_E (1), + SPONSORED_CONNECTIVITY_LEVEL_E (2) + } +// with { +// variant "length=32" +// } + + type enumerated PCC_Rule_Status{ + // Ref: ETSI TS 129 212 5.3.19 + ACTIVE_E (0), + INACTIVE_E (1), + TEMPORARILY_INACTIVE_E (2) + } + + type enumerated Session_Release_Cause{ + // Ref: ETSI TS 129 212 5.3.44 + UNSPECIFIED_REASON_E (0), + UE_SUBSCRIPTION_REASON_E (1), + INSUFFICIENT_SERVER_RESOURCES_E (2) + } +// with { +// variant "length=32" +// } + + type enumerated QoS_Negotiation{ + // Ref: ETSI TS 129 212 5.3.28 + NO_QoS_NEGOTIATION_E (0), + QoS_NEGOTIATION_SUPPORTED_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated QoS_Upgrade{ + // Ref: ETSI TS 129 212 5.3.29 + QoS_UPGRADE_NOT_SUPPORTED_E (0), + QoS_UPGRADE_SUPPORTED_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated Resource_Allocation_Notification{ + // Ref: ETSI TS 129 212 5.3.50 + ENABLE_NOTIFICATION_E (0) + } +// with { +// variant "length=32" +// } + + type enumerated Rule_Failure_Code{ + // Ref: ETSI TS 129 212 5.3.38 + UNKNOWN_RULE_NAME_E (1), + RATING_GROUP_ERROR_E (2), + SERVICE_IDENTIFIER_ERROR_E (3), + GW_PCEF_MALFUNCTION_E (4), + RESOURCES_LIMITATION_E (5), + MAX_NR_BEARERS_REACHED_E (6), + UNKNOWN_BEARER_ID_E (7), + MISSING_BEARER_ID_E (8), + MISSING_FLOW_INFORMATION_E (9), + RESOURCE_ALLOCATION_FAILURE_E (10), + UNSUCCESSFUL_QOS_VALIDATION_E (11), + INCORRECT_FLOW_INFORMATION_E (12), + PS_TO_CS_HANDOVER_E (13), + NO_BEARER_BOUND_E (15) + } + + type enumerated Usage_Monitoring_Level{ + // Ref: ETSI TS 129 212 5.3.61 + SESSION_LEVEL_E (0), + PCC_RULE_LEVEL_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated Usage_Monitoring_Report{ + // Ref: ETSI TS 129 212 5.3.62 + USAGE_MONITORING_REPORT_REQUIRED_E (0) + } +// with { +// variant "length=32" +// } + + type enumerated Usage_Monitoring_Support{ + // Ref: ETSI TS 129 212 5.3.63 + USAGE_MONITORING_DISABLED_E (0) + } +// with { +// variant "length=32" +// } + + }//end group AVP_Gx_Types + + }//end group AVP_Types + group AVPs{ + group TS129_212Gx_AVPs{ + + type record IP_CAN_Type_AVP{ + //Ref: ETSI TS 129 212 IP CAN Type AVP + AVP_Header aVP_Header,// + IP_CAN_Type aVP_Data + } +// with { +// variant "present=bytes(4, 1027);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Bearer_Control_Mode_AVP{ + //Ref: ETSI TS 129 212 Bearer_Control_Mode_AVP + AVP_Header aVP_Header,// + Bearer_Control_Mode aVP_Data + } +// with { +// variant "present=bytes(4, 1023);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Bearer_Operation_AVP{ + //Ref: ETSI TS 129 212 Bearer_Operation_AVP + AVP_Header aVP_Header,// + Bearer_Operation aVP_Data + } +// with { +// variant "present=bytes(4, 1021);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Bearer_Usage_AVP{ + //Ref: ETSI TS 129 212 Bearer_Usage_AVP + AVP_Header aVP_Header,// + Bearer_Usage aVP_Data + } +// with { +// variant "present=bytes(4, 1000);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Charging_Correlation_Indicator_AVP{ + //Ref: ETSI TS 129 212 Charging_Correlation_Indicator_AVP + AVP_Header aVP_Header,// + Charging_Correlation_Indicator aVP_Data + } +// with { +// variant "present=bytes(4, 1073);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record CSG_Information_Reporting_AVP{ + //Ref: ETSI TS 129 212 CSG_Information_Reporting_AVP + AVP_Header aVP_Header,// + CSG_Information_Reporting aVP_Data + } +// with { +// variant "present=bytes(4, 1071);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Event_Trigger_AVP{ + //Ref: ETSI TS 129 212 Event_Trigger_AVP + AVP_Header aVP_Header,// + Event_Trigger aVP_Data + } +// with { +// variant "present=bytes(4, 1006);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Flow_Direction_AVP{ + //Ref: ETSI TS 129 212 Flow_Direction_AVP + AVP_Header aVP_Header,// + Flow_Direction aVP_Data + } +// with { +// variant "present=bytes(4, 1080);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Metering_Method_AVP{ + //Ref: ETSI TS 129 212 Metering_Method_AVP + AVP_Header aVP_Header,// + Metering_Method aVP_Data + } +// with { +// variant "present=bytes(4, 1007);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Network_Request_Support_AVP{ + //Ref: ETSI TS 129 212 Network_Request_Support_AVP + AVP_Header aVP_Header,// + Network_Request_Support aVP_Data + } +// with { +// variant "present=bytes(4, 1024);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" + // } + + type record Offline_AVP{ + //Ref: ETSI TS 129 212 Offlinet_AVP + AVP_Header aVP_Header,// + Offline aVP_Data + } +// with { +// variant "present=bytes(4, 1008);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Online_AVP{ + //Ref: ETSI TS 129 212 Online_AVP + AVP_Header aVP_Header,// + Online aVP_Data + } +// with { +// variant "present=bytes(4, 1009);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Packet_Filter_Operation_AVP{ + //Ref: ETSI TS 129 212 Packet_Filter_Operation_AVP + AVP_Header aVP_Header,// + Packet_Filter_Operation aVP_Data + } +// with { +// variant "present=bytes(4, 1062);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Packet_Filter_Usage_AVP{ + //Ref: ETSI TS 129 212 Packet_Filter_Usage_AVP + AVP_Header aVP_Header,// + Packet_Filter_Usage aVP_Data + } +// with { +// variant "present=bytes(4, 1072);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + //Ref: ETSI TS 129 212 Reporting_Levele_AVP + type record Reporting_Level_AVP{ + AVP_Header aVP_Header,// + Reporting_Level aVP_Data + } +// with { +// variant "present=bytes(4, 1011);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record PCC_Rule_Status_AVP{ + //Ref: ETSI TS 129 212 PCC_Rule_Status_AVP + AVP_Header aVP_Header,// + PCC_Rule_Status aVP_Data + } + + type record Session_Release_Cause_AVP{ + //Ref: ETSI TS 129 212 Session_Release_Cause_AVP + AVP_Header aVP_Header,// + Session_Release_Cause aVP_Data + } +// with { +// variant "present=bytes(4, 1045);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record QoS_Negotiation_AVP{ + //Ref: ETSI TS 129 212 QoS_Negotiation_AVP + AVP_Header aVP_Header,// + QoS_Negotiation aVP_Data + } +// with { +// variant "present=bytes(4, 1029);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record QoS_Upgrade_AVP{ + //Ref: ETSI TS 129 212 QoS_Upgrade_AVP + AVP_Header aVP_Header,// + QoS_Upgrade aVP_Data + } +// with { +// variant "present=bytes(4, 1030);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Resource_Allocation_Notification_AVP{ + //Ref: ETSI TS 129 212 Resource_Allocation_Notification_AVP + AVP_Header aVP_Header,// + Resource_Allocation_Notification aVP_Data + } +// with { +// variant "present=bytes(4, 1063);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Rule_Failure_Code_AVP{ + //Ref: ETSI TS 129 212 Rule_Failure_Code_AVP + AVP_Header aVP_Header,// + Rule_Failure_Code aVP_Data + } + + type record Usage_Monitoring_Level_AVP{ + //Ref: ETSI TS 129 212 Usage_Monitoring_Level_AVP + AVP_Header aVP_Header,// + Usage_Monitoring_Level aVP_Data + } +// with { +// variant "present=bytes(4, 1068);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Usage_Monitoring_Report_AVP{ + //Ref: ETSI TS 129 212 Usage_Monitoring_Report_AVP + AVP_Header aVP_Header,// + Usage_Monitoring_Report aVP_Data + } +// with { +// variant "present=bytes(4, 1069);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Usage_Monitoring_Support_AVP{ + //Ref: ETSI TS 129 212 Usage_Monitoring_Support_AVP + AVP_Header aVP_Header,// + Usage_Monitoring_Support aVP_Data + } +// with { +// variant "present=bytes(4, 1070);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Charging_Rule_Name_AVP{ + //Ref: ETSI TS 129 212 Charging_Rule_Name_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1005);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Flow_Label_AVP{ + //Ref: ETSI TS 129 212 Flow_Label_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1057);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Monitoring_Key_AVP{ + //Ref: ETSI TS 129 212 Monitoring_Key_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1066);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Packet_Filter_Identifier_AVP{ + //Ref: ETSI TS 129 212 Packet_Filter_Identifier_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1060);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + type record PDN_Connection_ID_AVP{ + //Ref: ETSI TS 129 212 PDN_Connection_ID_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1065);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Routing_Rule_Identifier_AVP{ + //Ref: ETSI TS 129 212 Routing_Rule_Identifier_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1077);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Security_Parameter_Index_AVP{ + //Ref: ETSI TS 129 212 Security_Parameter_Index_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1056);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record ToS_Traffic_Class_AVP{ + //Ref: ETSI TS 129 212 ToS_Traffic_Class_AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 1014);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Max_Supported_Bandwidth_DL_AVP{ + //Ref: ETSI TS 129 212 Max_Supported_Bandwidth_DL_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1083);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Max_Supported_Bandwidth_UL_AVP{ + //Ref: ETSI TS 129 212 Max_Supported_Bandwidth_UL_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1084);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Precedence_AVP{ + //Ref: ETSI TS 129 212 Precedence_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1010);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Tunnel_Header_Length_AVP{ + //Ref: ETSI TS 129 212 Tunnel_Header_Length_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 1037);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record AN_GW_Address_AVP{ + //Ref: ETSI TS 129 212 AN_GW_Address_AVP + AVP_Header aVP_Header,// + Address aVP_Data + } +// with { +// variant "present=bytes(4, 1050);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record CoA_IP_Address_AVP{ + //Ref: ETSI TS 129 212 CoA_IP_Address_AVP + AVP_Header aVP_Header,// + Address aVP_Data + } +// with { +// variant "present=bytes(4, 1035);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Routing_IP_Address_AVP{ + //Ref: ETSI TS 129 212 Routing_IP_Address_AVP + AVP_Header aVP_Header,// + Address aVP_Data + } +// with { +// variant "present=bytes(4, 1079);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Packet_Filter_Content_AVP{ + //Ref: ETSI TS 129 212 Packet_Filter_Content_AVP + AVP_Header aVP_Header,// + IPFilterRule_Type aVP_Data + } +// with { +// variant "present=bytes(4, 1059);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record TFT_Filter_AVP{ + //Ref: ETSI TS 129 212 TFT_Filter_AVP + AVP_Header aVP_Header,// + IPFilterRule_Type aVP_Data + } +// with { +// variant "present=bytes(4, 1012);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Tunnel_Header_Filter_AVP{ + //Ref: ETSI TS 129 212 Tunnel_Header_Filter_AVP + AVP_Header aVP_Header,// + IPFilterRule_Type aVP_Data + } +// with { +// variant "present=bytes(4, 1036);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Revalidation_Time_AVP{ + //Ref: ETSI TS 129 212 Revalidation_Time_AVP + AVP_Header aVP_Header,// + Time aVP_Data + } +// with { +// variant "present=bytes(4, 1042);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Rule_Activation_Time_AVP{ + //Ref: ETSI TS 129 212 Rule_Activation_Time_AVP + AVP_Header aVP_Header,// + Time aVP_Data + } +// with { +// variant "present=bytes(4, 1043);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Rule_DeActivation_Time_AVP{ + //Ref: ETSI TS 129 212 Rule_DeActivation_Time_AVP + AVP_Header aVP_Header,// + Time aVP_Data + } +// with { +// variant "present=bytes(4, 1044);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Access_Network_Charging_Identifier_Gx_AVP{ + //Ref: ETSI TS 129 212 Access_Network_Charging_Identifier_Gx_AVP + AVP_Header aVP_Header, // + Access_Network_Charging_Identifier_Value_AVP acc_Net_Charging_Id_Val, + set of Charging_Rule_Base_Name_AVP charging_Rule_Base_Name optional, + set of Charging_Rule_Name_AVP charging_Rule_Name optional + } +// with { +// variant "present=bytes(4, 1022);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (charging_Rule_Base_Name) "fieldPresent=bytes(4, 1004)&&CodecHelper.isAvailable()" +// variant (charging_Rule_Name) "fieldPresent=bytes(4, 1005)&&CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Charging_Rule_Install_AVP{ + //Ref: ETSI TS 129 212 Charging_Rule_Install_AVP + AVP_Header aVP_Header, // + set of Charging_Rule_Definition_AVP charging_Rule_Definition optional, + set of Charging_Rule_Name_AVP charging_Rule_Name optional, + set of Charging_Rule_Base_Name_AVP charging_Rule_Base_Name optional, + Bearer_Identifier_AVP bearer_Identifier optional, + Rule_Activation_Time_AVP rule_Activation_Time optional, + Rule_DeActivation_Time_AVP rule_DeActivation_Time optional, + Resource_Allocation_Notification_AVP resource_Allocation_Notification optional, + Charging_Correlation_Indicator_AVP charging_Correlation_Indicator optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1001);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (charging_Rule_Definition) "fieldPresent=bytes(4, 1003)&&CodecHelper.isAvailable()" +// variant (charging_Rule_Name) "fieldPresent=bytes(4, 1005)&&CodecHelper.isAvailable()" +// variant (charging_Rule_Base_Name) "fieldPresent=bytes(4, 1004)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Charging_Rule_Remove_AVP{ + //Ref: ETSI TS 129 212 Charging_Rule_Install_AVP + AVP_Header aVP_Header, // + set of Charging_Rule_Name_AVP charging_Rule_Name optional, + set of Charging_Rule_Base_Name_AVP charging_Rule_Base_Name optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1002);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (charging_Rule_Name) "fieldPresent=bytes(4, 1005)&&CodecHelper.isAvailable()" +// variant (charging_Rule_Base_Name) "fieldPresent=bytes(4, 1004)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Charging_Rule_Definition_AVP{ + //Ref: ETSI TS 129 212 Charging_Rule_Definition_AVP + AVP_Header aVP_Header, // + Charging_Rule_Name_AVP charging_Rule_Name, + Service_Identifier_AVP service_Identifier optional, + Rating_Group_AVP rating_Group optional, + set of Flow_Information_AVP flow_Information optional, + Flow_Status_AVP flow_Status optional, + QoS_Information_AVP qoS_Information optional, + Reporting_Level_AVP reporting_Level optional, + Online_AVP online optional, + Offline_AVP offline optional, + Metering_Method_AVP metering_Method optional, + Precedence_AVP precedence optional, + AF_Charging_Identifier_AVP aF_Charging_Identifier optional, + set of Flows_AVP flows optional, + Monitoring_Key_AVP monitoring_Key optional, + AF_Signalling_Protocol_AVP aF_Signalling_Protocol optional, + Sponsor_Identity_AVP sponsor_Identity optional, + Application_Service_Provider_Identity_AVP application_Service_Provider_Identity optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1003);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (flow_Information) "fieldPresent=bytes(4, 1058)&&CodecHelper.isAvailable()" +// variant (flows) "fieldPresent=bytes(4, 510)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Charging_Rule_Report_AVP{ + //Ref: ETSI TS 129 212 Charging_Rule_Report_AVP + AVP_Header aVP_Header, // + set of Charging_Rule_Name_AVP charging_Rule_Name optional, + set of Charging_Rule_Base_Name_AVP charging_Rule_Base_Name optional, + Bearer_Identifier_AVP bearer_Identifier optional, + PCC_Rule_Status_AVP pCC_Rule_Status optional, + Rule_Failure_Code_AVP rule_Failure_Code optional, + Final_Unit_Indication_AVP final_Unit_Indication optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1018);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (charging_Rule_Name) "fieldPresent=bytes(4, 1005)&&CodecHelper.isAvailable()" +// variant (charging_Rule_Base_Name) "fieldPresent=bytes(4, 1004)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Flow_Information_AVP{ + //Ref: ETSI TS 129 212 Flow_Information_AVP + AVP_Header aVP_Header, // + Flow_Description_AVP flow_Description optional, + Packet_Filter_Identifier_AVP packet_Filter_Identifier optional, + Packet_Filter_Usage_AVP packet_Filter_Usage optional, + ToS_Traffic_Class_AVP toS_Traffic_Class optional, + Security_Parameter_Index_AVP security_Parameter_Index optional, + Flow_Label_AVP flow_Label optional, + Flow_Direction_AVP flow_Direction optional, + set of AVP_Type aVP_Type optional + } + + type record CoA_Information_AVP{ + //Ref: ETSI TS 129 212 CoA_Information_AVP + AVP_Header aVP_Header, // + Tunnel_Information_AVP tunnel_Information, + CoA_IP_Address_AVP coA_IP_Address, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1039);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Default_EPS_Bearer_QoS_AVP{ + //Ref: ETSI TS 129 212 Default_EPS_Bearer_QoS_AVP + AVP_Header aVP_Header, // + QoS_Class_Identifier_AVP qoS_Class_Identifier optional, + Allocation_Retention_Priority_AVP allocation_Retention_Priority optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1049);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Event_Report_Indication_AVP{ + //Ref: ETSI TS 129 212 Event_Report_Indication_AVP + AVP_Header aVP_Header, // + set of Event_Trigger_AVP event_Trigger optional, + User_CSG_Information_AVP user_CSG_Information optional, + RAT_Type_AVP rAT_Type optional, + QoS_Information_AVP qoS_Information optional, + RAI_AVP rAI optional, + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, + Trace_Data_AVP trace_Data optional, + Trace_Reference_AVP trace_Reference optional, + ThreeGPP2_BSID_AVP threeGPP2_BSID optional, + ThreeGPP_MS_TimeZone_AVP threeGPP_MS_TimeZone optional, + ThreeGPP_SGSN_Address_AVP threeGPP_SGSN_Address optional, + ThreeGPP_SGSN_IPv6_Address_AVP threeGPP_SGSN_IPv6_Address optional, + Routing_IP_Address_AVP routing_IP_Address optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1033);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (event_Trigger) "fieldPresent=bytes(4, 1006)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Maximum_Bandwidth_AVP{ + //Ref: ETSI TS 129 212 Maximum_Bandwidth_AVP + AVP_Header aVP_Header, // + Max_Supported_Bandwidth_UL_AVP max_Supported_Bandwidth_UL optional, + Max_Supported_Bandwidth_DL_AVP max_Supported_Bandwidth_DL optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1082);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Packet_Filter_Information_AVP{ + //Ref: ETSI TS 129 212 Packet_Filter_Information_AVP + AVP_Header aVP_Header, // + Packet_Filter_Identifier_AVP packet_Filter_Identifier optional, + Precedence_AVP precedence optional, + Packet_Filter_Content_AVP packet_Filter_Content optional, + ToS_Traffic_Class_AVP toS_Traffic_Class optional, + Security_Parameter_Index_AVP security_Parameter_Index optional, + Flow_Label_AVP flow_Label optional, + Flow_Direction_AVP flow_Direction optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1061);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Routing_Filter_AVP{ + //Ref: ETSI TS 129 212 Routing_Filter_AVP + AVP_Header aVP_Header, // + Flow_Description_AVP flow_Description, + Flow_Direction_AVP flow_Direction, + ToS_Traffic_Class_AVP toS_Traffic_Class optional, + Security_Parameter_Index_AVP security_Parameter_Index optional, + Flow_Label_AVP flow_Label optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1078);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Routing_Rule_Definition_AVP{ + //Ref: ETSI TS 129 212 Routing_Rule_Definition_AVP + AVP_Header aVP_Header, // + Routing_Rule_Identifier_AVP routing_Rule_Identifier, + set of Routing_Filter_AVP routing_Filter optional, + Precedence_AVP precedence optional, + Routing_IP_Address_AVP routing_IP_Address optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1076);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (routing_Filter) "fieldPresent=bytes(4, 1078)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Routing_Rule_Install_AVP{ + //Ref: ETSI TS 129 212 Routing_Rule_Install_AVP + AVP_Header aVP_Header, // + set of Routing_Rule_Definition_AVP routing_Rule_Definition optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1081);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (routing_Rule_Definition) "fieldPresent=bytes(4, 1076)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Routing_Rule_Remove_AVP{ + //Ref: ETSI TS 129 212 Routing_Rule_Remove_AVP + AVP_Header aVP_Header, // + set of Routing_Rule_Identifier_AVP routing_Rule_Identifier optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1075);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (routing_Rule_Identifier) "fieldPresent=bytes(4, 1077)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record TFT_Packet_Filter_Information_AVP{ + //Ref: ETSI TS 129 212 TFT_Packet_Filter_Information_AVP + AVP_Header aVP_Header, // + Precedence_AVP precedence optional, + TFT_Filter_AVP tFT_Filter optional, + ToS_Traffic_Class_AVP toS_Traffic_Class optional, + Security_Parameter_Index_AVP security_Parameter_Index optional, + Flow_Label_AVP flow_Label optional, + Flow_Direction_AVP flow_Direction optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1013);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Tunnel_Information_AVP{ + //Ref: ETSI TS 129 212 Tunnel_Information_AVP + AVP_Header aVP_Header, // + Tunnel_Header_Length_AVP tunnel_Header_Length optional, + record length (0..2) of Tunnel_Header_Filter_AVP tunnel_Header_Filter optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1038);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (tunnel_Header_Filter) "fieldPresent=bytes(4, 1036)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Usage_Monitoring_Information_AVP{ + //Ref: ETSI TS 129 212 Usage_Monitoring_Information_AVP + AVP_Header aVP_Header, // + Monitoring_Key_AVP monitoring_Key optional, + Granted_Service_Unit_AVP granted_Service_Unit optional, + Used_Service_Unit_AVP used_Service_Unit optional, + Usage_Monitoring_Level_AVP usage_Monitoring_Level optional, + Usage_Monitoring_Report_AVP usage_Monitoring_Report optional, + Usage_Monitoring_Support_AVP usage_Monitoring_Support optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 1067);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + }//end of group TS129_212Gx_AVPs + + }//end group AVPs + +} with { + encode "DIAMETERCodec"; variant ""; +} //end module LibDiameter_Types_Gx_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_RfRo_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_RfRo_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..866f9e5fdfc253bd2ec0f09e25530ddfb48d43e2 --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_RfRo_AVPs.ttcn @@ -0,0 +1,3796 @@ +/** + * @author STF 490 + * @version $Id: LibDiameter_Types_RfRo_AVPs.ttcn 180 2015-02-26 07:15:21Z garciay $ + * @desc This module defines Diameter Rf and Ro AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + */ +module LibDiameter_Types_RfRo_AVPs { + + // LibCommon + import from LibCommon_BasicTypesAndValues all; + + // LibDiameter + //import from LibDiameter_TypesAndValues all; + import from LibDiameter_Types_Base_AVPs all; + // import from LibDiameter_Types_S6a_AVPs all; + // import from LibDiameter_Types_Gx_AVPs all; + // import from LibDiameter_Types_Rx_AVPs all; + // import from LibDiameter_Types_CxDx_AVPs all; + + group AVPTypes { + + group Enum_AVP_Rf_Ro_Types { + + /** + * @desc PDP-Context-Type enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.138 PDP-Context-Type AVP + */ + type enumerated PDP_Context_Type { + PRIMARY_E (0), + SECONDARY_E (1) +// } with { +// variant "length=32" + } // End of type Charge_Reason_Code + + /** + * @desc Charge-Reason-Code enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.38A Charge-Reason-Code AVP + */ + type enumerated Charge_Reason_Code { + UNKNOWN_CRC_E (0), // To prevent recursive declaration with other enumerated containing UNKNOWN_E + USAGE_E (1), + COMMUNICATION_ATTEMPT_CHARGE_E (2), + SETUP_CHARGE_E (3), + ADD_ON_CHARGE_E (4) +// } with { +// variant "length=32" + } // End of type Charge_Reason_Code + + /** + * @desc Charge-Reason-Code enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.57 Dynamic-Address-Flag AVP + */ + type enumerated Dynamic_Address_Flag { + STATIC_E (0), + DYNAMIC_E (1) +// } with { +// variant "length=32" + } // End of type Dynamic_Address_Flag + + /** + * @desc Charge-Reason-Code enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.57A Dynamic-Address-Flag-Extension AVP + */ + type enumerated Dynamic_Address_Flag_Extension { + STATIC_E (0), + DYNAMIC_E (1) +// } with { +// variant "length=32" + } // End of type Dynamic_Address_Flag_Extension + + /** + * @desc Charge-Reason-Code enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.198 Serving-Node-Type AVP + */ + type enumerated Serving_Node_Type { + SGSN_E (0), + PMIPSGW_E (1), + GTPSGW_E (2), + EPDG_E (3), + HSGW_E (4), + MME_E (5) +// } with { +// variant "length=32" + } // End of type Serving_Node_Type + + /** + * @desc Charge-Reason-Code enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.200 SGW-Change AVP + */ + type enumerated SGW_Change { + UNAUTHENTICATEDE_ACR_START_NOT_DUE_TO_SGW_CHANGE_E (0), + ACR_START_DUE_TO_SGW_CHANGE_E (1) +// } with { +// variant "length=32" + } // End of type SGW_Change + + /** + * @desc IMSI-Unauthenticated-Flag enumerated values + * @see ETSI TS 132 299 V10.15.0 (2015-04) Clause 7.2.78 IMSI-Unauthenticated-Flag AVP + */ + type enumerated IMSI_Unauthenticated_Flag { + AUTHENTICATED_E (0), + UNAUTHENTICATED_E (1) +// } with { +// variant "length=32" + } // End of type IMSI_Unauthenticated_Flag + + /** + * @desc The Charging-Characteristics-Selection-Mode enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.39A Charging-Characteristics-Selection-Mode AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Charging_Characteristics_Selection_Mode { + SERVING_NODE_SUPPLIED_E (0), + SUBSCRIPTION_SPECIFIC_E (1), + APN_SPECIFIC_E (2), + HOME_DEFAULT_E (3), + ROAMING_DEFAULT_E (4), + VISITING_DEFAULT_E (5) +// } with { +// variant "length=32" + } // End of type Charging_Characteristics_Selection_Mode + + /** + * @desc The Charging-Characteristics-Selection-Mode enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.37 Change-Condition AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Change_Condition { + NORMALRELEASE_E (0), + ABNORMALRELEASE_E (1), + QOSCHANGE_E (2), + VOLUMELIMIT_E (3), + TIMELIMIT_E (4), + SERVINGNODECHANGE_E (5), + SERVINGNODEPLMNCHANGE_E (6), + USERLOCATIONCHANGE_E (7), + RATCHANGE_E (8), + UETIMEZONECHANGE_E (9), + TARIFFTIMECHANGE_E (10), + SERVICEIDLEDOUT_E (11), + SERVICESPECIFICUNITLIMIT_E (12), + MAXNUMBERCHANGESCHARGINGCONDITIONS_E (13), + CGI_SAICHANGE_E (14), + RAICHANGE_E (15), + ECGICHANGE_E (16), + TAICHANGE_E (17), + SERVICEDATAVOLUMELIMIT_E (18), + SERVICEDATATIMELIMIT_E (19), + MANAGEMENTINTERVENTION_E (20), + SERVICESTOP_E (21), + USERCSGINFORMATIONCHANGE_E (22), + S_GWCHANGE_E (23) +// } with { +// variant "length=32" + } // End of type Change_Condition + + /** + * @desc The Low-Priority-Indicator enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause .2.97A Low-Priority-Indicator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Low_Priority_Indicator { + NO_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type Low_Priority_Indicator + + /** + * @desc The AoC-Service-Obligatory-Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.18 AoC-Service-Obligatory-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated AoC_Service_Obligatory_Type { + NON_BINDING_E (0), + BINDING_E (1) +// } with { +// variant "length=32" + } // End of type AoC_Service_Obligatory_Type + + /** + * @desc The AoC-Service-Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.19 AoC-Service-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated AoC_Service_Type { + NONE_E (0), + AOC_S_E (1), + AOC_D_E (2), + AOC_E_E (3) +// } with { +// variant "length=32" + } // End of type AoC_Service_Type + + /** + * @desc The AoC-Format enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.14 AoC-Format AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated AoC_Format { + MONETARY_E (0), + NON_MONETARY_E (1), + CAI_E (2) +// } with { +// variant "length=32" + } // End of type AoC_Format + + /** + * @desc The AoC-Request-Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.16 AoC-Request-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated AoC_Request_Type { + AOC_NOT_REQUESTED_E (0), + AOC_FULL_E (1), + AOC_COST_ONLY_E (2), + AOC_TARIFF_ONLY_E (3) +// } with { +// variant "length=32" + } // End of type AoC_Request_Type + + /** + * @desc The Low-Balance-Indication enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.97 Low-Balance-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Low_Balance_Indication { + NOT_APPLICABLE_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type Low_Balance_Indication + + /** + * @desc The Role-Of-Node enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.177 Role-Of-Node AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Role_Of_Node { + ORIGINATING_ROLE_E (0), + TERMINATING_ROLE_E (1) +// } with { +// variant "length=32" + } // End of type Role_Of_Node + + /** + * @desc The Node_Functionality enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.113 Node-Functionality AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Node_Functionality { + S_CSCF_E (0), + P_CSCF_E (1), + I_CSCF_E (2), + MRFC_E (3), + MGCF_E (4), + BGCF_E (5), + AS_E (6), + IBCF_E (7), + S_GW_E (8), + P_GW_E (9), + HSGW_E (10), + E_CSCF_E (11) +// } with { +// variant "length=32" + } // End of type Node_Functionality + + /** + * @desc The Online_Charging_Flag enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.122 Online-Charging-Flag AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Online_Charging_Flag { + ADDRESSNOTPROVIDED_E (0), + ADDRESSPROVIDED_E (1) +// } with { +// variant "length=32" + } // End of type Online_Charging_Flag + + /** + * @desc The IMS_Emergency_Indicator enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.76A IMS-Emergency-Indicator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated IMS_Emergency_Indicator { + NON_EMERGENCY_E (0), + EMERGENCY_E (1) +// } with { +// variant "length=32" + } // End of type IMS_Emergency_Indicator + + /** + * @desc The Originator enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.124 Originator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Originator { + CALLING_PARTY_E (0), + CALLED_PARTY_E (1) +// } with { +// variant "length=32" + } // End of type Originator + + /** + * @desc The SDP_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.186 SDP-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated SDP_Type { + SDP_OFFER_E (0), + SDP_ANSWER_E (1) +// } with { +// variant "length=32" + } // End of type SDP_Type + + /** + * @desc The Local_GW_Inserted_Indication enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.92A Local-GW-Inserted-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Local_GW_Inserted_Indication { + LOCAL_GW_NOT_INSERTED_E (0), + LOCAL_GW_INSERTED_E (1) +// } with { +// variant "length=32" + } // End of type Local_GW_Inserted_Indication + + /** + * @desc The IP_Realm_Default_Indication enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.80A IP-Realm-Default-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated IP_Realm_Default_Indication { + DEFAULT_IP_REALM_NOT_USED_E (0), + DEFAULT_IP_REALM_USED_E (1) +// } with { +// variant "length=32" + } // End of type IP_Realm_Default_Indication + + /** + * @desc The Transcoder_Inserted_Indication enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.233A Transcoder-Inserted-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Transcoder_Inserted_Indication { + TRANSCODER_NOT_INSERTED_E (0), + TRANSCODER_INSERTED_E (1) +// } with { +// variant "length=32" + } // End of type Transcoder_Inserted_Indication + + /** + * @desc The Media_Initiator_Flag enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.101 Media-Initiator-Flag AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Media_Initiator_Flag { + CALLED_PARTY_E (0), + CALLING_PARTY_E (1), + UNKNOWN_MIF_E (3) // To prevent recursive declaration with other enumerated containing UNKNOWN_E +// } with { +// variant "length=32" + } // End of type Media_Initiator_Flag + + /** + * @desc The Application_Service_Type enumerated values + * @see OMA-DDS-Charging_Data-V1_0-20110201-A / Table 5 + */ + type enumerated Application_Service_Type { + SENDING_E (100), + RECEIVING_E (101), + RETRIEVAL_E (102), + INVITING_E (103), + LEAVING_E (104), + JOINING_E (105) +// INVITING_E (0), +// JOINING_E (1), +// LEAVING_E (2), +// RECEIVING_E (3), +// RETRIEVAL_E (4), +// SENDING_E (5) +// } with { +// variant "length=32" + } // End of type Application_Service_Type + + /** + * @desc The Address_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.9 Address-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Address_Type { + EMAIL_ADDRESS_E (0), + MSISDN_E (1), + IPV4_ADDRESS_E (2), + IPV6_ADDRESS_E (3), + NUMERIC_SHORTCODE_E (4), + ALPHANUMERIC_SHORTCODE_E (5), + OTHER_E (6), + IMSI_E (7) +// } with { +// variant "length=32" + } // End of type Address_Type + + /** + * @desc The DRM_Content enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.56 DRM-Content AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated DRM_Content { + NO_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type DRM_Content + + /** + * @desc The Addressee_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.10 Addressee-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Addressee_Type { + TO_E (0), + CC_E (1), + BCC_E (2) +// } with { +// variant "length=32" + } // End of type Addressee_Type + + /** + * @desc The Adaptation enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.4 Adaptations AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Adaptation { + NO_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type Adaptation + + /** + * @desc The Priority enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.154 Priority AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Priority { + LOW_E (0), + NORMAL_E (1), + HIGH_E (2) +// } with { +// variant "length=32" + } // End of type Priority + + /** + * @desc The Message_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.107 Message-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Message_Type { + M_SEND_REQ_E (1), + M_SEND_CONF_E (2), + M_NOTIFICATION_IND_E (3), + M_NOTIFYRESP_IND_E (4), + M_RETRIEVE_CONF_E (5), + M_ACKNOWLEDGE_IND_E (6), + M_DELIVERY_IND_E (7), + M_READ_REC_IND_E (8), + M_READ_ORIG_IND_E (9), + M_FORWARD_REQ_E (10), + M_FORWARD_CONF_E (11), + M_MBOX_STORE_CONF_E (12), + M_MBOX_VIEW_CONF_E (13), + M_MBOX_UPLOAD_CONF_E (14), + M_MBOX_DELETE_CONF_E (15) +// } with { +// variant "length=32" + } // End of type Message_Type + + /** + * @desc The Class_Identifier enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.40 Class-Identifier AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Class_Identifier { + PERSONAL_E (0), + ADVERTISEMENT_E (1), + INFORMATIONAL_E (2), + AUTO_E (3) +// } with { +// variant "length=32" + } // End of type Class_Identifier + + /** + * @desc The Read_Reply_Report_Requested enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.162 Read-Reply-Report-Requested AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Read_Reply_Report_Requested { + NO_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type Read_Reply_Report_Requested + + /** + * @desc The Delivery_Report_Requested enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.52 Delivery-Report-Requested AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Delivery_Report_Requested { + NO_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type Delivery_Report_Requested + + /** + * @desc The MMBox_Storage_Requested enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.109 MMBox-Storage-Requested AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated MMBox_Storage_Requested { + NO_E (0), + YES_E (1) +// } with { +// variant "length=32" + } // End of type MMBox_Storage_Requested + + /** + * @desc The MMBox_Storage_Requested enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.42 Content-Class AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Content_Class { + IMAGE_BASIC_E (0), + IMAGE_RICH_E (1), + VIDEO_BASIC_E (2), + VIDEO_RICH_E (3), + MEGAPIXEL_E (4), + CONTENT_BASIC_E (5), + CONTENT_RICH_E (6) +// } with { +// variant "length=32" + } // End of type Content_Class + + /** + * @desc The LCS_Client_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.86 LCS-Client-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated LCS_Client_Type { + EMERGENCY_SERVICES_E (0), + VALUE_ADDED_SERVICES_E (1), + PLMN_OPERATOR_SERVICESC_E (2), + LAWFUL_INTERCEPT_SERVICES_E (3) +// } with { +// variant "length=32" + } // End of type LCS_Client_Type + + /** + * @desc The LCS_Client_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.88 LCS-Format-Indicator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated LCS_Format_Indicator { + LOGICAL_NAME_E (0), + EMAIL_ADDRESS_E (1), + MSISDN_E (2), + URL_E (3), + SIP_URL_E (4) +// } with { +// variant "length=32" + } // End of type LCS_Format_Indicator + + /** + * @desc The Location_Estimate_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.95 Location-Estimate-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Location_Estimate_Type { + CURRENT_LOCATION_E (0), + CURRENT_LAST_KNOWN_LOCATION_E (1), + INITIAL_LOCATION_E (2), + ACTIVATE_DEFERRED_LOCATION_E (3), + CANCEL_DEFERRED_LOCATION_E (4) +// } with { +// variant "length=32" + } // End of type Location_Estimate_Type + + /** + * @desc The PoC_Server_Role enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.145 PoC-Server-Role AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PoC_Server_Role { + PARTICIPATING_POC_SERVER_E (0), + CONTROLLING_POC_SERVER_E (1) +// } with { +// variant "length=32" + } // End of type PoC_Server_Role + + /** + * @desc The PoC_Session_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.148 PoC-Session-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PoC_Session_Type { + ONE_TOONE_POC_SESSION_E (0), + CHAT_POC_GROUP_SESSION_E (1), + PRE_ARRANGED_POC_GROUP_SESSION_E (2), + AD_HOC_POC_GROUP_SESSION_E (3) +// } with { +// variant "length=32" + } // End of type PoC_Session_Type + + /** + * @desc The PoC_User_Role_info_Units enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.151 PoC-User-Role-info-Units AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PoC_User_Role_info_Units { + MODERATOR_E (0), + DISPATCHER_E (1), + SESSION_OWNER_E (2), + SESSION_PARTICIPANT_E (3) +// } with { +// variant "length=32" + } // End of type PoC_User_Role_info_Units + + /** + * @desc The PoC_Session_Initiation_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.147 PoC-Session-Initiation-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PoC_Session_Initiation_Type { + PRE_ESTABLISH_E (0), + ON_DEMAND_E (1) +// } with { +// variant "length=32" + } // End of type PoC_Session_Initiation_Type + + /** + * @desc The PoC_Event_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.142 PoC-Event-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PoC_Event_Type { + NORMAL_E (0), + INSTANT_PPERSONAL_AALERT_EVENT_E (1), + POC_GROUP_ADVERTISEMENT_EVENT_E (2), + EARLY_SSESSION_SETTING_UP_EVENT_E (3), + POC_TALK_BURST_E (4) +// } with { +// variant "length=32" + } // End of type PoC_Event_Type + + /** + * @desc The Participant_Access_Priority enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.142 PoC-Event-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated Participant_Access_Priority { + PRE_EMPTIVE_PRIORITY_E (0), + HIGH_PRIORITY_E (1), + NORMAL_PRIORITY_E (2), + LOW_PRIORITY_E (3) +// } with { +// variant "length=32" + } // End of type Participant_Access_Priority + + /** + * @desc The User_Participating_Type enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.142 PoC-Event-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated User_Participating_Type { + NORMAL_E (0), + NW_POC_BOX_E (1), + UE_POC_BOX_E (2) +// } with { +// variant "length=32" + } // End of type User_Participating_Type + + /** + * @desc The PoC_Change_Condition enumerated values + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.139 PoC-Change-Condition AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type enumerated PoC_Change_Condition { + SERVICE_CHANGE_E (0), + VOLUME_LIMIT_E (1), + TIME_LIMIT_E (2), + NUMBER_OF_TALK_BURST_LIMIT_E (3), + NUMBER_OF_ACTIVE_PARTICIPANTS_E (4), + TARIFF_TIME_E (5) +// } with { +// variant "length=32" + } // End of type PoC_Change_Condition + + } // End of group Enum_AVP_Rf_Ro_Types + + group Avp_Rf_Ro_Types { + + group TS132_299Rf_Ro_AVPS { + + /** + * @desc The Accounting-Input-Octets AVP (AVP code 363) + * @member aVP_Header Header AVP + * @member aVP_Data Number of octets transmitted during the data container recording interval, reflecting the volume counts for uplink traffic for a data flow + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.1.1 Accounting-Input-Octets + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Accounting_Input_Octets_AVP { + AVP_Header aVP_Header,// + UInt64 aVP_Data + } // End of type Accounting_Input_Octets_AVP + + /** + * @desc The Accounting-Output-Octets AVP (AVP code 364) + * @member aVP_Header Header AVP + * @member aVP_Data Number of octets transmitted during the data container recording interval, reflecting the volume counts for downlink traffic for a data flow + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.1.3 Accounting-Output-Octets + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Accounting_Output_Octets_AVP { + AVP_Header aVP_Header,// + UInt64 aVP_Data + } // End of type Accounting_Output_Octets_AVP + + /** + * @desc The Event-Type AVP (AVP code 823) + * @member aVP_Header Header AVP + * @member sip_Method TODO + * @member event TODO + * @member aVP_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.65 Event-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Event_Type_AVP { + AVP_Header aVP_Header,// + SIP_Method_AVP sip_Method optional, + Event_AVP event optional, + Expires_AVP aVP_Data optional + } // End of type Event_Type_AVP + + /** + * @desc The Event AVP (AVP code 825) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the content of the "Event" header + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.63 Event AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Event_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Event_AVP + + /** + * @desc The Content-Type AVP (AVP code 826) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the media type (e.g. application/sdp, text/html) of the message-body, as described in RFC 3261 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.46 Content-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Content_Type_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Content_Type_AVP + + /** + * @desc The Content-Length AVP (AVP code 827) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the size of the message-body, as described in RFC 3261 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.44 Content-Length AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Content_Length_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Content_Length_AVP + + /** + * @desc The Content-Disposition AVP (AVP code 828) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates how the message body or a message body part is to be interpreted (e.g. session, render), as described in RFC 3261 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.43 Content-Disposition AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Content_Disposition_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Content_Disposition_AVP + + /** + * @desc The Event AVP (AVP code 829) + * @member aVP_Header Header AVP + * @member aVP_Data Specifies whether the IMS node (except the MRFC) is serving the calling or the called party + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.177 Role-Of-Node AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Role_Of_Node_AVP { + AVP_Header aVP_Header,// + Role_Of_Node aVP_Data + } // End of type Role_Of_Node_AVP + + /** + * @desc The User-Session-Id AVP (AVP code 830) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the session identifier + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.242 User-Session-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record User_Session_Id_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type User_Session_Id_AVP + + /** + * @desc The Calling-Party-Address AVP (AVP code 831) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the session identifier + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.33 Calling-Party-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Calling_Party_Address_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Calling_Party_Address_AVP + + /** + * @desc The Called-Party-Address AVP (AVP code 832) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the session identifier + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.32 Called-Party-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Called_Party_Address_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Called_Party_Address_AVP + + /** + * @desc The Time-Stamps AVP (AVP code 833) + * @member aVP_Header Header AVP + * @member sip_Request_Timestamp TODO + * @member sip_Response_Timestamp TODO + * @member sip_Request_Timestamp_Fraction TODO + * @member sip_Response_Timestamp_Fraction TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.231 Time-Stamps AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Time_Stamps_AVP { + AVP_Header aVP_Header,// + SIP_Request_Timestamp_AVP sip_Request_Timestamp optional, + SIP_Response_Timestamp_AVP sip_Response_Timestamp optional, + SIP_Request_Timestamp_Fraction_AVP sip_Request_Timestamp_Fraction optional, + SIP_Response_Timestamp_Fraction_AVP sip_Response_Timestamp_Fraction optional + } // End of type Time_Stamps_AVP + + /** + * @desc The SIP-Request-Timestamp AVP (AVP code 834) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the time in UTC format of the SIP request + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.202 SIP-Request-Timestamp AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SIP_Request_Timestamp_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type SIP_Request_Timestamp_AVP + + /** + * @desc The SIP-Response-Timestamp AVP (AVP code 835) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the time in UTC format of the SIP response + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.204 SIP-Response-Timestamp AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SIP_Response_Timestamp_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type SIP_Response_Timestamp_AVP + + /** + * @desc The Application-Server AVP (AVP code 836) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the SIP URL(s) of the AS(s) addressed during the session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.23 Application-Server AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Application_Server_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Application_Server_AVP + + /** + * @desc The Application-provided-Called-Party-Address AVP (AVP code 837) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the called party number (SIP URI, E.164), if it is determined by an application server + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.22 Application-provided-Called-Party-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Application_provided_Called_Party_Address_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Application_provided_Called_Party_Address_AVP + + /** + * @desc The Inter-Operator-Identifier AVP (AVP code 838) + * @member aVP_Header Header AVP + * @member originating_IOI TODO + * @member terminating_IOI TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.80 Inter-Operator-Identifier AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Inter_Operator_Identifier_AVP { + AVP_Header aVP_Header,// + Originating_IOI_AVP originating_IOI optional, + Terminating_IOI_AVP terminating_IOI optional + } // End of type Inter_Operator_Identifier_AVP + + /** + * @desc The Originating-IOI AVP (AVP code 839) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the Inter Operator Identifier (IOI) for the originating network as generated by the IMS network element which takes responsibility for populating this parameter [404] in a SIP request as described in TS 24.229 [202] + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.123 Originating-IOI AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Originating_IOI_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Originating_IOI_AVP + + /** + * @desc The Terminating-IOI AVP (AVP code 840) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the Inter Operator Identifier (IOI) for the terminating network as generated by the IMS network element which takes responsibility for populating this parameter [404] in a SIP response as described in TS 24.229 [202] + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.225 TTerminatingerminating-IOI AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Terminating_IOI_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Originating_IOI_AVP + + /** + * @desc The IMS-Charging-Identifier AVP (AVP code 841) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the IMS Charging Identifier (ICID) as generated by a IMS node for a SIP session and described in TS 24.229 [204] + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.75 IMS-Charging-Identifier AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record IMS_Charging_Identifier_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type IMS_Charging_Identifier_AVP + + /** + * @desc The SDP-Session-Description AVP (AVP code 842) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the content of the SDP line (i=, c=, b=, k=, a=, etc.) in the session description, as described in RFC 4566 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.184 SDP-Session-Description AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_Session_Description_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type SDP_Session_Description_AVP + + /** + * @desc The SDP-Media-Component AVP (AVP code 843) + * @member aVP_Header Header AVP + * @member SDP_Media_Name_AVP TODO + * @member set of SDP_Media_Description_AVP TODO + * @member Local_GW_Inserted_Indication_AVP TODO + * @member IP_Realm_Default_Indication_AVP TODO + * @member Transcoder_Inserted_Indication_AVP TODO + * @member Media_Initiator_Flag_AVP TODO + * @member Media_Initiator_Party_AVP TODO + * @member ThreeGPP_Charging_Id_AVP TODO + * @member Access_Network_Charging_Identifier_Value_AVP TODO + * @member SDP_Type_AVP TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.180 SDP-Media-Component AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_Media_Component_AVP { + AVP_Header aVP_Header,// + SDP_Media_Name_AVP sdp_Media_Name optional, + set of SDP_Media_Description_AVP sdp_Media_Description optional, + Local_GW_Inserted_Indication_AVP local_GW_Inserted_Indication optional, + IP_Realm_Default_Indication_AVP ip_Realm_Default_Indication optional, + Transcoder_Inserted_Indication_AVP transcoder_Inserted_Indication optional, + Media_Initiator_Flag_AVP media_Initiator_Flag optional, + Media_Initiator_Party_AVP media_Initiator_Party optional, + ThreeGPP_Charging_Id_AVP threeGPP_Charging_Id optional, + Access_Network_Charging_Identifier_Value_AVP access_Network_Charging_Identifier_Value optional, + SDP_Type_AVP sdp_Type optional + } // End of type SDP_Media_Component_AVP + + /** + * @desc The SDP-Media-Name AVP (AVP code 844) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the content of SDP lines (i=, c=, b=, k=, a=, etc.) related to a media description, as described in RFC 4566 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.182 SDP-Media-Name AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_Media_Name_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type SDP_Media_Name_AVP + + /** + * @desc The SDP-Media-Description AVP (AVP code 845) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the content of SDP lines (i=, c=, b=, k=, a=, etc.) related to a media description, as described in RFC 4566 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.181 SDP-Media-Description AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_Media_Description_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type SDP_Media_Description_AVP + + /** + * @desc The CG-Address AVP (AVP code 846) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the IP-address of the P-GW that generated the GPRS/EPC Charging ID + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.36 CG-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record CG_Address_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type CG_Address_AVP + + /** + * @desc The GGSN-Address AVP (AVP code 847) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the IP-address of the P-GW that generated the GPRS/EPC Charging ID + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.68 GGSN-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record GGSN_Address_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type GGSN_Address_AVP + + /** + * @desc The Application-Server-Information AVP (AVP code 850) + * @member aVP_Header Header AVP + * @member application_Server TODO + * @member application_Provided_Called_Party_Address TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.24 Application-Server-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Application_Server_Information_AVP { + AVP_Header aVP_Header,// + Application_Server_AVP application_Server optional, + set of Application_provided_Called_Party_Address_AVP application_Provided_Called_Party_Address optional + } // End of type Application_Server_Information_AVP + + /** + * @desc The Trunk-Group-ID AVP (AVP code 851) + * @member aVP_Header Header AVP + * @member incoming_Trunk_Group_ID TODO + * @member outgoing_Trunk_Group_ID TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.24 7.2.237 Trunk-Group-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Trunk_Group_ID_AVP { + AVP_Header aVP_Header,// + Incoming_Trunk_Group_ID_AVP incoming_Trunk_Group_ID optional, + Outgoing_Trunk_Group_ID_AVP outgoing_Trunk_Group_ID optional + } // End of type Trunk_Group_ID_AVP + + /** + * @desc The Incoming-Trunk-Group-ID AVP (AVP code 852) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the incoming PSTN leg + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.79 Incoming-Trunk-Group-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Incoming_Trunk_Group_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Incoming_Trunk_Group_ID_AVP + + /** + * @desc The Outgoing-Trunk-Group-ID AVP (AVP code 853) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the outgoing PSTN leg + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.129 Outgoing-Trunk-Group-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Outgoing_Trunk_Group_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Outgoing_Trunk_Group_ID_AVP + + /** + * @desc The Bearer-Service AVP (AVP code 854) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the used bearer service for the PSTN leg + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.30 Bearer-Service AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Bearer_Service_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type Bearer_Service_AVP + + /** + * @desc The Service-ID AVP (AVP code 855) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the service the MRFC is hosting or AoC service + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.190 Service-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Service_Id_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Service_Id_AVP + + /** + * @desc The Associated-URI AVP (AVP code 856) + * @member aVP_Header Header AVP + * @member aVP_Data Holds a non-barred public user identity (SIP URI or TEL URI) associated to the public user identity under registration + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.26 Associated-URI AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Associated_URI_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Associated_URI_AVP + + /** + * @desc The Charged-Party AVP (AVP code 857) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the address (Public User ID: SIP URI, TEL URI, etc.) of the party to be charged + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.39 Charged-Party AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Charged_Party_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Charged_Party_AVP + + /** + * @desc The PoC-Controlling-Address AVP (AVP code 858) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the PoC server performing the controlling function for the associated PoC session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.141 PoC-Controlling-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_Controlling_Address_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type PoC_Controlling_Address_AVP + + /** + * @desc The PoC-Group-Name AVP (AVP code 859) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies a group + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.143 PoC-Group-Name AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_Group_Name_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type PoC_Group_Name_AVP + + /** + * @desc The Cause-Code AVP (AVP code 861) + * @member aVP_Header Header AVP + * @member aVP_Data Includes the cause code value from IMS node + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.35 Cause-Code AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Cause_Code_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Cause_Code_AVP + + /** + * @desc The Node-Functionality AVP (AVP code 862) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the functionality identifier of the node + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.113 Node-Functionality AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Node_Functionality_AVP { + AVP_Header aVP_Header,// + Node_Functionality aVP_Data + } // End of type Node_Functionality_AVP + + /** + * @desc The Originator AVP (AVP code 863) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the originating party of the message body + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.124 Originator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Originator_AVP { + AVP_Header aVP_Header,// + Originator aVP_Data + } // End of type Originator_AVP + + /** + * @desc The Service-Information AVP (AVP code 873) + * @member aVP_Header Header AVP + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.192 Service-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Service_Information_AVP { + AVP_Header aVP_Header,// + set of Subscription_Id_AVP subscription_Id optional, + AoC_Information_AVP aoc_Information optional, + PS_Information_AVP ps_Information optional, + WLAN_Information_AVP wlan_Information optional, + IMS_Information_AVP ims_Information optional, + MMS_Information_AVP mms_Information optional, + LCS_Information_AVP lcs_Information optional, + PoC_Information_AVP poc_Information optional, + MBMS_Information_AVP mbms_Information optional, + SMS_Information_AVP sms_Information optional, + MMTel_Information_AVP mmtel_Information optional, + Service_Generic_Information_AVP service_Generic_Information optional, + IM_Information_AVP im_Information optional, + DCD_Information_AVP dcd_Information optional + } // End of type Service_Information_AVP + + /** + * @desc The PS-Information AVP (AVP code 874) + * @member aVP_Header Header AVP + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.158 PS-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PS_Information_AVP { + AVP_Header aVP_Header,// + ThreeGPP_Charging_Id_AVP threeGPP_Charging_Id optional, + PDN_Connection_Charging_ID_AVP pdn_Connection_Charging_ID optional, + Node_Id_AVP node_Id optional, + ThreeGPP_PDP_Type_AVP threeGPP_PDP_Type optional, + set of PDP_Address_AVP pdp_Address optional, + PDP_Address_Prefix_Length_AVP pdp_Address_Prefix_Length optional, + Dynamic_Address_Flag_AVP dynamic_Address_Flag optional, + Dynamic_Address_Flag_Extension_AVP dynamic_Address_Flag_Extension optional, + QoS_Information_AVP qos_Information optional, + set of SGSN_Address_AVP sgsn_Address optional, + set of GGSN_Address_AVP ggsn_Address optional, + set of SGW_Address_AVP sgw_Address optional, + CG_Address_AVP cg_Address optional, + Serving_Node_Type_AVP serving_Node_Type optional, + SGW_Change_AVP sgw_Change optional, + ThreeGPP_IMSI_MCC_MNC_AVP threeGPP_IMSI_MCC_MNC optional, + IMSI_Unauthenticated_Flag_AVP imsi_Unauthenticated_Flag optional, + ThreeGPP_GGSN_MCC_MNC_AVP threeGPP_GGSN_MCC_MNC optional, + ThreeGPP_NSAPI_AVP threeGPP_NSAPI optional, + Called_Station_Id_AVP called_Station_Id optional, + ThreeGPP_Session_Stop_Indicator_AVP threeGPP_Session_Stop_Indicator optional, + ThreeGPP_Selection_Mode_AVP threeGPP_Selection_Mode optional, + ThreeGPP_Charging_Characteristics_AVP threeGPP_Charging_Characteristics optional, + Charging_Characteristics_Selection_Mode_AVP charging_Characteristics_Selection_Mode optional, + ThreeGPP_SGSN_MCC_MNC_AVP threeGPP_SGSN_MCC_MNC optional, + ThreeGPP_MS_TimeZone_AVP threeGPP_MS_TimeZone optional, + Charging_Rule_Base_Name_AVP charging_Rule_Base_Name optional, + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, + User_CSG_Information_AVP user_CSG_Information optional, + ThreeGPP2_BSID_AVP threeGPP2_BSID optional, + ThreeGPP_RAT_Type_AVP threeGPP_RAT_Type optional, + PS_Furnish_Charging_Information_AVP ps_Furnish_Charging_Information optional, + PDP_Context_Type_AVP pdp_Context_Type optional, + Offline_Charging_AVP offline_Charging optional, + set of Traffic_Data_Volumes_AVP traffic_Data_Volumes optional, + set of Service_Data_Container_AVP service_Data_Container optional, + User_Equipment_Info_AVP user_Equipment_Info optional, + Terminal_Information_AVP terminal_Information optional, + Start_Time_AVP start_Time optional, + Stop_Time_AVP stop_Time optional, + Change_Condition_AVP change_Condition optional, + Diagnostics_AVP diagnostics optional, + Low_Priority_Indicator_AVP low_Priority_Indicator optional + } // End of type PS_Information_AVP + + /** + * @desc The WLAN-Information AVP (AVP code 875) + * @member aVP_Header Header AVP + * @member wlan_Session_Id TODO + * @member wlan_Session_Id TODO + * @member pdg_Address TODO + * @member pdg_Charging_Id TODO + * @member wag_Address TODO + * @member wag_PLMN_Id TODO + * @member wlan_Radio_Container TODO + * @member wlan_UE_Local_IPAddress TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.246 WLAN-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record WLAN_Information_AVP { + AVP_Header aVP_Header,// + WLAN_Session_Id_AVP wlan_Session_Id optional, + PDG_Address_AVP pdg_Address optional, + PDG_Charging_Id_AVP pdg_Charging_Id optional, + WAG_Address_AVP wag_Address optional, + WAG_PLMN_Id_AVP wag_PLMN_Id optional, + WLAN_Radio_Container_AVP wlan_Radio_Container optional, + WLAN_UE_Local_IPAddress_AVP wlan_UE_Local_IPAddress optional + } // End of type WLAN_Information_AVP + + /** + * @desc The IMS-Information AVP (AVP code 876) + * @member aVP_Header Header AVP + * @member event_Type TODO + * @member role_Of_Node TODO + * @member node_Functionality TODO + * @member user_Session_Id TODO + * @member outgoing_Session_Id TODO + * @member session_Priority TODO + * @member calling_Party_Address TODO + * @member called_Party_Address TODO + * @member called_Asserted_Identity TODO + * @member number_Portability_Routing_Information TODO + * @member carrier_Select_Routing_Information TODO + * @member alternate_Charged_Party_Address TODO + * @member requested_Party_Address TODO + * @member associated_URI TODO + * @member time_Stamps TODO + * @member application_Server_Information TODO + * @member inter_Operator_Identifie TODO + * @member ims_Charging_Identifier TODO + * @member sdp_Session_Description TODO + * @member sdp_Media_Component TODO + * @member served_Party_IP_Address TODO + * @member server_Capabilities TODO + * @member bearer_Service TODO + * @member service_Id TODO + * @member service_Specific_Info TODO + * @member message_Body TODO + * @member cause_Code TODO + * @member access_Network_Information TODO + * @member early_Media_Description TODO + * @member ims_Communication_Service_Identifier TODO + * @member online_Charging_Flag TODO + * @member real_Time_Tariff_Information TODO + * @member account_Expiration TODO + * @member initial_IMS_Charging_Identifier TODO + * @member ims_Emergency_Indicator TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.77 IMS-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record IMS_Information_AVP { + AVP_Header aVP_Header,// + Event_Type_AVP event_Type optional, + Role_Of_Node_AVP role_Of_Node optional, + Node_Functionality_AVP node_Functionality, + User_Session_Id_AVP user_Session_Id optional, + Outgoing_Session_Id_AVP outgoing_Session_Id optional, + Session_Priority_AVP session_Priority optional, + set of Calling_Party_Address_AVP calling_Party_Address optional, + Called_Party_Address_AVP called_Party_Address optional, + set of Called_Asserted_Identity_AVP called_Asserted_Identity optional, + Number_Portability_Routing_Information_AVP number_Portability_Routing_Information optional, + Carrier_Select_Routing_Information_AVP carrier_Select_Routing_Information optional, + Alternate_Charged_Party_Address_AVP alternate_Charged_Party_Address optional, + Requested_Party_Address_AVP requested_Party_Address optional, + set of Associated_URI_AVP associated_URI optional, + Time_Stamps_AVP time_Stamps optional, + set of Application_Server_Information_AVP application_Server_Information optional, + set of Inter_Operator_Identifier_AVP inter_Operator_Identifier optional, + IMS_Charging_Identifier_AVP ims_Charging_Identifier optional, + set of SDP_Session_Description_AVP sdp_Session_Description optional, + set of SDP_Media_Component_AVP sdp_Media_Component optional, + Served_Party_IP_Address_AVP served_Party_IP_Address optional, + Server_Capabilities_AVP server_Capabilities optional, + Trunk_Group_ID_AVP trunk_Group_ID optional, + Bearer_Service_AVP bearer_Service optional, + Service_Id_AVP service_Id optional, + set of Service_Specific_Info_AVP service_Specific_Info optional, + set of Message_Body_AVP message_Body optional, + Cause_Code_AVP cause_Code optional, + Access_Network_Information_AVP access_Network_Information optional, + set of Early_Media_Description_AVP early_Media_Description optional, + IMS_Communication_Service_Identifier_AVP ims_Communication_Service_Identifier optional, + Online_Charging_Flag_AVP online_Charging_Flag optional, + Real_Time_Tariff_Information_AVP real_Time_Tariff_Information optional, + Account_Expiration_AVP account_Expiration optional, + Initial_IMS_Charging_Identifier_AVP initial_IMS_Charging_Identifier optional, + IMS_Emergency_Indicator_AVP ims_Emergency_Indicator optional + } // End of type IMS_Information_AVP + + /** + * @desc The MMS-Information AVP (AVP code 876) + * @member aVP_Header Header AVP + * @member originator_Address TODO + * @member recipient_Address TODO + * @member submission_Time TODO + * @member mm_Content_Type TODO + * @member priority TODO + * @member message_ID TODO + * @member message_Type TODO + * @member message_Size TODO + * @member message_Class TODO + * @member delivery_Report_Requested TODO + * @member read_Reply_Report_Requested TODO + * @member mmbox_Storage_Requested TODO + * @member applic_ID TODO + * @member reply_Applic_ID TODO + * @member aux_Applic_Info TODO + * @member content_Class TODO + * @member drm_Content TODO + * @member adaptations TODO + * @member vasp_Id TODO + * @member vas_Id TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.110 MMS-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record MMS_Information_AVP { + AVP_Header aVP_Header,// + Originator_Address_AVP originator_Address optional, + set of Recipient_Address_AVP recipient_Address optional, + Submission_Time_AVP submission_Time optional, + MM_Content_Type_AVP mm_Content_Type optional, + Priority_AVP priority optional, + Message_ID_AVP message_ID optional, + Message_Type_AVP message_Type optional, + Message_Size_AVP message_Size optional, + Message_Class_AVP message_Class optional, + Delivery_Report_Requested_AVP delivery_Report_Requested optional, + Read_Reply_Report_Requested_AVP read_Reply_Report_Requested optional, + MMBox_Storage_Requested_AVP mmbox_Storage_Requested optional, + Applic_ID_AVP applic_ID optional, + Reply_Applic_ID_AVP reply_Applic_ID optional, + Aux_Applic_Info_AVP aux_Applic_Info optional, + Content_Class_AVP content_Class optional, + DRM_Content_AVP drm_Content optional, + Adaptations_AVP adaptations optional, + VASP_ID_AVP vasp_Id optional, + VAS_ID_AVP vas_Id optional + } // End of type MMS_Information_AVP + + /** + * @desc The LCS-Information AVP (AVP code 878) + * @member aVP_Header Header AVP + * @member lcs_Client_ID TODO + * @member location_Type TODO + * @member location_Estimate TODO + * @member positioning_Data TODO + * @member priority optional TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.89 LCS-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Information_AVP { + AVP_Header aVP_Header,// + LCS_Client_ID_AVP lcs_Client_ID optional, + Location_Type_AVP location_Type optional, + Location_Estimate_AVP location_Estimate optional, + Positioning_Data_AVP positioning_Data optional, + ThreeGPP_IMSI_AVP threeGPP_IMSI optional, + MSISDN_AVP msisdn optional + } // End of type LCS_Information_AVP + + type record PoC_Information_AVP { + AVP_Header aVP_Header,// + PoC_Server_Role_AVP poc_Server_Role optional, + PoC_Session_Type_AVP poc_Session_Type optional, + PoC_User_Role_AVP poc_User_Role optional, + PoC_Session_Initiation_Type_AVP poc_Session_Initiation_Type optional, + PoC_Event_Type_AVP poc_Event_Type optional, + Number_Of_Participants_AVP number_Of_Participants optional, + set of Participants_Involved_AVP participants_Involved optional, + set of Participant_Group_AVP participant_Group optional, + set of Talk_Burst_Exchange_AVP talk_Burst_Exchange optional, + PoC_Controlling_Address_AVP poc_Controlling_Address optional, + PoC_Group_Name_AVP poc_Group_Name optional, + PoC_Session_Id_AVP poc_Session_Id optional, + Charged_Party_AVP charged_Party optional + } // End of type PoC_Information_AVP + + type record MBMS_Information_AVP { + AVP_Header aVP_Header// + // TODO + + } // End of type MBMS_Information_AVP + + /** + * @desc The Media-Initiator-Flag AVP (AVP code 882) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates which party has requested the session modification + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.101 Media-Initiator-Flag AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Media_Initiator_Flag_AVP { + AVP_Header aVP_Header,// + Media_Initiator_Flag aVP_Data + } // End of type Media_Initiator_Flag_AVP + + /** + * @desc The PoC-Server-Role AVP (AVP code 883) + * @member aVP_Header Header AVP + * @member aVP_Data Specifies the role of the PoC server + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.145 PoC-Server-Role AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_Server_Role_AVP { + AVP_Header aVP_Header,// + PoC_Server_Role aVP_Data + } // End of type PoC_Server_Role_AVP + + /** + * @desc The PoC-Session-Type AVP (AVP code 884) + * @member aVP_Header Header AVP + * @member aVP_Data Specifies the type of the PoC session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.148 PoC-Session-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_Session_Type_AVP { + AVP_Header aVP_Header,// + PoC_Session_Type aVP_Data + } // End of type PoC_Session_Type_AVP + + /** + * @desc The Number-Of-Participants AVP (AVP code 885) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the number of invited parties of the multi-party session when included in the initial charging request message + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.117 Number-Of-Participants AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Number_Of_Participants_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Number_Of_Participants_AVP + + /** + * @desc The Originator-Address AVP (AVP code 886) + * @member aVP_Header Header AVP + * @member address_Type TODO + * @member address_Data TODO + * @member address_Domain TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.125 Originator-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Originator_Address_AVP { + AVP_Header aVP_Header,// + Address_Type_AVP address_Type optional, + Address_Data_AVP address_Data optional, + Address_Domain_AVP address_Domain optional + } // End of type Originator_Address_AVP + + /** + * @desc The Participants-Involved AVP (AVP code 887) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the list of address (Public User ID: SIP URI, TEL URI, MSISDN) of the parties who are involved into the PoC session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.130 Participants-Involved AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Participants_Involved_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Participants_Involved_AVP + + /** + * @desc The Expires AVP (AVP code 888) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the content of the "Expires" header + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.66 Expires AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Expires_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Expires_AVP + + /** + * @desc The Message-Body AVP (AVP code 889) + * @member aVP_Header Header AVP + * @member content_Type TODO + * @member content_Length TODO + * @member content_Disposition TODO + * @member originator TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.103 Message-Body AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Message_Body_AVP { + AVP_Header aVP_Header,// + Content_Type_AVP content_Type, + Content_Length_AVP content_Length, + Content_Disposition_AVP content_Disposition optional, + Originator_AVP originator optional + } // End of type Message_Body_AVP + + /** + * @desc The WAG-Address AVP (AVP code 890) + * @member aVP_Header Header AVP + * @member aVP_Data Address and contains the WAG IP address + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.244 WAG-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record WAG_Address_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type WAG_Address_AVP + + /** + * @desc The WAG-PLMN-Ids AVP (AVP code 891) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the WAG PLMN id (MCC and MNC) + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.245 WAG-PLMN-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record WAG_PLMN_Id_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type WAG_PLMN_Id_AVP + + /** + * @desc The WLAN-Radio-Container AVP (AVP code 892) + * @member aVP_Header Header AVP + * @member operator_Name TODO + * @member location_Data TODO + * @member location_Information TODO + * @member wlan_Technology TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.247 WLAN-Radio-Container AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record WLAN_Radio_Container_AVP { + AVP_Header aVP_Header,// + Operator_Name_AVP operator_Name optional, + Location_Data_AVP location_Data optional, + Location_Information_AVP location_Information optional, + WLAN_Technology_AVP wlan_Technology optional + } // End of type WLAN_Radio_Container_AVP + + /** + * @desc The Unit-Quota-Threshold AVP (AVP code 893) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.249 WLAN-Technology AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record WLAN_Technology_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type WLAN_Technology_AVP + + /** + * @desc The WLAN-UE-Local-IPAddress AVP (AVP code 894) + * @member aVP_Header Header AVP + * @member aVP_Data Address and contains the UE"s local IP address + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.250 WLAN-UE-Local-IPAddress AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record WLAN_UE_Local_IPAddress_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type WLAN_UE_Local_IPAddress_AVP + + /** + * @desc The PDG-Address AVP (AVP code 895) + * @member aVP_Header Header AVP + * @member aVP_Data Address and contains the PDG IP address + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.134 PDG-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PDG_Address_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type PDG_Address_AVP + + /** + * @desc The PDG-Charging-Id AVP (AVP code 896) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the charging identifier generated by the PDG for the tunnel + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.135 PDG-Charging-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PDG_Charging_Id_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type PDG_Charging_Id_AVP + + /** + * @desc The Address-Data AVP (AVP code 897) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the address information and formatted according type of address indicated in the Address-Type AVP and according to MMS encapsulation + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.7 Address-Data AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Address_Data_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Address_Data_AVP + + /** + * @desc The Address-Domain AVP (AVP code 898) + * @member aVP_Header Header AVP + * @member domain_Name TODO + * @member threeGPP_IMSI_MCC_MNC TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.7 Address-Domain AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Address_Domain_AVP { + AVP_Header aVP_Header,// + Domain_Name_AVP domain_Name optional, + ThreeGPP_IMSI_MCC_MNC_AVP threeGPP_IMSI_MCC_MNC optional + } // End of type Address_Domain_AVP + + /** + * @desc The Address-Type AVP (AVP code 899) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the address information and formatted according type of address indicated in the Address-Type AVP and according to MMS encapsulation + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.9 Address-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Address_Type_AVP { + AVP_Header aVP_Header,// + Address_Type aVP_Data + } // End of type Address_Type_AVP + + /** + * @desc The VASP-ID AVP (AVP code 1101) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see 3GPP TS 29.140 Table 7.1: 3GPP specific AVP code + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record VASP_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type VASP_ID_AVP + + /** + * @desc The VAS-ID AVP (AVP code 1102) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see 3GPP TS 29.140 Table 7.1: 3GPP specific AVP code + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record VAS_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type VAS_ID_AVP + + /** + * @desc The Domain-Name AVP (AVP code 1200) + * @member aVP_Header Header AVP + * @member aVP_Data Represents a fully qualified domain name (FQDN) + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.55 Domain-Name AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Domain_Name_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Domain_Name_AVP + + /** + * @desc The MM-Content-Type AVP (AVP code 1201) + * @member aVP_Header Header AVP + * @member type_Number TODO + * @member additional_Type_Information TODO + * @member content_Size TODO + * @member additional_Content_Information TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.108 MM-Content-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record MM_Content_Type_AVP { + AVP_Header aVP_Header,// + Type_Number_AVP type_Number optional, + Additional_Type_Information_AVP additional_Type_Information optional, + Content_Size_AVP content_Size optional, + Additional_Content_Information_AVP additional_Content_Information optional + } // End of type MM_Content_Type_AVP + + /** + * @desc The Submission-Time AVP (AVP code 1202) + * @member aVP_Header Header AVP + * @member aVP_Data Represents a fully qualified domain name (FQDN) + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.217 Submission-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Submission_Time_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type Submission_Time_AVP + + /** + * @desc The Recipient-Address AVP (AVP code 1203) + * @member aVP_Header Header AVP + * @member address_Type TODO + * @member address_Data TODO + * @member address_Domain TODO + * @member addressee_Type TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.167 Recipient-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Recipient_Address_AVP { + AVP_Header aVP_Header,// + Address_Type_AVP address_Type optional, + Address_Data_AVP address_Data optional, + Address_Domain_AVP address_Domain optional, + Addressee_Type_AVP addressee_Type optional + } // End of type Recipient_Address_AVP + + /** + * @desc The Type-Number AVP (AVP code 1204) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the well-known media types + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.238 Type-Number AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Type_Number_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Type_Number_AVP + + /** + * @desc The Additional-Type-Information AVP (AVP code 1205) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates any additional information beyond well-known media types or non-well-known media types + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.6 Additional-Type-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Additional_Type_Information_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Additional_Type_Information_AVP + + /** + * @desc The Content-Size AVP (AVP code 1206) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the size in bytes of the specified content type + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.45 Content-Size AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Content_Size_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Content_Size_AVP + + /** + * @desc The Additional-Content-Information AVP (AVP code 1207) + * @member aVP_Header Header AVP + * @member type_Number TODO + * @member additional_Type_Information TODO + * @member content_Size TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.5 Additional-Content-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Additional_Content_Information_AVP { + AVP_Header aVP_Header,// + Type_Number_AVP type_Number optional, + Additional_Type_Information_AVP additional_Type_Information optional, + Content_Size_AVP content_Size optional + } // End of type Additional_Content_Information_AVP + + /** + * @desc The Addressee-Type AVP (AVP code 1208) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the how the recipient is addressed in the header of an MM + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.10 Addressee-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Addressee_Type_AVP { + AVP_Header aVP_Header,// + Addressee_Type aVP_Data + } // End of type Addressee_Type_AVP + + /** + * @desc The Priority AVP (AVP code 1209) + * @member aVP_Header Header AVP + * @member aVP_Data Priority (importance) of the message if specified + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.154 Priority AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Priority_AVP { + AVP_Header aVP_Header,// + Priority aVP_Data + } // End of type Priority_AVP + + /** + * @desc The Message-ID AVP (AVP code 1210) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the identification of the message being charged + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.105 Message-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Message_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Message_ID_AVP + + /** + * @desc The Message-Type AVP (AVP code 1211) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the identification of the message being charged + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.107 Message-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Message_Type_AVP { + AVP_Header aVP_Header,// + Message_Type aVP_Data + } // End of type Message_Type_AVP + + /** + * @desc The Message-Size AVP (AVP code 1212) + * @member aVP_Header Header AVP + * @member aVP_Data For MMS, it holds the total size in bytes of the MM calculated according to TS 23.140 + * For SMS, it holds the total size in octets of SM including any user data header + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.105 7.2.106 Message-Size AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Message_Size_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Message_Size_AVP + + /** + * @desc The Message-Class AVP (AVP code 1213) + * @member aVP_Header Header AVP + * @member class_Identifier TODO + * @member token_Text TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.104 Message-Class AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Message_Class_AVP { + AVP_Header aVP_Header,// + Class_Identifier_AVP class_Identifier optional, + Token_Text_AVP token_Text optional + } // End of type Message_Class_AVP + + /** + * @desc The Class-Identifier AVP (AVP code 1214) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.40 Class-Identifier AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Class_Identifier_AVP { + AVP_Header aVP_Header,// + Class_Identifier aVP_Data + } // End of type Class_Identifier_AVP + + /** + * @desc The Token-Text AVP (AVP code 1215) + * @member aVP_Header Header AVP + * @member aVP_Data Contains extension information for the Message-Class AVP + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.234 Token-Text AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Token_Text_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Token_Text_AVP + + /** + * @desc The Delivery-Report-Requested AVP (AVP code 1216) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates whether a delivery report has been requested by the originator or not + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.52 Delivery-Report-Requested AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Delivery_Report_Requested_AVP { + AVP_Header aVP_Header,// + Delivery_Report_Requested aVP_Data + } // End of type Delivery_Report_Requested_AVP + + /** + * @desc The Adaptations AVP (AVP code 1217) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies whether the originator allows adaptation of the content (default Yes) + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.4 Adaptations AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Adaptations_AVP { + AVP_Header aVP_Header,// + Adaptation aVP_Data + } // End of type Adaptations_AVP + + /** + * @desc The Applic-ID AVP (AVP code 1118) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the identification of the destination application that the underlying MMS abstract message was addressed to + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.21 Applic-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Applic_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Applic_ID_AVP + + /** + * @desc The Aux-Applic-Info AVP (AVP code 1119) + * @member aVP_Header Header AVP + * @member aVP_Data Holds additional application/implementation specific control information + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.28 Aux-Applic-Info AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Aux_Applic_Info_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Aux_Applic_Info_AVP + + /** + * @desc The Content-Class AVP (AVP code 1120) + * @member aVP_Header Header AVP + * @member aVP_Data Classifies the content of the MM to the highest content class to which the MM belongs, as defined in MMS Encapsulation + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.42 Content-Class AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Content_Class_AVP { + AVP_Header aVP_Header,// + Content_Class aVP_Data + } // End of type Content_Class_AVP + + /** + * @desc The DRM-Content AVP (AVP code 1221) + * @member aVP_Header Header AVP + * @member aVP_Data Represents a fully qualified domain name (FQDN) + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.56 DRM-Content AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record DRM_Content_AVP { + AVP_Header aVP_Header,// + DRM_Content aVP_Data + } // End of type DRM_Content_AVP + + /** + * @desc The Read-Reply-Report-Requested AVP (AVP code 1222) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates whether a read reply report has been requested by the originator MMS User Agent or not + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.162 Read-Reply-Report-Requested AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Read_Reply_Report_Requested_AVP { + AVP_Header aVP_Header,// + Read_Reply_Report_Requested aVP_Data + } // End of type Read_Reply_Report_Requested_AVP + + /** + * @desc The Reply-Applic-ID AVP (AVP code 1223) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the identifier of a "reply path", i.e. the identifier of the application to which delivery reports, read-reply reports and reply-MMs are addressed + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.173 Reply-Applic-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Reply_Applic_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Reply_Applic_ID_AVP + + /** + * @desc The SGSN-Address AVP (AVP code 1228) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the IP-address of the SGSN/Serving Node that was used during a report + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.199 SGSN-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SGSN_Address_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type SGSN_Address_AVP + + /** + * @desc The PoC-Session-Id AVP (AVP code 1229) + * @member aVP_Header Header AVP + * @member aVP_Data identifies an end-to-end PoC session and may be used for correlation between charging information generated by participating and controlling PoC functions + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.146 PoC-Session-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_Session_Id_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type PoC_Session_Id_AVP + + /** + * @desc The LCS-Client-ID AVP (AVP code 1232) + * @member aVP_Header Header AVP + * @member lcs_Client_Type TODO + * @member lcs_Client_External_ID TODO + * @member lcs_Client_Dialed_By_MS TODO + * @member lcs_Client_Name TODO + * @member lcs_APN TODO + * @member lcs_Requestor_ID TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.84 LCS-Client-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Client_ID_AVP { + AVP_Header aVP_Header,// + LCS_Client_Type_AVP lcs_Client_Type optional, + LCS_Client_External_ID_AVP lcs_Client_External_ID optional, + LCS_Client_Dialed_By_MS_AVP lcs_Client_Dialed_By_MS optional, + LCS_Client_Name_AVP lcs_Client_Name optional, + LCS_APN_AVP lcs_APN optional, + LCS_Requestor_ID_AVP lcs_Requestor_ID optional + } // End of type LCS_Client_ID_AVP + + /** + * @desc Deferred-Location-Event-Type AVP (AVP code 1230) + * @member aVP_Header Header AVP + * @member aVP_Data Holds information related to a deferred location request + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.51 Deferred-Location-Event-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Deferred_Location_Event_Type_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Deferred_Location_Event_Type_AVP + + /** + * @desc LCS-APN AVP (AVP code 1231) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the APN of the LCS Client + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.81 LCS-APN AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_APN_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type LCS_APN_AVP + + /** + * @desc LCS-Client-Dialed-By-MS AVP (AVP code 1233) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the number of the LCS Client dialled by the UE + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.82 LCS-Client-Dialed-By-MS AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Client_Dialed_By_MS_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type LCS_Client_Dialed_By_MS_AVP + + /** + * @desc LCS-Client-External-ID AVP (AVP code 1234) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the identification of the external LCS Client + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.83 LCS-Client-External-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Client_External_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type LCS_Client_External_ID_AVP + + /** + * @desc LCS-Client-External-ID AVP (AVP code 1235) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the identification of the external LCS Client + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.85 LCS-Client-Name AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Client_Name_AVP { + AVP_Header aVP_Header,// + LCS_Data_Coding_Scheme_AVP lcs_Data_Coding_Scheme optional, + LCS_Name_String_AVP lcs_Name_String optional, + LCS_Format_Indicator_AVP lcs_Format_Indicator optional + } // End of type LCS_Client_Name_AVP + + /** + * @desc LCS-Data-Coding-Scheme AVP (AVP code 1236) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the information of the alphabet and the language used + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.87 LCS-Data-Coding-Scheme AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Data_Coding_Scheme_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type LCS_Data_Coding_Scheme_AVP + + /** + * @desc LCS-Format-Indicator AVP (AVP code 1237) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the format of the LCS Client name + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.88 LCS-Format-Indicator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Format_Indicator_AVP { + AVP_Header aVP_Header,// + LCS_Format_Indicator aVP_Data + } // End of type LCS_Format_Indicator_AVP + + /** + * @desc LCS-Name-String AVP (AVP code 1238) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the LCS Client name + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.90 LCS-Name-String AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Name_String_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type LCS_Name_String_AVP + + /** + * @desc LCS-Requestor-ID AVP (AVP code 1239) + * @member aVP_Header Header AVP + * @member lcs_Data_Coding_Scheme TODO + * @member lcs_Requestor_ID_String TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.91 LCS-Requestor-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Requestor_ID_AVP { + AVP_Header aVP_Header,// + LCS_Data_Coding_Scheme_AVP lcs_Data_Coding_Scheme optional, + LCS_Requestor_ID_String_AVP lcs_Requestor_ID_String optional + } // End of type LCS_Requestor_ID_AVP + + /** + * @desc LCS-Requestor-ID-String AVP (AVP code 1240) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the identification of the Requestor and can be e.g. MSISDN or logical name + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.92 LCS-Requestor-ID-String AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Requestor_ID_String_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type LCS_Requestor_ID_String_AVP + + /** + * @desc LCS-Client-Type AVP (AVP code 1241) + * @member aVP_Header Header AVP + * @member aVP_Data Contains an estimate of the location of an MS in universal coordinates and the accuracy of the estimate + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.86 LCS-Client-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record LCS_Client_Type_AVP { + AVP_Header aVP_Header,// + LCS_Client_Type aVP_Data + } // End of type LCS_Client_Type_AVP + + /** + * @desc Location-Type AVP (AVP code 1244) + * @member aVP_Header Header AVP + * @member location_Estimate_Type TODO + * @member deferred_Location_Event_Type TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.96 Location-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Location_Type_AVP { + AVP_Header aVP_Header,// + Location_Estimate_Type_AVP location_Estimate_Type optional, + Deferred_Location_Event_Type_AVP deferred_Location_Event_Type optional + } // End of type Location_Type_AVP + + /** + * @desc The 7.2.248 Location-Estimate AVP (AVP code 1242) + * @member aVP_Header Header AVP + * @member aVP_Data Contains an estimate of the location of an MS in universal coordinates and the accuracy of the estimate + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.94 Location-Estimate AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Location_Estimate_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type Location_Estimate_AVP + + /** + * @desc The 7.2.248 Location-Estimate-Type AVP (AVP code 1243) + * @member aVP_Header Header AVP + * @member aVP_Data Contains an estimate of the location of an MS in universal coordinates and the accuracy of the estimate + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.95 Location-Estimate-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Location_Estimate_Type_AVP { + AVP_Header aVP_Header,// + Location_Estimate_Type aVP_Data + } // End of type Location_Estimate_Type_AVP + + /** + * @desc The 7.2.248 Positioning-Data AVP (AVP code 1245) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the usage of each positioning method that was attempted to determine the location estimate either successfully or unsuccessfully + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.152 Positioning-Data AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Positioning_Data_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Positioning_Data_AVP + + /** + * @desc The 7.2.248 WLAN-Session-Id AVP (AVP code 1246) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the charging id generated by the AAA Server for the session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.248 WLAN-Session-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record WLAN_Session_Id_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type WLAN_Session_Id_AVP + + /** + * @desc The PDP-Context-Type AVP (AVP code 1247) + * @member aVP_Header Header AVP + * @member reason Contains the reason for closing a container and the addition of a new container + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.138 PDP-Context-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PDP_Context_Type_AVP { + AVP_Header aVP_Header,// + PDP_Context_Type reason + } // End of type PDP_Context_Type_AVP + + /** + * @desc The MMBox-Storage-Requested AVP (AVP code 1248) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates whether an MMBoxstorage has been requested by the originator MMS User Agent or not + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.109 MMBox-Storage-Requested AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record MMBox_Storage_Requested_AVP { + AVP_Header aVP_Header,// + MMBox_Storage_Requested aVP_Data + } // End of type MMBox_Storage_Requested_AVP + + /** + * @desc The Called-Asserted-Identity AVP (AVP code 1250) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the address (Public User ID: SIP URI, E.164, etc.) of the finally asserted called party + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.31 Called-Asserted-Identity AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Called_Asserted_Identity_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Called_Asserted_Identity_AVP + + /** + * @desc The Requested-Party-Address AVP (AVP code 1251) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the address (SIP URI or TEL URI) of the party (Public User ID or Public Service ID) to whom the SIP transaction was originally posted + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.176 Requested-Party-ARequested-Party-AddressRequested-Party-Addressddress AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Requested_Party_Address_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Requested_Party_Address_AVP + + /** + * @desc The PoC-User-Role AVP (AVP code 1252) + * @member aVP_Header Header AVP + * @member poc_User_Role_Id TODO + * @member poc_User_Role_info_Units TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.149 PoC-User-Role AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_User_Role_AVP { + AVP_Header aVP_Header,// + PoC_User_Role_Ids_AVP poc_User_Role_Id optional, + PoC_User_Role_info_Units_AVP poc_User_Role_info_Units optional + } // End of type PoC_User_Role_AVP + + /** + * @desc The PoC-User-Role AVP (AVP code 1253) + * @member aVP_Header Header AVP + * @member aVP_Data Identifies the PoC user role + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.149 PoC-User-Role AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_User_Role_Ids_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type PoC_User_Role_Ids_AVP + + /** + * @desc The PoC-User-Role-info-Units AVP (AVP code 1254) + * @member aVP_Header Header AVP + * @member aVP_Data Specify the role type details of PoC users + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.151 PoC-User-Role-info-Units AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record PoC_User_Role_info_Units_AVP { + AVP_Header aVP_Header,// + PoC_User_Role_info_Units aVP_Data + } // End of type PoC_User_Role_info_Units_AVP + + /** + * @desc The Talk-Burst-Exchange AVP (AVP code 1255) + * @member aVP_Header Header AVP + * @member aVP_Data Specify the role type details of PoC users + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.220 Talk-Burst-Exchange AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Talk_Burst_Exchange_AVP { + AVP_Header aVP_Header,// + PoC_Change_Time_AVP poc_Change_Time, + Number_Of_Talk_Bursts_AVP number_Of_Talk_Bursts optional, + Talk_Burst_Volume_AVP talk_Burst_Volume optional, + Talk_Burst_Time_AVP talk_Burst_Time optional, + Number_Of_Received_Talk_Bursts_AVP number_Of_Received_Talk_Bursts optional, + Received_Talk_Burst_Volume_AVP received_Talk_Burst_Volume optional, + Received_Talk_Burst_Time_AVP received_Talk_Burst_Time optional, + Number_Of_Participants_AVP number_Of_Participants optional, + PoC_Change_Condition_AVP poc_Change_Condition optional + } // End of type Talk_Burst_Exchange_AVP + + /** + * @desc Service-Generic-Information AVP (AVP code 1256) + * @member aVP_Header Header AVP + * @member application_Server_ID TODO + * @member application_Service_Type TODO + * @member application_Session_ID TODO + * @member delivery_Status TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.191 Service-Generic-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + * @see OMA-DDS-Charging_Data-V1_0-20110201-A + */ + type record Service_Generic_Information_AVP { + AVP_Header aVP_Header,// + Application_Server_ID_AVP application_Server_ID optional, + Application_Service_Type_AVP application_Service_Type optional, + Application_Session_ID_AVP application_Session_ID optional, + Delivery_Status_AVP delivery_Status optional + } // End of type Service_Generic_Information_AVP + + /** + * @desc Participant-Access-Priority AVP (AVP code 1259) + * @member aVP_Header Header AVP + * @member aVP_Data Indicate the priority level for users when initiating a new PoC session or participating in a PoC session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.132 Participant-Access-Priority AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Participant_Access_Priority_AVP { + AVP_Header aVP_Header,// + Participant_Access_Priority aVP_Data + } // End of type Participant_Access_Priority_AVP + + /** + * @desc Service-Specific-Type AVP (AVP code 1260) + * @member aVP_Header Header AVP + * @member called_Party_Address TODO + * @member participant_Access_Priority TODO + * @member user_Participating_Type TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.131 Participant-Group AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Participant_Group_AVP { + AVP_Header aVP_Header,// + Called_Party_Address_AVP called_Party_Address optional, + Participant_Access_Priority_AVP participant_Access_Priority optional, + User_Participating_Type_AVP user_Participating_Type optional + } // End of type Participant_Group_AVP + + /** + * @desc The PoC-Change-Condition AVP (AVP code 1261) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the reason for closing a container and the addition of a new container + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.139 PoC-Change-Condition AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PoC_Change_Condition_AVP { + AVP_Header aVP_Header,// + PoC_Change_Condition aVP_Data + } // End of type PoC_Change_Condition_AVP + + /** + * @desc The PoC-Change-Time AVP (AVP code 1262) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the time stamp that defines the moment when a container is closed or the CDR is closed + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.140 PoC-Change-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PoC_Change_Time_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type PoC_Change_Time_AVP + + /** + * @desc The Access-Network-Information AVP (AVP code 1263) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the SIP P-header "P-Access-Network-Information" + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.1 Access-Network-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Access_Network_Information_AVP { + AVP_Header aVP_Header,// + octetstring aVP_Data + } // End of type Access_Network_Information_AVP + + /** + * @desc The Early-Media-Description AVP (AVP code 1272) + * @member aVP_Header Header AVP + * @member sdp_TimeStamps TODO + * @member sdp_Media_Component TODO + * @member sdp_Session_Description TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.58 Early-Media-Description AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Early_Media_Description_AVP { + AVP_Header aVP_Header,// + SDP_TimeStamps_AVP sdp_TimeStamps optional, + set of SDP_Media_Component_AVP sdp_Media_Component optional, + set of SDP_Session_Description_AVP sdp_Session_Description optional + } // End of type Early_Media_Description_AVP + + /** + * @desc The SDP-TimeStamps AVP (AVP code 1273) + * @member aVP_Header Header AVP + * @member sdp_Offer_Timestamp_AVP TODO + * @member sdp_Answer_Timestamp_AVP TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.185 SDP-TimeStamps AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_TimeStamps_AVP { + AVP_Header aVP_Header,// + SDP_Offer_Timestamp_AVP sdp_Offer_Timestamp optional, + SDP_Answer_Timestamp_AVP sdp_Answer_Timestamp optional + } // End of type SDP_TimeStamps_AVP + + /** + * @desc The SDP-Offer-Timestamp AVP (AVP code 1274) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the time in UTC format of the SDP offer + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.183 SDP-Offer-Timestamp AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_Offer_Timestamp_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type SDP_Offer_Timestamp_AVP + + /** + * @desc The SDP-Answer-Timestamp AVP (AVP code 1275) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the time in UTC format of the SDP offer + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.179 SDP-Answer-Timestamp AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SDP_Answer_Timestamp_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type SDP_Answer_Timestamp_AVP + + /** + * @desc The PoC-Session-Initiation-Type AVP (AVP code 1277) + * @member aVP_Data Specifies the type of the PoC session initiation + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.147 PoC-Session-Initiation-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PoC_Session_Initiation_Type_AVP { + AVP_Header aVP_Header,// + PoC_Session_Initiation_Type aVP_Data + } // End of type PoC_Session_Initiation_Type_AVP + + /** + * @desc The Offline-Charging AVP (AVP code 1278) + * @member aVP_Header Header AVP + * @member quota_Consumption_Time TODO + * @member time_Quota_Mechanism TODO + * @member envelope_Reporting optional TODO + * @member multiple_Services_Credit_Control TODO + * @member aVP_Type TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.121 Offline-Charging AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Offline_Charging_AVP { + AVP_Header aVP_Header,// + Quota_Consumption_Time_AVP quota_Consumption_Time optional, + Time_Quota_Mechanism_AVP time_Quota_Mechanism optional, + Envelope_Reporting_AVP envelope_Reporting optional, + set of Multiple_Services_Credit_Control_AVP multiple_Services_Credit_Control optional, + set of AVP_Type aVP_Type optional + } // End of type Offline_Charging_AVP + + /** + * @desc The User-Participating-Type AVP (AVP code 1279) + * @member aVP_Data Indicate the user participating type when participating in the PoC session + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.241 User-Participating-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record User_Participating_Type_AVP { + AVP_Header aVP_Header,// + User_Participating_Type aVP_Data + } // End of type User_Participating_Type_AVP + + /** + * @desc Alternate-Charged-Party-Address AVP (AVP code 1280) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the address of the alternate charged party determined by an AS at IMS session initiation + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.12 Alternate-Charged-Party-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Alternate_Charged_Party_Address_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Alternate_Charged_Party_Address_AVP + + /** + * @desc Number-Of-Received-Talk-Bursts AVP (AVP code 1282) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the number of the received talk bursts + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.118 Number-Of-Received-Talk-Bursts AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Number_Of_Received_Talk_Bursts_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Number_Of_Received_Talk_Bursts_AVP + + /** + * @desc Number-Of-Talk-Bursts AVP (AVP code 1283) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the number of the sent talk bursts + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.119 Number-Of-Talk-Bursts AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Number_Of_Talk_Bursts_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Number_Of_Talk_Bursts_AVP + + /** + * @desc Received-Talk-Burst-Time AVP (AVP code 1284) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the duration in seconds of the received talk bursts + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.165 Received-Talk-Burst-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Received_Talk_Burst_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Received_Talk_Burst_Time_AVP + + /** + * @desc Received-Talk-Burst-Volume AVP (AVP code 1285) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the volume in bytes of the received talk bursts + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.166 Received-Talk-Burst-Volume AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Received_Talk_Burst_Volume_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Received_Talk_Burst_Volume_AVP + + /** + * @desc Talk-Burst-Time AVP (AVP code 1286) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the duration in seconds of the sent talk bursts + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.221 Talk-Burst-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Talk_Burst_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Talk_Burst_Time_AVP + + /** + * @desc Talk-Burst-Volume AVP (AVP code 1287) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the volume in bytes of the sent talk bursts + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.222 Talk-Burst-Volume AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Talk_Burst_Volume_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Talk_Burst_Volume_AVP + + /** + * @desc Alternate-Charged-Party-Address AVP (AVP code 1288) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the address (SIP URI or TEL URI) of the party (Public User ID or Public Service ID) who initiates the media action, like adding/removing, connecting/disconnecting the media + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.12 Alternate-Charged-Party-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Media_Initiator_Party_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Media_Initiator_Party_AVP + + /** + * @desc IMS-Communication-Service-Identifier AVP (AVP code 1281) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the IMS Communication Service Identifier (ICSI) as contained in the P-Asserted-Service header of a SIP request to identify an IMS Communication Service as defined in TS 24.229 [202] + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.76 IMS-Communication-Service-Identifier AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record IMS_Communication_Service_Identifier_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type IMS_Communication_Service_Identifier_AVP + + type record SMS_Information_AVP { + AVP_Header aVP_Header// + // TODO + + } // End of type SMS_Information_AVP + + /** + * @desc The Low-Balance-Indication AVP (AVP code 2020) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates if the subscriber balance went below a designated aVP_Data by its account + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.97 Low-Balance-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Low_Balance_Indication_AVP { + AVP_Header aVP_Header,// + Low_Balance_Indication aVP_Data + } // End of type Low_Balance_Indication_AVP + + /** + * @desc The Remaining-Balance AVP (AVP code 2021) + * @member aVP_Header Header AVP + * @member unit_Value TODO + * @member currency_Code TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.172 Remaining-Balance AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Remaining_Balance_AVP { + AVP_Header aVP_Header,// + Unit_Value_AVP unit_Value, + Currency_Code_AVP currency_Code + } // End of type Remaining_Balance_AVP + + /** + * @desc The Carrier-Select-Routing-Information AVP (AVP code 2023) + * @member aVP_Header Header AVP + * @member aVP_Data Holds information on carrier selection performed by S-CSCF/AS + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.34 Carrier-Select-Routing-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Carrier_Select_Routing_Information_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Carrier_Select_Routing_Information_AVP + + /** + * @desc The Number-Portability-Routing-Information AVP (AVP code 2024) + * @member aVP_Header Header AVP + * @member aVP_Data Holds information on carrier selection performed by S-CSCF/AS + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.120 Number-Portability-Routing-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Number_Portability_Routing_Information_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Number_Portability_Routing_Information_AVP + + /** + * @desc The PoC-Event-Type AVP (AVP code 2025) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates PoC session unrelated charging event + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.142 PoC-Event-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PoC_Event_Type_AVP { + AVP_Header aVP_Header,// + PoC_Event_Type aVP_Data + } // End of type PoC_Event_Type_AVP + + type record MMTel_Information_AVP { + AVP_Header aVP_Header// + // TODO + + } // End of type MMTel_Information_AVP + + /** + * @desc The Node-Id AVP (AVP code 2034) + * @member aVP_Header Header AVP + * @member aVP_Data Operator configurable identifier string for the node + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.114 Node-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Node_Id_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Node_Id_AVP + + /** + * @desc The Change-Condition AVP (AVP code 2036) + * @member aVP_Header Header AVP + * @member aVP_Data Holds information if the SDP media component was of type SDP offer or SDP answer + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.186 SDP-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record SDP_Type_AVP { + AVP_Header aVP_Header,// + SDP_Type aVP_Data + } // End of type SDP_Type_AVP + + /** + * @desc The Change-Condition AVP (AVP code 2037) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the change in charging condition + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.37 Change-Condition AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Change_Condition_AVP { + AVP_Header aVP_Header,// + Change_Condition aVP_Data + } // End of type Change_Condition_AVP + + /** + * @desc The Change-Time AVP (AVP code 2038) + * @member aVP_Header Header AVP + * @member aVP_Data EPC Charging: holds the time in UTC format when the volume counts associated to the IP-CAN bearer, or the service data container, is closed and reported due to Charging condition change + * MMTel Charging: holds the time in UTC format and it is a time stamp that defines the moment when the conference participant has an action + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.38 Change-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Change_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Change_Time_AVP + + /** + * @desc The Diagnostics AVP (AVP code 2039) + * @member aVP_Header Header AVP + * @member cause Provides a more detailed cause value from PCN node + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.54 Diagnostics AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Diagnostics_AVP { + AVP_Header aVP_Header,// + UInt32 cause + } // End of type Diagnostics_AVP + + /** + * @desc The Service-Data-Container AVP (AVP code 2040) + * @member aVP_Header Header AVP + * @member aF_Correlation_Information TODO + * @member charging_Rule_Base_Name TODO + * @member accounting_Input_Octets TODO + * @member accounting_Output_Octets TODO + * @member local_Sequence_Number TODO + * @member qos_Information TODO + * @member rating_Group TODO + * @member change_Time TODO + * @member service_Identifier TODO + * @member service_Specific_Info TODO + * @member SGSN_Address TODO + * @member aVP_Data_First_Usage TODO + * @member aVP_Data_Last_Usage TODO + * @member aVP_Data_Usage TODO + * @member change_Condition TODO + * @member threeGPP_User_Location_Info TODO + * @member threeGPP2_BSID TODO + * @member user_CSG_Information TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.189 Service-Data-Container AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Service_Data_Container_AVP { + AVP_Header aVP_Header,// + AF_Correlation_Information_AVP aF_Correlation_Information optional, + Charging_Rule_Base_Name_AVP charging_Rule_Base_Name optional, + Accounting_Input_Octets_AVP accounting_Input_Octets optional, + Accounting_Output_Octets_AVP accounting_Output_Octets optional, + Local_Sequence_Number_AVP local_Sequence_Number optional, + QoS_Information_AVP qos_Information optional, + Rating_Group_AVP rating_Group optional, + Change_Time_AVP change_Time optional, + Service_Identifier_AVP service_Identifier optional, + Service_Specific_Info_AVP service_Specific_Info optional, + SGSN_Address_AVP SGSN_Address optional, + Time_First_Usage_AVP time_First_Usage optional, + Time_Last_Usage_AVP time_Last_Usage optional, + Time_Usage_AVP time_Usage optional, + set of Change_Condition_AVP change_Condition optional, + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, + ThreeGPP2_BSID_AVP threeGPP2_BSID optional, + User_CSG_Information_AVP user_CSG_Information optional + } // End of type Service_Data_Container_AVP + + /** + * @desc The Start-Time AVP (AVP code 2041) + * @member aVP_Header Header AVP + * @member aVP_Data The time in UTC format which represents the start of a user session at the S-GW/P-GW + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.215 Start-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Start_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Start_Time_AVP + + /** + * @desc The Stop-Time AVP (AVP code 2042) + * @member aVP_Header Header AVP + * @member aVP_Data The the time in UTC format which represents the termination of a user session at the S-GW/P-GW + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.216 Stop-Time AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Stop_Time_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Stop_Time_AVP + + /** + * @desc The Time-First-Usage AVP (AVP code 2043) + * @member aVP_Header Header AVP + * @member aVP_Data The the time in UTC format for the first IP packet to be transmitted and mapped to the current service data container + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.226 Time-First-Usage AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Time_First_Usage_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Time_First_Usage_AVP + + /** + * @desc The Time-Last-Usage AVP (AVP code 2044) + * @member aVP_Header Header AVP + * @member aVP_Data The the time in UTC format for the last IP packet to be transmitted and mapped to the current service data container + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.227 Time-Last-Usage AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Time_Last_Usage_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Time_Last_Usage_AVP + + /** + * @desc The Time-Last-Usage AVP (AVP code 2045) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the effective used time within the service data container reporting interval. + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.232 Time-Usage AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Time_Usage_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Time_Usage_AVP + + /** + * @desc The Traffic-Data-Volumes AVP (AVP code 2046) + * @member aVP_Header Header AVP + * @member qos_Information TODO + * @member accounting_Input_Octets TODO + * @member accounting_Output_Octets TODO + * @member change_condition TODO + * @member change_Time TODO + * @member threeGPP_User_Location_Info TODO + * @member user_CSG_Information TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.233 Traffic-Data-Volumes AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Traffic_Data_Volumes_AVP { + AVP_Header aVP_Header,// + QoS_Information_AVP qos_Information optional, + Accounting_Input_Octets_AVP accounting_Input_Octets optional, + Accounting_Output_Octets_AVP accounting_Output_Octets optional, + Change_Condition_AVP change_condition optional, + Change_Time_AVP change_Time optional, + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, + User_CSG_Information_AVP user_CSG_Information optional + } // End of type Traffic_Data_Volumes_AVP + + /** + * @desc The Serving-Node-Type AVP (AVP code 2047) + * @member aVP_Header Header AVP + * @member node_Type The type of Serving Node + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.198 Serving-Node-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Serving_Node_Type_AVP { + AVP_Header aVP_Header,// + Serving_Node_Type aVP_Data + } // End of type Serving_Node_Type_AVP + + /** + * @desc The PDN-Connection-Charging-ID AVP (AVP code 2050) + * @member aVP_Header Header AVP + * @member aVP_Data The charging identifier to identify different records belonging to same PDN connection + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.136 PDN-Connection-Charging-ID AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PDN_Connection_Charging_ID_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type PDN_Connection_Charging_ID_AVP + + /** + * @desc The Dynamic-Address-Flag AVP (AVP code 2051) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates whether the PDP context/PDN address is statically or dynamically allocated + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.57 Dynamic-Address-Flag AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Dynamic_Address_Flag_AVP { + AVP_Header aVP_Header,// + Dynamic_Address_Flag aVP_Data + } // End of type Dynamic_Address_Flag_AVP + + /** + * @desc The Accumulated-Cost AVP (AVP code 2052) + * @member aVP_Header Header AVP + * @member value_Digits TODO + * @member exponent TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.3 Accumulated-Cost AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Accumulated_Cost_AVP { + AVP_Header aVP_Header,// + Value_Digits_AVP value_Digits, + Exponent_AVP exponent optional + } // End of type Accumulated_Cost_AVP + + /** + * @desc The AoC-Cost-Information AVP (AVP code 2053) + * @member aVP_Header Header AVP + * @member accumulated_Cost Holds the accumulated cost for the ongoing session + * @member incremental_Cost Holds the incremental cost since last AoC interaction for the ongoing session + * @member currency_Code Not used in 3GPP. + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.13 AoC-Cost-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Cost_Information_AVP { + AVP_Header aVP_Header,// + Accumulated_Cost_AVP accumulated_Cost optional, + set of Incremental_Cost_AVP incremental_Cost optional, + Currency_Code_AVP currency_Code optional // Not used in 3GPP + } // End of type AoC_Cost_Information_AVP + + /** + * @desc The AoC-Information AVP (AVP code 2054) + * @member aVP_Header Header AVP + * @member aoc_Cost_Information_AVP Holds accumulated and incremental cost information for the AoC service + * @member tariff_Information_AVP Holds a tariff definition either from the local provider or from 3rd party provider + * @member aoc_Subscription_Information Holds the subscription and formatting parameters received from HSS + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.15 AoC-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Information_AVP { + AVP_Header aVP_Header,// + AoC_Cost_Information_AVP aoc_Cost_Information optional, + Tariff_Information_AVP tariff_Information optional, + AoC_Subscription_Information_AVP aoc_Subscription_Information optional + } // End of type AoC_Information_AVP + + /** + * @desc The AoC-Request-Type AVP (AVP code 2055) + * @member aVP_Header Header AVP + * @member aoc_Request_Type Tags if the client is looking for AoCI in conjunction to the Request-Type and Request-Action AVPs + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.16 AoC-Request-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Request_Type_AVP { + AVP_Header aVP_Header,// + AoC_Request_Type aoc_Request_Type + } // End of type AoC_Request_Type_AVP + + /** + * @desc The Current-Tariff AVP (AVP code 2056) + * @member aVP_Header Header AVP + * @member currency_Code Not used in 3GPP. + * @member scale_Factor Holds simple multiplication factor in the same format as Unit-Value + * @member rate_Element Holds simple rate element of one dimension + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.47 Current-Tariff AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Current_Tariff_AVP { + AVP_Header aVP_Header,// + Currency_Code_AVP currency_Code optional, // Not used in 3GPP + Scale_Factor_AVP scale_Factor optional, + set of Rate_Element_AVP rate_Element optional + } // End of type Current_Tariff_AVP + + /** + * @desc The Next-Tariff AVP (AVP code 2057) + * @member aVP_Header Header AVP + * @member currency_Code Not used in 3GPP. + * @member scale_Factor Holds simple multiplication factor in the same format as Unit-Value + * @member rate_Element Holds simple rate element of one dimension + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.112 Next-Tariff AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Next_Tariff_AVP { + AVP_Header aVP_Header,// + Currency_Code_AVP currency_Code optional, // Not used in 3GPP + Scale_Factor_AVP scale_Factor optional, + set of Rate_Element_AVP rate_Element optional + } // End of type Next_Tariff_AVP + + /** + * @desc The Rate-Element AVP (AVP code 2058) + * @member aVP_Header Header AVP + * @member cc_Unit_Type_AVP TODO + * @member charge_Reason_Code Identifies if the Rate-Element corresponds to a specific charge type + * @member unit_Value Not used in 3GPP. + * @member unit_Cost Holds monetary value + * @member unit_Quota_Threshold TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.161 Rate-Element AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Rate_Element_AVP { + AVP_Header aVP_Header,// + CC_Unit_Type_AVP cc_Unit_Type, + Charge_Reason_Code_AVP charge_Reason_Code optional, + Unit_Value_AVP unit_Value optional, + Unit_Cost_AVP unit_Cost optional, + Unit_Quota_Threshold_AVP unit_Quota_Threshold optional + } // End of type Rate_Element_AVP + + /** + * @desc The Scale-Factor AVP (AVP code 2059) + * @member aVP_Header Header AVP + * @member value_Digits TODO + * @member exponent TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.178 Scale-Factor AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Scale_Factor_AVP { + AVP_Header aVP_Header,// + Value_Digits_AVP value_Digits, + Exponent_AVP exponent optional + } // End of type Scale_Factor_AVP + + /** + * @desc The Tariff-Information AVP (AVP code 2060) + * @member aVP_Header Header AVP + * @member current_Tariff Holds tariff information + * @member tariff_Time_Change Not used in 3GPP. + * @member next_Tariff Holds tariff information + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.223 Tariff-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Tariff_Information_AVP { + AVP_Header aVP_Header,// + Current_Tariff_AVP current_Tariff, + Tariff_Time_Change_AVP tariff_Time_Change optional, + Next_Tariff_AVP next_Tariff optional + } // End of type Tariff_Information_AVP + + /** + * @desc The Unit-Cost AVP (AVP code 2061) + * @member aVP_Header Header AVP + * @member value_Digits TODO + * @member exponent TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.239 Unit-Cost AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Unit_Cost_AVP { + AVP_Header aVP_Header,// + Value_Digits_AVP value_Digits, + Exponent_AVP exponent optional + } // End of type Unit_Cost_AVP + + /** + * @desc The Incremental-Cost AVP (AVP code 2062) + * @member aVP_Header Header AVP + * @member value_Digits TODO + * @member exponent TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.70 Incremental-Cost AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Incremental_Cost_AVP { + AVP_Header aVP_Header,// + Value_Digits_AVP value_Digits, + Exponent_AVP exponent optional + } // End of type Incremental_Cost_AVP + + /** + * @desc The Local-Sequence-Number AVP (AVP code 2063) + * @member aVP_Header Header AVP + * @member seq_number Holds the service data container sequence number + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.93 Local-Sequence-Number AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Local_Sequence_Number_AVP { + AVP_Header aVP_Header,// + UInt32 seq_number + } // End of type Local_Sequence_Number_AVP + + /** + * @desc The SGW-Change AVP (AVP code 2065) + * @member aVP_Header Header AVP + * @member aVP_Data Accounting Request type + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.200 SGW-Change AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SGW_Change_AVP { + AVP_Header aVP_Header,// + SGW_Change aVP_Data + } // End of type SGW_Change_AVP + + /** + * @desc The Charging-Characteristics-Selection-Mode AVP (AVP code 2066) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates how the applied Charging-Characteristics was selected + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.39A Charging-Characteristics-Selection-Mode AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record Charging_Characteristics_Selection_Mode_AVP { + AVP_Header aVP_Header,// + Charging_Characteristics_Selection_Mode aVP_Data + } // End of type Charging_Characteristics_Selection_Mode_AVP + + /** + * @desc The SGW-Address AVP (AVP code 2067) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the IP-address of the S-GW Node + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.199A SGW-Address AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.1: Use Of IETF Diameter AVPs + */ + type record SGW_Address_AVP { + AVP_Header aVP_Header,// + Address aVP_Data + } // End of type SGW_Address_AVP + + /** + * @desc The Dynamic-Address-Flag-Extension AVP (AVP code 2068) + * @member aVP_Header Header AVP + * @member pdpAddressAllocation indicates that the IPv4 PDN address has been dynamically allocated for that particular IP CAN bearer (PDN connection) of PDN type IPv4v6, and the dynamic IPv6 address is indicated in Dynamic Address Flag + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.57A Dynamic-Address-Flag-Extension AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Dynamic_Address_Flag_Extension_AVP { + AVP_Header aVP_Header,// + Dynamic_Address_Flag_Extension pdpAddressAllocation + } // End of type Dynamic_Address_Flag_Extension_AVP + + /** + * @desc The Application-Server-ID AVP (AVP code 2101) + * @member aVP_Header Header AVP + * @member aVP_Data The Application Server identifier + * + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Application_Server_ID_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Application_Server_ID_AVP + + /** + * @desc The Application-Service-Type AVP (AVP code 2102) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Application_Service_Type_AVP { + AVP_Header aVP_Header,// + Application_Service_Type aVP_Data + } // End of type Application_Service_Type_AVP + + /** + * @desc The Application-Session-ID AVP (AVP code 2103) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Application_Session_ID_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Application_Session_ID_AVP + + /** + * @desc The Delivery_Status AVP (AVP code 2104) + * @member aVP_Header Header AVP + * @member aVP_Data TODO + * + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Delivery_Status_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Delivery_Status_AVP + + type record IM_Information_AVP { + AVP_Header aVP_Header// + // TODO + + } // End of type IM_Information_AVP + + type record DCD_Information_AVP { + AVP_Header aVP_Header// + // TODO + + } // End of type DCD_Information_AVP + + /** + * @desc The Incremental-Cost AVP (AVP code 2118) + * @member aVP_Header Header AVP + * @member value Enumerated value + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.38A Charge-Reason-Code AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Charge_Reason_Code_AVP { + AVP_Header aVP_Header,// + Charge_Reason_Code aVP_Data + } // End of type Charge_Reason_Code_AVP + + /** + * @desc The SIP-Request-Timestamp-Fraction AVP (AVP code 2301) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the miliseconds fraction in relation to SIP-Request-Timestamp + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.203 SIP-Request-Timestamp-Fraction AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record SIP_Request_Timestamp_Fraction_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type SIP_Request_Timestamp_Fraction_AVP + + /** + * @desc The SIP-Response-Timestamp-Fraction AVP (AVP code 2302) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the miliseconds fraction in relation to SIP-Response-Timestamp + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.205 SIP-Response-Timestamp-Fraction AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record SIP_Response_Timestamp_Fraction_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type SIP_Response_Timestamp_Fraction_AVP + + /** + * @desc The Online-Charging-Flag AVP (AVP code 2303) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the Online Charging Request was sent based on the provided ECF address from the SIP P-header "P-Charging-Function-Addresses" + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.122 Online-Charging-Flag AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Online_Charging_Flag_AVP { + AVP_Header aVP_Header,// + Online_Charging_Flag aVP_Data + } // End of type Online_Charging_Flag_AVP + + /** + * @desc The Online-Charging-Flag AVP (AVP code 2305) + * @member aVP_Header Header AVP + * @member tariff_Information TODO + * @member tariff_XML TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.164 Real-Time-Tariff-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Real_Time_Tariff_Information_AVP { + AVP_Header aVP_Header,// + Tariff_Information_AVP tariff_Information optional, + Tariff_XML_AVP tariff_XML optional + } // End of type Real_Time_Tariff_Information_AVP + + /** + * @desc The Tariff-XML AVP (AVP code 2306) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the XML body describing the tariff/add-on charge information exchanged during the SIP transaction, as described in the TS 29.658 [222] + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.224 Tariff-XML AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Tariff_XML_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Tariff_XML_AVP + + /** + * @desc The IMSI-Unauthenticated-Flag AVP (AVP code 2308) + * @member aVP_Header Header AVP + * @member aVP_Data Enumerated value + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.78 IMSI-Unauthenticated-Flag AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record IMSI_Unauthenticated_Flag_AVP { + AVP_Header aVP_Header,// + IMSI_Unauthenticated_Flag aVP_Data + } // End of type IMSI_Unauthenticated_Flag_AVP + + /** + * @desc The Account-Expiration AVP (AVP code 2309) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the subscriber account expiration date and time of day + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.2 Account-Expiration AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Account_Expiration_AVP { + AVP_Header aVP_Header,// + Time aVP_Data + } // End of type Account_Expiration_AVP + + /** + * @desc The AoC-Format AVP (AVP code 2310) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the format on how the AoC information shall be sent to the UE + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.14 AoC-Format AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Format_AVP { + AVP_Header aVP_Header,// + AoC_Format aVP_Data + } // End of type AoC_Format_AVP + + /** + * @desc The AoC-Service AVP (AVP code 2311) + * @member aVP_Header Header AVP + * @member aoc_Service_Obligatory_Type AoC Service type + * @member aoc_Service_Type AoC Service obligatory type + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.17 AoC-Service AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Service_AVP { + AVP_Header aVP_Header,// + AoC_Service_Obligatory_Type_AVP aoc_Service_Obligatory_Type optional, + AoC_Service_Type_AVP aoc_Service_Type optional + } // End of type AoC_Service_AVP + + /** + * @desc The AoC-Service-Obligatory-Type AVP (AVP code 2312) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the information if the AoC information is binding or not + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.18 AoC-Service-Obligatory-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Service_Obligatory_Type_AVP { + AVP_Header aVP_Header,// + AoC_Service_Obligatory_Type aVP_Data + } // End of type AoC_Service_Obligatory_Type_AVP + + /** + * @desc The AoC-Service-Type AVP (AVP code 2313) + * @member aVP_Header Header AVP + * @member aVP_Data Defines the type of AoC information to be provided to the subscriber + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.19 AoC-Service-Type AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Service_Type_AVP { + AVP_Header aVP_Header,// + AoC_Service_Type aVP_Data + } // End of type AoC_Service_Type_AVP + + /** + * @desc The AoC-Subscription-Information AVP (AVP code 2314) + * @member aVP_Header Header AVP + * @member aoc_Service TODO + * @member aoc_Format TODO + * @member preferred_AoC_Currency TODO + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.20 AoC-Subscription-Information AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record AoC_Subscription_Information_AVP { + AVP_Header aVP_Header,// + set of AoC_Service_AVP aoc_Service optional, + AoC_Format_AVP aoc_Format optional, + Preferred_AoC_Currency_AVP preferred_AoC_Currency optional + } // End of type AoC_Subscription_Information_AVP + + /** + * @desc The Preferred-AoC-Currency AVP (AVP code 2315) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the preferred currency code that the AoC function would like to get the AoC information + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.153 Preferred-AoC-Currency AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Preferred_AoC_Currency_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type Preferred_AoC_Currency_AVP + + /** + * @desc The Initial-IMS-Charging-Identifier AVP (AVP code 2321) + * @member aVP_Header Header AVP + * @member aVP_Data Holds the Initial IMS Charging Identifier (ICID) as generated by a IMS node for the initial SIP session created for IMS service continuity + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.79A Initial-IMS-Charging-Identifier AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Initial_IMS_Charging_Identifier_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Initial_IMS_Charging_Identifier_AVP + + /** + * @desc The Initial-IMS-Charging-Identifier AVP (AVP code 2322) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates the IMS session is an IMS emergency session or IMS registration + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.76A IMS-Emergency-Indicator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record IMS_Emergency_Indicator_AVP { + AVP_Header aVP_Header,// + IMS_Emergency_Indicator aVP_Data + } // End of type IMS_Emergency_Indicator_AVP + + /** + * @desc The Outgoing-Session-Id AVP (AVP code 2330) + * @member aVP_Header Header AVP + * @member aVP_Data Contains the SIP Call ID of the outgoing leg, as defined in RFC 3261 + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.128A Outgoing-Session-Id AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Outgoing_Session_Id_AVP { + AVP_Header aVP_Header,// + UTF8String aVP_Data + } // End of type Outgoing_Session_Id_AVP + + /** + * @desc The Low-Priority-Indicator AVP (AVP code 2602) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates if the PDN connection has a low aVP_Data, i.e. for Machine Type Communications + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.97A Low-Priority-Indicator AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Low_Priority_Indicator_AVP { + AVP_Header aVP_Header,// + Low_Priority_Indicator aVP_Data + } // End of type Low_Priority_Indicator_AVP + + /** + * @desc The Local-GW-Inserted-Indication AVP (AVP code 2603) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates whether the IP realm used for the SDP media component is the Default IP realm or not + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.80A IP-Realm-Default-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record IP_Realm_Default_Indication_AVP { + AVP_Header aVP_Header,// + IP_Realm_Default_Indication aVP_Data + } // End of type IP_Realm_Default_Indication_AVP + + /** + * @desc The Local-GW-Inserted-Indication AVP (AVP code 2604) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates if the local GW (TrGW, IMS-AGW) is inserted or not for the SDP media component + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.92A Local-GW-Inserted-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Local_GW_Inserted_Indication_AVP { + AVP_Header aVP_Header,// + Local_GW_Inserted_Indication aVP_Data + } // End of type Local_GW_Inserted_Indication_AVP + + /** + * @desc The Transcoder-Inserted-Indication AVP (AVP code 2605) + * @member aVP_Header Header AVP + * @member aVP_Data Indicates if a transcoder is inserted or not for the SDP media component + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.233A Transcoder-Inserted-Indication AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record Transcoder_Inserted_Indication_AVP { + AVP_Header aVP_Header,// + Transcoder_Inserted_Indication aVP_Data + } // End of type Transcoder_Inserted_Indication_AVP + + /** + * @desc The PDP-Address-Prefix-Length AVP (AVP code 2606) + * @member aVP_Header Header AVP + * @member aVP_Data The aVP_Data length of an IPv6 typed PDP-Address AVP + * + * @see ETSI TS 132 299 V10.15.0 Clause 7.2.137a PDP-Address-Prefix-Length AVP + * @see ETSI TS 132 299 V10.15.0 Table 7.2: 3GPP specific AVPs + */ + type record PDP_Address_Prefix_Length_AVP { + AVP_Header aVP_Header,// + UInt32 aVP_Data + } // End of type PDP_Address_Prefix_Length_AVP + + } // End of group TS132_299Rf_Ro_AVPS + + } // End of group Avp_Rf_Ro_Types + + } // End of group AVPTypes + +} with { + encode "DIAMETERCodec"; variant ""; +} // End of module LibDiameter_Types_RfRo_AVPs diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Rx_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Rx_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..6e00d18edcb78fce8411ec967f0c1223f488338b --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_Rx_AVPs.ttcn @@ -0,0 +1,492 @@ +/** + * @author STF 466 + * @version $Id$ + * @desc This module defines Diameter Rx AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new Rx AVP types is ok; + */ +module LibDiameter_Types_Rx_AVPs { + + // LibCommon + import from LibCommon_BasicTypesAndValues all; + + // LibDiameter + import from LibDiameter_Types_Base_AVPs all; + + group AVPTypes{ + + group AVP_Rx_Types{ + + type enumerated Abort_Cause_Type{ + // Ref: ETSI TS 129 214 5.3.1 + BEARER_RELEASED_E (0), + INSUFFICIENT_SERVER_RESOURCES_E (1), + INSUFFICIENT_BEARER_RESOURCES_E (2), + PS_TO_CS_HANDOVER_E (3), + SPONSORED_DATA_CONNECTIVITY_DISALLOWED_E (4) + } +// with { +// variant "length=32" +// } + + type enumerated Flow_Usage_Type{ + // Ref: ETSI TS 129 214 5.3.12 + NO_INFORMATION_E (0), + RTCP_E (1), + AF_SIGNALLING_E (2) + } +// with { +// variant "length=32" +// } + + + type enumerated IMS_Content_Type{ + // Ref: ETSI TS 129 214 5.3.61 + NO_CONTENT_DETAIL_E (0), + CAT_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated Specific_Action_Type{ + // Ref: ETSI TS 129 214 5.3.13 + VOID_0_E (0), + CHARGING_CORRELATION_EXCHANGE_E (1), + INDICATION_OF_LOSS_OF_BEARER_E (2), + INDICATION_OF_RECOVERY_OF_BEARER_E (3), + INDICATION_OF_RELEASE_OF_BEARER_E (4), + VOID_5_E (5), + IP_CAN_CHANGE_E (6), + INDICATION_OF_OUT_OF_CREDIT_E (7), + INDICATION_OF_SUCCESSFUL_RESOURCES_ALLOCATION_E (8), + INDICATION_OF_FAILED_RESOURCES_ALLOCATION_E (9), + INDICATION_OF_LIMITED_PCC_DEPLOYMENT_E (10), + USAGE_REPORT_E (11), + ACCESS_NETWORK_INFO_REPORT_E (12) + } +// with { +// variant "length=32" +// } + + type enumerated Media_Type_Type{ + // Ref: ETSI TS 129 214 5.3.19 + AUDIO_E (0), + VIDEO_E (1), + DATA_E (2), + APPLICATION_E (3), + CONTROL_E (4), + TEXT_E (5), + MESSAGE_E (6), + OTHER_E (7) // OTHER is defined as c_uInt32Max = 0xFFFFFFFF + } +// with { +// variant "length=32" +// } + + type enumerated Rx_Request_Type{ + // Ref: ETSI TS 129 214 5.3.31 + INITIAL_REQUEST_E (0), + UPDATE_REQUEST_E (1), + PCSCF_RESTORATION_E (2) + } +// with { +// variant "length=32" +// } + + type enumerated Service_Info_Type{ + // Ref: ETSI TS 129 214 5.3.25 + FINAL_SERVICE_INFORMATION_E (0), + PRELIMINARY_SERVICE_INFORMATION_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated SIP_Forking_Indication_Type{ + // Ref: ETSI TS 129 214 5.3.22 + SINGLE_DIALOGUE_E (0), + SEVERAL_DIALOGUES_E (1) + } +// with { +// variant "length=32" +// } + + type enumerated Reservation_Priority_Type{ + // Ref: ETSI TS 183 017 7.3.9 + PRIORITY_ONE_E (1), + PRIORITY_TWO_E (2), + PRIORITY_THREE_E (3), + PRIORITY_FOUR_E (4), + PRIORITY_FIVE_E (5), + PRIORITY_SIX_E (6), + PRIORITY_SEVEN_E (7), + PRIORITY_EIGHT_E (8), + PRIORITY_NINE_E (9), + PRIORITY_TEN_E(10), + PRIORITY_ELEVEN_E (11), + PRIORITY_TWELVE_E (12), + PRIORITY_THIRTEEN_E (13), + PRIORITY_FOURTEEN_E (14), + PRIORITY_FIFTEEN_E (15) + } + + }//end group AVP_Rx_Types + + }//end group AVP_Types + group AVPs{ + group TS129_214Rx_AVPS{ + + type record Abort_Cause_AVP{ + //Ref: ETSI TS 129 214 Abort Cause AVP + AVP_Header aVP_Header,// + Abort_Cause_Type aVP_Data + } +// with { +// variant "present=bytes(4, 500);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Access_Network_Charging_Address_AVP{ + //Ref: ETSI TS 129 214 Access_Network_Charging_Address AVP + AVP_Header aVP_Header,// + Address aVP_Data + } +// with { +// variant "present=bytes(4, 501);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Access_Network_Charging_Identifier_AVP{ + //Ref: ETSI TS 129 214 Access_Network_Charging_Identifier AVP + AVP_Header aVP_Header, // + Access_Network_Charging_Identifier_Value_AVP acc_Net_Charging_Id_Val, + set of Flows_AVP flows + } +// with { +// variant "present=bytes(4, 502);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (flows) "condition=CodecHelper.leaveScope()" +// } + + type record Acceptable_Service_Info_AVP{ + //Ref: ETSI TS 129 214 Acceptable_Service_Info_AVP + AVP_Header aVP_Header,// + set of Media_Component_Description_AVP media_component_description optional, + Max_Requested_Bandwidth_UL_AVP max_Requested_Bw_Ul optional, + Max_Requested_Bandwidth_DL_AVP max_Requested_Bw_Dl optional, + set of AVP_Type aVP_Type optional + } + // with { +// variant "present=bytes(4, 411);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (media_component_description) "fieldPresent=bytes(4, 511)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record AF_Application_Identifier_AVP{ + //Ref: ETSI TS 129 214 AF_Application_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 504);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record AF_Requested_Data_AVP{ + //Ref: ETSI TS 129 214 AF_Requested_Data AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 551);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Codec_Data_AVP{ + //Ref: ETSI TS 129 214 Codec_data AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 524);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope();condition=CodecHelper.leaveScope()" +// } + + type record Flow_Usage_AVP{ + //Ref: ETSI TS 129 214 Flow_Usage AVP + AVP_Header aVP_Header,// + Flow_Usage_Type aVP_Data + } +// with { +// variant "present=bytes(4, 512);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record GCS_Identifier_AVP{ + //Ref: ETSI TS 129 214 GCS_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 538);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record IMS_Content_Identifier_AVP{ + //Ref: ETSI TS 129 214 IMS_Content_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 563);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record IMS_Content_Type_AVP{ + //Ref: ETSI TS 129 214 IMS_Content_Type AVP + AVP_Header aVP_Header,// + IMS_Content_Type aVP_Data + } +// with { +// variant "present=bytes(4, 564);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record IP_Domain_AVP{ + //Ref: ETSI TS 129 214 IP_Domain AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 525);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Specific_Action_AVP{ + //Ref: ETSI TS 129 214 Specific_Action AVP + AVP_Header aVP_Header,// + Specific_Action_Type aVP_Data + } +// with { +// variant "present=bytes(4, 513);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type set of Specific_Action_AVP Setof_Specific_Action_AVP +// with { +// variant "present=bytes(4, 513)" +// } + + type record MCPTT_Identifier_AVP{ + //Ref: ETSI TS 129 214 MCPTT_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 547);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record MCVideo_Identifier_AVP{ + //Ref: ETSI TS 129 214 MCVideo_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 562);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Media_Component_Description_AVP{ + //Ref: ETSI TS 129 214 Media_Component_Decription_AVP + AVP_Header aVP_Header,// + Media_Component_Number_AVP media_Component_Nr, + set of Media_Sub_Component_AVP media_Sub_component optional, + AF_Application_Identifier_AVP af_Application_Id optional, + Media_Type_AVP media_type optional, + Max_Requested_Bandwidth_UL_AVP max_Requested_Bw_Ul optional, + Max_Requested_Bandwidth_DL_AVP max_Requested_Bw_Dl optional, + Flow_Status_AVP flow_Status optional, + Reservation_Priority_AVP reservation_Priority optional, + RS_Bandwidth_AVP rs_Bw optional, + RR_Bandwidth_AVP rr_Bw optional, + set of Codec_Data_AVP codec_data optional + } +// with { +// variant "present=bytes(4, 517);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (media_Sub_component) "fieldPresent=bytes(4, 519)&&CodecHelper.isAvailable()" +// variant (codec_data) "fieldPresent=bytes(4, 524)&&CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Media_Sub_Component_AVP{ + //Ref: ETSI TS 129 214 Media_Sub_Component_AVP + AVP_Header aVP_Header,// + Flow_Number_AVP flow_Number, + record length (0..2) of Flow_Description_AVP flow_Description optional, + Flow_Status_AVP flow_Status optional, + Flow_Usage_AVP flow_Usage optional, + Max_Requested_Bandwidth_UL_AVP max_Requested_Bw_Ul optional, + Max_Requested_Bandwidth_DL_AVP max_Requested_Bw_Dl optional, + AF_Signalling_Protocol_AVP af_Signalling_Protocol optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 519);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (flow_Description) "fieldPresent=bytes(4, 507)&&CodecHelper.isAvailable()" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Flow_Description_AVP{ + //Ref: ETSI TS 129 214 Flow_Description AVP + AVP_Header aVP_Header,// + IPFilterRule_Type aVP_Data + } +// with { +// variant "present=bytes(4, 507);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Media_Type_AVP{ + //Ref: ETSI TS 129 214 Media_Type AVP + AVP_Header aVP_Header,// + Media_Type_Type aVP_Data + } +// with { +// variant "present=bytes(4, 520);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record MPS_Identifier_AVP{ + //Ref: ETSI TS 129 214 MPS_Identifier AVP + AVP_Header aVP_Header,// + octetstring aVP_Data + } +// with { +// variant "present=bytes(4, 528);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "encode=CodecHelper.encodeOctetstringWithPadding();decode=CodecHelper.decodeOctetstringWithPadding();condition=CodecHelper.leaveScope()" +// } + + type record Pre_emption_Control_Info_AVP{ + //Ref: ETSI TS 129 214 Pre_emption_Control_Info AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 553);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Retry_Interval_AVP{ + //Ref: ETSI TS 129 214 Retry_Interval AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 541);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Rx_Request_Type_AVP{ + //Ref: ETSI TS 129 214 Rx_Request_Type AVP + AVP_Header aVP_Header,// + Rx_Request_Type aVP_Data + } +// with { +// variant "present=bytes(4, 533);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record RR_Bandwidth_AVP{ + //Ref: ETSI TS 129 214 RR Bandwidth_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 521);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record RS_Bandwidth_AVP{ + //Ref: ETSI TS 129 214 RS Bandwidth_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 522);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Service_Info_Status_AVP{ + //Ref: ETSI TS 129 214 Service_Info AVP + AVP_Header aVP_Header,// + Service_Info_Type aVP_Data + } +// with { +// variant "present=bytes(4, 527);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Service_Authorization_Info_AVP { + //Ref: ETSI TS 129 214 RS Bandwidth_AVP + AVP_Header aVP_Header,// + UInt32 aVP_Data + } +// with { +// variant "present=bytes(4, 548);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + type record SIP_Forking_Indication_AVP{ + //Ref: ETSI TS 129 214 SIP_Forking_Indication AVP + AVP_Header aVP_Header,// + SIP_Forking_Indication_Type aVP_Data + } +// with { +// variant "present=bytes(4, 523);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + type record Sponsored_Connectivity_Data_AVP{ + //Ref: ETSI TS 129 214 Sponsored_Connectivity_Data AVP + AVP_Header aVP_Header, // + Sponsor_Identity_AVP sponsor_Identity optional, + Application_Service_Provider_Identity_AVP application_service_provider_Id optional, + Granted_Service_Unit_AVP granted_Service_Unit optional, + Used_Service_Unit_AVP used_service_unit optional, + set of AVP_Type aVP_Type optional + } +// with { +// variant "present=bytes(4, 530);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Type) "fieldPresent=CodecHelper.isAvailable();condition=CodecHelper.leaveScope()" +// } + + type record Reservation_Priority_AVP{ + //Ref: ETSI TS 183 017 Reservation_Priority AVP + AVP_Header aVP_Header,// + Reservation_Priority_Type aVP_Data + } +// with { +// variant "present=bytes(4, 458);use=com.testingtech.ttcn.tci.codec.CodecHelper" +// variant (aVP_Data) "condition=CodecHelper.leaveScope()" +// } + + }//end of group TS129_214Rx_AVPs + + }//end group AVPs + + +} with { + encode "DIAMETERCodec"; variant ""; +} //end module LibDiameter_Types_Rx_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_S6a_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_S6a_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..d2a52b1dc707cb725633a0771dd42ad8b2a227ed --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_S6a_AVPs.ttcn @@ -0,0 +1,1116 @@ +/** + * @author STF 466 + * @version $Id$ + * @desc This module defines Diameter S6a AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new S6a AVP types is ok; + */ +module LibDiameter_Types_S6a_AVPs { + + // LibCommon + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_DataStrings all; + + // LibDiameter + //import from LibDiameter_TypesAndValues all; + import from LibDiameter_Types_Base_AVPs all; + //import from LibDiameter_Types_Gx_AVPs all; + // import from LibDiameter_Types_RfRo_AVPs all; + import from LibDiameter_Types_CxDx_AVPs all; + // import from LibDiameter_Types_Gx_AVPs all; + // import from LibDiameter_Types_Rx_AVPs all; + + group AVPs { + + group TS129_272_AVPs { + + type record ULR_Flags_AVP { //ref: 7.3.7 + AVP_Header aVP_Header, //ULR-Flags ::= + UInt32 aVP_Data + } + + type record ULA_Flags_AVP { //ref: 7.3.8 + AVP_Header aVP_Header, //ULA-Flags ::= + UInt32 aVP_Data + } + + type record Visited_PLMN_Id_AVP { //ref: 7.3.9 + AVP_Header aVP_Header, //Visited-PLMN-Id ::= + Oct3 aVP_Data + } + + type enumerated UE_SRVCC_Capability_Type { + UE_SRVCC_NOT_SUPPORTED_E (0), + UE_SRVCC_SUPPORTED_E (1) + } + + type record UE_SRVCC_Capability_AVP { //ref: 7.3.130 + AVP_Header aVP_Header, //UE-SRVCC-Capability ::= + UE_SRVCC_Capability_Type aVP_Data + } + + type record SGSN_Number_AVP { //ref: 7.3.102 + AVP_Header aVP_Header, //SGSN-Number ::= + octetstring aVP_Data + } + + type enumerated Homogeneous_Support_Type { + NOT_SUPPORTED_E (0), + SUPPORTED_E (1) + } + + type record Homogeneous_Support_AVP { //ref: 7.3.107 + AVP_Header aVP_Header, //Homogeneous-Support-of-IMS-Voice-Over-PS-Sessions ::= + Homogeneous_Support_Type aVP_Data + } + + type record GMLC_Address_AVP { //ref: 7.3.109 - TS 129 173 6.4.7 + AVP_Header aVP_Header, //GMLC-Address ::= + Address aVP_Data + } + + type record Context_Identifier_AVP { //ref: 7.3.27 + AVP_Header aVP_Header, //Context-Identifier ::= + UInt32 aVP_Data + } + + type record Service_Selection_AVP { //ref: 7.3.36 - IETF RFC 5778 6.2 + AVP_Header aVP_Header, //Service-Selection ::= + UTF8String aVP_Data + } + + type record MIP_Home_Agent_Address_AVP { //ref: 7.3.42 - IETF RFC 4004 7.4 + AVP_Header aVP_Header, //MIP-Home-Agent-Address ::= + Address aVP_Data + } + + type record MIP_Home_Agent_Host_AVP { //ref: 7.3.43 - IETF RFC 4004 7.11 + AVP_Header aVP_Header, //MIP-Home-Agent-Host ::= + Destination_Realm_AVP destination_Realm, + Destination_Host_AVP destination_Host, + set of AVP_Type aVP_Type optional + } + + type record MIP6_Home_Link_Prefix_AVP { //ref:IETF RFC 5447 4.2.4 + AVP_Header aVP_Header, //MIP6-Home-Link-Prefix ::= + octetstring aVP_Data + } + + type record MIP6_Agent_Info_AVP { //ref: 7.3.45 + AVP_Header aVP_Header, //MIP6-Agent-Info ::= < AVP Header: 486 > + MIP_Home_Agent_Address_AVP mip_Home_Agent_Address1 optional, + MIP_Home_Agent_Address_AVP mip_Home_Agent_Address2 optional, + MIP_Home_Agent_Host_AVP mip_Home_Agent_Host optional, + MIP6_Home_Link_Prefix_AVP mip6_Home_Link_Prefix optional, + set of AVP_Type aVP_Type optional + } + + type record Specific_APN_Info_AVP { //ref: 7.3.82 + AVP_Header aVP_Header, //Specific-APN-Info ::= + Service_Selection_AVP service_Selection, + MIP6_Agent_Info_AVP mip6_Agent_Info, + Visited_Network_Identifier_AVP visited_Network_Identifier optional, + set of AVP_Type aVP_Type optional + } + + type record Active_APN_AVP { //ref: 7.3.127 + AVP_Header aVP_Header, //Active-APN ::= + Context_Identifier_AVP context_Identifier, + Service_Selection_AVP service_Selection optional, + MIP6_Agent_Info_AVP mip6_Agent_Info optional, + Visited_Network_Identifier_AVP visited_Network_Identifier optional, + Specific_APN_Info_AVP specific_APN_Info optional, + set of AVP_Type aVP_Type optional + } + + type enumerated Error_Diagnostic_Code_Type { + GPRS_DATA_SUBSCRIBED_E (0), + NO_GPRS_DATA_SUBSCRIBED_E (1), + ODB_ALL_APN_E (2), + ODB_HPLMN_APN_E (3), + ODB_VPLMN_APN_E (4) + } + + type record Error_Diagnostic_AVP { //ref: 7.3.128 + AVP_Header aVP_Header, //Error-Diagnostic ::= + Error_Diagnostic_Code_Type error_Diagnostic_Code + } + + type enumerated Subscriber_Status_Code { + SERVICE_GRANTED_E (0), + OPERATOR_DETERMINED_BARRING_E (1) + } + + type record Subscriber_Status_AVP { //ref: 7.3.29 + AVP_Header aVP_Header, //Subscriber-Status ::= + Subscriber_Status_Code subscriber_Status_Code + } + + type record STN_SR_AVP { //ref: 7.3.39 + AVP_Header aVP_Header, //STN-SR ::= + octetstring sTN_SR + } + + type enumerated ICS_Indicator_Code { + FALSE_E (0), + TRUE_E (1) + } + + type record ICS_Indicator_AVP { //ref: 7.3.104 + AVP_Header aVP_Header, //ICS-Indicator ::= + ICS_Indicator_Code iCS_Indicator_Code + } + + type enumerated Network_Access_Mode_Code { + PACKET_AND_CIRCUIT_E (0), + Reserved_E (1), + ONLY_PACKET_E (2) + } + + type record Network_Access_Mode_AVP { //ref: 7.3.21 + AVP_Header aVP_Header, //Network-Access-Mode ::= + Network_Access_Mode_Code network_Access_Mode + } + + type record Operator_Determined_Barring_AVP { //ref: 7.3.30 + AVP_Header aVP_Header, //Operator-Determined-Barring ::= + UInt32 aVP_Data + } + + type record HPLMN_ODB_AVP { //ref: 7.3.22 + AVP_Header aVP_Header, //HPLMN-ODB ::= + UInt32 aVP_Data + } + + type record Regional_Subscription_Zone_Code_AVP { //ref: 7.3.52 + AVP_Header aVP_Header, //Regional-Subscription-Zone-Code ::= + octetstring aVP_Data + } + + type record Access_Restriction_Data_AVP { //ref: 7.3.31 + AVP_Header aVP_Header, //Access-Restriction-Data ::= + UInt32 aVP_Data + } + + type record APN_OI_Replacement_AVP { //ref: 7.3.32 + AVP_Header aVP_Header, //APN-OI-Replacement ::= + UTF8String aVP_Data + } + + type record GMLC_Number_AVP { //ref: 7.3.85 + AVP_Header aVP_Header, //GMLC-Number ::= + octetstring aVP_Data + } + + type record SS_Code_AVP { //ref: 7.3.87 + AVP_Header aVP_Header, //SS-Code ::= + octetstring aVP_Data + } + + type record SS_Status_AVP { //ref: 7.3.88 + AVP_Header aVP_Header, //SS-Status ::= + octetstring aVP_Data + } + + type enumerated Notification_To_UE_User_Code { + NOTIFY_LOCATION_ALLOWED_E (0), + NOTIFYANDVERIFY_LOCATION_ALLOWED_IF_NO_RESPONSE_E (1), + NOTIFYANDVERIFY_LOCATION_NOT_ALLOWED_IF_NO_RESPONSE_E (2), + LOCATION_NOT_ALLOWED_E (3) + } + + type record Notification_To_UE_User_AVP { //ref: 7.3.89 + AVP_Header aVP_Header, //Notification-To-UE-User ::= + Notification_To_UE_User_Code notification_To_UE_User_Code + } + + type record External_Client_AVP { //ref: 7.3.90 + AVP_Header aVP_Header, //External-Client ::= > + Client_Identity_AVP client_Identity, + GMLC_Restriction_AVP gMLC_Restriction optional, + Notification_To_UE_User_AVP notification_To_UE_User optional, + set of AVP_Type aVP_Type optional + } + + type record Client_Identity_AVP { //ref: 7.3.91 + AVP_Header aVP_Header, //Client-Identity ::= + octetstring aVP_Data + } + + type enumerated GMLC_Restriction_Code { + GMLC_LIST_E (0), + HOME_COUNTRY_E (1) + } + + type record GMLC_Restriction_AVP { //ref: 7.3.92 + AVP_Header aVP_Header, //GMLC-Restriction ::= + GMLC_Restriction_Code gMLC_Restriction_Code + } + + type enumerated PLMN_Client_Code { + GMLC_LIST_E (0), + HOME_COUNTRY_E (1) + } + + type record PLMN_Client_AVP { //ref: 7.3.93 + AVP_Header aVP_Header, //PLMN-Client ::= + PLMN_Client_Code pLMN_Client_Code + } + + type record ServiceTypeIdentity_AVP { //ref: 7.3.95 + AVP_Header aVP_Header, //ServiceTypeIdentity ::= + UInt32 aVP_Data + } + + type record Service_Type_AVP { //ref: 7.3.94 + AVP_Header aVP_Header, //Service-Type ::= + ServiceTypeIdentity_AVP serviceTypeIdentity, + GMLC_Restriction_AVP gMLC_Restriction optional, + Notification_To_UE_User_AVP notification_To_UE_User optional, + set of AVP_Type aVP_Type optional + } + + type record LCS_PrivacyException_AVP { //ref: 7.3.86 + AVP_Header aVP_Header, //LCS-PrivacyException ::= + SS_Code_AVP sS_Code optional, + SS_Status_AVP sS_Status optional, + Notification_To_UE_User_AVP notification_To_UE_User optional, + set of External_Client_AVP external_Client optional, + set of PLMN_Client_AVP pLMN_Client optional, + set of Service_Type_AVP service_Type optional, + set of AVP_Type aVP_Type optional + } + + type record MO_LR_AVP { //ref: 7.3.96 + AVP_Header aVP_Header, //MO-LR ::= + SS_Code_AVP sS_Code optional, + SS_Status_AVP sS_Status optional, + set of AVP_Type aVP_Type optional + } + + type record LCS_Info_AVP { //ref: 7.3.32 + AVP_Header aVP_Header, //LCS-Info ::= + set of GMLC_Number_AVP gMLC_Number optional, + set of LCS_PrivacyException_AVP lCS_PrivacyException optional, + set of MO_LR_AVP mO_LR optional, + set of AVP_Type aVP_Type optional + } + + type record TS_Code_AVP { //ref: 7.3.100 + AVP_Header aVP_Header, //TS-Code ::= + octetstring aVP_Data + } + + type record Teleservice_List_AVP { //ref: 7.3.99 + AVP_Header aVP_Header, //Teleservice-List ::= + set length (1..infinity) of TS_Code_AVP tS_Code, + set of AVP_Type aVP_Type optional + } + + type record Call_Barring_Info_AVP { //ref: 7.3.101 + AVP_Header aVP_Header, //Call-Barring-Info ::= + SS_Code_AVP sS_Code, + SS_Status_AVP sS_Status, + set of AVP_Type aVP_Type optional + } + + type record AMBR_AVP { //ref: 7.3.41 + AVP_Header aVP_Header, //AMBR ::= + Max_Requested_Bandwidth_UL_AVP max_Requested_Bw_Ul,//max_Requested_Bandwidth_UL,//max_Requested_Bw_Ul + Max_Requested_Bandwidth_DL_AVP max_Requested_Bw_Dl,//max_Requested_Bandwidth_DL,//max_Requested_Bw_Dl + set of AVP_Type aVP_Type optional + } + + type record ThreeGPP_Charging_Char_AVP { //ref: TS 129 601 + AVP_Header aVP_Header, //3GPP-Charging-Characteristics ::= + octetstring aVP_Data + } + + type enumerated All_APN_Conf_Included_Id_Code { + All_APN_CONFIGURATIONS_INCLUDED_E (0), + MODIFIED_ADDED_APN_CONFIGURATIONS_INCLUDED_E (1) + } + + type record All_APN_Conf_Included_Id_AVP { //ref: 7.3.33 + AVP_Header aVP_Header, //All-APN-Configurations-Included-Indicator ::= + All_APN_Conf_Included_Id_Code all_APN_Conf_Included_Indicator + } + + type record APN_Configuration_Profile_AVP { //ref: 7.3.34 + AVP_Header aVP_Header, //APN-Configuration-Profile ::= + Context_Identifier_AVP context_Identifier, + All_APN_Conf_Included_Id_AVP all_APN_Conf_Included_Id, + set length (1 .. infinity) of APN_Configuration_AVP aPN_Configuration, + set of AVP_Type aVP_Type optional + } + + type enumerated PDN_Type_Code { + IPv4_E (0), + IPv6_E (1), + IPv4v6_E (2), + IPv4_OR_IPv6_E (3) + } + + type record PDN_Type_AVP { //ref: 7.3.62 + AVP_Header aVP_Header, //PDN-Type ::= + PDN_Type_Code pDN_Type_Code + } + + type record EPS_Subscribed_QoS_Profile_AVP { //ref: 7.3.37 + AVP_Header aVP_Header, //EPS-Subscribed-QoS-Profile ::= + QoS_Class_Identifier_AVP qoS_Class_Identifier, + Allocation_Retention_Priority_AVP allocation_Retention_Priority, + set of AVP_Type aVP_Type optional + } + + type enumerated VPLMN_Dynamic_Address_Allowed_Code { + NOTALLOWED_E (0), + ALLOWED_E (1) + } + + type record VPLMN_Dynamic_Address_Allowed_AVP { //ref: 7.3.38 + AVP_Header aVP_Header, //VPLMN-Dynamic-Address-Allowed ::= + VPLMN_Dynamic_Address_Allowed_Code vPLMN_Dynamic_Address_Allowed + } + + type enumerated PDN_GW_Allocation_Type_Code { + STATIC_E (0), + DYNAMIC_E (1) + } + + type record PDN_GW_Allocation_Type_AVP { //ref: 7.3.44 + AVP_Header aVP_Header, //PDN-GW-Allocation-Type ::= + PDN_GW_Allocation_Type_Code pDN_GW_Allocation_Type + } + + type enumerated SIPTO_Permission_Code { + SIPTO_ALLOWED_E (0), + SIPTO_NOTALLOWED_E (1) + } + + type record SIPTO_Permission_AVP { //ref: 7.3.135 + AVP_Header aVP_Header, //SIPTO-Permission ::= + SIPTO_Permission_Code sIPTO_Permission + } + + type enumerated LIPA_Permission_Code { + LIPA_PROHIBITED_E (0), + LIPA_ONLY_E (1), + LIPA_CONDITIONAL_E (2) + } + + type record LIPA_Permission_AVP { //ref: 7.3.133 + AVP_Header aVP_Header, //LIPA-Permission ::= + LIPA_Permission_Code lIPA_Permission + } + + type record APN_Configuration_AVP { //ref: 7.3.35 + AVP_Header aVP_Header, //APN-Configuration ::= + Context_Identifier_AVP context_Identifier, + set length (2) of Served_Party_IP_Address_AVP served_Party optional, + PDN_Type_AVP pDN_Type, + Service_Selection_AVP service_Selection, + EPS_Subscribed_QoS_Profile_AVP ePS_Subscribed_QoS_Profile optional, + VPLMN_Dynamic_Address_Allowed_AVP vPLMN_Dynamic_Address_Allowed optional, + MIP6_Agent_Info_AVP mIP6_Agent_Info optional, + Visited_Network_Identifier_AVP visited_Network_Identifier optional, + PDN_GW_Allocation_Type_AVP pDN_GW_Allocation_Type optional, + ThreeGPP_Charging_Char_AVP threeGPP_Charging_Char optional, + AMBR_AVP aMBR optional, + set of Specific_APN_Info_AVP specific_APN_Info optional, + APN_OI_Replacement_AVP aPN_OI_Replacement optional, + SIPTO_Permission_AVP sIPTO_Permission optional, + LIPA_Permission_AVP lIPA_Permission optional, + set of AVP_Type aVP_Type optional + } + + type record RAT_Freq_Sel_Priority_ID_AVP { //ref: 7.3.46 + AVP_Header aVP_Header, //PRAT-Frequency-Selection-Priority-ID ::= + UInt32 aVP_Data + } + + type enumerated Trace_Depth_Code { + MINIMUM_E (0), + MEDIUM_E (1), + MAXIMUM_E (2), + MINIMUM_WITHOUT_VENDOR_SPECIFIC_EXTENSION_E (3), + MEDIUM_WITHOUT_VENDOR_SPECIFIC_EXTENSION_E (4), + MAXIMUM_WITHOUT_VENDOR_SPECIFIC_EXTENSION_E (5) + } + + type record Trace_Depth_AVP { //ref: 7.3.67 + AVP_Header aVP_Header, //Trace-Depth ::= + Trace_Depth_Code trace_Depth + } + + type record Trace_NE_Type_List_AVP { //ref: 7.3.68 + AVP_Header aVP_Header, //Trace-NE-Type-List ::= + octetstring aVP_Data + } + + type record Trace_Interface_List_AVP { //ref: 7.3.69 + AVP_Header aVP_Header, //Trace-Interface-List ::= + octetstring aVP_Data + } + + type record Trace_Event_List_AVP { //ref: 7.3.70 + AVP_Header aVP_Header, //Trace-Event-List ::= + octetstring aVP_Data + } + + type record OMC_Id_AVP { //ref: 7.3.71 + AVP_Header aVP_Header, //OMC-Id ::= + octetstring aVP_Data + } + + type record Trace_Collection_Entity_AVP { //ref: 7.3.98 + AVP_Header aVP_Header, //Trace-Collection-Entitys ::= + Address aVP_Data + } + + type enumerated Job_Type_Code { + IMMEDIATE_MDT_ONLY_E (0), + LOGGED_MDT_ONLY_E (1), + TRACE_ONLY_E (2), + IMMEDIATE_MDT_AND_TRACE_E (3), + RLF_REPORTS_ONLY_E (4), + RCEF_REPORTS_ONLY_E (5) + } + + type record Job_Type_AVP { //ref: 7.3.137 - TS 132 422 5.9a + AVP_Header aVP_Header, //Job-Type ::= + Job_Type_Code job_Type + } + + type record Cell_Global_Identity_AVP { //ref: 7.3.119 + AVP_Header aVP_Header, //Cell-Global-Identity ::= + octetstring aVP_Data + } + + type record E_UTRAN_Cell_Gl_Identity_AVP { //ref: 7.3.117 + AVP_Header aVP_Header, //E-UTRAN-Cell-Global-Identity ::= + octetstring aVP_Data + } + + type record Routing_Area_Identity_AVP { //ref: 7.3.120 + AVP_Header aVP_Header, //Routing-Area-Identity ::= + octetstring aVP_Data + } + + type record Location_Area_Identity_AVP { //ref: 7.3.121 + AVP_Header aVP_Header, //Location-Area-Identity ::= + octetstring aVP_Data + } + + type record Tracking_Area_Identity_AVP { //ref: 7.3.118 + AVP_Header aVP_Header, //Tracking-Area-Identity::= + octetstring aVP_Data + } + + type record Area_Scope_AVP { //ref: 7.3.138 - TS 132 422 5.10.2 + AVP_Header aVP_Header, //Area-Scope ::= + set of Cell_Global_Identity_AVP cell_Global_Identity optional, + set of E_UTRAN_Cell_Gl_Identity_AVP e_UTRAN_Cell_Global_Identity optional, + set of Routing_Area_Identity_AVP routing_Area_Identity optional, + set of Location_Area_Identity_AVP location_Area_Identity optional, + set of Tracking_Area_Identity_AVP tracking_Area_Identity optional, + set of AVP_Type aVP_Type optional + } + + type record List_Of_Measurements_AVP { //ref: 7.3.139 + AVP_Header aVP_Header, //List-Of-Measurements ::= + UInt32 aVP_Data + } + + type record Reporting_Trigger_AVP { //ref: 7.3.140 + AVP_Header aVP_Header, //Reporting-Trigger ::= + UInt32 aVP_Data + } + + type enumerated Report_Interval_Code { + T_250ms_E ( 0), + T_500ms_E ( 1), + T_1000ms_E ( 2), + T_2000ms_E ( 3), + T_3000ms_E ( 4), + T_4000ms_E ( 5), + T_6000ms_E ( 6), + T_8000ms_E ( 7), + T_12000ms_E ( 8), + T_16000ms_E ( 9), + T_20000ms_E (10), + T_24000ms_E (11), + T_28000ms_E (12), + T_32000ms_E (13), + T_64000ms_E (14), + T_120ms_E (15), + T_240ms_E (16), + T_480ms_E (17), + T_640ms_E (18), + T_1024ms_E (19), + T_2048ms_E (20), + T_5120ms_E (21), + T_10240ms_E (22), + T_60000ms_E (23), // 1 min + T_360000ms_E (24), // 6 min + T_720000ms_E (25), // 12 min + T_1800000ms_E (26), // 30 min + T_3600000ms_E (27) // 60 min + } + + type record Report_Interval_AVP { //ref: 7.3.141 - TS 132 422 5.10.5 + AVP_Header aVP_Header, //Report-Interval ::= + Report_Interval_Code report_Interval + } + + type enumerated Report_Amount_Code { + N_1_E (0), + N_2_E (1), + N_4_E (2), + N_8_E (3), + N_16_E (4), + N_32_E (5), + N_64_E (6), + N_INFINITY_E (7) + } + + type record Report_Amount_AVP { //ref: 7.3.142 - TS 132 422 5.10.6 + AVP_Header aVP_Header, //Report-Amount ::= + Report_Amount_Code report_Amount + } + + type record Event_Threshold_RSRP_AVP { //ref: 7.3.143 - TS 132 422 5.10.7 + AVP_Header aVP_Header, //Event-Threshold-RSRP ::= + UInt32 aVP_Data + } + + type record Event_Threshold_RSRQ_AVP { //ref: 7.3.144 - TS 132 422 5.10.7a + AVP_Header aVP_Header, //Event-Threshold-RSRQ ::= + UInt32 aVP_Data + } + + type enumerated Logging_Interval_Code { + T_1dot28_E (0), + T_2dot56_E (1), + T_5dot12_E (2), + T_10dot24_E (3), + T_20dot48_E (4), + T_30dot72_E (5), + T_40dot96_E (6), + T_61dot44_E (7) + } + + type record Logging_Interval_AVP { //ref: 7.3.145 - TS 132 422 5.10.8 + AVP_Header aVP_Header, //Logging-Interval ::= + Logging_Interval_Code logging_Interval + } + + type enumerated Logging_Duration_Code { + T_600sec_E (0), + T_1200sec_E (1), + T_2400sec_E (2), + T_3600sec_E (3), + T_5400sec_E (4), + T_7200sec_E (5) + } + + type record Logging_Duration_AVP { //ref: 7.3.146 - TS 132 422 5.10.9 + AVP_Header aVP_Header, //Logging-Duration ::= + Logging_Duration_Code logging_Duration + } + + type record MDT_Configuration_AVP { //ref: 7.3.136 + AVP_Header aVP_Header, //MDT-Configuration ::= + Job_Type_AVP job_Type, + Area_Scope_AVP area_Scope optional, + List_Of_Measurements_AVP list_Of_Measurements optional, + Reporting_Trigger_AVP reporting_Trigger optional, + Report_Interval_AVP report_Interval optional, + Report_Amount_AVP report_Amount optional, + Event_Threshold_RSRP_AVP event_Threshold_RSRP optional, + Event_Threshold_RSRQ_AVP event_Threshold_RSRQ optional, + Logging_Interval_AVP logging_Interval optional, + Logging_Duration_AVP logging_Duration optional, + set of AVP_Type aVP_Type optional + } + + type record Trace_Data_AVP { //ref: 7.3.63 + AVP_Header aVP_Header, //Trace-Data ::= + Trace_Reference_AVP trace_Reference, + Trace_Depth_AVP trace_Depth, + Trace_NE_Type_List_AVP trace_NE_Type_List, + Trace_Interface_List_AVP trace_Interface_List optional, + Trace_Event_List_AVP trace_Event_List, + OMC_Id_AVP oMC_Id optional, + Trace_Collection_Entity_AVP trace_Collection_Entity, + MDT_Configuration_AVP mDT_Configuration optional, + set of AVP_Type aVP_Type optional + } + + type enumerated Complete_DL_Included_Indicator_Code { + All_PDP_CONTEXTS_INCLUDED_E (0), + MODIFIED_ADDED_PDP_CONTEXTS_INCLUDED_E (1) + } + + type record Complete_DL_Included_Indicator_AVP { //ref: 7.3.73 + AVP_Header aVP_Header, //Complete-Data-List-Included-Indicator ::= + Complete_DL_Included_Indicator_Code complete_DL_Included_Indicator + } + + type record PDP_Type_AVP { //ref: 7.3.75 + AVP_Header aVP_Header, //PDP-Type ::= + octetstring aVP_Data + } + + type record QoS_Subscribed_AVP { //ref: 7.3.77 + AVP_Header aVP_Header, //QoS-Subscribed ::= + octetstring aVP_Data + } + + type record Ext_PDP_Type_AVP { //ref: 7.3.75A + AVP_Header aVP_Header, //Ext-PDP-Type ::= + octetstring aVP_Data + } + + type record Ext_PDP_Address_AVP { //ref: 7.3.129 + AVP_Header aVP_Header, //Ext-PDP-Address ::= + Address aVP_Data + } + + type record PDP_Context_AVP { //ref: 7.3.74 + AVP_Header aVP_Header, //PDP-Context ::= + Context_Identifier_AVP context_Identifier, + PDP_Type_AVP pDP_Type, + PDP_Address_AVP pDP_Address optional, + QoS_Subscribed_AVP qoS_Subscribed, + VPLMN_Dynamic_Address_Allowed_AVP vPLMN_Dynamic_Address_Allowed optional, + Service_Selection_AVP service_Selection, + ThreeGPP_Charging_Char_AVP threeGPP_Charging_Char optional, + Ext_PDP_Type_AVP ext_PDP_Type optional, + Ext_PDP_Address_AVP ext_PDP_Address optional, + AMBR_AVP aMBR optional, + SIPTO_Permission_AVP sIPTO_Permission optional, + LIPA_Permission_AVP lIPA_Permission optional, + set of AVP_Type aVP_Type optional + } + + type record GPRS_Subscription_Data_AVP { //ref: 7.3.72 + AVP_Header aVP_Header, //GPRS-Subscription-Data ::= + Complete_DL_Included_Indicator_AVP complete_Data_List_Included_Indicator, + set length (1..50) of PDP_Context_AVP pDP_Context, + set of AVP_Type aVP_Type optional + } + +// type record CSG_Id_AVP { //ref: 7.3.79 +// AVP_Header aVP_Header, //CSG-Id ::= +// UInt32 aVP_Data +// } + + type record Expiration_Date_AVP { //ref: 7.3.80 + AVP_Header aVP_Header, //Expiration-Date ::= + Time aVP_Data + } + + type record CSG_Subscription_Data_AVP { //ref: 7.3.78 + AVP_Header aVP_Header, //CSG-Subscription-Data ::= + CSG_Id_AVP cSG_Id, + Expiration_Date_AVP expiration_Date optional, + set of Service_Selection_AVP service_Selection optional, + set of AVP_Type aVP_Type optional + } + + type enumerated Roaming_Rest_Unsupp_Feature_Code { + ROAMING_RESTRICTED_DUE_TO_UNSUPPORTED_FEATURE_E (0) + } + + type record Roaming_Rest_Unsupp_Feature_AVP { //ref: 7.3.81 + AVP_Header aVP_Header, //Roaming-Restricted-Due-To-Unsupported-Feature ::= + Roaming_Rest_Unsupp_Feature_Code roaming_Restricted_Due_To_Unsupported_Feature + } + + type record RAU_TAU_Timer_AVP { //ref: 7.3.134 + AVP_Header aVP_Header, //Subscribed-Periodic-RAU-TAU-Timer ::= + UInt32 aVP_Data + } + + type record MPS_Priority_AVP { //ref: 7.3.131 + AVP_Header aVP_Header, //MPS-Priority ::= + UInt32 aVP_Data + } + + type enumerated VPLMN_LIPA_Allowed_Code { + LIPA_NOTALLOWED_E (0), + LIPA_ALLOWED_E (1) + } + + type record VPLMN_LIPA_Allowed_AVP { //ref: 7.3.132 + AVP_Header aVP_Header, //VPLMN-LIPA-Allowed ::= + VPLMN_LIPA_Allowed_Code vPLMN_LIPA_Allowed + } + + type enumerated Relay_Node_Indicator_Code { + NOT_RELAY_NODE_E (0), + RELAY_NODE_E (1) + } + + type record Relay_Node_Indicator_AVP { //ref: 7.3.147 + AVP_Header aVP_Header, //Relay-Node-Indicator ::= + Relay_Node_Indicator_Code relay_Node_Indicator + } + + type enumerated MDT_User_Consent_Code { + CONSENT_NOT_GIVEN_E (0), + CONSENT_GIVEN_E (1) + } + + type record MDT_User_Consent_AVP { //ref: 7.3.148 + AVP_Header aVP_Header, //MDT-User-Consent ::= + MDT_User_Consent_Code mDT_User_Consent + } + + type record Subscription_Data_AVP { //ref: 7.3.2 + AVP_Header aVP_Header, //Subscription-Data ::= + Subscriber_Status_AVP subscriber_Status optional, + MSISDN_AVP mSISDN optional, + STN_SR_AVP sTN_SR optional, + ICS_Indicator_AVP iCS_Indicator optional, + Network_Access_Mode_AVP network_Access_Mode optional, + Operator_Determined_Barring_AVP operator_Determined_Barring optional, + HPLMN_ODB_AVP hPLMN_ODB optional, + set length (10) of Regional_Subscription_Zone_Code_AVP zone_Code optional, + Access_Restriction_Data_AVP access_Restriction_Data optional, + APN_OI_Replacement_AVP aPN_OI_Replacement optional, + LCS_Info_AVP lCS_Info optional, + Teleservice_List_AVP teleservice_List optional, + set of Call_Barring_Info_AVP call_Barring_Info optional, + ThreeGPP_Charging_Char_AVP threeGPP_Charging_Char optional, + AMBR_AVP aMBR optional, + APN_Configuration_Profile_AVP aPN_Configuration_Profile optional, + RAT_Freq_Sel_Priority_ID_AVP rAT_Freq_Sel_Priority_ID optional, + Trace_Data_AVP trace_Data optional, + GPRS_Subscription_Data_AVP gPRS_Subscription_Data optional, + CSG_Subscription_Data_AVP cSG_Subscription_Data optional, + Roaming_Rest_Unsupp_Feature_AVP roaming_Rest_Unsupp_Feature optional, + RAU_TAU_Timer_AVP subscribed_Perio_RAUTAU_Timer optional, + MPS_Priority_AVP mPS_Priority optional, + VPLMN_LIPA_Allowed_AVP vPLMN_LIPA_Allowed optional, + Relay_Node_Indicator_AVP relay_Node_Indicator optional, + MDT_User_Consent_AVP mDT_User_Consent optional, + set of AVP_Type aVP_Type optional + } + + type record Number_Of_Requested_Vectors_AVP { //ref: 7.3.14 + AVP_Header aVP_Header, //Number-Of-Requested-Vectors ::= + UInt32 aVP_Data + } + + type record Immediate_Response_Preferred_AVP { //ref: 7.3.16 + AVP_Header aVP_Header, //Immediate-Response-Preferred ::= + UInt32 aVP_Data + } + + type record Re_synchronization_Info_AVP { //ref: 7.3.15 + AVP_Header aVP_Header, //Re-synchronization-Info ::= + octetstring aVP_Data + } + + type record Req_EUTRAN_Auth_Info_AVP { //ref: 7.3.11 + AVP_Header aVP_Header, //Requested-EUTRAN-Authentication-Info ::= + Number_Of_Requested_Vectors_AVP number_Of_Requested_Vectors optional, + Immediate_Response_Preferred_AVP immediate_Response_Preferred optional, + Re_synchronization_Info_AVP re_synchronization_Info optional, + set of AVP_Type aVP_Type optional + } + + type record Req_UTRAN_GERAN_Auth_Info_AVP { //ref: 7.3.12 + AVP_Header aVP_Header, //Requested-EUTRAN-GERAN-Authentication-Info ::= + Number_Of_Requested_Vectors_AVP number_Of_Requested_Vectors optional, + Immediate_Response_Preferred_AVP immediate_Response_Preferred optional, + Re_synchronization_Info_AVP re_synchronization_Info optional, + set of AVP_Type aVP_Type optional + } + + type record Item_Number_AVP { //ref: 7.3.23 + AVP_Header aVP_Header, //Item-Number ::= + UInt32 aVP_Data + } + + type record RAND_AVP { //ref: 7.3.53 + AVP_Header aVP_Header, //RAND ::= + octetstring aVP_Data + } + + type record XRES_AVP { //ref: 7.3.54 + AVP_Header aVP_Header, //XRES ::= + octetstring aVP_Data + } + + type record AUTN_AVP { //ref: 7.3.55 + AVP_Header aVP_Header, //AUTN ::= + octetstring aVP_Data + } + + type record KASME_AVP { //ref: 7.3.56 + AVP_Header aVP_Header, //KASME ::= + octetstring aVP_Data + } + + type record E_UTRAN_Vector_AVP { //ref: 7.3.18 + AVP_Header aVP_Header, //E-UTRAN-Vector ::= + Item_Number_AVP item_Number optional, + RAND_AVP rAND, + XRES_AVP xRES, + AUTN_AVP aUTN, + KASME_AVP kASME, + set of AVP_Type aVP_Type optional + } + + type record UTRAN_Vector_AVP { //ref: 7.3.19 + AVP_Header aVP_Header, //UTRAN-Vector ::= + Item_Number_AVP item_Number optional, + RAND_AVP rAND, + XRES_AVP xRES, + AUTN_AVP aUTN, + Confidentiality_Key_AVP confidentiality_Key, + Integrity_Key_AVP integrity_Key, + set of AVP_Type aVP_Type optional + } + + type record SRES_AVP { //ref: 7.3.60 + AVP_Header aVP_Header, //SRES ::= + octetstring aVP_Data + } + + type record Kc_AVP { //ref: 7.3.59 + AVP_Header aVP_Header, //Kc ::= + octetstring aVP_Data + } + + type record GERAN_Vector_AVP { //ref: 7.3.20 + AVP_Header aVP_Header, //GERAN-Vector ::= + Item_Number_AVP item_Number optional, + RAND_AVP rAND, + SRES_AVP sRES, + Kc_AVP kc, + set of AVP_Type aVP_Type optional + } + + type record Authentication_Info_AVP { //ref: 7.3.17 + AVP_Header aVP_Header, //Authentication-Info ::= + set of E_UTRAN_Vector_AVP e_UTRAN_Vector optional, + set of UTRAN_Vector_AVP uTRAN_Vector optional, + set of GERAN_Vector_AVP gERAN_Vector optional, + set of AVP_Type aVP_Type optional + } + + type enumerated Cancellation_Type_Code { + MME_UPDATE_PROCEDURE_E (0), + SGSN_UPDATE_PROCEDURE_E (1), + SUBSCRIPTION_WITHDRAWAL_E (2), + UPDATE_PROCEDURE_IWF_E (3), + INITIAL_ATTACH_PROCEDURE_E (4) + } + + type record Cancellation_Type_AVP { //ref: 7.3.24 + AVP_Header aVP_Header, //Cancellation-Type ::= + Cancellation_Type_Code cancellation_Type + } + + type record CLR_Flags_AVP { //ref: 7.3.152 + AVP_Header aVP_Header, //CLR-Flags ::= + UInt32 aVP_Data + } + + type record IDR_Flags_AVP { //ref: 7.3.103 + AVP_Header aVP_Header, //IDR-Flags ::= + UInt32 aVP_Data + } + + type record DSR_Flags_AVP { //ref: 7.3.25 + AVP_Header aVP_Header, //DSR-Flags ::= + UInt32 aVP_Data + } + + type record DSA_Flags_AVP { //ref: 7.3.26 + AVP_Header aVP_Header, //DSA-Flags ::= + UInt32 aVP_Data + } + + type record PUER_Flags_AVP { //ref: 7.3.149 + AVP_Header aVP_Header, //PUR-Flags ::= + UInt32 aVP_Data + } + + type record PUEA_Flags_AVP { //ref: 7.3.48 + AVP_Header aVP_Header, //PUA-Flags ::= + UInt32 aVP_Data + } + + type record IDA_Flags_AVP { //ref: 7.3.47 + AVP_Header aVP_Header, //IDA-Flags ::= + UInt32 aVP_Data + } + + type record NOR_Flags_AVP { //ref: 7.3.49 + AVP_Header aVP_Header, //NOR-Flags ::= + UInt32 aVP_Data + } + + type enumerated IMS_Voice_PS_Sessions_Support_Code { + NOT_SUPPORTED_E (0), + SUPPORTED_E (1) + } + + type record IMS_Voice_PS_Sessions_Support_AVP { //ref: 7.3.106 + AVP_Header aVP_Header, //IMS-Voice-Over-PS-Sessions-Supported ::= + IMS_Voice_PS_Sessions_Support_Code iMS_Voice_Over_PS_Sessions_Supported + } + + type record Last_UE_Activity_Time_AVP { //ref: 7.3.108 + AVP_Header aVP_Header, //Last-UE-Activity-Time ::= + Time aVP_Data + } + + type record EPS_User_State_AVP { //ref: 7.3.110 + AVP_Header aVP_Header, //EPS-User-State ::= + MME_User_State_AVP mME_User_State optional, + SGSN_User_State_AVP sGSN_User_State optional, + set of AVP_Type aVP_Type optional + } + + type record EPS_Location_Information_AVP { //ref: 7.3.111 + AVP_Header aVP_Header, //EPS-Location-Information ::= + MME_Location_Information_AVP mME_Location_Information optional, + SGSN_Location_Information_AVP sGSN_Location_Information optional, + set of AVP_Type aVP_Type optional + } + + type record Service_Area_Identity_AVP { //ref: 7.3.122 + AVP_Header aVP_Header, //Service-Area-Identity ::= + octetstring aVP_Data + } + + type record Geographical_Information_AVP { //ref: 7.3.123 + AVP_Header aVP_Header, //Geographical-Information ::= + octetstring aVP_Data + } + + type record Geodetic_Information_AVP { //ref: 7.3.124 + AVP_Header aVP_Header, //Geodetic-Information ::= + octetstring aVP_Data + } + + type enumerated Current_Location_Retrieved_Code { + ACTIVE_LOCATION_RETRIEVAL_E (0) + } + + type record Current_Location_Retrieved_AVP { //ref: 7.3.125 + AVP_Header aVP_Header, //Current-Location-Retrieved ::= + Current_Location_Retrieved_Code current_Location_Retrieved + } + + type record Age_Of_Location_Informations_AVP { //ref: 7.3.126 + AVP_Header aVP_Header, //Age-Of-Location-Information ::= + UInt32 aVP_Data + } + + type enumerated CSG_Access_Mode_Code { + CLOSED_MODE_E (0), + HYBRID_MODE_E (1) + } + + type record CSG_Access_Mode_AVP { //ref: TS 132 299 7.2.46A + AVP_Header aVP_Header, //CSG-Access-Mode ::= + CSG_Access_Mode_Code cSG_Access_Mode + } + + type enumerated CSG_Membership_Indication_Code { + NOT_CSG_MEMBER_E (0), + CSG_MEMBER_E (1) + } + + type record CSG_Membership_Indication_AVP { //ref: TS 132 299 7.2.46B + AVP_Header aVP_Header, //CSG-Membership-Indication ::= + CSG_Membership_Indication_Code cSG_Membership_Indication + } + + type record MME_Location_Information_AVP { //ref: 7.3.115 + AVP_Header aVP_Header, //MME-Location-Information ::= + E_UTRAN_Cell_Gl_Identity_AVP e_UTRAN_Cell_Gl_Identity optional, + Tracking_Area_Identity_AVP tracking_Area_Identity optional, + Geographical_Information_AVP geographical_Information optional, + Geodetic_Information_AVP geodetic_Information optional, + Current_Location_Retrieved_AVP current_Location_Retrieved optional, + Age_Of_Location_Informations_AVP age_Of_Location_Informations optional, + User_CSG_Information_AVP user_CSG_Information optional, + set of AVP_Type aVP_Type optional + } + + type record SGSN_Location_Information_AVP { //ref: 7.3.116 + AVP_Header aVP_Header, //SGSN-Location-Information ::= + Cell_Global_Identity_AVP cell_Global_Identity optional, + Location_Area_Identity_AVP location_Area_Identity optional, + Service_Area_Identity_AVP service_Area_Identity optional, + Routing_Area_Identity_AVP routing_Area_Identity optional, + Geographical_Information_AVP geographical_Information optional, + Geodetic_Information_AVP geodetic_Information optional, + Current_Location_Retrieved_AVP current_Location_Retrieved optional, + Age_Of_Location_Informations_AVP age_Of_Location_Informations optional, + User_CSG_Information_AVP user_CSG_Information optional, + set of AVP_Type aVP_Type optional + } + + type record MME_User_State_AVP { //ref: 7.3.112 + AVP_Header aVP_Header, //MME-User-State ::= + User_State_AVP user_State optional, + set of AVP_Type aVP_Type optional + } + + type record SGSN_User_State_AVP { //ref: 7.3.113 + AVP_Header aVP_Header, //SGSN-User-State ::= + User_State_AVP user_State optional, + set of AVP_Type aVP_Type optional + } + + type enumerated User_State_Code { + DETACHED_E (0), + ATTACHED_NOT_REACHABLE_FOR_PAGING_E (1), + ATTACHED_REACHABLE_FOR_PAGING_E (2), + CONNECTED_NOT_REACHABLE_FOR_PAGING_E (3), + CONNECTED_REACHABLE_FOR_PAGING_E (4), + NETWORK_DETERMINED_NOT_REACHABLE_E (5) + } + + type record User_State_AVP { //ref: 7.3.114 + AVP_Header aVP_Header, //User-State ::= + User_State_Code user_State + } + + type record User_Id_AVP { //ref: 7.3.50 + AVP_Header aVP_Header, //User-Id ::= + UTF8String aVP_Data + } + + type enumerated Alert_Reason_Code { + MME_UPDATE_PROCEDURE_E (0), + SGSN_UPDATE_PROCEDURE_E (1), + SUBSCRIPTION_WITHDRAWAL_E (2), + UPDATE_PROCEDURE_IWF_E (3), + INITIAL_ATTACH_PROCEDURE_E (4) + } + + type record Alert_Reason_AVP { //ref: 7.3.83 + AVP_Header aVP_Header, //Alert-Reason ::= + Alert_Reason_Code alert_Reason + } + + } // End of group TS129_272_AVPs + + } // End of group AVPs + +} with { + encode "DIAMETERCodec"; variant ""; +} // End of LibDiameter_Types_S6a_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_S9_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_S9_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..4b5a1deb3b49ee417a8c9cfd1016c2039531cd5e --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_S9_AVPs.ttcn @@ -0,0 +1,292 @@ +/** + * @author STF 466 + * @version $Id$ + * @desc This module defines Diameter S9 AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new S9 AVP types is ok; + */ +module LibDiameter_Types_S9_AVPs { + + import from LibCommon_BasicTypesAndValues all; + //import from LibDiameter_TypesAndValues all; + import from LibDiameter_Types_Base_AVPs all; + import from LibDiameter_Types_Gx_AVPs all; + import from LibDiameter_Types_Rx_AVPs all; + // import from LibDiameter_Types_RfRo_AVPs all; + + group AVPs{ + group TS129_215_AVPs { + type octetstring DiameterIdentity; // Alias + + type record TDF_Information_AVP { //ref: TS129 212 5.3.78 + AVP_Header aVP_Header, //TDF-Information ::= + TDF_Destination_Realm_AVP tDF_Destination_Realm optional, + TDF_Destination_Host_AVP tDF_Destination_Host optional, + TDF_IP_Address_AVP tDF_IP_Address optional + } + + type record TDF_Destination_Realm_AVP { //ref: TS129 212 5.3.79 + AVP_Header aVP_Header, //TDF-Destination-Realm ::= + DiameterIdentity aVP_Data + } + + type record TDF_Destination_Host_AVP { //ref: TS129 212 5.3.80 + AVP_Header aVP_Header, //TDF-Destination-Host ::= + DiameterIdentity aVP_Data + } + + type record TDF_IP_Address_AVP { //ref: TS129 212 5.3.81 + AVP_Header aVP_Header, //TDF-IP-Address ::= + Address aVP_Data + } + + type enumerated AN_GW_Status_Code { + AN_GW_FAILED_E (0) + } + + type record AN_GW_Status_AVP { //ref: TS129 212 5.3.100 + AVP_Header aVP_Header, //AN-GW-Statush ::= + AN_GW_Status_Code aN_GW_Status + } + + type record ThreeGPP_GGSN_Address_AVP { //ref: TS129 061 table 9a + AVP_Header aVP_Header, //3GPP-GGSN-Address ::= + octetstring aVP_Data + } + + type record ThreeGPP_GGSN_IPv6_Address_AVP { //ref: TS129 061 table 9a + AVP_Header aVP_Header, //3GPP-GGSN-IPv6-Address ::= + octetstring aVP_Data + } + + type record TWAN_Identifier_AVP { //ref: TS129 061 table 9a + AVP_Header aVP_Header, //TWAN-Identifier ::= + octetstring aVP_Data + } + + type record QoS_Rule_Report_AVP { //ref: TS129 212 5a.3.5 + AVP_Header aVP_Header, //QoS-Rule-Report ::= + set of QoS_Rule_Name_AVP qoS_Rule_Name optional, + set of QoS_Rule_Base_Name_AVP qoS_Rule_Base_Name optional, + PCC_Rule_Status_AVP pCC_Rule_Status optional, + Rule_Failure_Code_AVP rule_Failure_Code optional, + set of AVP_Type aVP_Type optional + } + + type record QoS_Rule_Name_AVP { //ref: TS129 212 5a.3.4 + AVP_Header aVP_Header, //QoS-Rule-Name ::= + octetstring aVP_Data + } + + type record QoS_Rule_Base_Name_AVP { //ref: TS129 212 5a.3.7 + AVP_Header aVP_Header, //QoS-Rule-Base-Name ::= + UTF8String aVP_Data + } + + type record Appl_Detection_Info_AVP { //ref: TS129 212 5.3.91 + AVP_Header aVP_Header, //Application-Detection-Information ::= + TDF_Application_Identifier_AVP tDF_Application_Identifier, + TDF_Application_Instance_Id_AVP tDF_Application_Instance_Id optional, + set of Flow_Information_AVP flow_Information optional, + set of AVP_Type aVP_Type optional + } + + type record TDF_Application_Identifier_AVP { //ref: TS129 212 5.3.77 + AVP_Header aVP_Header, //TDF-Application-Identifier ::= + octetstring aVP_Data + } + + type record TDF_Application_Instance_Id_AVP { //ref: TS129 212 5.3.92 + AVP_Header aVP_Header, //TDF-Application-Instance-Identifier ::= + octetstring aVP_Data + } + + type record HeNB_Local_IP_Address_AVP { //ref: TS129 212 5.3.95 + AVP_Header aVP_Header, //HeNB-Local-IP-Address ::= + Address aVP_Data + } + + type record UE_Local_IP_Address_AVP { //ref: TS129 212 5.3.96 + AVP_Header aVP_Header, //UE-Local-IP-Address ::= + Address aVP_Data + } + + type record UDP_Source_Port_AVP { //ref: TS129 212 5.3.97 + AVP_Header aVP_Header, //UDP-Source-Port ::= + UInt32 aVP_Data + } + + type enumerated Session_Linking_Indicator_Code { + SESSION_LINKING_IMMEDIATE_E (0), + SESSION_LINKING_DEFERRED_E (1) + } + + type record Session_Linking_Indicator_AVP { //ref: TS129 212 5a.3.6 + AVP_Header aVP_Header, //Session-Linking-Indicator ::= + Session_Linking_Indicator_Code session_Linking_Indicator + } + + type record Subses_Decision_Info_AVP { //ref: TS129 215 5.3.1 + AVP_Header aVP_Header, //Subsession-Decision-Info ::= + Subsession_Id_AVP subsession_Id, + set length (0..2) of AN_GW_Addr_AVP aN_GW_Address optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + set of Charging_Rule_Remove_AVP charging_Rule_Remove optional, + set of Charging_Rule_Install_AVP charging_Rule_Install optional, + set of QoS_Rule_Install_AVP qoS_Rule_Install optional, + set of QoS_Rule_Remove_AVP qoS_Rule_Remove optional, + Default_EPS_Bearer_QoS_AVP default_EPS_Bearer_QoS optional, + set of Usage_Monitoring_Info_AVP usage_Monitoring_Information optional, + Session_Release_Cause_AVP session_Release_Cause optional, + Bearer_Control_Mode_AVP bearer_Control_Mode optional, + set of Event_Trigger_AVP event_Trigger optional, + Revalidation_Time_AVP revalidation_Time optional, + Online_AVP online optional, + Offline_AVP offline optional, + QoS_Information_AVP qoS_Information optional, + set of AVP_Type aVP_Type optional + } + + type record Subses_Enforcement_Info_AVP { //ref: TS129 215 5.3.2 + AVP_Header aVP_Header, //Subsession-Enforcement-Info ::= + Subsession_Id_AVP subsession_Id, + Subsession_Operation_AVP subsession_Operation optional, + set length (0..2) of AN_GW_Addr_AVP aN_GW_Address optional, + Bearer_Identifier_AVP bearer_Identifier optional, + Bearer_Operation_AVP bearer_Operation optional, + set of Packet_Filter_Info_AVP packet_Filter_Information optional, + Packet_Filter_Operation_AVP packet_Filter_Operation optional, + QoS_Information_AVP qoS_Information optional, + Framed_IP_Address_AVP framed_IP_Address optional, + Framed_IPv6_Prefix_AVP framed_IPv6_Prefix optional, + set of CoA_Information_AVP coA_Information optional, + Called_Station_Id_AVP called_Station_Id optional, + PDN_Connection_ID_AVP pDN_Connection_ID optional, + Bearer_Usage_AVP bearer_Usage optional, + set of TFT_Packet_Filter_Info_AVP tFT_Packet_Filter_Information optional, + Online_AVP online optional, + Offline_AVP offline optional, + Result_Code_AVP result_Code optional, + Experimental_Result_AVP experimental_Result optional, + set of Charging_Rule_Report_AVP charging_Rule_Report optional, + set of QoS_Rule_Report_AVP qoS_Rule_Report optional, + IP_CAN_Type_AVP iP_CAN_Type optional, + RAT_Type_AVP rat_Type optional, + ThreeGPP_SGSN_MCC_MNC_AVP threeGPP_SGSN_MCC_MNC optional, + ThreeGPP_SGSN_Address_AVP threeGPP_SGSN_Address optional, + ThreeGPP_SGSN_IPv6_Address_AVP threeGPP_SGSN_IPv6_Address optional, + RAI_AVP rAI optional, + ThreeGPP_User_Location_Info_AVP threeGPP_User_Location_Info optional, + ThreeGPP2_BSID_AVP threeGPP2_BSID optional, + User_CSG_Information_AVP user_CSG_Information optional, + Default_EPS_Bearer_QoS_AVP default_EPS_Bearer_QoS optional, + Network_Request_Support_AVP network_Request_Support optional, + Routing_Rule_Install_AVP routing_Rule_Install optional, + Routing_Rule_Remove_AVP routing_Rule_Remove optional, + Logical_Access_ID_AVP logical_Access_ID optional, + Physical_Access_ID_AVP physical_Access_ID optional, + set of Usage_Monitoring_Info_AVP usage_Monitoring_Information optional, + Multiple_BBERF_Action_AVP multiple_BBERF_Action optional, + set of Event_Trigger_AVP event_Trigger optional, + Access_Netw_Charging_Addr_AVP access_Network_Charging_Address optional, + set of Access_Netw_Charg_Id_Gx_AVP access_Network_Charging_Id_Gx optional, + Session_Linking_Indicator_AVP session_Linking_Indicator optional, + set of AVP_Type aVP_Type optional + } + + type record Subsession_Id_AVP { //ref: TS129 215 5.3.3 + AVP_Header aVP_Header, //Subsession-Id ::= + UInt32 aVP_Data + } + + type enumerated Subsession_Operation_Code { + TERMINATION_E (0), + ESTABLISHMENT_E (1), + MODIFICATION_E (2) + } + + type record Subsession_Operation_AVP { //ref: TS129 215 5.3.4 + AVP_Header aVP_Header, //Subsession-Operation ::= + Subsession_Operation_Code subsession_Operation + } + + type enumerated Multiple_BBERF_Action_Code { + ESTABLISHMENT_E (0), + TERMINATION_E (1) + } + + type record Multiple_BBERF_Action_AVP { //ref: TS129 215 5.3.6 + AVP_Header aVP_Header, //Multiple-BBERF-Action ::= + Multiple_BBERF_Action_Code multiple_BBERF_Action + } + + type Resource_Allocation_Notification_AVP + Resource_Alloc_Notification_AVP; // Shortened Name - Alias + type Access_Network_Charging_Identifier_Value_AVP + ANw_Charging_Id_Value_AVP; // Shortened Name - Alias + type record QoS_Rule_Install_AVP { //ref: TS129 212 5a.3.1 + AVP_Header aVP_Header, //QoS-Rule-Install ::= + set of QoS_Rule_Definition_AVP qoS_Rule_Definition optional, + set of QoS_Rule_Name_AVP qoS_Rule_Name optional, + set of QoS_Rule_Base_Name_AVP qoS_Rule_Base_Name optional, + Tunnel_Information_AVP tunnel_Information optional, + ANw_Charging_Id_Value_AVP acc_Net_Charging_Id_Val optional, + Resource_Alloc_Notification_AVP resource_Alloc_Notification optional, + Rule_Activation_Time_AVP rule_Activation_Time optional, + Rule_DeActivation_Time_AVP rule_DeActivation_Time optional, + ThreeGPP_GGSN_Address_AVP threeGPP_GGSN_Address optional, + ThreeGPP_GGSN_IPv6_Address_AVP threeGPP_GGSN_IPv6_Address optional, + set length (0..2) of AN_GW_Addr_AVP aN_GW_Address optional, + UDP_Source_Port_AVP uDP_Source_Port optional, + set of AVP_Type aVP_Type optional + } + + type record QoS_Rule_Remove_AVP { //ref: TS129 212 5a.3.2 + AVP_Header aVP_Header, //QoS-Rule-Remove ::= + set of QoS_Rule_Name_AVP qoS_Rule_Name optional, + set of QoS_Rule_Base_Name_AVP qoS_Rule_Base_Name optional, + set of AVP_Type aVP_Type optional + } + + type record QoS_Rule_Definition_AVP { //ref: TS129 212 5a.3.3 + AVP_Header aVP_Header, //QoS-Rule-Definition ::= + QoS_Rule_Name_AVP qoS_Rule_Name, + set of Flow_Information_AVP flow_Information optional, + QoS_Information_AVP qoS_Information optional, + Precedence_AVP precedence optional, + set of Required_Access_Info_AVP required_Access_Info optional, + set of AVP_Type aVP_Type optional + } + + type enumerated Required_Access_Info_Code { + USER_LOCATION_E (0), + MS_TIME_ZONE_E (1) } + + type record Required_Access_Info_AVP { //ref: TS129 214 5.3.34 + AVP_Header aVP_Header, //Required-Access-Info ::= + Required_Access_Info_Code required_Access_Info + } + }//end of group TS129_215_AVPs + }//end group AVPs + + group ShorterNames { + type Packet_Filter_Information_AVP Packet_Filter_Info_AVP; // Shortened Name - Alias + type AN_GW_Address_AVP AN_GW_Addr_AVP; // Shortened Name - Alias + type TFT_Packet_Filter_Information_AVP TFT_Packet_Filter_Info_AVP; // Shortened Name - Alias + type Access_Network_Charging_Address_AVP + Access_Netw_Charging_Addr_AVP; // Shortened Name - Alias + type Access_Network_Charging_Identifier_Gx_AVP + Access_Netw_Charg_Id_Gx_AVP; // Shortened Name - Alias + type Multiple_Services_Credit_Control_AVP + Multiple_Services_CC_AVP; // Shortened Name - Alias + type Usage_Monitoring_Information_AVP Usage_Monitoring_Info_AVP; // Shortened Name - Alias + type CSG_Information_Reporting_AVP CSG_Info_Reporting_AVP; // Shortened Name - Alias + } + +} with { + encode "DIAMETERCodec"; variant ""; +} //end module LibDiameter_Types_S9_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_ShDh_AVPs.ttcn b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_ShDh_AVPs.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..bdfc52f4adb42d9b38de9abde9e041e5ec2bbfce --- /dev/null +++ b/ttcn/patch_lib_diameter_titan/ttcn/LibDiameter_Types_ShDh_AVPs.ttcn @@ -0,0 +1,29 @@ +/** + * @author STF 544 + * @version $Id$ + * @desc This module defines Diameter Cx and Dx AVP types used by LibDiameter constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * @remark Adding of new ShDh AVP types is ok; + */ +module LibDiameter_Types_ShDh_AVPs { + + // LibCommmon + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_DataStrings all; + + // LibDiameter + //import from LibDiameter_TypesAndValues all; + //import from LibDiameter_Types_Base_AVPs all; + // import from LibDiameter_Types_Gx_AVPs all; + // import from LibDiameter_Types_Rx_AVPs all; + // import from LibDiameter_Types_S6a_AVPs all; + // import from LibDiameter_Types_S9_AVPs all; + // import from LibDiameter_Types_CxDx_AVPs all; + // import from LibDiameter_Types_RfRo_AVPs all; + +} with { + encode "DIAMETERCodec"; variant ""; +} // End of LibDiameter_Types_ShDh_AVPs \ No newline at end of file diff --git a/ttcn/patch_lib_http/module.mk b/ttcn/patch_lib_http/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..70c22cffe29d0e81f0523514f2cf168ece360c3e --- /dev/null +++ b/ttcn/patch_lib_http/module.mk @@ -0,0 +1,8 @@ +sources := \ + ttcn/LibHttp_XmlMessageBodyTypes.ttcn \ + ttcn/LibHttp_XmlTemplates.ttcn \ + ttcn/LibHttp_JsonMessageBodyTypes.ttcn \ + ttcn/LibHttp_JsonTemplates.ttcn \ + ttcn/LibHttp_Templates.ttcn \ + ttcn/LibHttp_TestSystem.ttcn \ + ttcn/LibHttp_Functions.ttcn diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_Functions.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_Functions.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..b3b7947a10cb86484998c1ed64c20d8656078aa2 --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_Functions.ttcn @@ -0,0 +1,326 @@ +module LibHttp_Functions { + + // LibCommon + import from LibCommon_Time all; + import from LibCommon_VerdictControl all; + import from LibCommon_Sync all; + + // LibHttp + import from LibHttp_TypesAndValues all; + import from LibHttp_Templates all; + import from LibHttp_Pics all; + import from LibHttp_Pixits all; + import from LibHttp_TestSystem all; + + group preambles { + + /** + * @desc Setup HTTP pprotocol port + */ + function f_cf_01_http_up() runs on HttpComponent { + + // Map ports + map(self:httpPort, system:httpPort); + + // Connect + f_connect4SelfOrClientSync(); + + activate(a_cf_01_http_down()); + activate(a_default_requests()); + activate(a_default_responses()); + + } // End of function f_cf_01_http_up + + /** + * @desc Setup HTTP pprotocol port + */ + function f_cf_01_http_notif_up() runs on HttpComponent { + + // Map ports + map(self:httpPort, system:httpPort); + map(self:httpPort_notif, system:httpPort_notif); + + // Connect + f_connect4SelfOrClientSync(); + + activate(a_cf_01_http_notif_down()); + activate(a_default_requests()); + activate(a_default_responses()); + + } // End of function f_cf_01_http_notif_up + + } // End of group preambles + + group postambles { + + /** + * @desc Shutdown HTTP pprotocol port + */ + function f_cf_01_http_down() runs on HttpComponent { + + // Unmap ports + unmap(self:httpPort, system:httpPort); + + // Disconnect ports + f_disconnect4SelfOrClientSync(); + + deactivate; + } // End of function f_cf_01_http_down + + /** + * @desc Shutdown HTTP pprotocol port + */ + function f_cf_01_http_notif_down() runs on HttpComponent { + + // Unmap ports + unmap(self:httpPort, system:httpPort); + unmap(self:httpPort_notif, system:httpPort_notif); + + // Disconnect ports + f_disconnect4SelfOrClientSync(); + + deactivate; + } // End of function f_cf_01_http_notif_down + + /** + * @desc Default handling cf01 de-initialisation. + */ + altstep a_cf_01_http_down() runs on HttpComponent { + [] a_shutdown() { + f_cf_01_http_down(); + log("*** a_cf_01_http_down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***"); + stop; + } + } // End of altstep a_cf_01_http_down + + /** + * @desc Default handling cf01 de-initialisation. + */ + altstep a_cf_01_http_notif_down() runs on HttpComponent { + [] a_shutdown() { + f_cf_01_http_notif_down(); + log("*** a_cf_01_http_notif_down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***"); + stop; + } + } // End of altstep a_cf_01_http_notif_down + + } // End of group postambles + + group http_headers { + + function f_init_default_headers_list( + in charstring p_header_content_type := PICS_HEADER_CONTENT_TYPE, + in charstring p_header_content_text := "", + out Headers p_headers + ) { + var integer v_i := 0; + + p_headers[v_i] := { c_header_host, { PICS_HEADER_HOST } }; + v_i := v_i + 1; + p_headers[v_i] := { c_header_content_type, { p_header_content_type } }; + v_i := v_i + 1; + if (p_header_content_text != "") { + p_headers[v_i] := { c_header_content_text, { p_header_content_text } }; + v_i := v_i + 1; + } + p_headers[v_i] := { c_header_content_length, { "0" } }; + v_i := v_i + 1; + p_headers[v_i] := { c_header_connection, { "keep-alive" } }; + v_i := v_i + 1; + p_headers[v_i] := { c_header_pragma, { "no-cache" } }; + v_i := v_i + 1; + p_headers[v_i] := { c_header_cache_control, { "no-cache" } }; + v_i := v_i + 1; + if (PICS_USE_TOKEN_HEADER) { + p_headers[v_i] := { c_header_authorization, { PICS_TOKEN_HEADER } }; // aladdin:opensesame + v_i := v_i + 1; + } + //p_headers[v_i] := { c_header_accept, { "application/x-its-response" } }; + if (lengthof(PX_ADDITIONAL_HTTP_HEADERS_KEYS) != 0) { + f_set_headers_list(PX_ADDITIONAL_HTTP_HEADERS_KEYS, PX_ADDITIONAL_HTTP_HEADERS_VALUES, p_headers); + } + } // End of function f_init_default_headers_list + + function f_set_headers_list( + in charstring_list p_headers_to_set, + in charstring_list p_headers_value, + inout Headers p_headers + ) { + // Sanity checks + if (lengthof(p_headers_to_set) == 0) { + return; + } else if (lengthof(p_headers) == 0) { + return; + } + + for (var integer v_idx := 0; v_idx < lengthof(p_headers_to_set); v_idx := v_idx + 1) { + var integer v_jdx; + for (v_jdx := 0; v_jdx < lengthof(p_headers); v_jdx := v_jdx + 1) { + if (p_headers[v_jdx].header_name == p_headers_to_set[v_idx]) { + p_headers[v_jdx].header_value := { p_headers_value[v_idx] }; // NOTE Codec won't encode it + break; + } + } // End of 'for' statement + if (v_jdx == lengthof(p_headers)) { + p_headers[v_jdx].header_name := p_headers_to_set[v_idx]; + p_headers[v_jdx].header_value := { p_headers_value[v_idx] }; + } + } // End of 'for' statement + } // End of function f_set_headers_list + + function f_remove_headers_list( + in charstring_list p_headers_to_remove, + inout Headers p_headers + ) { + // Sanity checks + if (lengthof(p_headers_to_remove) == 0) { + return; + } else if (lengthof(p_headers) == 0) { + return; + } + + for (var integer v_idx := 0; v_idx < lengthof(p_headers_to_remove); v_idx := v_idx + 1) { + for (var integer v_jdx := 0; v_jdx < lengthof(p_headers); v_jdx := v_jdx + 1) { + if (p_headers[v_jdx].header_name == p_headers_to_remove[v_idx]) { + p_headers[v_jdx].header_value := omit; // NOTE Codec won't encode it + break; + } + } // End of 'for' statement + } // End of 'for' statement + } // End of function f_remove_headers_list + + function f_get_header( + in Headers p_headers, + in charstring p_header_name := c_header_content_text, + out charstring_list p_header_value + ) { + // Sanity checks + if (lengthof(p_header_name) == 0) { + return; + } else if (lengthof(p_headers) == 0) { + return; + } + + for (var integer v_jdx := 0; v_jdx < lengthof(p_headers); v_jdx := v_jdx + 1) { + if (p_headers[v_jdx].header_name == p_header_name) { + p_header_value := p_headers[v_jdx].header_value; // NOTE Codec won't encode it + break; + } + } // End of 'for' statement + } // End of function f_get_header + + /** + * @desc Check HTTP response headers + * @param p_headers The HTTP headers + * @param p_value the expected va;ue + * @return true on success, false otherwise + */ + function f_check_headers( + in Headers p_headers, + in charstring p_header_name := "Location", + in template (present) charstring p_value := ? + ) return boolean { + // Local variables + var boolean v_header_matched := false; + + for (var integer v_idx := 0; v_idx < lengthof(p_headers); v_idx := v_idx + 1) { + if (p_headers[v_idx].header_name == p_header_name) { + if (match(p_headers[v_idx].header_value[0], p_value) == true) { + v_header_matched := true; + } // else, nothing to do + break; + } + } // End of 'for' statement + + return v_header_matched; + } // End of function f_check_headers + + } // End of group http_headers + + group altsteps { + + altstep a_default_requests() runs on HttpComponent { + [] httpPort.receive(mw_http_request) { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: Receive request instead of response on httpPort ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [] httpPort_notif.receive(mw_http_request) { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: Receive unsollicited request on httpPort_notif ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + } // End of altstep a_default_requests + + altstep a_default_responses() runs on HttpComponent { + var HttpMessage v_response; + + [] httpPort.receive( + mw_http_response( + mw_http_response_ok( + mw_http_message_body_xml + ))) { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Unexpected XML response ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [] httpPort.receive( + mw_http_response( + mw_http_response_ok( + mw_http_message_body_json + ))) { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Unexpected JSON response ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [] httpPort.receive( + mw_http_response( + mw_http_response_ok( + mw_http_message_body_binary + ))) { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Unexpected binary response ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [PICS_USE_TOKEN_HEADER == false] httpPort.receive( + mw_http_response( + mw_http_response_401_unauthorized + )) -> value v_response { + tc_http_ac.stop; + log("*** " & testcasename() & ": PASS: Received HTTP error message in case of non authenticated HTTP request ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success); + } + [] httpPort.receive( + mw_http_response( + mw_http_response_ko + )) -> value v_response { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: " & int2str(v_response.response.statuscode) & "/" & v_response.response.statustext & " ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + // Do not repeat! + } + [] httpPort.receive(mw_http_response) -> value v_response { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: " & int2str(v_response.response.statuscode) & "/" & v_response.response.statustext & " ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [] httpPort.receive { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: Receive unsollicited message on httpPort ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [] httpPort_notif.receive(mw_http_response) -> value v_response { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: " & int2str(v_response.response.statuscode) & "/" & v_response.response.statustext & " on httpPort_notif ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + [] httpPort_notif.receive { + tc_http_ac.stop; + log("*** " & testcasename() & ": FAIL: Server error: Receive unsollicited message on httpPort_notif ***"); + f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error); + } + } // End of altstep a_default_responses + + } // end of group altsteps + +} // End of module LibHttp_Functions diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_JsonMessageBodyTypes.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_JsonMessageBodyTypes.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..3e411e5edf4c626714904d5aa917ff8e1b5d2b8f --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_JsonMessageBodyTypes.ttcn @@ -0,0 +1,24 @@ +module LibHttp_JsonMessageBodyTypes { + + // LibNg112 + import from LibNg112_DequeueRegistration all; + + /** + * This file volontary contains a trivial declaration of the type JsonBody. + * In accordance with your TTCN-3 module LibHttp_JSONTypes, you have to change the JsonBody typing. + */ + // TODO Add here your custom RFCs import + + type union JsonBody { + // TODO Add here your custom variants + DequeueRegistrationRequest dequeueRegistrationRequest, + DequeueRegistrationResponse dequeueRegistrationResponse, + universal charstring raw + } with { + variant "" + } + +} with { + encode "JSON"; + variant "" +} // End of module LibHttp_JsonMessageBodyTypes diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_JsonTemplates.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_JsonTemplates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..4dbfc939ffad5d3adced346031ff6e2780f1d248 --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_JsonTemplates.ttcn @@ -0,0 +1,121 @@ +/** + * @author ETSI / STF569 + * @version $URL$ + * $ID:$ + * @desc This module provides the custom templates for ITS HTTP based protocols. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + */ +module LibHttp_JsonTemplates { + + // LibHttp + import from LibHttp_TypesAndValues all; + import from LibHttp_JsonMessageBodyTypes all; + + // LibJson + import from Json all; + + // LibNg112 + import from LibNg112_DequeueRegistration all; + import from LibNg112_SubscriptionPayloads all; + + // TODO Add here your custom RFCs import + + template (value) JsonBody m_json_body_raw( + in template (value) charstring p_raw + ) := { + raw := p_raw + } // End of template m_json_body_raw + + template (present) JsonBody mw_json_body_raw( + template (present) charstring p_raw := ? + ) := { + raw := p_raw + } // End of template mw_json_body_raw + + group dequeue_register { + + template (value) LibHttp_JsonMessageBodyTypes.JsonBody m_body_json_dequeue_registration_request( + in template (value) DequeueRegistrationRequest p_dequeue_registration_request + ) := { + dequeueRegistrationRequest := p_dequeue_registration_request + } // End of template m_dequeue_registration_request + + template (present) LibHttp_JsonMessageBodyTypes.JsonBody mw_body_json_dequeue_registration_request( + template (present) DequeueRegistrationRequest p_dequeue_registration_request := ? + ) := { + dequeueRegistrationRequest := p_dequeue_registration_request + } // End of template mw_dequeue_registration_request + + template (present) LibHttp_JsonMessageBodyTypes.JsonBody mw_body_json_dequeue_registration_response( + template (present) DequeueRegistrationResponse p_dequeue_registration_response := ? + ) := { + dequeueRegistrationResponse := p_dequeue_registration_response + } // End of template m_dequeue_registration_response + + template (omit) DequeueRegistrationRequest m_dequeue_registration_request( + in template (value) Json.String p_DequeueRegistrationQueueUri, + in template (value) Json.String p_DequeueRegistrationDequeuer, + in template (value) Json.Integer p_DequeueRegistrationExpirationTime, + in template (omit) Json.Integer p_DequeueRegistrationDequeuePreference := omit + ) := { + DequeueRegistrationQueueUri := p_DequeueRegistrationQueueUri, + DequeueRegistrationDequeuer := p_DequeueRegistrationDequeuer, + DequeueRegistrationExpirationTime := p_DequeueRegistrationExpirationTime, + DequeueRegistrationDequeuePreference := p_DequeueRegistrationDequeuePreference + } // End of template m_dequeue_registration_request + + template (present) DequeueRegistrationRequest mw_dequeue_registration_request( + template (present) Json.String p_DequeueRegistrationQueueUri := ?, + template (present) Json.String p_DequeueRegistrationDequeuer := ?, + template (present) Json.Integer p_DequeueRegistrationExpirationTime := ?, + template Json.Integer p_DequeueRegistrationDequeuePreference := * + ) := { + DequeueRegistrationQueueUri := p_DequeueRegistrationQueueUri, + DequeueRegistrationDequeuer := p_DequeueRegistrationDequeuer, + DequeueRegistrationExpirationTime := p_DequeueRegistrationExpirationTime, + DequeueRegistrationDequeuePreference := p_DequeueRegistrationDequeuePreference + } // End of template mw_dequeue_registration_request + + template (omit) DequeueRegistrationRequest m_dequeue_deregistration_request( + in template (value) Json.String p_DequeueRegistrationQueueUri, + in template (value) Json.String p_DequeueRegistrationDequeuer, + in template (omit) Json.Integer p_DequeueRegistrationDequeuePreference := omit + ) := { + DequeueRegistrationQueueUri := p_DequeueRegistrationQueueUri, + DequeueRegistrationDequeuer := p_DequeueRegistrationDequeuer, + DequeueRegistrationExpirationTime := 0, + DequeueRegistrationDequeuePreference := p_DequeueRegistrationDequeuePreference + } // End of template m_dequeue_deregistration_request + + template (present) DequeueRegistrationRequest mw_dequeue_deregistration_request( + template (present) Json.String p_DequeueRegistrationQueueUri := ?, + template (present) Json.String p_DequeueRegistrationDequeuer := ?, + template Json.Integer p_DequeueRegistrationDequeuePreference := * + ) := { + DequeueRegistrationQueueUri := p_DequeueRegistrationQueueUri, + DequeueRegistrationDequeuer := p_DequeueRegistrationDequeuer, + DequeueRegistrationExpirationTime := 0, + DequeueRegistrationDequeuePreference := p_DequeueRegistrationDequeuePreference + } // End of template mw_dequeue_registration_request + + template (value) DequeueRegistrationResponse m_dequeue_response_ok( + in template (value) Json.Integer p_DequeueRegistrationExpirationTime + ) := { + DequeueRegistrationExpirationTime := p_DequeueRegistrationExpirationTime, + DequeueRegistrationStatusCode := 0 + + } // End of template m_dequeue_registration_request + + template (present) DequeueRegistrationResponse mw_dequeue_response_ok( + template (present) Json.Integer p_DequeueRegistrationExpirationTime := ? + ) := { + DequeueRegistrationExpirationTime := p_DequeueRegistrationExpirationTime, + DequeueRegistrationStatusCode := ? + } // End of template mw_dequeue_registration_request + + } // End of group dequeue_register + +} // End of module LibHttp_JsonTemplates diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_Templates.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_Templates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..8adde3de4d17cc5fc199ce7d68a235098162d53d --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_Templates.ttcn @@ -0,0 +1,428 @@ +/** + * @author ETSI / STF549 + * @version $URL$ + * $ID:$ + * @desc This module provides the templates for ITS HTTP based protocols. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * @see ETSI TS 103 478 + */ +module LibHttp_Templates { + + // LibHttp + import from LibHttp_TypesAndValues all; + import from LibHttp_MessageBodyTypes all; + import from LibHttp_XmlMessageBodyTypes all; + import from LibHttp_JsonMessageBodyTypes all; + import from LibHttp_BinaryMessageBodyTypes all; + + template LibHttp_TypesAndValues.Response mw_http_response_456_bad_queue( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 456, + statustext := ? + } // End of template mw_http_response_456_bad_queue + + template LibHttp_TypesAndValues.Response mw_http_response_457_bad_dequeuePreference( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 457, + statustext := ? + } // End of template mw_http_response_457_bad_dequeuePreference + + group http_messages { + + template (value) HttpMessage m_http_request( + in template (value) Request p_request + ) := { + request := p_request + } // End of template m_http_request + + template (present) HttpMessage mw_http_request( + template (present) Request p_request := ? + ) := { + request := p_request + } // End of template mw_http_request + + template (value) HttpMessage m_http_response( + in template (value) Response p_response + ) := { + response := p_response + } // End of template m_http_response + + template (present) HttpMessage mw_http_response( + template (present) Response p_response := ? + ) := { + response := p_response + } // End of template mw_http_response + + } // End of group http_messages + + group http_headers { + + template (value) Header m_header_line( + in template (value) charstring p_header_name, + in template (value) charstring_list p_header_value + ) := { + header_name := p_header_name, + header_value := p_header_value + } // End of template m_header_line + + } // End of group http_headers + + group http_requests { + + template (omit) Request m_http_request_get( + in charstring p_uri, + in template (value) Headers p_headers, + in template (omit) HttpMessageBody p_body := omit + ) := { + method := "GET", + uri := p_uri, + version_major := c_http_version_major, + version_minor := c_http_version_minor, + header := p_headers, + body := p_body + } // End of template m_http_request_get + + template Request mw_http_request_get( + template (present) charstring p_uri := ?, + template (present) Headers p_headers := ?, + template HttpMessageBody p_body := * + ) := { + method := "GET", + uri := p_uri, + version_major := c_http_version_major, + version_minor := c_http_version_minor, + header := p_headers, + body := p_body + } // End of template mw_http_request_get + + template (omit) Request m_http_request_post( + in charstring p_uri, + in template (value) Headers p_headers, + in template (omit) HttpMessageBody p_body := omit + ) modifies m_http_request_get := { + method := "POST" + } // End of template m_http_request_post + + template Request mw_http_request_post( + template (present) charstring p_uri := ?, + template (present) Headers p_headers := ?, + template HttpMessageBody p_body := * + ) modifies mw_http_request_get := { + method := "POST" + } // End of template mw_http_request_post + + template (omit) Request m_http_request_patch( + in charstring p_uri, + in template (value) Headers p_headers, + in template (omit) HttpMessageBody p_body := omit + ) modifies m_http_request_get := { + method := "PATCH" + } // End of template m_http_request_patch + + template Request mw_http_request_patch( + template (present) charstring p_uri := ?, + template (present) Headers p_headers := ?, + template HttpMessageBody p_body := * + ) modifies mw_http_request_get := { + method := "PATCH" + } // End of template mw_http_request_patch + + template (omit) Request m_http_request_put( + in charstring p_uri, + in template (value) Headers p_headers, + in template (omit) HttpMessageBody p_body := omit + ) modifies m_http_request_get := { + method := "PUT" + } // End of template m_http_request_put + + template Request mw_http_request_put( + template (present) charstring p_uri := ?, + template (present) Headers p_headers := ?, + template HttpMessageBody p_body := * + ) modifies mw_http_request_get := { + method := "PUT" + } // End of template mw_http_request_put + + template (omit) Request m_http_request_delete( + in charstring p_uri, + in template (value) Headers p_headers, + in template (omit) HttpMessageBody p_body := omit + ) modifies m_http_request_get := { + method := "DELETE" + } // End of template m_http_request_delete + + template Request mw_http_request_delete( + template (present) charstring p_uri := ?, + template (present) Headers p_headers := ?, + template HttpMessageBody p_body := * + ) modifies mw_http_request_get := { + method := "DELETE" + } // End of template mw_http_request_post + + } // End of group http_requests + + group http_responses { + + template (value) Response m_http_response_ok( + in template (value) HttpMessageBody p_body, + in template (value) Headers p_header + ) := { + version_major := 1, + version_minor := 1, + statuscode := 200, + statustext := "OK", + header := p_header, + body := p_body, + tls := omit, + mutual_tls := omit + } // End of template m_http_response_ok + + template (value) Response m_http_response_ok_no_body( + in template (value) Headers p_header + ) := { + version_major := 1, + version_minor := 1, + statuscode := 200, + statustext := "OK", + header := p_header, + body := omit + } // End of template m_http_response_ok_no_body + + template (present) Response mw_http_response_ok_no_body( + template (present) Headers p_header := ? + ) := { + version_major := 1, + version_minor := 1, + statuscode := 200, + statustext := "OK", + header := p_header, + body := omit, + tls := *, + mutual_tls := * + } // End of template mw_http_response_ok_no_body + + template (value) Response m_http_response_204_no_content( + in template (value) Headers p_header + ) modifies m_http_response_ok_no_body := { + statuscode := 204, + statustext := "No Content" + } // End of template m_http_response_204_no_content + + template (present) Response mw_http_response_ok( + template (present) HttpMessageBody p_body := ?, + template (present) Headers p_header := ? + ) := { + version_major := 1, + version_minor := 1, + statuscode := 200, + statustext := ?, + header := p_header, + body := p_body, + tls := *, + mutual_tls := * + } // End of template mw_http_response_ok + + template (present) Response mw_http_response_201_created( + template (present) HttpMessageBody p_body := ?, + template (present) Headers p_header := ? + ) modifies mw_http_response_ok := { + statuscode := 201, + statustext := "Created" + } // End of template mw_http_response_201_created + + template (present) Response mw_http_response_202_accepted( + template (present) HttpMessageBody p_body := ?, + template (present) Headers p_header := ? + ) modifies mw_http_response_ok := { + statuscode := 202, + statustext := "Accepted" + } // End of template mw_http_response_202_accepted + + template (present) Response mw_http_response_204_no_content( + template (present) Headers p_header := ? + ) modifies mw_http_response_ok_no_body := { + statuscode := 204, + statustext := "No Content" + } // End of template mw_http_response_204_no_content + + template (value) Response m_http_response_ko( + in template (value) HttpMessageBody p_body, + in template (value) Headers p_header, + in template (value) integer p_statuscode := 404, + in template (value) charstring p_statustext := "Not found" + ) := { + version_major := 1, + version_minor := 1, + statuscode := p_statuscode, + statustext := p_statustext, + header := p_header, + body := p_body + } // End of template m_http_response_ko + + template (value) Response m_http_response_ko_no_body( + in template (value) Headers p_header, + in template (value) integer p_statuscode := 404, + in template (value) charstring p_statustext := "Not found" + ) := { + version_major := 1, + version_minor := 1, + statuscode := p_statuscode, + statustext := p_statustext, + header := p_header, + body := omit + } // End of template m_http_response_ko_no_body + + template (value) Response m_http_response_500_internal_error( + in template (value) Headers p_header, + in template (value) integer p_statuscode := 500, + in template (value) charstring p_statustext := "Internal Error" + ) modifies m_http_response_ko_no_body := { + } // End of template m_http_response_ko + + template (present) Response mw_http_response_ko_no_body( + template (present) Headers p_header := ?, + template (present) integer p_statuscode := 404, + template (present) charstring p_statustext := "Not found" + ) := { + version_major := 1, + version_minor := 1, + statuscode := p_statuscode, + statustext := p_statustext, + header := p_header, + body := omit + } // End of template mw_http_response_ko_no_body + + template Response mw_http_response_ko( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) := { + version_major := 1, + version_minor := 1, + statuscode := complement(200), + statustext := ?, + header := p_header, + body := p_body + } // End of template mw_http_response_ko + + template (value) Response m_http_response_400_bad_request( + in template (value) HttpMessageBody p_body, + in template (value) Headers p_header, + in template (value) integer p_statuscode := 400, + in template (value) charstring p_statustext := "Bad Request" + ) modifies m_http_response_ko := { + } // End of template m_http_response_400_bad_request + + template Response mw_http_response_400_bad_request( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 400, + statustext := "Bad Request" + } // End of template mw_http_response_400_bad_request + + template Response mw_http_response_401_unauthorized( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 401, + statustext := "Unauthorized" + } // End of template mw_http_response_401_unauthorized + + template Response mw_http_response_403_forbidden( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 403, + statustext := "Forbidden" + } // End of template mw_http_response_403_forbidden + + template Response mw_http_response_404_not_found( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 404, + statustext := "Not Found" + } // End of template mw_http_response_404_not_found + + template Response mw_http_response_412_precondition_failed( + template HttpMessageBody p_body := *, + template (present) Headers p_header := ? + ) modifies mw_http_response_ko := { + statuscode := 412, + statustext := "Precondition Failed" + } // End of template mw_http_response_412_not_found + + } // End of group http_responses + + group http_html_body { + + template (value) HttpMessageBody m_http_message_body_html( + in template (value) HtmlBody p_html_body + ) := { + html_body := p_html_body + } // End of template m_http_message_body_html + + template (present) HttpMessageBody mw_http_message_body_html( + template (present) HtmlBody p_html_body := ? + ) := { + html_body := p_html_body + } // End of template mw_http_message_body_html + + } // End of group http_html_body + + group http_xml_body { + + template (value) HttpMessageBody m_http_message_body_xml( + in template (value) XmlBody p_xml_body + ) := { + xml_body := p_xml_body + } // End of template m_http_message_body_xml + + template (present) HttpMessageBody mw_http_message_body_xml( + template (present) XmlBody p_xml_body := ? + ) := { + xml_body := p_xml_body + } // End of template mw_http_message_body_xml + + } // End of group http_xml_body + + group http_json_body { + + template (value) HttpMessageBody m_http_message_body_json( + in template (value) JsonBody p_json_body + ) := { + json_body := p_json_body + } // End of template m_http_message_body_json + + template (present) HttpMessageBody mw_http_message_body_json( + template (present) JsonBody p_json_body := ? + ) := { + json_body := p_json_body + } // End of template mw_http_message_body_json + + } // End of group http_json_body + + group http_binary_body { + + template (value) HttpMessageBody m_http_message_body_binary( + in template (value) BinaryBody p_binary_body + ) := { + binary_body := p_binary_body + } // End of template m_http_message_body_binary + + template (present) HttpMessageBody mw_http_message_body_binary( + template (present) BinaryBody p_binary_body := ? + ) := { + binary_body := p_binary_body + } // End of template mw_http_message_body_binary + + } // End of group http_binary_body + +} // End of module LibHttp_Templates diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_TestSystem.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_TestSystem.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..fa86083436de6e7870249d313124f128869f11ba --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_TestSystem.ttcn @@ -0,0 +1,38 @@ +/** + * @author ETSI / STF545 + * @version $URL$ + * $ID:$ + * @desc This module provides the test system used by ITS HTTP based protocols. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * @see ETSI TS 103 478 + */ +module LibHttp_TestSystem { + + // LibCommon + import from LibCommon_Sync all; + import from LibCommon_Time all; + + // LibHttp + import from LibHttp_TypesAndValues all; + + type port HttpPort message { + inout HttpMessage; + } + + type component HttpComponent extends SelfSyncComp { // FIXME To be rename into HttpTest + port HttpPort httpPort; + port HttpPort httpPort_notif; + // timers + timer tc_http_ac := PX_TAC; + + } // End of component HttpComponent + + type component HttpTestAdapter { // FIXME To be rename into HttpTestSystem + port HttpPort httpPort; + port HttpPort httpPort_notif; + } // End of component TestAdapter + +} // End of module LibHttp_TestSystem diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_XmlMessageBodyTypes.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_XmlMessageBodyTypes.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..68796c4f8e414c353d0a692df3e426248e647027 --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_XmlMessageBodyTypes.ttcn @@ -0,0 +1,62 @@ +module LibHttp_XmlMessageBodyTypes { + + import from XSD all; + + // LibNg112 + import from LibNg112_TypesAndValues all; + + // LibHttp + import from LibHttp_XMLTypes all; + + // RFC5985 Held + import from urn_ietf_params_xml_ns_geopriv_held language "XSD" all + with { + extension "File:../xsd/RFC5985_held.xsd"; + } + + // RFC3863 PIDF + import from urn_ietf_params_xml_ns_pidf language "XSD" all + with { + extension "File:../xsd/urn_ietf_params_xml_ns_pidf.ttcn" + } + + // RFC5222 + import from urn_ietf_params_xml_ns_lost1 language "XSD" all + with { + extension "File:../xsd/RFC5222_lost.xsd"; + } + + /** + * This file volontary contains a trivial declaration of the type XmlBody. + * In accordance with your TTCN-3 module LibHttp_XMLTypes, you have to change the XmlBody typing. + */ + // TODO Add here your custom RFCs import + + type union XmlBodyMsg { + // TODO Add here your custom variants + LocationRequest locationRequest, + LocationResponse locationResponse, + Presence presence, + ErrorType errorType, + FindService findServiceRequest, + FindServiceResponse findServiceResponse, + ListServices listServices, + ListServicesResponse listServicesResponse, + ListServicesByLocation listServicesByLocation, + ListServicesByLocationResponse listServicesByLocationResponse, + ExceptionContainer exceptionContainer, + Redirect redirect, + charstring raw + } with { + variant "" + } + + type record XmlBody { + XmlBodyMsg msg, + charstring raw optional + } + +} with { + encode "XML"; + variant "" +} // End of LibHttp_XmlMessageBodyTypes diff --git a/ttcn/patch_lib_http/ttcn/LibHttp_XmlTemplates.ttcn b/ttcn/patch_lib_http/ttcn/LibHttp_XmlTemplates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..1c4211192dd55dcf61ca87ad0c18ca60350ab540 --- /dev/null +++ b/ttcn/patch_lib_http/ttcn/LibHttp_XmlTemplates.ttcn @@ -0,0 +1,1095 @@ +/** + * @author ETSI / STF545 + * @version $URL: https://oldforge.etsi.org/svn/LibIts/branches/STF525/ttcn/Http/LibHttp_Templates.ttcn $ + * $ID:$ + * @desc This module provides the custom templates for ITS HTTP based protocols. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + */ +module LibHttp_XmlTemplates { + + import from XSD all; + + // RFC5985 Held + import from urn_ietf_params_xml_ns_geopriv_held language "XSD" all + with { + extension "File:../xsd/RFC5985_held.xsd"; + } + // RFC6155 Held ID + import from urn_ietf_params_xml_ns_geopriv_held_id language "XSD" all + with { + extension "File:../xsd/RFC6155_held_id.xsd"; + } + // RFC3863 PIDF + import from urn_ietf_params_xml_ns_pidf language "XSD" all + with { + extension "File:../xsd/urn_ietf_params_xml_ns_pidf.ttcn" + } + import from urn_ietf_params_xml_ns_pidf_geopriv10 language "XSD" all + with { + extension "File:../xsd/RFC4119_geopriv10.xsd"; + } + import from urn_ietf_params_xml_ns_pidf_geopriv10_basicPolicy language "XSD" all + with { + extension "File:../xsd/RFC4119_geopriv10_basic_policy.xsd"; + } + + import from urn_ietf_params_xml_ns_pidf_geopriv10_civicAddr language "XSD" all + with { + extension "File:../xsd/RFC5139_pdif_geopriv10_civic_address.xsd"; + } + + // RFC3863 + import from urn_ietf_params_xml_ns_pidf language "XSD" all + with { + extension "File:../xsd/RFC3863_pidf.xsd"; + } + + // RFC5222 + import from urn_ietf_params_xml_ns_lost1 language "XSD" all + with { + extension "File:../xsd/RFC5222_lost.xsd"; + } + + // OpenGIS + import from http_www_opengis_net_pidflo_1_0 language "XSD" all + with { + extension "File:../xsd/GLM-pidf-lo-shape.xsd"; + } + import from http_www_opengis_net_gml language "XSD" all + with { + extension "File:../xsd/gmlBase.xsd"; + extension "File:../xsd/basicTypes.xsd"; + extension "File:../xsd/measures.xsd"; + extension "File:../xsd/geometryPrimitives.xsd"; + extension "File:../xsd/geometryBasic0d1d.xsd"; + extension "File:../xsd/geometryBasic2d.xsd"; + } + + // LibHttp + import from LibHttp_XmlMessageBodyTypes all; + import from LibHttp_XMLTypes all; + + template (value) XmlBody m_xml_body_raw( + in template (value) charstring p_raw + ) := { + raw := p_raw + } // End of template m_xml_body_raw + + template (present) XmlBody mw_xml_body_raw( + template (present) charstring p_raw := ? + ) := { + raw := p_raw + } // End of template mw_xml_body_raw + + group rfc5985_held { + + group http_xml_body { + + template (value) XmlBody m_body_xml_location_request( + in template (value) LocationRequest p_locationRequest + ) := { + msg := { locationRequest := p_locationRequest }, + raw := omit + } // End of template m_body_xml_location_request + + template (present) XmlBody mw_body_xml_location_request( + template (present) LocationRequest p_locationRequest := ? + ) := { + msg := { locationRequest := p_locationRequest }, + raw := omit + } // End of template mw_body_xml_location_request + + template (value) XmlBody m_body_xml_location_response( + in template (value) LocationResponse p_locationResponse + ) := { + msg := { locationResponse := p_locationResponse }, + raw := omit + } // End of template m_body_xml_location_response + + template (present) XmlBody mw_body_xml_location_response( + template (present) LocationResponse p_locationResponse := ? + ) := { + msg := { locationResponse := p_locationResponse }, + raw := omit + } // End of template mw_body_xml_location_response + + template (present) XmlBody mw_body_xml_presence( + in template (present) Presence p_presence := ? + ) := { + msg := { presence := p_presence }, + raw := omit + } // End of template mw_body_xml_presence + + template (present) XmlBody mw_body_xml_location_response_error( + in template (present) ErrorType p_error_type := ? + ) := { + msg := { errorType := p_error_type }, + raw := omit + } // End of template mw_body_xml_location_response_error + + template (value) XmlBody m_body_xml_find_service_request( + in template (value) FindService p_findServiceRequest + ) := { + msg := { findServiceRequest := p_findServiceRequest }, + raw := omit + } // End of template m_body_xml_find_service_request + + template (present) XmlBody mw_body_xml_find_service_request( + template (present) FindService p_findServiceRequest := ? + ) := { + msg := { findServiceRequest := p_findServiceRequest }, + raw := omit + } // End of template mw_body_xml_find_service_request + + template (value) XmlBody m_body_xml_find_service_response( + in template (value) FindServiceResponse p_findServiceResponse + ) := { + msg := { findServiceResponse := p_findServiceResponse }, + raw := omit + } // End of template m_body_xml_find_service_response + + template (present) XmlBody mw_body_xml_find_service_response( + template (present) FindServiceResponse p_findServiceResponse := ? + ) := { + msg := { findServiceResponse := p_findServiceResponse }, + raw := omit + } // End of template mw_body_xml_find_service_response + + template (value) XmlBody m_body_xml_list_services_request( + in template (value) ListServices p_listServices + ) := { + msg := { listServices := p_listServices }, + raw := omit + } // End of template m_body_xml_list_services_request + + template (present) XmlBody mw_body_xml_list_services_response( + template (present) ListServicesResponse p_listServicesResponse := ? + ) := { + msg := { listServicesResponse := p_listServicesResponse }, + raw := omit + } // End of template mw_body_xml_list_services_response + + template (value) XmlBody m_body_xml_list_services_by_location_request( + in template (value) ListServicesByLocation p_listServicesByLocation + ) := { + msg := { listServicesByLocation := p_listServicesByLocation }, + raw := omit + } // End of template m_body_xml_list_services_by_location_request + + template (present) XmlBody mw_body_xml_list_services_by_location_response( + template (present) ListServicesByLocationResponse p_listServicesByLocationResponse := ? + ) := { + msg := { listServicesByLocationResponse := p_listServicesByLocationResponse }, + raw := omit + } // End of template mw_body_xml_list_services_by_location_response + + template (value) XmlBody m_body_xml_redirect_response( + in template (value) Redirect p_redirect + ) := { + msg := { redirect := p_redirect }, + raw := omit + } // End of template m_body_xml_list_services_request + + template (present) XmlBody mw_body_xml_redirect_response( + template (present) Redirect p_redirect := ? + ) := { + msg := { redirect := p_redirect }, + raw := omit + } // End of template mw_body_xml_list_services_by_location_response + + template (present) XmlBody mw_body_xml_find_service_response_error( + template (present) ExceptionContainer p_exceptionContainer := ? + ) := { + msg := { exceptionContainer := p_exceptionContainer }, + raw := omit + } // End of template mw_body_xml_find_service_response_error + + } // End of group http_xml_body + + template (omit) LocationRequest m_locationRequest( + in template (value) LocationRequestType.elem_list p_elem_list, + in template (omit) LocationTypeType p_locationType := omit, + in template (omit) ResponseTimeType p_responseTime := omit, + in template (omit) LocationRequestType.attr p_attr := omit + ) := { + responseTime := p_responseTime, + attr := p_attr, + locationType := p_locationType, + elem_list := p_elem_list + } // End of template m_locationRequest + + template LocationRequest mw_locationRequest( + template (present) LocationRequestType.elem_list p_elem_list := ?, + template LocationTypeType p_locationType := *, + template ResponseTimeType p_responseTime := *, + template LocationRequestType.attr p_attr := * + ) := { + responseTime := p_responseTime, + attr := p_attr, + locationType := p_locationType, + elem_list := p_elem_list + } // End of template mw_locationRequest + + //template (value) Uri m_uri(in template (value) Uri p_uri) := p_uri; + + template (value) LocationResponseType m_locationResponse( + in template (omit) ReturnLocationType p_locationUriSet := omit, + in template (value) Presence p_presence, + in template (value) LocationResponseType.elem_list p_elem_list := { } + ) := { + locationUriSet := p_locationUriSet, + presence := p_presence, + elem_list := p_elem_list + } // End of template m_locationResponse + + template LocationResponseType mw_locationResponse( + template ReturnLocationType p_locationUriSet := *, + template Presence p_presence := *, + template LocationResponseType.elem_list p_elem_list := * + ) := { + locationUriSet := p_locationUriSet, + presence := p_presence, + elem_list := p_elem_list + } // End of template mw_locationResponse + + template (omit) LocationTypeType m_locationTypeType( + in template (value) LocationTypeBase p_base, + in template (omit) XSD.Boolean p_exact := omit + ) := { + exact := p_exact, + base := p_base + } // End of template m_locationTypeType + + template (value) LocationTypeBase m_locationTypeBase_civic := { + alt_1 := { + civic + } + } // End of template m_locationTypeBase_civic + + template (value) LocationTypeBase m_locationTypeBase_geodetic := { + alt_1 := { + geodetic + } + } // End of template m_locationTypeBase_geodetic + + template (value) LocationTypeBase m_locationTypeBase_locationUri := { + alt_1 := { + locationURI + } + } // End of template m_locationTypeBase_locationUri + + template (value) LocationTypeBase m_locationTypeBase_all := { + alt_1 := { + geodetic, civic + } + } // End of template m_locationTypeBase_all + + template (value) ReturnLocationType m_locationUriSet( + in template (value) XSD.DateTime p_expires, + in template (value) ReturnLocationType.locationURI_list p_locationURI_list + ):= { + expires := p_expires, + locationURI_list := p_locationURI_list + } // End of template m_locationUriSet + + template (present) ReturnLocationType mw_locationUriSet( + template (present) XSD.DateTime p_expires := ?, + template (present) ReturnLocationType.locationURI_list p_locationURI_list := { ? } + ):= { + expires := p_expires, + locationURI_list := p_locationURI_list + } // End of template mw_locationUriSet + + template ErrorType mw_error_type( + template (present) XSD.Token p_code := ?, + template (present) ErrorType.message_list p_message_list := ?, + template (present) ErrorType.elem_list p_elem_list := {}, + template ErrorType.attr p_attr := * + ) := { + code := p_code, + attr := p_attr, + message_list := p_message_list, + elem_list := p_elem_list + } // End of template mw_error_type + + } // End of group rfc5985_held + + group rfc6155_held_id { + + template (value) Device m_device( + in template (value) Device.elem_list p_elem_list + ) := { + elem_list := p_elem_list + } // End of template m_device + + template (present) Device mw_device( + template (present) DeviceIdentity.elem_list p_elem_list := ? + ) := { + elem_list := p_elem_list + } // End of template mw_device + + } // End of group rfc6155_held_id + + group rfc3863_pidf { + + template (present) Presence mw_presence( + template (present) XSD.AnyURI p_entity := ?, + template (present) Presence.tuple_list p_tuple_list := ? + ) := { + entity := p_entity, + tuple_list := p_tuple_list, + note_list := {}, + elem_list := {} + } // End of template mw_presence + + template Tuple mw_tuple( + template (present) universal charstring p_id := ?, + template (present) Status p_status := ?, + template (present) Tuple.elem_list p_elem_list := ?, + template (present) Tuple.note_list p_note_list := {}, + template Contact p_contact := * + ) := { + id := p_id, + status := p_status, + elem_list := p_elem_list, + contact := p_contact, + note_list := p_note_list, + timestamp_ := * + } // End of template mw_tuple + + } // End of group rfc3863_pidf + + group rfc4119_geopriv10 { + + template (value) LocInfoType m_location_info( + in template (value) LocInfoType.point p_point + ) := { + point := p_point + } // End of template m_location_info + + template (present) LocInfoType mw_location_info( + template LocInfoType.point p_point := * + ) := { + point := p_point + } // End of template mw_location_info + + template (value) Geopriv m_geopriv( + in template (value) LocInfoType p_location_info, + in template (value) LocPolicyType p_usage_rules, + in template (value) Geopriv.elem_list p_elem_list := { }, + in template (omit) LocMethod p_method := omit, + in template (omit) LocProvidedBy p_provided_by := omit + ) := { + location_info := p_location_info, + usage_rules := p_usage_rules, + method := p_method, + provided_by := p_provided_by, + elem_list := p_elem_list + } // End of template m_geopriv + + template (present) Geopriv mw_geopriv( + template (present) LocInfoType p_location_info := ?, + template (present) LocPolicyType p_usage_rules := ?, + template LocMethod p_method := ?, + template LocProvidedBy p_provided_by := *, + template Geopriv.elem_list p_elem_list := * + ) := { + location_info := p_location_info, + usage_rules := p_usage_rules, + method := p_method, + provided_by := p_provided_by, + elem_list := p_elem_list + } // End of template mw_geopriv + + template (value) LocPolicyType m_LocPolicyType( + in template (value) LocPolicyType.elem_list p_elem_list := {} + ) := { + retransmission_allowed := omit, + retention_expiry := omit, + external_ruleset := omit, + note_well := omit, + elem_list := p_elem_list + } // End of template m_LocPolicyType + + } // End of group rfc4119_geopriv10 + + group rfc5139_pdif_geopriv10_civic_address { + + template (present) CaType mw_ca_type( + template (present) XSD.Token p_base := ? + ) := { + lang := *, + base := p_base + } // End of template mw_ca_type + + template CivicAddress mw_civicAddress( + template (present) Iso3166a2 p_country := ?, + template (present) XSD.Token p_a1 := ?, + template (present) XSD.String p_a3 := ?, + template (present) XSD.String p_a4 := ?, + template (present) XSD.String p_sTS := ?, + template (present) XSD.String p_lMK := ?, + template (present) CivicAddress.elem_list p_elem_list := ? + ) := { + attr := *, + country := p_country, + a1 := mw_ca_type(p_a1), + a2 := *, + a3 := mw_ca_type(p_a3), + a4 := mw_ca_type(p_a4), + a5 := *, + a6 := *, + pRM := *, + pRD := *, + rD := *, + sTS := mw_ca_type(p_sTS), + pOD := *, + pOM := *, + rDSEC := *, + rDBR := *, + rDSUBBR := *, + hNO := *, + hNS := *, + lMK := mw_ca_type(p_lMK), + lOC := *, + fLR := *, + nAM := *, + pC := *, + bLD := *, + uNIT := *, + rOOM := *, + sEAT := *, + pLC := *, + pCN := *, + pOBOX := *, + aDDCODE := *, + elem_list := p_elem_list + } // End of template mw_civicAddress + + } // End of group rfc5139_pdif_geopriv10_civic_address + + group rfc5222_lost { + + template (omit) FindService m_find_service_request( + in template (value) FindService.location_list p_location_list, + in template (value) FindService.notLost_list p_notLost_list, + in template (omit) Service p_service := omit, + in template (omit) XSD.Boolean p_recursive_ := omit, + in template (omit) FindService.serviceBoundary p_serviceBoundary := omit, + in template (omit) XSD.Boolean p_validateLocation := omit, + in template (omit) Path p_path := omit + ) := { + recursive_ := p_recursive_, + serviceBoundary := p_serviceBoundary, + validateLocation := p_validateLocation, + location_list := p_location_list, + path := p_path, + service := p_service, + notLost_list := p_notLost_list + } // End of template m_find_service_request + + template FindService mw_find_service_request( + template (present) FindService.location_list p_location_list := ?, + template (present) FindService.notLost_list p_notLost_list := ?, + template Service p_service := *, + template XSD.Boolean p_recursive_ := *, + template FindService.serviceBoundary p_serviceBoundary := *, + template XSD.Boolean p_validateLocation := *, + template Path p_path := * + ) := { + recursive_ := p_recursive_, + serviceBoundary := p_serviceBoundary, + validateLocation := p_validateLocation, + location_list := p_location_list, + path := p_path, + service := p_service, + notLost_list := p_notLost_list + } // End of template mw_find_service_request + + template (omit) Location m_location( + in template (value) XSD.Token p_id, + in template (value) Location.extensionPoint_list p_extensionPoint_list, + in template (omit) XSD.NMTOKEN p_profile := omit + ) := { + id := p_id, + profile := p_profile, + extensionPoint_list := p_extensionPoint_list + } // End of template m_location + + template Location mw_location( + template (present) XSD.Token p_id := ?, + template (present) Location.extensionPoint_list p_extensionPoint_list := ?, + template XSD.NMTOKEN p_profile := * + ) := { + id := p_id, + profile := p_profile, + extensionPoint_list := p_extensionPoint_list + } // End of template mw_location + + template (value) NotLost m_notLost( + in template (value) XSD.String p_elem + ) := { + elem := p_elem + } // End of template m_notLost + + template (value) ExtensionPoint m_extension_point( + in template (value) XSD.String p_elem + ) := { + elem := p_elem, + notLost_list := { } + } // End of template m_extension_point + + template (present) ExtensionPoint mw_extension_point( + template (present) XSD.String p_elem := ? + ) := { + elem := p_elem, + notLost_list := { } + } // End of template mw_extension_point + + template (value) ExtensionPoint m_extension_point_notLost( + in template (value) XSD.String p_elem, + in template (value) ExtensionPoint.notLost_list p_notLost_list + ) modifies m_extension_point := { + notLost_list := p_notLost_list + } // End of template m_extension_point_notLost + + template (omit) FindServiceResponse m_find_service_response( + in template (value) FindServiceResponse.mapping_list p_mapping_list, + in template (value) FindServiceResponse.warnings_list p_warnings_list := { }, + in template (value) Path p_path, + in template (value) FindServiceResponse.notLost_list p_notLost_list := { }, + in template (omit) LocationValidation p_locationValidation := omit, + in template (omit) LocationUsed p_locationUsed := omit + ) := { + mapping_list := p_mapping_list, + locationValidation := p_locationValidation, + warnings_list := p_warnings_list, + path := p_path, + notLost_list := p_notLost_list, + locationUsed := p_locationUsed + } // End of template m_find_service_response + + template FindServiceResponse mw_find_service_response( + template (present) FindServiceResponse.mapping_list p_mapping_list := ?, + template (present) FindServiceResponse.warnings_list p_warnings_list := ?, + template (present) Path p_path := ?, + template (present) FindServiceResponse.notLost_list p_notLost_list := ?, + template LocationValidation p_locationValidation := *, + template LocationUsed p_locationUsed := * + ) := { + mapping_list := p_mapping_list, + locationValidation := p_locationValidation, + warnings_list := p_warnings_list, + path := p_path, + notLost_list := p_notLost_list, + locationUsed := p_locationUsed + } // End of template mw_find_service_response + + template Redirect mw_redirect( + template (present) XSD.Token p_source := ?, + template (present) XSD.Token p_target := ?, + template (present) XSD.Token p_message := ? + ) := { + lang := ?, + message_ := p_message, + source := p_source, + target := p_target, + notLost_list := {} + } // End of template mw_find_service_response + + template Redirect m_redirect( + template (present) XSD.Token p_source := ?, + template (present) XSD.Token p_target := ?, + template (present) XSD.Token p_message := "Out of jurisdiction" + ) := { + lang := "en", + message_ := p_message, + source := p_source, + target := p_target, + notLost_list := {} + } // End of template mw_find_service_response + + template (omit) Mapping m_mapping( + in template (value) Mapping.expires p_expires, + in template (value) XSD.DateTime p_lastUpdated, + in template (value) AppUniqueString p_source, + in template (value) XSD.Token p_sourceId, + in template (value) Mapping.displayName_list p_displayName_list, + in template (value) Mapping.uri_list p_uri_list, + in template (omit) Mapping.choice p_choice := omit, + in template (omit) Service p_service := omit, + in template (value) Mapping.notLost_list p_notLost_list := { }, + in template (omit) Mapping.lang p_lang := omit, + in template (omit) XSD.Token p_message_ := omit, + in template (omit) ServiceNumber p_serviceNumber := omit + ) := { + lang := p_lang, + expires := p_expires, + lastUpdated := p_lastUpdated, + message_ := p_message_, + source := p_source, + sourceId := p_sourceId, + displayName_list := p_displayName_list, + service := p_service, + choice := omit, + uri_list := p_uri_list, + serviceNumber := p_serviceNumber, + notLost_list := p_notLost_list + } // End of template m_mapping + + template Mapping mw_mapping( + template (present) Mapping.expires p_expires := ?, + template (present) XSD.DateTime p_lastUpdated := ?, + template (present) AppUniqueString p_source := ?, + template (present) XSD.Token p_sourceId := ?, + template (present) Mapping.displayName_list p_displayName_list := ?, + template (present) Mapping.uri_list p_uri_list := ?, + template Mapping.choice p_choice := *, + template Service p_service := *, + template (present) Mapping.notLost_list p_notLost_list := ?, + template Mapping.lang p_lang := *, + template XSD.Token p_message_ := *, + template ServiceNumber p_serviceNumber := * + ) := { + lang := p_lang, + expires := p_expires, + lastUpdated := p_lastUpdated, + message_ := p_message_, + source := p_source, + sourceId := p_sourceId, + displayName_list := p_displayName_list, + service := p_service, + choice := *, + uri_list := p_uri_list, + serviceNumber := p_serviceNumber, + notLost_list := p_notLost_list + } // End of template mw_mapping + + template (value) DisplayName m_display_name( + in template (value) XSD.Language p_lang := "en", + in template (value) XSD.String p_base + ) := { + lang := p_lang, + base := p_base + } // End of template m_display_name + + template (present) DisplayName mw_display_name( + template (present) XSD.Language p_lang := ?, + template (present) XSD.String p_base := ? + ) := { + lang := p_lang, + base := p_base + } // End of template mw_display_name + + template (present) Mapping.expires mw_expires_date_time( + template (present) XSD.DateTime p_date_time := ? + ) := { + dateTime := p_date_time + } // End of template mw_expires_date_time + + template (present) Mapping.choice mw_mapping_service_boundary( + template (present) ServiceBoundary_1 p_service_boundary := ? + ) := { + serviceBoundary := p_service_boundary + } // End of template mw_mapping_service_boundary + + template (present) ServiceBoundary_1 mw_service_boundary( + template (present) ServiceBoundary_1.serviceBoundary_list p_serviceBoundary_list + ) := { + serviceBoundary_list := p_serviceBoundary_list + } // End of template mw_service_boundary + + template ServiceBoundary mw_service_boundary_item( + template XSD.NMTOKEN p_profile := *, + template (present) ServiceBoundary.extensionPoint_list p_extensionPoint_list := ? + ) := { + profile := p_profile, + extensionPoint_list := p_extensionPoint_list + } // End of template mw_service_boundary_item + + template BasicException mw_basic_exception( + template XSD.Language p_lang := *, + template XSD.Token p_message_ := *, + template (present) BasicException.notLost_list p_notLost_list := ? + ) := { + lang := p_lang, + message_ := p_message_, + notLost_list := p_notLost_list + } // End of template mw_basic_exception + + template LocationProfileUnrecognized mw_location_profile_unrecognized( + template XSD.Language p_lang := *, + template XSD.Token p_message_ := *, + template (present) LocationProfileUnrecognized.notLost_list p_notLost_list := ? + ) := { + lang := p_lang, + message_ := p_message_, + notLost_list := p_notLost_list + } // End of template mw_location_profile_unrecognized + + template (present) ExceptionContainer mw_exception_serviceNotImplemented( + template (present) AppUniqueString p_source := ?, + template (present) BasicException p_serviceNotImplemented := ?, + template (present) ExceptionContainer.notLost_list p_notLost_list := ? +) := { + source := p_source, + choice_list := { { serviceNotImplemented := p_serviceNotImplemented } }, + notLost_list := p_notLost_list + } // End of template mw_exception_serviceNotImplemented + + template (present) ExceptionContainer mw_exception_locationProfileUnrecognized( + template (present) AppUniqueString p_source := ?, + template (present) LocationProfileUnrecognized p_locationProfileUnrecognized := ?, + template (present) ExceptionContainer.notLost_list p_notLost_list := ? + ) := { + source := p_source, + choice_list := { { locationProfileUnrecognized := p_locationProfileUnrecognized } }, + notLost_list := p_notLost_list + } // End of template mw_exception_locationProfileUnrecognized + + template (present) ExceptionContainer mw_exception_loop( + template (present) AppUniqueString p_source := ?, + template (present) Loop p_loop := ?, + template (present) ExceptionContainer.notLost_list p_notLost_list := ? + ) := { + source := p_source, + choice_list := { { loop := p_loop } }, + notLost_list := p_notLost_list + } // End of template mw_exception_loop + + template (present) ExceptionContainer mw_exception_badRequest( + template (present) AppUniqueString p_source := ?, + template (present) BadRequest p_bad := ?, + template (present) ExceptionContainer.notLost_list p_notLost_list := ? + ) := { + source := p_source, + choice_list := { { badRequest := p_bad } }, + notLost_list := p_notLost_list + } // End of template mw_exception_badRequest + + template (value) LocationUsed m_location_used( + in template (value) XSD.Token p_id + ) := { + id := p_id + } // End of template m_location_used + + template (present) LocationUsed mw_location_used( + template (present) XSD.Token p_id := ? + ) := { + id := p_id + } // End of template mw_location_used + + template (value) Via m_via( + in template (value) AppUniqueString p_source + ) := { + source := p_source, + notLost_list := { } + } // End of template m_via + + template (present) Via mw_via( + template (present) AppUniqueString p_source := ? + ) := { + source := p_source, + notLost_list := ? + } // End of template mw_via + + template (value) Path m_path( + in template (value) Path.via_list p_via_list + ) := { + via_list := p_via_list + } // End of template m_path + + template (present) Path mw_path( + template (present) Path.via_list p_via_list := ? + ) := { + via_list := p_via_list + } // End of template mw_path + + template (omit) ListServices m_list_services( + in template (omit) Path p_path := omit, + in template (omit) Service p_service := omit + ) := { + path := p_path, + service := p_service, + notLost_list := { } + } // End of template m_list_services + + template (present) ListServicesResponse mw_list_services_response( + template (present) ServiceList p_serviceList := ?, + template (present) Path p_path := ?, + template (present) ListServicesResponse.warnings_list p_warnings_list := ? + ) := { + serviceList := p_serviceList, + warnings_list := p_warnings_list, + path := p_path, + notLost_list := { } + } // End of template mw_list_services_response + + template (omit) ListServicesByLocation m_list_services_by_location( + in template (value) ListServicesByLocation.location_list p_location_list, + in template (omit) Path p_path := omit, + in template (omit) Service p_service := omit, + in template (omit) XSD.Boolean p_recursive_ := omit + ) := { + recursive_ := p_recursive_, + location_list := p_location_list, + path := p_path, + service := p_service, + notLost_list := { } + } // End of template m_list_services_by_location + + template (present) ListServicesByLocationResponse mw_list_services_by_location_response( + template (present) ServiceList p_serviceList := ?, + template (present) Path p_path := ?, + template (present) ListServicesByLocationResponse.warnings_list p_warnings_list := ?, + template (present) LocationUsed p_locationUsed := ? + ) := { + serviceList := p_serviceList, + warnings_list := p_warnings_list, + path := p_path, + notLost_list := { }, + locationUsed := p_locationUsed + } // End of template mw_list_services_by_location_response + + } // End of group rfc5222_lost + + group open_gis { + + template (omit) Point m_point( + in template (value) Pos p_position, + in template (omit) XSD.AnyURI p_srsName := omit, + in template (omit) XSD.AnyURI p_id := omit + ) := { + axisLabels := omit, + gid := omit, + id := p_id, + srsDimension := omit, + srsName := p_srsName, + uomLabels := omit, + pos := p_position + } // End of template m_point + + template Point mw_point( + template (present) Pos p_position := ?, + template XSD.AnyURI p_srsName := * + ) := { + axisLabels := *, + gid := *, + id := *, + srsDimension := *, + srsName := p_srsName, + uomLabels := *, + pos := p_position + } // End of template mw_point + + template Point mw_point_1( + template (present) XSD.Double p_position_1 := ?, + template (present) XSD.Double p_position_2 := ?, + template XSD.AnyURI p_srsName := * + ) := { + axisLabels := *, + gid := *, + id := *, + srsDimension := *, + srsName := p_srsName, + uomLabels := *, + pos := { p_position_1, p_position_2 } + } // End of template mw_point_1 + + template (omit) CircleType m_circle( + in template (value) CenterGroup p_centerGroup, + in template (value) LengthType p_radius, + in template (omit) XSD.AnyURI p_srsName := omit, + in template (omit) XSD.AnyURI p_id := omit + ) := { + axisLabels := omit, + gid := omit, + id := omit, + srsDimension := omit, + srsName := p_srsName, + uomLabels := omit, + centerGroup := p_centerGroup, + radius := p_radius + } // End of template m_circle + + template CircleType mw_circle( + template (present) CenterGroup p_centerGroup := ?, + template (present) LengthType p_radius := ?, + template XSD.AnyURI p_srsName := * + ) := { + axisLabels := *, + gid := *, + id := *, + srsDimension := *, + srsName := p_srsName, + uomLabels := *, + centerGroup := p_centerGroup, + radius := p_radius + } // End of template mw_circle + + template (omit) EllipseType m_ellipse( + in template (value) CenterGroup p_centerGroup, + in template (value) LengthType p_semiMajorAxis, + in template (value) LengthType p_semiMinorAxis, + in template (value) AngleType p_orientation, + in template (omit) XSD.AnyURI p_srsName := omit, + in template (omit) XSD.AnyURI p_id := omit + ) := { + axisLabels := omit, + gid := omit, + id := omit, + srsDimension := omit, + srsName := p_srsName, + uomLabels := omit, + centerGroup := p_centerGroup, + semiMajorAxis := p_semiMajorAxis, + semiMinorAxis := p_semiMinorAxis, + orientation := p_orientation + } // End of template m_ellipse + + template (omit) ArcBandType m_arcband( + in template (value) CenterGroup p_centerGroup, + in template (value) LengthType p_innerRadius, + in template (value) LengthType p_outerRadius, + in template (value) AngleType p_startAngle, + in template (value) AngleType p_openingAngle, + in template (omit) XSD.AnyURI p_srsName := omit, + in template (omit) XSD.AnyURI p_id := omit + ) := { + axisLabels := omit, + gid := omit, + id := omit, + srsDimension := omit, + srsName := p_srsName, + uomLabels := omit, + centerGroup := p_centerGroup, + innerRadius := p_innerRadius, + outerRadius := p_outerRadius, + startAngle := p_startAngle, + openingAngle := p_openingAngle + } // End of template m_arcband + + + template (omit) PolygonType m_polygon( + in template (omit) DoubleList p_posList, + in template (omit) XSD.AnyURI p_srsName := omit + ) := { + axisLabels := omit, + gid := omit, + id := omit, + srsDimension := omit, + srsName := p_srsName, + uomLabels := omit, + exterior := { + ring := { + linearRing := { + axisLabels := omit, + gid := omit, + id := omit, + srsDimension := omit, + srsName := omit, + uomLabels := omit, + choice := { + posList := { + count := omit, + base := p_posList + } + } + } + } + } + } + + + + template (value) CenterGroup m_center_group_pos( + in template (value) CenterGroup.pos p_pos + ) := { + pos := p_pos + } // End of template m_center_group_pos + + template (present) CenterGroup mw_center_group_pos( + template (present) CenterGroup.pos p_pos := ? + ) := { + pos := p_pos + } // End of template mw_center_group_pos + + template (present) CenterGroup mw_center_group_pos_1( + template (present) XSD.Double p_pos_1 := ?, + template (present) XSD.Double p_pos_2 := ? + ) := { + pos := { p_pos_1, p_pos_2 } + } // End of template mw_center_group_pos_1 + + template (value) LengthType m_radius( + in template (value) XSD.AnyURI p_uom, + in template (value) XSD.Double p_base + ) := { + uom := p_uom, + base := p_base + } // End of template m_radius + + template (present) LengthType mw_radius( + template (present) XSD.AnyURI p_uom := ?, + template (present) XSD.Double p_base := ? + ) := { + uom := p_uom, + base := p_base + } // End of template mw_radius + + template (present) PolygonType mw_polygon( + template (present) XSD.AnyURI p_srsName := ?, + template (present) Exterior p_exterior := ? + ) := { + axisLabels := *, + gid := *, + id := *, + srsDimension := *, + srsName := p_srsName, + uomLabels := *, + exterior := p_exterior + } // End of template mw_polygon + + template (present) Exterior mw_exterior_linear_ring( + template (present) LinearRingType p_linear_ring := ? + ) := { + ring := { linearRing := p_linear_ring } + } // End of template mw_exterior + + template (omit) LinearRingType m_linear_ring_type_pos( + in template (value) LinearRingType.choice.choice_list p_choice_list, + in template (omit) XSD.AnyURI p_srsName := omit, + in template (omit) NCNameList p_uomLabels := omit + ) := { + axisLabels := omit, + gid := omit, + id := omit, + srsDimension := omit, + srsName := p_srsName, + uomLabels := p_uomLabels, + choice := { + choice_list := p_choice_list + } + } // End of template m_linear_ring_type_pos + + template (present) LinearRingType mw_linear_ring_type_pos( + template (present) XSD.AnyURI p_srsName := ?, + template (present) LinearRingType.choice.choice_list p_choice_list := ? + ) := { + axisLabels := *, + gid := *, + id := *, + srsDimension := *, + srsName := p_srsName, + uomLabels := *, + choice := { + choice_list := p_choice_list + } + } // End of template mw_linear_ring_type_pos + + } // End of group open_gis + +} // End of module LibHttp_XmlTemplates diff --git a/ttcn/patch_lib_ims_titan/module.mk b/ttcn/patch_lib_ims_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..58a75b6b39ea357852c5b35b66a8c91784fcee34 --- /dev/null +++ b/ttcn/patch_lib_ims_titan/module.mk @@ -0,0 +1,6 @@ +sources := \ + ttcn/LibIms_Interface.ttcn \ + ttcn/LibIms_Library.ttcn \ + ttcn/LibIms_SIPTypesAndValues.ttcn \ + ../patch_lib_ims_titan/ttcn/LibIms_Steps.ttcn \ + ../patch_lib_ims_titan/ttcn/LibIms_Templates.ttcn diff --git a/ttcn/patch_lib_ims_titan/ttcn/LibIms_Steps.ttcn b/ttcn/patch_lib_ims_titan/ttcn/LibIms_Steps.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..1d0d3c29115c1b9bd0a0159204afbd37c4f510b0 --- /dev/null +++ b/ttcn/patch_lib_ims_titan/ttcn/LibIms_Steps.ttcn @@ -0,0 +1,1548 @@ +/** + * @author STF471 + * @version $Id$ + * @desc This module provides the steps used by the test component for SIP-IMS tests. + * This module is part of LibImsV3. + */ +module LibIms_Steps { + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Steps all; + import from LibSip_PIXITS all; + import from LibSip_Interface all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Common all; + // LibIms + import from LibIms_Templates all; + import from LibIms_Interface all; + import from LibIms_SIPTypesAndValues all; + + group externalfunctions { + } // end group externalfunctions + group parameterOperations { + + /** + * @desc Adds new Via parameter + * @param p_message (request) SIP message to be used to prepair via header + */ + function f_addNewViaParameter( + in Request p_message + ) runs on ImsComponent { + var integer v_intVia; + var integer i := 0; + if (isvalue(p_message.msgHeader.via)) { + + v_intVia := lengthof(p_message.msgHeader.via.viaBody); + while (i < v_intVia) { + p_message.msgHeader.via.viaBody[v_intVia] := p_message.msgHeader.via.viaBody[v_intVia - 1]; + v_intVia := v_intVia - 1; + } + vc_branch := c_branchCookie & f_getRndTag(); + p_message.msgHeader.via.viaBody[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile)); + vc_via := p_message.msgHeader.via; + } + } + + /** + * @desc Removes own Via parameter + * @param p_message (request) SIP message to be used to prepair via header + */ + function f_removeOwnViaParameter( + in Response p_message + ) runs on ImsComponent { + var integer v_intVia; + var Via v_via := c_empty_Via; + var integer i := 0; + + if (ispresent(p_message.msgHeader.via)) { + + v_intVia := lengthof(p_message.msgHeader.via.viaBody) - 1; + + for (i := 0; i < v_intVia; i := i + 1) { + v_via.viaBody[i] := p_message.msgHeader.via.viaBody[i + 1]; + } + vc_via := v_via; + } + } + + /** + * @desc Adds new RecordRoute parameter and removes Route parameter + * @param p_message (request) SIP message to be used to prepair via header + */ + function f_addNewRecordRouteAndRemoveRoutParameter( + in Request p_message + ) runs on ImsComponent { + var integer v_intRoute, v_intRecordRoute; + var integer i := 1; + var RouteBody v_route1; + var Route v_newRoute; + v_newRoute.fieldName := ROUTE_E; + if (isvalue(p_message.msgHeader.route)) { + v_intRoute := lengthof(p_message.msgHeader.route.routeBody); + v_route1 := p_message.msgHeader.route.routeBody[0]; + while (i < v_intRoute) { + v_newRoute.routeBody[i - 1] := p_message.msgHeader.route.routeBody[i]; + i := i + 1; + } + vc_route := v_newRoute; + } + + if (isvalue(p_message.msgHeader.recordRoute)) { + + v_intRecordRoute := lengthof(p_message.msgHeader.recordRoute.routeBody); + while (0 < v_intRecordRoute) { + p_message.msgHeader.recordRoute.routeBody[v_intRecordRoute] := p_message.msgHeader.recordRoute.routeBody[v_intRecordRoute - 1]; + v_intRecordRoute := v_intRecordRoute - 1; + } + p_message.msgHeader.recordRoute.routeBody[0] := v_route1; + vc_recordRoute := valueof(p_message.msgHeader.recordRoute); + } + } + + /** + * @desc Adds new RecordRoute parameter (IMS) + * @param p_rr The recordRoute parameter to add + */ + function f_addNewRecordRouteIMS( + in RecordRoute p_rr + ) runs on ImsComponent + return template RecordRoute { + var integer v_intRecordRoute; + var template RecordRoute v_recordRoute := omit; + + v_intRecordRoute := lengthof(p_rr.routeBody); + if (v_intRecordRoute > 0) { + while (0 < v_intRecordRoute) { + p_rr.routeBody[v_intRecordRoute] := p_rr.routeBody[v_intRecordRoute - 1]; + v_intRecordRoute := v_intRecordRoute - 1; + } + p_rr.routeBody[0] := valueof(m_routeBody_currIpAddr(vc_userprofile)); + vc_recordRoute := p_rr; + return vc_recordRoute; + } + else { + return (v_recordRoute); + } + } + + } // end group parameterOperations + + group fieldOperations { + + /** + * @desc Sets BYE header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersBYE( + inout CSeq p_cSeq_s, + in SipUrl p_to_user + ) runs on ImsComponent { + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + vc_route := f_route(); // update the route header field depending on vc_boo_route + vc_recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route + LibSip_Steps.f_setHeadersBYE(p_cSeq_s); + } // end f_setHeadersBYE + + /** + * @desc Sets CANCEL header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + */ + function f_setHeadersCANCEL( + inout CSeq p_cSeq_s + ) runs on ImsComponent { + vc_route := f_route(); // update the route header field depending on vc_boo_route + vc_recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route + LibSip_Steps.f_setHeadersCANCEL(p_cSeq_s); + } // end f_setHeadersCANCEL + + /** + * @desc Sets headers for forward request from AS in case if AS acts as Proxy + * @param p_cSeq_s The current cSeq + * @param p_proxyMode true = proxyMode, false = B2BMode + */ + function f_setHeadersForwardRequestFromAS( + inout CSeq p_cSeq_s, + boolean p_proxyMode + ) runs on ImsComponent { + var Request v_request; + v_request := vc_request; + + if (p_proxyMode) { + vc_requestUri2 := v_request.requestLine.requestUri; + vc_to := v_request.msgHeader.toField; + vc_contact := v_request.msgHeader.contact; + f_addNewViaParameter(v_request); + f_addNewRecordRouteAndRemoveRoutParameter(v_request); + } + else { + // B2Bmode + vc_contact := m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)); + if (PX_SEED) { + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() + }; + } else { + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + } + } + } // end function f_setHeadersForwardRequest + + /** + * @desc Sets header fields for forward request from AS in case if AS acts as Proxy + */ + function f_setHeadersForwardResponseFromAS( + ) runs on ImsComponent { + var Response v_response; + v_response := vc_response; + + vc_caller_To := v_response.msgHeader.toField; + vc_to := v_response.msgHeader.toField; + vc_contact := v_response.msgHeader.contact; + + if (ispresent(v_response.msgHeader.recordRoute)) { + vc_recordRoute := v_response.msgHeader.recordRoute; + } + f_removeOwnViaParameter(v_response); + } // end function f_setHeadersForwardResponse + + /** + * @desc Sets Invite header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersINVITE( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + if (vc_boo_route) { + vc_route := m_route_interface(vc_interfaceprofile); + } + if (vc_boo_recordRoute) { + vc_recordRoute := m_recordRoute_currIpAddr(vc_userprofile); + } + + LibSip_Steps.f_setHeadersINVITE(p_cSeq_s); + } // end f_setHeadersINVITE + + /** + * @desc Sets Invite header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersUPDATE( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + if (vc_boo_route) { + vc_route := m_route_interface(vc_interfaceprofile); + } + if (vc_boo_recordRoute) { + vc_recordRoute := m_recordRoute_currIpAddr(vc_userprofile); + } + + LibSip_Steps.f_setHeadersUPDATE(p_cSeq_s); + } // end f_setHeadersUPDATE + + /** + * @desc Sets Message header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersMESSAGE( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + LibSip_Steps.f_setHeadersMESSAGE(p_cSeq_s); + } // end f_setHeadersMESSAGE + + /** + * @desc Sets Notify header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersNOTIFY( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + LibSip_Steps.f_setHeadersNOTIFY(p_cSeq_s); + + vc_branch := c_branchCookie & f_getRndTag(); + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_virtual_XCSCF(vc_branch, vc_userprofile))} + }; + + vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + // contact header initialization for sending of NOTIFY from CSCF component + vc_contact := m_Contact(m_SipUrl_currIpaddr_CSCF(vc_userprofile)); + } // end f_setHeadersNOTIFY + + /** + * @desc Sets Options header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersOPTIONS( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + LibSip_Steps.f_setHeadersOPTIONS(p_cSeq_s); + + vc_branch := c_branchCookie & f_getRndTag(); + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_virtual_XCSCF(vc_branch, vc_userprofile))} + }; + + vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + // contact header initialization for sending of OPTIONS from CSCF component + vc_contact := m_Contact(m_SipUrl_currIpaddr_CSCF(vc_userprofile)); + } // end f_setHeadersOPTIONS + + /** + * @desc Sets Publish header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersPUBLISH( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + LibSip_Steps.f_setHeadersPUBLISH(p_cSeq_s); + + vc_branch := c_branchCookie & f_getRndTag(); + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_virtual_XCSCF(vc_branch, vc_userprofile))} + }; + + vc_to := f_initToHeader(p_to_user); // init of vc_to using userProfile identifier + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + if (vc_boo_route) { + vc_route := m_route_interface(vc_interfaceprofile); + } + if (vc_boo_recordRoute) { + vc_recordRoute := m_recordRoute_currIpAddr(vc_userprofile); + } + + // contact header initialization for sending of PUBLISH from CSCF component + vc_contact := m_Contact(m_SipUrl_currIpaddr_CSCF(vc_userprofile)); + } // end f_setHeadersPUBLISH + + /** + * @desc Sets Subscribe header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersSUBSCRIBE( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in SipUrl p_from_user + ) runs on ImsComponent { + vc_to := { + fieldName := TO_E, + addressField := { + nameAddr := { + displayName := omit, // optional charstring + addrSpec := p_to_user // SipUrl + } + }, // end addressField + toParams := omit + }; + vc_from := f_initFromHeader(p_from_user, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + LibSip_Steps.f_setHeadersSUBSCRIBE(p_cSeq_s); + } // end f_setHeadersSUBSCRIBE + + /** + * @desc Sets headers for ReINVITE method + * @param p_cSeq_s The current cSeq + * @param p_orginatingSide true in case of Re-INVITE is send from the orgination endpoint otherwise false. + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersReINVITE( + inout CSeq p_cSeq_s, + in boolean p_orginatingSide, + in SipUrl p_to_user + ) runs on ImsComponent { + var integer v_tmp, i, j, v_nbroute; + var Request v_request; + v_request := vc_request; + + f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + + vc_requestUri := p_to_user; + + if (p_orginatingSide) { + vc_to := vc_caller_To; + vc_from := vc_caller_From; + } + else { + vc_to := vc_callee_To; + vc_from := vc_callee_From; + + // get route from previous ACK request + // Route Management + if (isvalue(v_request.msgHeader.recordRoute)) { + vc_recordRoute := valueof(v_request.msgHeader.recordRoute); + v_nbroute := lengthof(vc_recordRoute.routeBody); + // copy and reverse the order of the routes in route header + for (i := 0; i <= (v_nbroute - 1); i := i + 1) { + j := v_nbroute - 1 - i; + vc_route.routeBody[j] := vc_recordRoute.routeBody[i]; + } + vc_route.fieldName := ROUTE_E; + vc_boo_recordRoute := true; + vc_boo_route := true; + } + else { + vc_boo_recordRoute := false; + vc_boo_route := false; + } + } + + v_tmp := str2int(vc_sdp_local.origin.session_id); + vc_sdp_local.origin.session_id := int2str(v_tmp + 1); + v_tmp := str2int(vc_sdp_local.origin.session_version); + vc_sdp_local.origin.session_version := int2str(v_tmp + 1); + } // end function f_setHeadersReINVITE + + /** + * @desc Sets component variables related to message header fields when sending requests from the home I-CSCF (TS) to the visited P-CSCF (SUT) (message type independent: CSeq, contact, via), function uses information from userprofile and interfaceprofile + * @param p_cSeq_s The CSeq parameter + * @param p_method The method name for cSeq header field + */ + function f_setHeadersGeneral_ICSCF( + inout CSeq p_cSeq_s, + in charstring p_method + ) runs on SipComponent { + p_cSeq_s.fieldName := CSEQ_E; + p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1; + p_cSeq_s.method := p_method; + vc_cSeq := p_cSeq_s; + + vc_contact := m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)); + + vc_branch := c_branchCookie & f_getRndTag(); + vc_branch_ICSCF := c_branchCookie & f_getRndTag(); + + vc_via := { + fieldName := VIA_E, + viaBody := { + valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile)), + valueof(m_ViaBody_virtualUEinPCSCF(vc_branch_ICSCF, vc_userprofile)) + } + }; + } // end function f_setHeadersGeneral_ICSCF + + /** + * @desc Sets header field for the next outgoing REGISTER message from the visited P-CSCF to the home I-CSCF + * @param p_cSeq_s The CSeq parameter to be applied + */ + function f_setHeaders_REGISTER_PCSCF( + inout CSeq p_cSeq_s + ) runs on SipComponent { + var SemicolonParam_List v_params; + + f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via + vc_requestUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := vc_userprofile.registrarDomain, + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + }; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + + if (PX_SEED) { + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() + }; + } else { + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + } + vc_callIdReg := vc_callId; + + vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile))); + v_params := { + { + id := c_tagId, + paramValue := { + tokenOrHost := f_getRndTag() + } + } + }; + vc_from := { + fieldName := FROM_E, + addressField := vc_to.addressField, + fromParams := v_params + }; + + if (not vc_firstREGISTER_sent) { + v_params := { + { + id := c_expiresId, + paramValue := { + tokenOrHost := c_shortRegistration + } + } + }; + vc_contact.contactBody.contactAddresses[0].contactParams := v_params; + } + + vc_firstREGISTER_sent := true; // f_setHeaders_Register is called in deREGISTER function + vc_authorization := { + fieldName := AUTHORIZATION_E, + body := {f_calculatecCredentials_empty(vc_userprofile)} + }; + } // end function setHeaders_REGISTER_PCSCF + + /** + * @desc Sets REFER header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_to_user The selected user's SIP URL + */ + function f_setHeadersREFER( + inout CSeq p_cSeq_s, + in SipUrl p_to_user + ) runs on ImsComponent { + vc_requestUri := p_to_user; // Request URI of Invite is identical with To header + if (vc_boo_route) { + vc_route := m_route_interface(vc_interfaceprofile); + } + if (vc_boo_recordRoute) { + vc_recordRoute := m_recordRoute_currIpAddr(vc_userprofile); + } + + LibSip_Steps.f_setHeadersREFER(p_cSeq_s); + } // end f_setHeadersREFER + + /** + * @desc Sets REFER header fields (IMS addresses) extension of general settings from LibSip basic function + * @param p_cSeq_s The current cSeq + * @param p_uri The SipUrl for request URI and To header + */ + function f_setHeadersREFER_conf( + inout CSeq p_cSeq_s, + in SipUrl p_uri + ) runs on ImsComponent { + vc_to := { + fieldName := TO_E, + addressField := { + nameAddr := { + displayName := omit, // optional charstring + addrSpec := p_uri // SipUrl + } + }, // end addressField + toParams := omit + }; + + vc_from := f_initFromHeader(p_uri, f_getRndTag()); // init of vc_from using userProfile identifier + vc_requestUri := p_uri; // Request URI of Invite is identical with To header + if (vc_boo_route) { + vc_route := m_route_interface(vc_interfaceprofile); + } + if (vc_boo_recordRoute) { + vc_recordRoute := m_recordRoute_currIpAddr(vc_userprofile); + } + + LibSip_Steps.f_setHeadersREFER(p_cSeq_s); + } // end f_setHeadersREFER_conf + + } // end group fieldOperations + + group awaitingMessage { + } + + group sendMessage { + + /** + * @desc Sends PRACK message + * @param p_mb The message body of the PRACK message + * @param p_rack_cseq The cSeq of the PRACK message + */ + function f_sendPRACK_sdp( + template(value) MessageBody p_mb, + CSeq p_rack_cseq + ) runs on SipComponent { + var integer v_responseNum := 1; + var template(value) PRACK_Request v_prackReq; + + f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via + if (isvalue(vc_response.msgHeader.rSeq.responseNum)) { + v_responseNum := vc_response.msgHeader.rSeq.responseNum; + } + vc_rAck := m_RAck(v_responseNum, p_rack_cseq.seqNumber, p_rack_cseq.method); + + v_prackReq := m_PRACK_Request_sdp(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_rAck, p_mb); + + // added route header if required + if (isvalue(vc_response.msgHeader.recordRoute)) { + v_prackReq.msgHeader.route := f_route(); + } + + SIPP.send(v_prackReq) to vc_sent_label; + } + + } + group globalSteps { + + //NOTE STF471: removed function f_init_userprofile, have to move up to specific ATS + + /** + * @desc Initializes the To header + * @param p_user Identifies the selected user's SIP URL + * @return The To header + */ + function f_initToHeader( + in SipUrl p_user + ) runs on ImsComponent + return To { + var To v_to := c_empty_To; + v_to := { + fieldName := TO_E, + addressField := { + nameAddr := { + displayName := omit, // optional charstring + addrSpec := p_user // SipUrl + } + }, // end addressField + toParams := omit + }; + return (v_to); + } + + /** + * @desc Initializes the From header + * @param p_user Identifies the selected user' SIP URL + * @param p_tag_str The string value of the tag id + * @return The From header + */ + function f_initFromHeader( + in SipUrl p_user, + charstring p_tag_str + ) runs on ImsComponent + return From { + var From v_from := c_empty_From; + v_from := { + fieldName := FROM_E, + addressField := { + nameAddr := { + displayName := omit, // optional charstring + addrSpec := p_user // SipUrl + } + }, // end addressField + fromParams := { + { + id := c_tagId, + paramValue := { + tokenOrHost := p_tag_str + } + } + } + }; + return v_from; + } + + //NOTE STF471: removed function f_initSipUrl, have to move up to specific ATS + + //NOTE STF471: removed function f_init_interfaceprofile, have to move up to specific ATS + + /** + * @desc Retrieves user DomainPort value of the user profile + * @param p_userProfile Identifies the selected user profile + * @return The Domain HostPort + */ + function f_get_userDomainPort( + in SipUserProfile p_userProfile + ) runs on ImsComponent + return HostPort { + return + { + p_userProfile.homeDomain, + p_userProfile.currPort + }; + } + + /** + * @desc Retrieves HostPort value of the interface profile + * @param p_interface Identifies the selected interface + * @return The HostPort + */ + function f_get_interfaceHostPort( + in ImsInterfaceProfile p_interface + ) runs on ImsComponent + return HostPort { + return + { + p_interface.SUTIpaddr, + p_interface.SUTPort + }; + } + + /** + * @desc Retrieves DomainPort value of the interface profile + * @param p_interface Identifies the selected interface + * @return The Domain HostPort + */ + function f_get_interfaceDomainPort( + in ImsInterfaceProfile p_interface + ) runs on ImsComponent + return HostPort { + return + { + p_interface.SUTHomeDomain, + p_interface.SUTPort + }; + } + + /** + * @desc Gets the receive template for the NameAddr of the interface + * @param p_interface Identifies the selected interface + * @return The NameAddr template + */ + function f_get_interfaceNameAddr( + in ImsInterfaceProfile p_interface + ) runs on ImsComponent + return template NameAddr { + return mw_SipUrl_SUTinterface(p_interface.SUTIpaddr, p_interface.SUTPort); + } + + } + + group registration { + + /** + * @desc Registration and authentication + * @param p_cSeq_s The current cseq + * @param p_auth flag indicating if authentication is needed + * @param p_host P-CSCF domain name (formerly value from module parameter PX_IMS_TS_PCSCF_HOME_DOMAIN) + * @param p_port P-CSCF port number (formerly value from module parameter PX_IMS_TS_PCSCF_PORT) + */ + function f_Registration_IMS( + inout CSeq p_cSeq_s, + in boolean p_auth, + template(value) charstring p_host, + template(value) integer p_port + ) runs on SipComponent { + f_setHeaders_REGISTER(p_cSeq_s); + f_SendREGISTER(m_REGISTER_Request_IMS(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, m_add_Authorization_digest(vc_authorization, {c_Integrity_protected_no}), p_host, p_port)); // LibSip + // awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER + if (p_auth) { + // receiving 401 Unauthorized response. + // and Re-send REGISTER request with Authorization header + tc_ack.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response { + tc_ack.stop; + // set headers via, cseq and authorization + f_setHeaders_2ndREGISTER(p_cSeq_s); + f_SendREGISTER(m_REGISTER_Request_IMS(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, m_add_Authorization_digest(vc_authorization, {c_Integrity_protected_yes}), p_host, p_port)); // LibSip + // awaiting 200 OK REGISTER + f_awaitingOkResponse(p_cSeq_s); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + } + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) { + tc_ack.stop; + log("*** " & __SCOPE__ & ": INCONC: Authorization was not requested as expected ***"); + setverdict(inconc); + } + } + } + else { + f_awaitingOkResponse(p_cSeq_s); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + } + } // end function f_Registration_IMS + + /** + * @desc awaiting UE1 registration (with authentication) + * @param p_cSeq_s The current cseq + * @param p_to_user The selected user's SIP URL + * @param p_qop of the peer UE (alternatively) + * @param p_register The expected REGISTER_Request - default: mw_REGISTER_authorizedRequest_IMS + */ + function f_awaitingRegistration_IMS( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in charstring p_qop, + in template(present) REGISTER_Request p_register := + mw_REGISTER_authorizedRequest_IMS( + mw_Authorization_digest( + mw_digestResponse( + (c_Integrity_protected_yes, c_Integrity_protected_ip_assoc_pending) + ) + ) + ) + ) runs on ImsComponent { + var SipUrl v_passociated_url; + + // Awaiting 1st REGISTER + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 401 response + f_sendResponse( + m_Response_WWWauthenticate_IMS( + c_statusLine401, + vc_callId, + p_cSeq_s, + vc_caller_From, + vc_caller_To, + vc_via, + m_wwwAuthenticate( + f_calculatecChallenge_forWWWAuthorization( + p_qop, + valueof(vc_authorization.body[0].digestResponse) + ) + ) + ) + ); + + // Awaiting 2nd REGISTER with authorization header + f_awaitingREGISTER(p_register); + + // 200OK to complete the request + if (isvalue(vc_request.msgHeader.contact)) { + vc_contact := valueof(vc_request.msgHeader.contact); + vc_contact.contactBody.contactAddresses[0].contactParams := { + { + "expires", + { + tokenOrHost := int2str(3600) + } + } + }; + } + v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec; + f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200, vc_callId, p_cSeq_s, vc_callee_From, vc_callee_To, vc_via, vc_contact, p_to_user, v_passociated_url)); + } // end function f_awaitingRegistration_IMS + + /** + * @desc Awaiting UE1 registration (with authentication, without security headers) + * @param p_cSeq_s The current cseq + * @param p_to_user The selected user's SIP URL + * @param p_qop of the peer UE (alternatively) + */ + function f_awaitingRegistration_IMS_gm( + inout CSeq p_cSeq_s, + in SipUrl p_to_user, + in charstring p_qop + ) runs on ImsComponent { + vc_ignore_subscribe := true; // handle SUBSCRIBE during the call + + f_awaitingRegistration_IMS(p_cSeq_s, p_to_user, p_qop, mw_REGISTER_authorizedRequest_wo_securityheaders_IMS); + + vc_DeregDone := false; + } // end function f_awaitingRegistration_IMS_gm + + /** + * @desc Remove registration + * @param p_cSeq_s The current cseq + * @param p_host P-CSCF domain name (formerly value from module parameter PX_IMS_TS_PCSCF_HOME_DOMAIN) + * @param p_port P-CSCF port number (formerly value from module parameter PX_IMS_TS_PCSCF_PORT) + */ + function f_removeRegistration_IMS( + inout CSeq p_cSeq_s, + template(value) charstring p_host, + template(value) integer p_port + ) runs on SipComponent { + var template(value) REGISTER_Request v_request; + + if (PX_SIP_REGISTRATION) { + f_setHeaders_deREGISTER(p_cSeq_s); + v_request := m_REGISTER_Request_expires_IMS(vc_requestUri, vc_callIdReg, p_cSeq_s, vc_from, vc_to, vc_via, vc_contact, vc_authorization, p_host, p_port, "0"); + v_request.msgHeader.route := f_route(); + + f_SendREGISTER(v_request); + if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED) { + // receiving 401 Unauthorized response. + // and Re-send REGISTER request with Authorization header + tc_ack.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq_s)) -> value vc_response { + tc_ack.stop; + // set headers via, cseq and authorization + f_setHeaders_2ndREGISTER(p_cSeq_s); + v_request := m_REGISTER_Request_expires_IMS(vc_requestUri, vc_callIdReg, p_cSeq_s, vc_from, vc_to, vc_via, vc_contact, vc_authorization, p_host, p_port, "0"); + v_request.msgHeader.route := f_route(); + // Re-send protected REGISTER + f_SendREGISTER(v_request); // LibSip + // awaiting 200 OK REGISTER + f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq_s)); + } + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq_s)) -> value vc_response { + tc_ack.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + log("*** " & __SCOPE__ & ": INFO: Authorization was not requested as expected ***"); + } + } + } + else { + f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq_s)); + } + } + } // end f_RemoveRegistration_IMS + + } // end group registration + + group preambles { + + /** + * @desc Sets variables and default initialization for user profile where proxy role is present + * @param p_userprofile User profile of call + * @param p_cSeq_s The current cseq + */ + function f_IMS_preamble_MGCF( + inout CSeq p_cSeq_s + ) runs on ImsComponent { + vc_boo_recordRoute := true; + vc_boo_route := true; + //NOTE STF471: removed f_init_interfaceprofile(c_interfaceProfile_IMS_SUT_MGCF); + + f_IMS_preamble_woRegistration(p_cSeq_s); + } + + /** + * @desc Sets variables and default initialization for user profile + * @param p_cSeq_s The current cseq + */ + function f_IMS_preamble_woRegistration( + inout CSeq p_cSeq_s + ) runs on ImsComponent { + // avoid deregistration in default behavior + vc_DeregDone := true; + vc_boo_route := true; + vc_boo_recordRoute := true; + + // Variables & defaults initialization + LibSip_Steps.f_init_component(p_cSeq_s); + + // Preamble + //NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable + vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile)); + vc_contact := m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)); + } + + //NOTE STF471 added + /** + * @desc Sets variables and default initialization for user profile + * @param p_cSeq_s The current cseq + */ + function f_IMS_preamble_woRegistration_as( + inout CSeq p_cSeq_s + ) runs on ImsComponent { + // avoid deregistration in default behavior + vc_DeregDone := true; + vc_boo_route := true; + vc_boo_recordRoute := true; + + // Variables & defaults initialization + LibSip_Steps.f_init_component(p_cSeq_s); + + // Preamble + //NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable + vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile)); + } + + /** + * @desc Sets variables and default initialization for user profile and handle registration and authentication with MD5 + * @param p_cSeq_s The current cseq + * @param p_register Register template + */ + function f_IMS_preamble_withEmergencyRegistration( + inout CSeq p_cSeq_s, + template REGISTER_Request p_register + ) runs on ImsComponent { + + //NOTE STF471: removed f_init_interfaceprofile(p_interface); + // Variables & defaults initialization + f_IMS_preamble_woRegistration(p_cSeq_s); + // Preamble + f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED, true); + + // deregistration in case of successful registration + vc_DeregDone := false; + } + + /** + * @desc Sets variables and default initialization for user profile and handle registration and authentication with MD5 + * @param p_cSeq_s The current cseq + * @param p_register Register template + */ + function f_IMS_preamble_withRegistration( + inout CSeq p_cSeq_s, + out template REGISTER_Request p_register + ) runs on ImsComponent { + + //NOTE STF471: removed f_init_interfaceprofile(p_interface); + // Variables & defaults initialization + f_IMS_preamble_woRegistration(p_cSeq_s); + + // Preamble + f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED); + + // deregistration in case of successful registration + vc_DeregDone := false; + + f_setHeaders_SUBSCRIBE(p_cSeq_s); + f_Subscription(p_cSeq_s, m_SUBSCRIBE_Request_UE(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via, vc_contact, vc_route_REG)); + } + + //NOTE STF471 added + /** + * @desc Sets variables and default initialization for user profile and handle registration and authentication with MD5 + * @param p_cSeq_s The current cseq + * @param p_register Register template + */ + function f_IMS_preamble_withRegistrationWoSubscription( + inout CSeq p_cSeq_s, + out template REGISTER_Request p_register + ) runs on ImsComponent { + //NOTE STF471: removed f_init_interfaceprofile(p_interface); + + // Variables & defaults initialization + f_IMS_preamble_woRegistration(p_cSeq_s); + + // Preamble + f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED); + + // deregistration in case of successful registration + vc_DeregDone := false; + } + + /** + * @desc Sets variables and default initialization for user profile and handle registration and authentication with MD5 (basic registration template) + * @param p_cSeq_s The current cseq + * @param p_host P-CSCF domain name (formerly value from module parameter PX_IMS_TS_PCSCF_HOME_DOMAIN) + * @param p_port P-CSCF port number (formerly value from module parameter PX_IMS_TS_PCSCF_PORT) + */ + function f_IMS_preamble_withRegistrationBasic( + inout CSeq p_cSeq_s, + template(value) charstring p_host, + template(value) integer p_port + ) runs on ImsComponent { + //NOTE STF471: removed f_init_interfaceprofile(p_interface); + // Variables & defaults initialization + f_IMS_preamble_woRegistration(p_cSeq_s); + + // Preamble + f_Registration_IMS(p_cSeq_s, PX_SIP_REGISTER_AUTHENTICATION_ENABLED, p_host, p_port); + f_setHeaders_SUBSCRIBE(p_cSeq_s); + f_Subscription(p_cSeq_s, m_SUBSCRIBE_Request_UE(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via, vc_contact, vc_route_REG)); + } + + /** + * @desc Sets variables and default initialization for user profile and handle registration and authentication with MD5 (basic registration template) + * @param p_cSeq_s The current cseq + */ + function f_IMS_preamble_AS( + inout CSeq p_cSeq_s + ) runs on ImsComponent { + // avoid deregistration in default behavior + vc_DeregDone := true; + vc_boo_route := true; + vc_boo_recordRoute := true; + vc_cSeq := p_cSeq_s; + + // Defaults + vc_def_catchSyncStop := activate(a_Sip_catchSyncStop()); + vc_default := activate(a_altstep_AS()); + + // Preamble + //NOTE STF471: removed f_init_interfaceprofile(p_interface); + //NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable + vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile)); + vc_contact := m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)); + } + + } // end group preambles + + group postambles { + + /** + * @desc Terminates component and handles deregistration + * @param p_cSeq_s The current cseq + */ + function f_IMS_postamble_withDeRegistration( + CSeq p_cSeq_s + ) runs on ImsComponent { + f_RemoveRegistration(p_cSeq_s); + f_terminate_component(); + } + + /** + * @desc Terminates component and optionally handles deregistration on AS as TS + * @param p_deRegistration Handle deregistration? + */ + function f_IMS_postamble_AS_withDeRegistration( + boolean p_deRegistration + ) runs on ImsComponent { + + if (p_deRegistration == true) { + f_awaitingREGISTER_sendReply(mw_REGISTER_Request_Base, true); + } + f_terminate_component(); + } + + /** + * @desc Terminates component without registration + */ + function f_SIP_postamble_IMS1_withoutRegistration( + ) runs on ImsComponent { + f_terminate_component(); + } + + /** + * @desc Terminates component without de-registration + */ + function f_IMS_postamble_withoutDeRegistration( + ) runs on ImsComponent { + f_terminate_component(); + } + + /** + * @desc Terminates component with de-registration + * @param p_to_user The selected user's SIP URL + * @param p_qop of the peer UE (alternatively) + */ + function f_SIP_postamble_IMS1_awaitDeRegistration( + in SipUrl p_to_user, + in charstring p_qop + ) runs on ImsComponent { + var SipUrl v_passociated_url; + // Awaiting 1st REGISTER + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 401 response + f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization(p_qop, valueof(vc_authorization.body[0].digestResponse))))); + + // Awaiting 2nd REGISTER with authorization header + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 200OK to complete the request + v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec; + f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact, p_to_user, v_passociated_url)); + + f_terminate_component(); + } + + /** + * @desc Terminates component with de-registration + * @param p_to_user The selected user's SIP URL + * @param p_qop of the peer UE (alternatively) + */ + function f_IMS_postamble_awaitDeRegistration( + in SipUrl p_to_user, + in charstring p_qop + ) runs on ImsComponent { + var SipUrl v_passociated_url; + // Awaiting 1st REGISTER + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 401 response + f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization(p_qop, valueof(vc_authorization.body[0].digestResponse))))); + + // Awaiting 2nd REGISTER with authorization header + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 200OK to complete the request + v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec; + f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact, p_to_user, v_passociated_url)); + + f_terminate_component(); + } + + + /** + * @desc Awaits de-registration + * @param p_to_user The selected user's SIP URL + * @param p_qop of the peer UE (alternatively) + */ + function f_IMS_awaitDeRegistration( + in SipUrl p_to_user, + in charstring p_qop + ) runs on ImsComponent { + var SipUrl v_passociated_url; + // Awaiting 1st REGISTER + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 401 response + f_sendResponse(m_Response_WWWauthenticate_IMS(c_statusLine401, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, m_wwwAuthenticate(f_calculatecChallenge_forWWWAuthorization(p_qop, valueof(vc_authorization.body[0].digestResponse))))); + + // Awaiting 2nd REGISTER with authorization header + f_awaitingREGISTER(mw_REGISTER_unauthorizedRequest_IMS); + + // 200OK to complete the request + v_passociated_url := vc_caller_From.addressField.nameAddr.addrSpec; + f_sendResponse(m_Response_2xxonREGISTER_IMS(c_statusLine200, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact, p_to_user, v_passociated_url)); + } + + //NOTE STF471: renamed f_SIP_postamble_UE(1|2)_withoutRegistration to f_SIP_postamble_UE_withoutRegistration + /** + * @desc Terminates component without registration + */ + function f_SIP_postamble_UE_withoutRegistration( + ) runs on ImsComponent { + f_terminate_component(); + } + + /** + * @desc Sends BYE and awaits response (IMS) + * @param p_requestUri The Request URI + * @param p_callId CallId parameter for outgoing BYE + * @param p_cSeq_s CSeq parameter for outgoing BYE + * @param p_from From parameter for outgoing BYE + * @param p_to To parameter for outgoing BYE + */ + function f_terminateCall_IMS( + SipUrl p_requestUri, + CallId p_callId, + inout CSeq p_cSeq_s, + From p_from, + template(value) To p_to + ) runs on ImsComponent { + LibSip_Steps.f_setHeadersBYE(p_cSeq_s); + // Sending of a BYE request to release the call and expect a final response + f_SendBYE(m_BYE_Request_IMS(p_requestUri, p_callId, p_cSeq_s, p_from, p_to, vc_via, vc_route)); + + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(mw_statusLine1xx, p_callId, p_cSeq_s)) { + repeat; + } + [] SIPP.receive(mw_Response_Base(mw_statusLineFinal, p_callId, p_cSeq_s)) { + tc_resp.stop; + } + // timeout should be handled in default_alt_step + } + } // end function f_terminateCall_IMS + + /** + * @desc Sends BYE and awaits response (UE) + * @param p_requestUri The Request URI + * @param p_callId CallId parameter for outgoing BYE + * @param p_cSeq_s CSeq parameter for outgoing BYE + * @param p_from From parameter for outgoing BYE + * @param p_to To parameter for outgoing BYE + * @param p_recordRoute RecordRoute parameter for outgoing BYE - default: omit + */ + function f_terminateCall_UE( + SipUrl p_requestUri, + CallId p_callId, + inout CSeq p_cSeq_s, + From p_from, + template(value) To p_to, + template RecordRoute p_recordRoute := omit + ) runs on ImsComponent { + var Route v_route; + LibSip_Steps.f_setHeadersBYE(p_cSeq_s); + // Sending of a BYE request to release the call and expect a final response + if (ispresent(p_recordRoute)) { + v_route := {ROUTE_E, valueof(p_recordRoute.routeBody)}; + f_SendBYE(m_BYE_Request_UE(p_requestUri, p_callId, p_cSeq_s, p_from, valueof(p_to), vc_via, v_route)); + } + else { + f_SendBYE(m_BYE_Request_UE(p_requestUri, p_callId, p_cSeq_s, p_from, valueof(p_to), vc_via, vc_route)); + } + + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(mw_statusLine1xx, p_callId, p_cSeq_s)) { + repeat; + } + [] SIPP.receive(mw_Response_Base(mw_statusLineFinal, p_callId, p_cSeq_s)) { + tc_resp.stop; + } + // timeout should be handled in default_alt_step + } + } // end function f_terminateCall_UE + + /** + * @desc Sends BYE and awaits response and De-registration + * @param p_requestUri The Request URI + * @param p_callId CallId parameter for outgoing BYE + * @param p_cSeq_s CSeq parameter for outgoing BYE + * @param p_from From parameter for outgoing BYE + * @param p_to To parameter for outgoing BYE + * @param p_qop of the peer UE (alternatively) + */ + function f_terminateCall_UE_withDeReg( + SipUrl p_requestUri, + CallId p_callId, + inout CSeq p_cSeq_s, + From p_from, + template(value) To p_to, + in charstring p_qop + ) runs on ImsComponent { + LibSip_Steps.f_setHeadersBYE(p_cSeq_s); + // Sending of a BYE request to release the call and expect a final response + f_SendBYE(m_BYE_Request_UE(p_requestUri, p_callId, p_cSeq_s, p_from, p_to, vc_via, vc_route)); + + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(mw_statusLine1xx, p_callId, p_cSeq_s)) { + repeat; + } + [] SIPP.receive(mw_Response_Base(mw_statusLineFinal, p_callId, p_cSeq_s)) { + tc_resp.stop; + } + // timeout should be handled in default_alt_step + } + action("Please de-register"); + f_IMS_awaitDeRegistration(p_requestUri, p_qop); + } // end function f_terminateCall_UE_withDeReg + + } + group defaults { + + /** + * @desc Altstep for clearing registration (IMS user) + * @param p_to_user The selected user's SIP URL + * @param p_qop of the peer UE (alternatively) + * @verdict fail for all unexpected branches + */ + altstep a_clearRegistration_IMSuser( + in SipUrl p_to_user, + in charstring p_qop + ) runs on ImsComponent { + var Response v_response; + var Request v_request; + var SUBSCRIBE_Request v_subscribe_request; + var REGISTER_Request v_register_request; + var BYE_Request v_bye_request; + var CANCEL_Request v_cancel_request; + var NOTIFY_Request v_notify_request; + var INFO_Request v_info_request; + var CSeq v_cSeq; + [] any timer.timeout { + log("*** " & testcasename() & ": FAIL: Timeout while waiting for message. ***"); + setverdict(fail); + all timer.stop; + vc_callId := vc_callIdReg; + action("Please de-register"); + f_IMS_awaitDeRegistration(p_to_user, p_qop); + f_componentStop(); + } + // allow repeated INVITEs + [vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base) { + repeat; + } + // allow repeated BYEs after ack of the first BYE + [vc_ignore_bye] SIPP.receive(mw_BYE_Request_Base(?)) { + repeat; + } + [] SIPP.receive(mw_ACK_Request_Base(?)) { + repeat; + } + // allow 100 replies + [] SIPP.receive(mw_Response_Base(c_statusLine100, ?, ?)) { + repeat; + } + // ignore 181 if flag is set (following TS 183004 ����4.5.2.1) + [vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181, vc_callId, vc_cSeq)) -> value v_response sender vc_sent_label { + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); + repeat; + } + // according to SIP chap.8.1.3.2 + [] SIPP.receive(mw_Response_Base(c_statusLine183, vc_callId, vc_cSeq)) { + repeat; + } + // ignore 484 if flag is set + [vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484, vc_callId, vc_cSeq)) { + repeat; + } + [vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label { + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); + f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route)); + repeat; + } + [vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?)) { + repeat; + } + [] SIPP.receive(mw_INFO_Request_Base(vc_callId)) -> value v_info_request sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_info_request); + f_send200OK(); + repeat; + } + // awaiting of Notify + [] SIPP.receive(mw_NOTIFY_Request_Base(vc_callId)) -> value v_notify_request sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_notify_request); + f_send200OK(); + repeat; + } + // awaiting of subscribe from UE + [vc_ignore_subscribe] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_subscribe_request sender vc_sent_label { + f_setHeadersOnReceiptOfSUBSCRIBE(v_subscribe_request); + f_send200OK(); + repeat; + } + // awaiting of subscribe on proxy + [] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_subscribe_request sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_subscribe_request); + f_sendResponse(m_Response_Contact(c_statusLine200, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact)); + f_SendNOTIFY(m_NOTIFY_Request_contact(v_subscribe_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact)); + f_awaitingOkResponse(vc_cSeq); + repeat; + } + // unexpected BYE is acknowledged to avoid retransmissions + [] SIPP.receive(mw_BYE_Request_Base(?)) -> value v_bye_request sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected BYE message received. ***"); + setverdict(fail); + f_setHeadersOnReceiptOfRequest(v_bye_request); + f_send200OK(); + action("Please de-register"); + f_IMS_awaitDeRegistration(p_to_user, p_qop); + f_componentStop(); + } + // unexpected CANCEL is acknowledged to avoid retransmissions + [] SIPP.receive(mw_CANCEL_Request_Base(?)) -> value v_cancel_request sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected CANCEL message received. ***"); + setverdict(fail); + f_setHeadersOnReceiptOfRequest(v_cancel_request); + // Answer to the CANCEL + f_send200OK(); + action("Please de-register"); + f_IMS_awaitDeRegistration(p_to_user, p_qop); + f_componentStop(); + } + // catch 4xx response + [] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected 4xx response received. ***"); + setverdict(fail); + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); + LibSip_Steps.f_setHeadersACK(); + f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route)); + action("Please de-register"); + f_IMS_awaitDeRegistration(p_to_user, p_qop); + f_componentStop(); + } + // catch 5xx response + [] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?)) -> value v_response sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected 5xx response received. ***"); + setverdict(fail); + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); + LibSip_Steps.f_setHeadersACK(); + f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route)); + action("Please de-register"); + f_IMS_awaitDeRegistration(p_to_user, p_qop); + f_componentStop(); + } + // catch invalid REGISTER + [] SIPP.receive(mw_REGISTER_Request_Base) -> value v_register_request sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected REGISTER received. ***"); + setverdict(fail); + f_componentStop(); + } + // any + [] SIPP.receive { + log("*** " & testcasename() & ": FAIL: Unexpected message received. ***"); + setverdict(fail); + all timer.stop; + action("Please de-register"); + f_IMS_awaitDeRegistration(p_to_user, p_qop); + f_componentStop(); + } + } + + /** + * @desc Main default altstep to handle unexpected messages and timeout + * @verdict fail for all unexpected branches + */ + altstep a_altstep_AS( + ) runs on SipComponent { + var Request v_request; + var REGISTER_Request v_register_request; + var BYE_Request v_bye_request; + var CANCEL_Request v_cancel_request; + + [] any timer.timeout { + log("*** " & testcasename() & ": FAIL: Timeout while waiting for message. ***"); + setverdict(fail); + all timer.stop; + } + // allow repeated INVITEs + [vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base) { + repeat; + } + // handle REGISTER requests + [] SIPP.receive(mw_REGISTER_Request_Base) -> value v_register_request sender vc_sent_label { + f_setHeadersOnReceiptOfREGISTER(v_register_request); + // vc_contact := vc_request.msgHeader.contact; + f_sendResponse(m_Response_Contact(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, vc_contact)); + repeat; + } + // according to SIP chap.8.1.3.2 + [] SIPP.receive(mw_Response_Base(c_statusLine183, vc_callId, vc_cSeq)) { + repeat; + } + // unexpected CANCEL is acknowledged to avoid retransmissions + [] SIPP.receive(mw_CANCEL_Request_Base(?)) -> value v_cancel_request sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected CANCEL message received. ***"); + setverdict(fail); + f_setHeadersOnReceiptOfRequest(v_cancel_request); + f_send200OK(); + } + // unexpected BYE is acknowledged to avoid retransmissions + [] SIPP.receive(mw_BYE_Request_Base(?)) -> value v_bye_request sender vc_sent_label { + log("*** " & testcasename() & ": FAIL: Unexpected BYE message received. ***"); + setverdict(fail); + f_setHeadersOnReceiptOfRequest(v_bye_request); + f_send200OK(); + } + [] SIPP.receive(mw_Response_Base(?, vc_callId, vc_cSeq)) -> value vc_response { + log("*** " & testcasename() & ": FAIL: Unexpected response message in " & __SCOPE__ & " received. ***"); + setverdict(fail); + repeat; + } + // any + [] SIPP.receive { + log("*** " & testcasename() & ": FAIL: Unexpected message received. ***"); + setverdict(fail); + all timer.stop; + } + } + } +} // module LibIms_Steps diff --git a/ttcn/patch_lib_ims_titan/ttcn/LibIms_Templates.ttcn b/ttcn/patch_lib_ims_titan/ttcn/LibIms_Templates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..7a60b7d2da5ed7c99cd5b195a9190c1b05a8d21b --- /dev/null +++ b/ttcn/patch_lib_ims_titan/ttcn/LibIms_Templates.ttcn @@ -0,0 +1,4632 @@ +/** + * @author STF471 + * @version $Id$ + * @desc This module provides the templates used by the test component for SIP-IMS tests. + * This module is part of LibImsV3. + */ +module LibIms_Templates { + // LibCommon + import from LibCommon_DataStrings all; + + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_Templates all; + import from LibSip_Steps all; + import from LibSip_PIXITS all; + import from LibSip_XMLTypes all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Common all; + + // LibIms + import from LibIms_SIPTypesAndValues all; + + // LibXMLTypes + import from XSD all; + + import from urn_ietf_params_xml_ns_resource_lists language "XSD" all + with { + extension "File:../xsd/ResourceList.xsd"; + } + + import from urn_ietf_params_xml_ns_reginfo language "XSD" all except {type Contact;} + with { + extension "File:../xsd/regInfo.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all + with { + extension "File:../xsd/SupplementaryServices.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all + with { + extension "File:../xsd/MCID.xsd"; + } + + import from NoTargetNamespace language "XSD" all + with { + extension "File:../xsd/Ims3gpp.xsd"; + } + + import from urn_ietf_params_xml_ns_conference_info language "XSD" all + with { + extension "File:../xsd/CONF.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all + with { + extension "File:../xsd/PSTN.xsd"; + } + + import from urn_ietf_params_xml_ns_common_policy language "XSD" all + with { + extension "File:../xsd/common-policy.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all + with { + extension "File:../xsd/CDIVN.xsd"; + } + + import from urn_3gpp_ns_cw_1_0 language "XSD" all + with { + extension "File:../xsd/cw.xsd"; + } + + import from urn_ietf_params_xml_ns_pidf language "XSD" all + with { + extension "File:../xsd/pidf.xsd"; + } + + template(present) charstring mw_international_number_format := pattern "\\+\d+"; + + template(present) NameAddr mw_SipUrl_SUTinterface( + template(present) charstring p_host := ?, + template(present) integer p_port := ? + ) := { + displayName := *, + addrSpec := { + scheme := "sip:", + components := { + sip := { + userInfo := *, + hostPort := mw_hostPort(p_host, p_port) + } + }, + urlParameters := *, + headers := * + } + } + + template(present) Addr_Union mw_UE1_Addr_display( + template(present) DisplayName p_displayName + ) := { + nameAddr := { + displayName := p_displayName, + addrSpec := ? + } + } + + // MIME name application + template(value) charstring m_mimeMultipart := "multipart/mixed;boundary=""" & PX_SIP_MIME_BOUNDARY & """"; + + group subfields { + + template(value) SipUrl m_SipUrl_currIpaddr_CSCF( + template(value) SipUserProfile p_userprofile + ) := { + scheme := c_sipScheme, //* contains "sip" + components := { + sip := { + userInfo := omit, //* optional + hostPort := { + host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring + portField := p_userprofile.currPort //* optional integer + } + } + }, + urlParameters := omit, + headers := omit + } + + template(present) SemicolonParam_List mw_semicolonParams_realm( + template GenValue p_realm + ) := + superset( + { + "realm", + p_realm + }, + { + "nonce", + ? + }, + { + "algorithm", + { tokenOrHost := "AKAv1-MD5" } + }, + { + "ik", + ? + }, + { + "ck", + ? + } + ); + + template(value) SemicolonParam_List m_semicolonParams_language( + template(omit) GenValue p_language := omit + ) := { + { + "language", + p_language + } + } + + template(present) SemicolonParam_List mw_semicolonParams_language( + template GenValue p_language + ) := { + { + "language", + p_language + } + } + + template(value) SemicolonParam_List m_semicolonParams_isub( + template(omit) GenValue p_address := omit + ) := { + { + "isub", + p_address + } + } + } + + group headerFieldTemplates { + + template(value) MinSE m_minSE( + template(value) DeltaSec p_ds + ) := { + fieldName := MIN_SE_E, + deltaSec := p_ds, + minSeParam := omit + } + + template(present) PathValue mw_pathvalue( + template(present) SipUrl p_sipUrl := ? + ) := { + nameAddr := { + displayName := *, // optional charstring + addrSpec := p_sipUrl // SipUrl + }, + rrParam := * + } + + template(value) Path m_path( + template(value) charstring p_host, + template(value) integer p_port, + template(value) SipUrl p_sipUrl + ) modifies m_path_TS := { + pathValues := { + { + nameAddr := { + displayName := omit, // optional charstring + addrSpec := p_sipUrl // SipUrl + }, + rrParam := omit + } + } + } + + template(value) Path m_path_TS( + template(value) charstring p_host, + template(value) integer p_port + ) := { + fieldName := PATH_E, + pathValues := { + { + nameAddr := { + displayName := omit, // optional charstring + addrSpec := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "registrar", + password := omit + }, + hostPort := {p_host, p_port} + } + }, + urlParameters := { + { + id := "lr", + paramValue := omit + } + }, + headers := omit + } + }, + rrParam := omit + } + } + } + + /** + * @desc Path header field expectation with at least one path value + * @param p_sipUrl value of the last element in the list of path values + */ + template(present) Path mw_path( + template(present) SipUrl p_sipUrl := ? + ) := { + fieldName := PATH_E, + pathValues := {mw_pathvalue(p_sipUrl)} // any number of SipUrl may occur before p_sipUrl + } + + template(value) PAccessNetworkInfo m_pAccessNetworkInfo_IEEE_11a := { + fieldName := P_ACCESS_NETWORK_INFO_E, + accessType := "IEEE-802.11a", + genericParams := { + { + id := "extension-access-info", + paramValue := { tokenOrHost := "192.1.1.20" } + } + } + } + + template(value) PAssertedService m_pAssertedService( + template(value) PAssertedServiceValue p_pAssertedServiceValue + ) := { + fieldName := P_ASSERTED_SERVICE_E, + pAssertedServiceValue := p_pAssertedServiceValue + } + + template(value) PChargingFunctionAddresses m_pChargingFunctionAddresses_fixedValue := { + fieldName := P_CHARGING_FUNCTION_ADDRESSES_E, + chargeAddrParams := { + { + id := "ccf", + paramValue := { tokenOrHost := "192.1.1.1" } + }, // value is fixed because it is deleted on proxy + { + id := "ecf", + paramValue := { tokenOrHost := "192.1.1.2" } + } // value is fixed because it is deleted on proxy + } + } + + template(value) PChargingVector m_pChargingVector( + template(value) charstring p_icidValue, + template(omit) SemicolonParam_List p_chargeParams := omit + ) modifies m_pChargingVector_icid_TS := { + icidValue := p_icidValue, + chargeParams := p_chargeParams + } + + // NOTE STF471 change: icidValue extracted from chargeParams, chargeParams removed + template(value) PChargingVector m_pChargingVector_icid_TS := { + fieldName := P_CHARGING_VECTOR_E, + icidValue := c_icid_value, + chargeParams := omit + } + + template(value) PChargingVector m_pChargingVector_origIoi_fixedValue( + template(value) GenValue p_homeDomain + ) modifies m_pChargingVector_icid_TS := { + chargeParams := { + { + id := c_icid_generated_at, + paramValue := { tokenOrHost := "192.1.1.10" } + }, + { + id := c_orig_ioi, + paramValue := p_homeDomain + } + } + } + + template(value) PChargingVector m_pChargingVector_termIoi_fixedValue( + template(value) GenValue p_homeDomain + ) modifies m_pChargingVector_icid_TS := { + chargeParams := { + { + id := c_icid_generated_at, + paramValue := { tokenOrHost := "192.1.1.10" } + }, + { + id := c_term_ioi, + paramValue := p_homeDomain + } + } + } + + template(value) PChargingVector m_pChargingVector_accessNetwInfo( + template(value) GenValue p_homeDomain + ) modifies m_pChargingVector_icid_TS := { + chargeParams := { + { + id := c_term_ioi, + paramValue := p_homeDomain + }, + { + id := c_access_network_charging_info, + paramValue := { tokenOrHost := "192.1.1.10" } + } + } + } + + // NOTE STF471 change: icidValue added + template(present) PChargingVector mw_pChargingVector( + template(present) charstring p_id := ?, + template GenValue p_paramValue + ) := { + fieldName := P_CHARGING_VECTOR_E, + icidValue := ?, + chargeParams := + superset( + { + id := p_id, + paramValue := p_paramValue + } + ) + } + + template(value) PMediaAuthorization m_pMediaAuthorization_fixedValue := { + fieldName := P_MEDIA_AUTHORIZATION_E, + pMediaAuthorizations := {"A"} // example + } + + + template(value) PEarlyMedia m_pEarlyMedia_sup := { + fieldName := P_EARLY_MEDIA_E, + em_param := {"supported"} + } + + + template(value) ProxyRequire m_proxyRequire_secAgree := { + fieldName := PROXY_REQUIRE_E, + optionsTags := {"sec-agree"} + } + + template(value) PVisitedNetworkID m_pVisitedNetworkID_TS := { + fieldName := P_VISITED_NETWORK_E, + vNetWorkSpec := { + { + vNetworkSpecToken := "Visited ETSI 1", + genericParams := omit + } + } + } + + template(present) PVisitedNetworkID mw_pVisitedNetworkID( + template(present) charstring p_vNetworkSpecToken + ) modifies m_pVisitedNetworkID_TS := { + vNetWorkSpec := { + { + vNetworkSpecToken := p_vNetworkSpecToken, + genericParams := * + } + } + } + + template(value) RecordRoute m_recordRoute_notmatching := { + fieldName := RECORD_ROUTE_E, + routeBody := { + { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, // contains "sip" + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "unknown", + password := omit + }, + hostPort := { + host := "unknown.domain.name", // hostname, IPv4 or IPv6 as a charstring + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + } + }, + rrParam := omit + } + } + } + + template(value) Require m_require := { + fieldName := REQUIRE_E, + optionsTags := {} + } + + template(value) Require m_require_secAgree + modifies m_require := { + optionsTags := {"sec-agree"} + } + + template(present) Require mw_require_path + modifies m_require := { + optionsTags := superset("path") + } + + template(value) Route m_route_interface( + template(value) ImsInterfaceProfile p_interfaceprofile + ) modifies m_route_notmatching := { + routeBody := { + { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, // contains "sip" + components := { + sip := { + userInfo := omit, + hostPort := { + host := p_interfaceprofile.SUTHomeDomain, + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + } + }, + rrParam := omit + } + } + } + + template(value) Route m_route_notmatching := { + fieldName := ROUTE_E, + routeBody := { + { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, // contains "sip" + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "unknown", + password := omit + }, + hostPort := { + host := "unknown.domain.name", // hostname, IPv4 or IPv6 as a charstring + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + } + }, + rrParam := omit + } + } + } + + + template(value) SessionExpires m_se( + template(value) DeltaSec p_ds + ) modifies mw_se := { + deltaSec := p_ds + } + + template(present) SessionExpires mw_se := { + fieldName := SESSION_EXPIRES_E, + deltaSec := ?, + seParam := omit + } + + template(value) Supported m_supported := { + fieldName := SUPPORTED_E, + optionsTags := {} + } + + template(value) Supported m_supported_timer + modifies m_supported := { + optionsTags := {"timer"} + } + + template(value) Supported m_supported_histinfo + modifies m_supported := { + optionsTags := {"histinfo"} + } + + + template(value) Supported m_supported_fromChange + modifies m_supported := { + optionsTags := {"from-change"} + } + + template(value) To m_To_targetRefreshRequest( + template(value) To p_To + ) := { + fieldName := TO_E, + addressField := { + nameAddr := { + displayName := p_To.addressField.nameAddr.displayName, + addrSpec := p_To.addressField.nameAddr.addrSpec + } + }, // end addressField + toParams := { + { + id := c_tagId, + paramValue := { tokenOrHost := f_getRndTag() } + } + } + } + + template(value) ViaBody m_ViaBody_virtualUEinPCSCF( + template(value) charstring p_branch_val, + template(value) SipUserProfile p_userprofile + ) := { + sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT), + sentBy := { + host := p_userprofile.contactIpaddr, + portField := p_userprofile.contactPort + }, + viaParams := { + { + id := c_branchId, + paramValue := { + tokenOrHost := p_branch_val + } + } + } + } + + template(value) ViaBody m_ViaBody_virtual_XCSCF( + template(value) charstring p_branch_val, + template(value) SipUserProfile p_userprofile + ) modifies m_ViaBody_virtualUEinPCSCF := { + sentBy := { + host := p_userprofile.currIpaddr, + portField := p_userprofile.currPort + } + } + + template(value) Via m_via_notmatching := { + fieldName := VIA_E, + viaBody := { + { + sentProtocol := m_SentProtocol("UDP"), + sentBy := { + host := "unknown.domain.name", + portField := 10000 + }, + viaParams := { + { + id := c_branchId, + paramValue := { tokenOrHost := "abcd0000" } + } + } + } + } + } + + /** + * @desc WWW-Authenticate header field + * @param p_challenge value + */ + template(value) WwwAuthenticate m_wwwAuthenticate( + template(value) Challenge p_challenge + ) := { + fieldName := WWW_AUTHENTICATE_E, + challenge := p_challenge + } + + /** + * @desc WWW-Authenticate header field + * @param p_challenge value + */ + template(present) WwwAuthenticate mw_wwwAuthenticate( + template(present) SemicolonParam_List p_semicolonParam_List := ? + ) := { + fieldName := WWW_AUTHENTICATE_E, + challenge := { + digestCln := p_semicolonParam_List // set of GenericParam + } + } + + template(present) SemicolonParam_List mw_challenge := superset(mw_ck, mw_ik); + + template(present) GenericParam mw_ck := { + "ck", * + } + + template(present) GenericParam mw_ik := { + "ik", * + } + + /** + * @desc AcceptContact header field + * @param p_semicolonParam_List value + */ + template(value) AcceptContact m_acceptContact( + template(omit) SemicolonParam_List p_semicolonParam_List := omit + ) := { + fieldName := ACCEPT_CONTACT_E, + acValues := { + { + wildcard := c_WILDCARD, + acRcParams := p_semicolonParam_List // set of GenericParam + } + } + } + + /** + * @desc Authenticate header field + * @param p_semicolonParam_List value + */ + template(present) AcceptContact mw_acceptContact( + template SemicolonParam_List p_semicolonParam_List + ) := { + fieldName := ACCEPT_CONTACT_E, + acValues := { + { + wildcard := c_WILDCARD, + acRcParams := p_semicolonParam_List // set of GenericParam + } + } + } + + template(present) SubscriptionState mw_subscriptionState( + template(present) charstring p_state := ? + ) := { + fieldName := SUBSCRIPTION_STATE_E, + subState := p_state, + substateParams := omit + } + + // [3455/5.1 ] + template(value) PAssociatedURI m_pAssociatedURI( + template(value) NameAddr p_nameAddr + ) := { + fieldName := P_ASSOCIATED_URI_E, + nameAddrList := { + { + nameAddr := p_nameAddr, + genericParams := omit + } + } + } + + template(present) SecurityServer mw_securityServer( + template(present) SecurityMechanism_List p_securityMechanism_List := ? + ) := { + fieldName := SECURITY_SERVER_E, + securityMech := p_securityMechanism_List + } + + template(value) SecurityClient m_securityClient( + template(value) SecurityMechanism_List p_securityMechanism_List + ) := { + fieldName := SECURITY_CLIENT_E, + securityMech := p_securityMechanism_List + } + + template(value) SecurityVerify m_securityVerify( + template(value) SecurityMechanism_List p_securityMechanism_List + ) := { + fieldName := SECURITY_VERIFY_E, + securityMech := p_securityMechanism_List + } + + template(value) RSeq m_rseq9999 := { + fieldName := RSEQ_E, + responseNum := 9999 // Ref: ES 283 003 V2.5.1 ch:A.2.1.4.7 + } + + template(value) Expires m_expires( + template(value) integer p_deltaSec + ) := { + fieldName := EXPIRES_E, + deltaSec := int2str(valueof(p_deltaSec)) + } + + + } // end group headerFieldTemplates + + group messageBodyTemplates { + + group xmlTemplates { + + template(value) XmlBody m_XmlBody_ConfInfo( + template(value) Conference_type p_confInfo + ) := { + conference := p_confInfo + } + + template(value) XmlBody m_XmlBody_CW( + template(value) Ims_cw p_cw + ) := { + cw := p_cw + } + + template(value) XmlBody m_XmlBody_CUG( + template(value) Cug p_cug + ) := { + cug := p_cug + } + + template(value) XmlBody m_XmlBody_MCID( + template(value) Mcid p_mcid + ) := { + mcid := p_mcid + } + + template(value) XmlBody m_XmlBody_PSTNTransit( + template(value) PSTN_transit p_pstn + ) := { + pstnTransit := p_pstn + } + + template(value) XmlBody m_XmlBody_simservs( + template(value) Simservs p_simservs + ) := { + simservs := p_simservs + } + + template(value) XmlBody m_XmlBody_ACR_ICB( + template(value) Incoming_communication_barring p_icb + ) := { + simservs := { + attr := omit, + //absServiceGroup_list := {}, + extensions := { + elem_list := valueof(p_icb.attr) + } + } + } + + template(value) XmlBody m_XmlBody_ACR_OCB( + template(value) Outgoing_communication_barring p_ocb + ) := { + simservs := { + attr := omit, + //absServiceGroup_list := {}, + extensions := { + elem_list := valueof(p_ocb.attr) + } + } + } + + template(value) XmlBody m_XmlBody_CDIVN( + template(value) Comm_div_info_type p_cdivn + ) := { + cdivn := p_cdivn + } + + template(value) XmlBody m_XmlBody_Reginfo( + template(value) Reginfo p_regInfo + ) := { + regInfo := p_regInfo + } + + template(value) XmlBody m_XmlBody_Presence( + template(value) Presence p_presence + ) := { + presence := p_presence + } + + template(value) MessageBody m_messageBodyXML( + template(value) XmlBody p_xmlBody + ) := { + xmlBody := p_xmlBody + } + + template(value) Reginfo m_reginfo( + template(value) XSD.AnyURI p_user + ) := { + full, + 0, + {m_registration(p_user)}, + {} + } + + template(value) Registration m_registration( + template(value) XSD.AnyURI p_user + ) := { + p_user, // XSD.anyURI aor + "a7", // XSD.string id + init, // enumerated {active,init,terminated} state, + {}, // record of Contact contact_list optional, + {} // record of anytype elem_list optional + } + + template(present) XmlBody mw_XmlBody_ConfInfo( + template(present) Conference_type p_confInfo := ? + ) := { + conference := p_confInfo + } + + template(present) XmlBody mw_XmlBody_CUG( + template(present) Cug p_cug := ? + ) := { + cug := p_cug + } + + template(present) XmlBody mw_XmlBody_MCID( + template(present) Mcid p_mcid := ? + ) := {mcid := p_mcid} + + template(present) XmlBody mw_XmlBody_PSTNTransit( + template(present) PSTN_transit p_pstn := ? + ) := { + pstnTransit := p_pstn + } + + template(present) XmlBody mw_XmlBody_CDIVN( + template(present) Comm_div_info_type p_cdivn := ? + ) := { + cdivn := p_cdivn + } + + template(present) XmlBody mw_XmlBody_simservs( + template(present) Simservs p_simservs := ? + ) := { + simservs := p_simservs + } + + template(present) XmlBody mw_XmlBody_ResourceLists( + template(present) Resource_lists p_resourceLists := ? + ) := { + resourceLists := p_resourceLists + } + + template(present) XmlBody mw_XmlBody_Reginfo( + template(present) Reginfo p_regInfo := ? + ) := { + regInfo := p_regInfo + } + + template(present) MessageBody mw_messageBodyXML( + template(present) XmlBody p_xmlBody := ? + ) := { + xmlBody := p_xmlBody + } + + + } // end group xmlTemplates + + group acrCbTemplates { + + template(value) Incoming_communication_barring m_ICB( + template(value) RuleType p_ruleType + ) := { + active := omit, + attr := omit, + ruleset := { + {p_ruleType} + } + } + + template(value) Outgoing_communication_barring m_OCB( + template(value) RuleType p_ruleType + ) := { + active := omit, + attr := omit, + ruleset := { + {p_ruleType} + } + } + + template(value) RuleType m_ruleType_actionFalse( + template(value) ConditionsType p_condition + ) := { + id := "rule66", + conditions := p_condition, + actions := { + elem_list := {""} + }, + transformations := omit + } + + template(value) ConditionsType m_conditionsType_identity( + template(value) charstring p_id + ) := { + { + { + identity_list := { + { + { + { + one := { + id := p_id, + elem := omit + } + } + } + } + } + } + } + } + + + } // end group acr_cbTemplates + + group cugTemplates { + + template(value) Cug m_CUG( + template(omit) CugRequestType p_crt := omit, + template(omit) NetworkIdentityType p_nit := omit, + template(omit) SixteenbitType p_cibc := omit, + template(omit) TwobitType p_cci := omit + ) := { + active := omit, + attr := omit, + cugCallOperation := p_crt, + networkIndicator := p_nit, + cugInterlockBinaryCode := p_cibc, + cugCommunicationIndicator := p_cci + } + + template(present) Cug mw_CUG( + template CugRequestType p_crt, + template NetworkIdentityType p_nit, + template SixteenbitType p_cibc, + template TwobitType p_cci + ) := { + active := omit, + attr := *, + cugCallOperation := p_crt, + networkIndicator := p_nit, + cugInterlockBinaryCode := p_cibc, + cugCommunicationIndicator := p_cci + } + + template(value) CugRequestType m_cugReqType( + template(value) boolean p_outAccessRequest, + template(value) CugIndexType p_cugIndex + ) := { + outgoingAccessRequest := p_outAccessRequest, + cugIndex := p_cugIndex + } + + template(present) CugRequestType mw_cugReqType( + template(present) boolean p_outAccessRequest := ?, + template(present) CugIndexType p_cugIndex := ? + ) := { + outgoingAccessRequest := p_outAccessRequest, + cugIndex := p_cugIndex + } + + } // end group cugTemplates + + group cwTemplates { + + template(value) Ims_cw m_CW( + template(value) TEmptyType p_cwi + ) := { + attr := omit, + communication_waiting_indication := p_cwi, + elem_list := {} + } + + template(present) Ims_cw mw_ims_cw( + template(present) TEmptyType p_cwi := ? + ) := { + attr := *, + communication_waiting_indication := p_cwi, + elem_list := ? + } + + } // end group cwTemplates + + group mcidTemplates { + + template(value) Mcid m_mcid_request_mcidIndicatorTrue := { + choice := { + request := { + mcidRequestIndicator := "1", + holdingIndicator := "0" + } + } + } + + template(value) Mcid m_mcid_request_mcidIndicatorTrue_holdIndTrue + modifies m_mcid_request_mcidIndicatorTrue := { + choice := { + request := { + holdingIndicator := "1" + } + } + } + + template(present) Mcid mw_mcid_request_mcidIndicatorTrue + modifies m_mcid_request_mcidIndicatorTrue := { + choice := { + request := { + holdingIndicator := ? + } + } + } + + template(value) Mcid m_mcid_response_mcidIndicatorTrue := { + choice := { + response := { + mcidResponseIndicator := "1", + holdingProvidedIndicator := "0" + } + } + } + + template(present) Mcid mw_mcid_response_mcidIndicatorTrue + modifies m_mcid_response_mcidIndicatorTrue := { + choice := { + response := { + holdingProvidedIndicator := ? + } + } + } + + template(present) Mcid mw_mcid_response_mcidIndicatorTrue_holdProvIndFalse + modifies mw_mcid_response_mcidIndicatorTrue := { + choice := { + response := { + holdingProvidedIndicator := "0" + } + } + } + + template(present) Mcid mw_mcid_response_mcidIndicatorTrue_holdProvIndTrue + modifies mw_mcid_response_mcidIndicatorTrue := { + choice := { + response := { + holdingProvidedIndicator := "1" + } + } + } + + } // end group mcidTemplates + + group pstnTemplates { + + template(value) PSTN_transit m_PSTN_transit_BC1( + template(value) BearerCapabilityType p_bct + ) := { + bearerInfomationElement_list := {p_bct}, + highLayerCompatibility_list := {}, + lowLayerCompatibility := omit, + progressIndicator_list := {}, + display_list := {} + } + + template(value) PSTN_transit m_PSTN_transit_BC2( + template(value) BearerCapabilityType p_bct, + template(value) BearerCapabilityType p_bct2 + ) modifies m_PSTN_transit_BC1 := { + bearerInfomationElement_list := {p_bct, p_bct2} + } + + template(present) PSTN_transit mw_PSTN_transit_bc( + template(present) BearerCapabilityType p_bct := ?, + template(present) BearerCapabilityType p_bct2 := ? + ) := { + bearerInfomationElement_list := {p_bct, p_bct2}, + highLayerCompatibility_list := {*, *}, + lowLayerCompatibility := *, + progressIndicator_list := ?, + display_list := ? + } + + template(value) PSTN_transit m_PSTN_transit_BC1_HLC1( + template(value) BearerCapabilityType p_bct, + template(value) HighLayerCompatibilityType p_hlc + ) modifies m_PSTN_transit_BC1 := { + highLayerCompatibility_list := {p_hlc} + } + + template(value) PSTN_transit m_PSTN_transit_BC1_HLC2( + template(value) BearerCapabilityType p_bct, + template(value) HighLayerCompatibilityType p_hlc, + template(value) HighLayerCompatibilityType p_hlc2 + ) modifies m_PSTN_transit_BC1_HLC1 := { + highLayerCompatibility_list := {p_hlc, p_hlc2} + } + + template(value) PSTN_transit m_PSTN_transit_BC1_LLC( + template(value) BearerCapabilityType p_bct, + template(value) LowLayerCompatibilityType p_llc + ) modifies m_PSTN_transit_BC1 := { + lowLayerCompatibility := p_llc + } + + template(value) PSTN_transit m_PSTN_transit_BC1_PI1( + template(value) BearerCapabilityType p_bct, + template(value) ProgressIndicatorType p_pi1 + ) modifies m_PSTN_transit_BC1 := { + progressIndicator_list := {p_pi1} + } + + template(value) PSTN_transit m_PSTN_transit_BC1_PI2( + template(value) BearerCapabilityType p_bct, + template(value) ProgressIndicatorType p_pi1, + template(value) ProgressIndicatorType p_pi2 + ) modifies m_PSTN_transit_BC1_PI1 := { + progressIndicator_list := {p_pi1, p_pi2} + } + + template(value) PSTN_transit m_PSTN_transit_BC1_PI3( + template(value) BearerCapabilityType p_bct, + template(value) ProgressIndicatorType p_pi1, + template(value) ProgressIndicatorType p_pi2, + template(value) ProgressIndicatorType p_pi3 + ) modifies m_PSTN_transit_BC1_PI2 := { + progressIndicator_list := {p_pi1, p_pi2, p_pi3} + } + + template(value) PSTN_transit m_PSTN_transit_BC1_HLC1_PI1( + template(value) BearerCapabilityType p_bct, + template(value) HighLayerCompatibilityType p_hlc, + template(value) ProgressIndicatorType p_pi1 + ) modifies m_PSTN_transit_BC1_HLC1 := { + progressIndicator_list := {p_pi1} + } + + template(value) BearerCapabilityType m_BearerCapabilityType( + template(value) Bit5 p_InfoTrfCap + ) := { + bCoctet3 := { + codingStandard := "00", // Coding standard = CCITT standardized coding + informationTransferCabability := bit2str(valueof(p_InfoTrfCap)) // Information transfer capability + }, + bCoctet4 := { + transferMode := "00", // Coding standard = CCITT standardized coding + informationTransferRate := "10000" // Information transfer rate = 64 kbit/s + }, + bCoctet4_1 := omit, + bCoctet5 := omit, + bCoctet5a := omit, + bCoctet5bV110 := omit, + bCoctet5bV120 := omit, + bCoctet5c := omit, + bCoctet5d := omit, + bCoctet6 := omit, + bCoctet7 := omit, + bCoctet7a := omit, + bCoctet7b := omit + } + + template(present) BearerCapabilityType mw_BearerCapabilityType( + template(present) BCOctet3Type p_BCOctet3Type := ?, + template(present) BCOctet4Type p_BCOctet4Type := ? + ) := { + bCoctet3 := p_BCOctet3Type, + bCoctet4 := p_BCOctet4Type, + bCoctet4_1 := *, + bCoctet5 := *, + bCoctet5a := *, + bCoctet5bV110 := *, + bCoctet5bV120 := *, + bCoctet5c := *, + bCoctet5d := *, + bCoctet6 := *, + bCoctet7 := *, + bCoctet7a := *, + bCoctet7b := * + } + + template(present) BearerCapabilityType mw_BearerCapabilityType_TrfCap( + template(value) Bit5 p_InfoTrfCap + ) modifies m_BearerCapabilityType := { + bCoctet4_1 := *, + bCoctet5 := *, + bCoctet5a := *, + bCoctet5bV110 := *, + bCoctet5bV120 := *, + bCoctet5c := *, + bCoctet5d := *, + bCoctet6 := *, + bCoctet7 := *, + bCoctet7a := *, + bCoctet7b := * + } + + template(value) ProgressIndicatorType m_ProgressIndicatorType( + template(value) Bit7 p_progDesc + ) := { + progressOctet3 := { + codingStandard := "00", + location := "0000" + }, + progressOctet4 := { + progressDescription := bit2str(valueof(p_progDesc)) + } + } + + template(present) ProgressIndicatorType mw_ProgressIndicatorType( + template(present) ProgressOctet3Type p_ProgressOctet3Type := ?, + template(present) ProgressOctet4Type p_ProgressOctet4Type := ? + ) := { + progressOctet3 := p_ProgressOctet3Type, + progressOctet4 := p_ProgressOctet4Type + } + + template(value) LowLayerCompatibilityType m_LowLayerCompatibilityType( + template(value) Bit5 p_InfoTrfCap + ) := { + lLOctet3 := { + codingStandard := "00", // Coding standard = CCITT standardized coding + informationTransferCapability := bit2str(valueof(p_InfoTrfCap)) // Information transfer capability + }, + lLOctet3a := omit, + lLOctet4 := { + transferMode := "00", // Coding standard = CCITT standardized coding + informationTransferRate := "10000" // Information transfer rate = 64 kbit/s + }, + lLOctet4_1 := omit, + lLOctet5 := omit, + lLOctet5a := omit, + lLOctet5bV110 := omit, + lLOctet5bV120 := omit, + lLOctet5c := omit, + lLOctet5d := omit, + lLOctet6 := omit, + lLOctet6aHDLC := omit, + lLOctet6aUserSpecific := omit, + lLOctet6b := omit, + lLOctet7 := { + layer3Identification := "11", + userInfoLayer3Protocol := "00010" + }, + lLOctet7aUserSpecific := omit, + lLOctet7aX25 := omit, + lLOctet7bX25 := omit, + lLOctet7c := omit, + lLOctet7aTR9577 := omit, + lLOctet7bTR9577 := omit + } + + template(present) LowLayerCompatibilityType mw_LowLayerCompatibilityType( + template(present) LLOctet3Type p_LLOctet3 := ?, + template(present) LLOctet4Type p_LLOctet4 := ?, + template(present) LLOctet7Type p_LLOctet7 := ? + ) := { + lLOctet3 := p_LLOctet3, + lLOctet3a := *, + lLOctet4 := p_LLOctet4, + lLOctet4_1 := *, + lLOctet5 := *, + lLOctet5a := *, + lLOctet5bV110 := *, + lLOctet5bV120 := *, + lLOctet5c := *, + lLOctet5d := *, + lLOctet6 := *, + lLOctet6aHDLC := *, + lLOctet6aUserSpecific := *, + lLOctet6b := *, + lLOctet7 := p_LLOctet7, + lLOctet7aUserSpecific := *, + lLOctet7aX25 := *, + lLOctet7bX25 := *, + lLOctet7c := *, + lLOctet7aTR9577 := *, + lLOctet7bTR9577 := * + } + + template(value) HighLayerCompatibilityType m_HighLayerCompatibilityType( + template(value) Bit7 p_HLOctet4 + ) := { + hLOctet3 := { + codingStandard := "00", + interpretation := "100", + presentationMethod := "01" + }, + hLOctet4 := { + highLayerCharacteristics := bit2str(valueof(p_HLOctet4)) + }, + hLOctet4aMaintenance := omit, + hLOctet4Audio := omit + } + + template(present) HighLayerCompatibilityType mw_HighLayerCompatibilityType( + template(present) HLOctet3Type p_HLOctet3 := ?, + template(present) HLOctet4Type p_HLOctet4 := ? + ) := { + hLOctet3 := p_HLOctet3, + hLOctet4 := p_HLOctet4, + hLOctet4aMaintenance := *, + hLOctet4Audio := * + } + + } // end group pstnTemplates + + group cdivnTemplates { + + /* general CDIVN subscription */ + template(value) Comm_div_info_type m_CDIVN_sub := { + entity := "comm-div-info", + comm_div_subs_info := { + attr := omit, + comm_div_selection_criteria := { + attr := omit, + originating_user_selection_criteria := omit, + diverting_user_selection_criteria := omit, + diverted_to_user_selection_criteria := omit, + diversion_time_selection_criteria := omit, + diversion_reason_selection_criteria := omit, + elem_list := {} + }, + comm_div_ntfy_trigger_criteria := omit, + comm_div_info_selection_criteria := omit, + elem_list := {} + }, + comm_div_ntfy_info := omit, + elem_list := {} + } + + } // end group cdivnTemplates + + group resourceListsTemplates { + + template(value) Resource_lists m_ResourceList_2Users( + template(value) EntryType p_user1, + template(value) EntryType p_user2 + ) := { + sequence_list := { + { + list := { + name := omit, + attr := omit, + display_name := omit, + sequence_list := { + { + choice := { + entry := p_user1 + } + }, + { + choice := { + entry := p_user2 + } + } + }, + elem_list := {} + } + } + } + } + + template(value) EntryType m_EntryUser( + template(value) SipUrl p_user + ) := { + uri := + valueof(p_user.components.sip.userInfo.userOrTelephoneSubscriber) + & "@" + & valueof(p_user.components.sip.hostPort.host), + attr := omit, + display_name := omit, + elem_list := {} + } + + } // end group resourceListsTemplates + + group ims3GppTemplates { + + template(present) TIMS3GPP mw_Ims_3gpp_CW := { + version := 1.0, + attr := *, + choice := { + alternative_service := { + attr := *, + type_ := ?, + reason := ?, + elem_list := ? + } + }, + elem_list := ? + } + + } // end group ims3gppTemplates + + group confTemplates { + + template(value) XSD.Boolean m_boolXSD_true := true; + + template(value) XSD.Boolean m_boolXSD_false := false; + + template(value) urn_ietf_params_xml_ns_conference_info.Media_type m_mediatype_status( + template(value) Media_status_type p_status + ) := { + id := "1", + attr := omit, + display_text := omit, + type_ := omit, + label_ := omit, + src_id := omit, + status := p_status, + elem_list := {} + } + + template(value) Endpoint_type m_endpoint( + template(omit) charstring p_Uri := omit, + template(omit) Endpoint_status_type p_epStatus := omit, + template(omit) Joining_type p_joinMethod := omit, + template(omit) Disconnection_type p_discMethod := omit, + template(value) urn_ietf_params_xml_ns_conference_info.Media_type p_mediastatus + ) := { + entity := p_Uri, + state := full, + attr := omit, + display_text := omit, + referred := omit, + status := p_epStatus, + joining_method := p_joinMethod, + joining_info := omit, + disconnection_method := p_discMethod, + disconnection_info := omit, + media_list := {p_mediastatus}, // optional, + call_info := omit, + elem_list := {} + } + + template(value) User_type m_1user( + template(omit) charstring p_Uri := omit, + template(value) Endpoint_type p_endpoint + ) := { + entity := p_Uri, + state := full, + attr := omit, + display_text := omit, + associated_aors := omit, + roles := omit, + languages := omit, + cascaded_focus := omit, + endpoint_list := {p_endpoint}, // optional, + elem_list := {} + } + + template(value) Users_type m_users_1user_full( + template(value) User_type p_user + ) := { + state := full, + attr := omit, + user_list := {p_user}, + elem_list := {} + } + + template(value) Users_type m_users_2user_full( + template(value) User_type p_user, + template(value) User_type p_user2 + ) modifies m_users_1user_full := { + user_list := {p_user, p_user2} + } + + template(value) Conference_state_type m_conference_state( + template(value) UnsignedInt p_nUsers, + template(value) boolean p_active, + template(value) boolean p_locked + ) := { + attr := omit, + user_count := p_nUsers, + active := p_active, + locked := p_locked, + elem_list := {} + } + + template(value) Conference_type m_ci_cUri_cState_userEntity( + template(value) charstring p_cUri, + template(value) Conference_state_type p_cState, + template(value) Users_type p_users + ) := { + entity := p_cUri, + state := full, + version := 1, + attr := omit, + conference_description := omit, + host_info := omit, + conference_state := p_cState, + users := p_users, + sidebars_by_ref := omit, + sidebars_by_val := omit, + elem_list := {} + } + + template(present) Conference_type mw_conferenceInfo_active := { + entity := ?, + state := *, + version := *, + attr := *, + conference_description := *, + host_info := *, + conference_state := ?, + users := { + state := ?, + attr := *, + user_list := { + { + entity := *, + state := *, + attr := *, + display_text := *, + associated_aors := *, + roles := *, + languages := *, + cascaded_focus := *, + endpoint_list := { + { + entity := *, + state := *, + attr := *, + display_text := *, + referred := *, + status := connected, + joining_method := dialed_in, + joining_info := *, + disconnection_method := *, + disconnection_info := *, + media_list := ?, + call_info := *, + elem_list := ? + } + }, + elem_list := ? + } + }, + elem_list := ? + }, + sidebars_by_ref := *, + sidebars_by_val := *, + elem_list := ? + } + } + + } // end group messageBodyTemplates + + group messageTemplates { + + group modifiedTemplates { + + group requestSend { + + template(value) ACK_Request m_ACK_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit + ) modifies m_ACK_Request_Base := { + msgHeader := {route := p_route} + } + + template(value) ACK_Request m_ACK_Request_AS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit + ) modifies m_ACK_Request_IMS := { + msgHeader := { + route := p_route, + recordRoute := p_recordRoute + } + } + + template(value) ACK_Request m_ACK_Request_sdp_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb, + template(omit) Route p_route := omit + ) modifies m_ACK_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + route := p_route + }, + messageBody := p_mb + } + + template(value) ACK_Request m_ACK_Request_Mime_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) MessageBody p_mb, + template(omit) Route p_route := omit + ) modifies m_ACK_Request_Base := { + msgHeader := { + contentLength := { + fieldName := CONTENT_LENGTH_E, + len := f_MessageBodyLength(valueof(p_mb)) + }, + contentType := { + fieldName := CONTENT_TYPE_E/*, + mediaType := m_mimeMultipart*/ + }, + route := p_route + }, + messageBody := p_mb + } + + template(value) BYE_Request m_BYE_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit + ) modifies m_BYE_Request_Base := { + msgHeader := { + route := p_route, + recordRoute := p_recordRoute // used in case of AS as TS - for ISC interface + } + } // end of temlate m_BYE_Request_IMS + + template(value) BYE_Request m_BYE_Request_Reason_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(value) GenValue p_cause + ) modifies m_BYE_Request_Base := { + msgHeader := { + reason := mw_Reason(p_cause), + route := p_route + } + } + + template(value) BYE_Request m_BYE_Request_UserToUser_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(value) UserToUser.uuiData p_U2UData + ) modifies m_BYE_Request_Base := { + msgHeader := { + route := p_route, + userToUser := m_UserToUserData(p_U2UData) + } + } + + template(value) BYE_Request m_BYE_Request_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit + ) modifies m_BYE_Request_Base := { + msgHeader := { + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + route := p_route + } + } + + template(value) CANCEL_Request m_CANCEL_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit + ) modifies m_CANCEL_Request_Base := { + msgHeader := {route := p_route} + } + + template(value) CANCEL_Request m_CANCEL_Request_Reason_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(value) integer p_cause + ) modifies m_CANCEL_Request_IMS := { + msgHeader := {reason := m_Reason(p_cause)} + } + + template(value) CANCEL_Request m_CANCEL_Request_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit + ) modifies m_CANCEL_Request_IMS := { + } + + /** + * @desc INFO message + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_mb + */ + template(value) INFO_Request m_INFO_Request_IMS_Base( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb + ) modifies m_INFO_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)) + }, + messageBody := p_mb + } + + /** + * @desc INFO message + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_mb + */ + template(value) INFO_Request m_INFO_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb + ) modifies m_INFO_Request_IMS_Base := { + msgHeader := { + contentType := m_contentType(c_sdpApplication) + } + } + + /** + * @desc INFO message + * @desc + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_mb + */ + template(value) INFO_Request m_INFO_Request_Mime_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb + ) modifies m_INFO_Request_IMS_Base := { + msgHeader := { + contentType := m_contentType(m_mimeMultipart) + } + } + + template(value) INFO_Request m_INFO_Request_Xml_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb + ) modifies m_INFO_Request_IMS_Base := { + msgHeader := { + contentType := m_contentType(c_xmlApplication) + } + } + + template(value) INVITE_Request m_INVITE_Request_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) LibSip_SIPTypesAndValues.Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_noBody_UE := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication) + }, + messageBody := p_mb + } + + template(value) INVITE_Request m_INVITE_Request_noBody_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit + ) modifies m_INVITE_Request_Base := { + msgHeader := { + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + require := p_require, + route := p_route, + supported := p_supported + } + } + + template(value) INVITE_Request m_INVITE_Request_Allow_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb, + template(value) LibSip_SIPTypesAndValues.Allow p_allow + ) modifies m_INVITE_Request_UE := { + msgHeader := {allow := p_allow} + } + + template(value) INVITE_Request m_INVITE_Request_noBody_Allow_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) LibSip_SIPTypesAndValues.Allow p_allow + ) modifies m_INVITE_Request_noBody_UE := { + msgHeader := {allow := p_allow} + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + * @param p_mb + */ + template(value) INVITE_Request m_INVITE_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + require := p_require, + pChargingVector := p_pChargingVector, + recordRoute := p_recordRoute, + route := p_route, + supported := p_supported + }, + messageBody := p_mb + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + * @param p_mb + * @param p_historyInfo + */ + template(value) INVITE_Request m_INVITE_Request_HistoryInfo_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb, + template(value) HistoryInfo p_historyInfo + ) modifies m_INVITE_Request_IMS := { + msgHeader := { + historyInfo := p_historyInfo + } + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + * @param p_mb + */ + template(value) INVITE_Request m_INVITE_Request_Mime_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_IMS := { + msgHeader := { + contentType := m_contentType(m_mimeMultipart) + } + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + */ + template(value) INVITE_Request m_INVITE_Request_IMS_noBody( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit + ) modifies m_INVITE_Request_Base := { + msgHeader := { + require := p_require, + pChargingVector := p_pChargingVector, + recordRoute := p_recordRoute, + route := p_route, + supported := p_supported + } + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + * @param p_mb + * @param p_pAssertedID + * @param p_privacy + */ + template(value) INVITE_Request m_INVITE_Request_Mime_PAsserted_Privacy_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb, + template(value) PAssertedID p_pAssertedID, + template(value) Privacy p_privacy + ) modifies m_INVITE_Request_Mime_IMS := { + msgHeader := { + pAssertedID := p_pAssertedID, + privacy := p_privacy + } + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_acceptContact + * @param p_pAssertedID + * @param p_supported + * @param p_pChargingVector + * @param p_mb + */ + template(value) INVITE_Request m_INVITE_Request_PAsserted_AcceptContact_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) AcceptContact p_acceptContact, + template(value) PAssertedID p_pAssertedID, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_Base := { + msgHeader := { + acceptContact := p_acceptContact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + require := p_require, + pAssertedID := p_pAssertedID, + pChargingVector := p_pChargingVector, + recordRoute := p_recordRoute, + route := p_route, + supported := p_supported + }, + messageBody := p_mb + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_pAssertedID + * @param p_privacy + * @param p_supported + * @param p_pChargingVector + * @param p_mb + */ + template(value) INVITE_Request m_INVITE_Request_PAsserted_Privacy_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) PAssertedID p_pAssertedID, + template(value) Privacy p_privacy, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + require := p_require, + pAssertedID := p_pAssertedID, + pChargingVector := p_pChargingVector, + privacy := p_privacy, + recordRoute := p_recordRoute, + route := p_route, + supported := p_supported + }, + messageBody := p_mb + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_supported + * @param p_pChargingVector + * @param p_mb + * @param p_pAssertedService + */ + template(value) INVITE_Request m_INVITE_Request_PAssertedService_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb, + template(value) PAssertedService p_pAssertedService + ) modifies m_INVITE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + require := p_require, + pChargingVector := p_pChargingVector, + route := p_route, + supported := p_supported, + pAssertedService := p_pAssertedService + }, + messageBody := p_mb + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + * @param p_mb + */ + template(value) INVITE_Request m_INVITE_Request_PEarlyMedia_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_IMS := { + msgHeader := { + pEarlyMedia := m_pEarlyMedia_sup + } + } + + template(value) INVITE_Request m_INVITE_Request_PPreferred_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb, + template(value) PPreferredID p_pPreferredID + ) modifies m_INVITE_Request_UE := { + msgHeader := { + pPreferredID := p_pPreferredID + } + } + + template(value) INVITE_Request m_INVITE_Request_PPreferred_Privacy_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb, + template(value) PPreferredID p_pPreferredID, + template(value) Privacy p_privacy + ) modifies m_INVITE_Request_UE := { + msgHeader := { + pPreferredID := p_pPreferredID, + privacy := p_privacy + } + } + + template(value) INVITE_Request m_INVITE_Request_SessionExpires_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb, + template(value) SessionExpires p_se + ) modifies m_INVITE_Request_UE := { + msgHeader := { + sessionExpires := p_se + } + } + + template(value) INVITE_Request m_INVITE_Request_minSE_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb, + template(value) MinSE p_minSE + ) modifies m_INVITE_Request_UE := { + msgHeader := { + minSE := p_minSE + } + } + + /** + * @desc INVITE message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_from + * @param p_to + * @param p_via + * @param p_contact + * @param p_require + * @param p_route + * @param p_supported + * @param p_pChargingVector + * @param p_mb + * @param p_minSE + */ + template(value) INVITE_Request m_INVITE_Request_minSE_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb, + template(value) MinSE p_minSE + ) modifies m_INVITE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + require := p_require, + pChargingVector := p_pChargingVector, + route := p_route, + supported := p_supported, + minSE := p_minSE + }, + messageBody := p_mb + } + + template(value) INVITE_Request m_INVITE_Request_User2UserData_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) LibSip_SIPTypesAndValues.Contact p_contact, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb, + template(value) UserToUser.uuiData p_U2UData + ) modifies m_INVITE_Request_IMS := { + msgHeader := { + userToUser := m_UserToUserData(p_U2UData) + } + } + + template(value) MESSAGE_Request m_MESSAGE_Request_MBody_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) MessageBody p_mb + ) modifies m_MESSAGE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_plainText), + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + require := p_require, + route := p_route, + supported := p_supported + }, + messageBody := p_mb + } + + template(value) MESSAGE_Request m_MESSAGE_Request_NoBody_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit + ) modifies m_MESSAGE_Request_Base := { + msgHeader := { + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + require := p_require, + route := p_route, + supported := p_supported + }, + messageBody := omit + } + + template(value) MESSAGE_Request m_MESSAGE_Request_PCharging_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) GenValue p_homeDomain + ) modifies m_MESSAGE_Request_NoBody_UE := { + msgHeader := { + pChargingFunctionAddresses := m_pChargingFunctionAddresses_fixedValue, + pChargingVector := m_pChargingVector_origIoi_fixedValue(p_homeDomain) + } + } + + template(value) MESSAGE_Request m_MESSAGE_Request_PCharging_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit + ) modifies m_MESSAGE_Request_NoBody_UE := { + msgHeader := { + pAccessNetworkInfo := omit, + pChargingFunctionAddresses := m_pChargingFunctionAddresses_fixedValue, + pChargingVector := p_pChargingVector + } + } + + template(value) MESSAGE_Request m_MESSAGE_Request_PMediaAuth_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit + ) modifies m_MESSAGE_Request_NoBody_UE := { + msgHeader := { + pMediaAuthorization := m_pMediaAuthorization_fixedValue + } + } + + template(value) MESSAGE_Request m_MESSAGE_Request_PPreferred_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit, + template(value) PPreferredID p_pPreferredID + ) modifies m_MESSAGE_Request_NoBody_UE := { + msgHeader := { + pPreferredID := p_pPreferredID + } + } + + template(value) MESSAGE_Request m_MESSAGE_Request_1300Bytes_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) Supported p_supported := omit + ) modifies m_MESSAGE_Request_NoBody_UE := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(m_MBody_longPlainText)), + contentType := m_contentType(c_plainText) + }, + messageBody := m_MBody_longPlainText + } + + template(value) NOTIFY_Request m_NOTIFY_Request_Xml_IMS_Conference( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb + ) modifies m_NOTIFY_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_xmlApplication), + event := { + fieldName := EVENT_E, + eventType := "conference", + eventParams := omit + }, + subscriptionState := { + fieldName := SUBSCRIPTION_STATE_E, + subState := "active", + substateParams := omit + }, + expires := m_expires(3600) + }, + messageBody := p_mb + } + + template(value) NOTIFY_Request m_NOTIFY_Request_Xml_IMS_RegInfo( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb + ) modifies m_NOTIFY_Request_Base := { + msgHeader := { + contact := p_contact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_xmlreginfoApplication), + event := m_Event_reg, + subscriptionState := m_SubscriptionState_active, + expires := m_expires(3600) + }, + messageBody := p_mb + } + + template(value) PRACK_Request m_PRACK_Request_sdp( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) RAck p_RAck, + template(value) MessageBody p_mb + ) modifies m_PRACK_Request_Base := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + cSeq := m_cSeq(p_cSeq.seqNumber, "PRACK"), + fromField := p_from, + rAck := p_RAck, + toField := p_to, + via := p_via + }, + messageBody := p_mb + } + + template(value) PUBLISH_Request m_PUBLISH_Request_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Event p_event := omit, + template(omit) RAck p_RAck := omit, + template(value) MessageBody p_mb, + template(omit) Route p_route := omit + ) modifies m_PUBLISH_Request_Base := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_plainText /*c_sdpApplication*/), + cSeq := m_cSeq(p_cSeq.seqNumber, "PUBLISH"), + event := p_event, + fromField := p_from, + route := p_route, + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + toField := p_to, + via := p_via + }, + messageBody := p_mb + } + + template(value) PUBLISH_Request m_PUBLISH_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Event p_event := omit, + template(omit) RAck p_RAck := omit, + template(value) MessageBody p_mb, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) PChargingVector p_pChargingVector := omit + ) modifies m_PUBLISH_Request_UE := { + msgHeader := { + recordRoute := p_recordRoute, + pChargingVector := p_pChargingVector + } + } + + /** + * @desc REFER message exchanged at Mw + * @param p_requestUri + * @param p_callId + * @param p_cSeq + * @param p_contact + * @param p_from + * @param p_to + * @param p_via + * @param p_referTo + * @param p_referredBy + * @param p_require + * @param p_route + * @param p_recordRoute + * @param p_supported + * @param p_pChargingVector + * @param p_mb + */ + template(value) REFER_Request m_REFER_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) ReferTo p_referTo, + template(omit) ReferredBy p_referredBy := omit, + template(omit) Require p_require := omit, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(omit) Supported p_supported := omit, + template(omit) PChargingVector p_pChargingVector := omit, + template(value) MessageBody p_mb + ) modifies m_REFER_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + referredBy := p_referredBy, + referTo := p_referTo, + require := p_require, + pChargingVector := p_pChargingVector, + recordRoute := p_recordRoute, + route := p_route, + supported := p_supported + }, + messageBody := p_mb + } + + template(value) REGISTER_Request m_REGISTER_Request_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) Authorization p_authorization := omit, + template(omit) ProxyRequire p_proxyRequire := omit, + template(omit) Require p_require := omit, + template(omit) SecurityClient p_securityClient := omit, + template(omit) SecurityVerify p_securityVerify := omit, + template(omit) Supported p_supported := omit + ) modifies m_REGISTER_Request_Base := { + requestLine := { + method := REGISTER_E, + requestUri := p_requestUri + }, + msgHeader := { + authorization := p_authorization, + callId := p_callId, + contact := p_contact, + cSeq := p_cSeq, + fromField := p_from, + proxyRequire := p_proxyRequire, + require := p_require, + securityClient := p_securityClient, + securityVerify := p_securityVerify, + supported := p_supported, + toField := p_to, + via := p_via + } + } + + + template(value) REGISTER_Request m_REGISTER_Request_IMS( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) Authorization p_authorization := omit, + template(value) charstring p_host, + template(value) integer p_port + ) modifies m_REGISTER_Request_Base := { + requestLine := { + method := REGISTER_E, + requestUri := p_requestUri + }, + msgHeader := { + authorization := p_authorization, + callId := p_callId, + contact := p_contact, + cSeq := p_cSeq, + fromField := p_from, + path := m_path_TS(p_host, p_port), + pChargingVector := m_pChargingVector_icid_TS, + pVisitedNetworkID := m_pVisitedNetworkID_TS, + require := { + fieldName := REQUIRE_E, + optionsTags := {"path"} + }, + toField := p_to, + via := p_via + } + } + + template(value) REGISTER_Request m_REGISTER_Request_IMS_3party( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) Authorization p_authorization := omit, + template(value) charstring p_host, + template(value) integer p_port, + template(omit) Path p_path := omit + ) modifies m_REGISTER_Request_IMS := { + msgHeader := {path := p_path} + } + + template(value) REGISTER_Request m_REGISTER_Request_expires_IMS( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) Authorization p_authorization := omit, + template(value) charstring p_host, + template(value) integer p_port, + template(value) DeltaSec p_deltaSec + ) modifies m_REGISTER_Request_IMS := { + msgHeader := { + expires := m_expires(str2int(valueof(p_deltaSec))) + } + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_UE( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) Route p_route := omit + ) modifies m_SUBSCRIBE_Request_Base := { + requestLine := { + method := SUBSCRIBE_E, + requestUri := p_requestUri + }, + msgHeader := { + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + contact := p_contact, + cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), + event := m_Event_reg, + expires := m_Expires_600000, + route := p_route + } + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_mb_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb + ) modifies m_SUBSCRIBE_Request_Base := { + requestLine := { + method := SUBSCRIBE_E, + requestUri := p_requestUri + }, + msgHeader := { + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a, + contact := p_contact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), + event := m_Event_reg, + expires := m_Expires_600000 + }, + messageBody := p_mb + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_mb_event_UE( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb, + template(value) Event p_event, + template(value) charstring p_contentType + ) modifies m_SUBSCRIBE_Request_mb_UE := { + msgHeader := { + contentType := m_contentType(p_contentType), + event := p_event + } + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_IMS( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_SUBSCRIBE_Request_Base := { + requestLine := { + method := SUBSCRIBE_E, + requestUri := p_requestUri + }, + msgHeader := { + contact := p_contact, + cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), + event := m_Event_reg, + expires := m_Expires_600000 + } + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_Event( + template(value) SipUrl p_requestUri, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) Event p_event + ) modifies m_SUBSCRIBE_Request_IMS := { + msgHeader := { + event := p_event + } + } + + } // end group requestSend + + group requestReceive { + + template(present) ACK_Request mw_ACK_Request_noPaccessNetworkInfo( + template CallId p_callId + ) modifies mw_ACK_Request_Base := { + msgHeader := { + pAccessNetworkInfo := omit + } + } + + template(present) ACK_Request mw_ACK_Request_PchargingVector( + template CallId p_callId, + template(present) PChargingVector p_pChargingVector := ? + ) modifies mw_ACK_Request_Base := { + msgHeader := { + pChargingVector := p_pChargingVector + } + } + + template(present) BYE_Request mw_BYE_Request_noPChargingFunction_UE( + template CallId p_callId + ) modifies mw_BYE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := omit, + pChargingVector := omit + } + } + + template(present) BYE_Request mw_BYE_Request_via_PChargingVector_UE( + template CallId p_callId, + template(present) PChargingVector p_pChargingVector := ?, + template(present) Via p_via := ? + ) modifies mw_BYE_Request_Base := { + msgHeader := { + pChargingVector := p_pChargingVector, + via := p_via + } + } + + template(present) BYE_Request mw_BYE_Request_via_UE( + template CallId p_callId, + template(present) Via p_via := ? + ) modifies mw_BYE_Request_Base := { + msgHeader := { + via := p_via + } + } + + template(present) BYE_Request mw_BYE_Request_route( + template CallId p_callId, + template(present) Route p_route := ? + ) modifies mw_BYE_Request_Base := { + msgHeader := { + route := p_route + } + } + + template(present) INVITE_Request mw_INVITE_Request_noPChargingFunction + modifies mw_INVITE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := omit + } + } + + template(present) INVITE_Request mw_INVITE_Request_PChargingFunction + modifies mw_INVITE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := ? + } + } + + template(present) INVITE_Request mw_INVITE_Request_NoPCharging + modifies mw_INVITE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := omit, + pChargingVector := omit + } + } + + template(present) INVITE_Request mw_INVITE_Request_NoPChargingPreferred + modifies mw_INVITE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := omit, + pChargingVector := omit, + pPreferredID := omit + } + } + + template(present) INVITE_Request mw_INVITE_Request_PAsserted_noPPreferred( + template(present) PAssertedID p_pAssertedID := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + pAssertedID := p_pAssertedID, + pPreferredID := omit + } + } + + template(present) INVITE_Request mw_INVITE_Request_PAsserted_AcceptContact( + template(present) PAssertedID p_pAssertedID := ?, + template(present) AcceptContact p_acceptContact := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + pAssertedID := p_pAssertedID, + acceptContact := p_acceptContact + } + } + + template(present) INVITE_Request mw_INVITE_Request_RecordRoute_Via( + template(present) RecordRoute p_recordRoute := ?, + template(present) Via p_via := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + recordRoute := p_recordRoute, + via := p_via + } + } + + template(present) INVITE_Request mw_INVITE_Request_route( + template(present) Route p_route := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + route := p_route + } + } + + template(present) INVITE_Request mw_INVITE_Request_require( + template(present) Require p_require := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + require := p_require + } + } + + template(present) INVITE_Request mw_INVITE_Request_supported( + template(present) Supported p_supported := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + supported := p_supported + } + } + + template(present) INVITE_Request mw_INVITE_Request_SessionExpires( + template(present) SessionExpires p_sessionExpires := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + sessionExpires := p_sessionExpires + } + } + + template(present) INVITE_Request mw_INVITE_Request_User2UserData( + template(present) UserToUser.uuiData p_U2UData := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + userToUser := mw_UserToUserData(p_U2UData) + } + } + + template(present) INVITE_Request mw_INVITE_Request_IMS( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + pChargingVector := p_pChargingVector, + recordRoute := p_recordRoute, + route := p_route, + via := p_via + } + } + + template(present) INVITE_Request mw_INVITE_Request_IMS_requestLine( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via, + template(present) SipUrl p_requestUri := ? + ) modifies mw_INVITE_Request_IMS := { + requestLine := { + requestUri := p_requestUri + }, + msgHeader := { + pChargingVector := p_pChargingVector, + recordRoute := p_recordRoute, + route := p_route, + via := p_via + } + } + + template(present) INVITE_Request mw_INVITE_Request_IMS_PAsserted_noPPreferred( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via, + template(present) PAssertedID p_pAssertedID := ? + ) modifies mw_INVITE_Request_IMS := { + msgHeader := { + pAssertedID := p_pAssertedID, + pPreferredID := omit + } + } + + template(present) INVITE_Request mw_INVITE_Request_IMS_mb( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via + ) modifies mw_INVITE_Request_IMS := { + messageBody := ? + } + + template(present) INVITE_Request mw_INVITE_Request_IMS_cug( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via, + template(present) Cug p_cug := ? + ) modifies mw_INVITE_Request_IMS := { + messageBody := ( + mw_MBody_XML(mw_XmlBody_CUG(p_cug)), + mw_MBody_MIMESdpXml(?, mw_XmlBody_CUG(p_cug)) + ) + } + + /* TITAN compiler error: Restriction on template formal parameter does not allow usage of complemented list match without omit or AnyValueOrNone in the list + template(present) INVITE_Request mw_INVITE_Request_IMS_noCug( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via + ) modifies mw_INVITE_Request_IMS := { + messageBody := ( + mw_MBody_XML(complement(mw_XmlBody_CUG(?))), + mw_MBody_MIMESdpXml(?, complement(mw_XmlBody_CUG(?))) + ) + }*/ + + template(present) INVITE_Request mw_INVITE_Request_IMS_pstn( + template PChargingVector p_pChargingVector, + template RecordRoute p_recordRoute, + template Route p_route, + template Via p_via, + template(present) PSTN_transit p_pstn := ? + ) modifies mw_INVITE_Request_IMS := { + messageBody := ( + mw_MBody_XML(mw_XmlBody_PSTNTransit(p_pstn)), + mw_MBody_MIMESdpXml(?, mw_XmlBody_PSTNTransit(p_pstn)) + ) + } + + /** + * @desc Await INVITE using topology hiding + */ + template(present) INVITE_Request mw_INVITE_Request_TH + modifies mw_INVITE_Request_TH_R10 := { + msgHeader := { + pChargingVector := omit + } + } + + template(present) INVITE_Request mw_INVITE_Request_TH_R10 + modifies mw_INVITE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := omit + } + } + + /** + * @desc Await INVITE without PAsserted and Privacy + * @param p_from + */ + template(present) INVITE_Request mw_INVITE_Request_noPasserted_noPrivacy( + template From p_from + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + pAssertedID := omit, + pPreferredID := omit + } + } + + + /** + * @desc Await INVITE with PAsserted and Privacy + * @param p_from + * @param p_pAssertedID + * @param p_privacy + */ + template(present) INVITE_Request mw_INVITE_Request_PassertedPrivacy( + template From p_from, + template(present) PAssertedID p_pAssertedID := ?, + template(present) Privacy p_privacy := ? + ) modifies mw_INVITE_Request_noPasserted_noPrivacy := { + msgHeader := { + pAssertedID := p_pAssertedID, + privacy := p_privacy + } + } + + /** + * @desc Await INVITE with PAsserted and Privacy + * @param p_from + * @param p_pAssertedID + * @param p_privacy + */ + template(present) INVITE_Request mw_INVITE_Request_Passerted_ifPrivacy( + template From p_from, + template PAssertedID p_pAssertedID, + template(present) Privacy p_privacy := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + fromField := p_from, + pAssertedID := p_pAssertedID, + privacy := p_privacy ifpresent + } + } + + /** + * @desc Await INVITE with history info + * @param p_historyInfo + */ + template(present) INVITE_Request mw_INVITE_Request_HistoryInfo( + template(present) HistoryInfo p_historyInfo := ? + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + historyInfo := p_historyInfo + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_noPchargingFunction_UE + modifies mw_MESSAGE_Request_Base := { + msgHeader := { + pChargingFunctionAddresses := omit, + pChargingVector := omit + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_noPchargingFunctionPrefId_UE + modifies mw_MESSAGE_Request_noPchargingFunction_UE := { + msgHeader := { + pPreferredID := omit + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_noPchargingFunction_IMS := + mw_MESSAGE_Request_noPchargingFunction_UE; + + template(present) MESSAGE_Request mw_MESSAGE_Request_PAsserted_noPPreferred( + template CallId p_callId, + template(present) PAssertedID p_pAssertedID := ? + ) modifies mw_MESSAGE_Request_Base := { + msgHeader := { + callId := p_callId, + pAssertedID := p_pAssertedID, + pPreferredID := omit + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_route( + template CallId p_callId, + template(present) Route p_route := ? + ) modifies mw_MESSAGE_Request_Base := { + msgHeader := { + callId := p_callId, + route := p_route + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_via( + template CallId p_callId, + template(present) Via p_via := ? + ) modifies mw_MESSAGE_Request_Base := { + msgHeader := { + callId := p_callId, + via := p_via + } + } + + template(present) NOTIFY_Request mw_NOTIFY_Request( + template CallId p_callId, + template(present) charstring p_state := ?, + template(present) charstring p_contentType := ?, + template Event p_event, + template MessageBody p_mb + ) modifies mw_NOTIFY_Request_Base := { + msgHeader := { + subscriptionState := mw_subscriptionState(p_state), + contentType := mw_contentType(p_contentType), + event := p_event + }, + messageBody := p_mb + } + + template(present) PRACK_Request mw_PRACK_Request_sdp( + template CallId p_callId, + template MessageBody p_mb + ) modifies mw_PRACK_Request_Base := { + msgHeader := { + callId := p_callId + }, + messageBody := p_mb + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_PchargingVector( + template(present) charstring p_id := ?, + template GenValue p_paramValue + ) modifies mw_MESSAGE_Request_Base := { + msgHeader := { + pChargingVector := mw_pChargingVector(p_id, p_paramValue) + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_noPaccessNetworkInfo + modifies mw_MESSAGE_Request_Base := { + msgHeader := { + pAccessNetworkInfo := omit + } + } + + template(present) MESSAGE_Request mw_MESSAGE_Request_noPMediaAuthorization + modifies mw_MESSAGE_Request_Base := { + msgHeader := { + pMediaAuthorization := omit + } + } + + template(present) PUBLISH_Request mw_PUBLISH_Request_PchargingVector( + template CallId p_callId, + template(present) PChargingVector p_pChargingVector := ? + ) modifies mw_PUBLISH_Request_Base := { + msgHeader := { + pChargingVector := p_pChargingVector + } + } + + template(present) REGISTER_Request mw_REGISTER_Request_IMS( + template Path p_Path, + template PChargingVector p_pChargingVector, + template PVisitedNetworkID p_pVisitedNetworkID + ) modifies mw_REGISTER_Request_Base := { + msgHeader := { + authorization := ?, + path := p_Path, + pChargingVector := p_pChargingVector, + pVisitedNetworkID := p_pVisitedNetworkID, + require := mw_require_path, + securityClient := omit, + securityVerify := omit + } + } + + template(present) REGISTER_Request mw_REGISTER_authorizedRequest_IMS( + template(present) Authorization p_authorization := ? + ) modifies mw_REGISTER_Request_Base := { + msgHeader := { + authorization := p_authorization + } + } + + template(present) REGISTER_Request mw_REGISTER_authorizedRequest_wo_securityclient_IMS( + template(present) Authorization p_authorization := ? + ) modifies mw_REGISTER_authorizedRequest_IMS := { + msgHeader := { + securityClient := omit + } + } + + template(present) REGISTER_Request mw_REGISTER_auth_via_nosecclient_IMS( + template(present) Authorization p_authorization := ?, + template(present) Via p_via + ) modifies mw_REGISTER_authorizedRequest_wo_securityclient_IMS := { + msgHeader := { + via := p_via + } + } + + template(present) REGISTER_Request mw_REGISTER_authorizedRequest_wo_securityheaders_IMS + modifies mw_REGISTER_Request_Base := { + msgHeader := { + securityVerify := omit, + securityClient := omit + } + } + + template(present) REGISTER_Request mw_REGISTER_unauthorizedRequest_IMS + modifies mw_REGISTER_Request_Base := { + msgHeader := { + authorization := * + } + } + + template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Request_IMS( + template(present) From p_from := ?, + template(present) To p_to := ?, + template PAssertedID p_pAssertedID, + template PChargingVector p_pChargingVector + ) modifies mw_SUBSCRIBE_Request_Base := { + requestLine := { + method := SUBSCRIBE_E + }, + msgHeader := { + fromField := p_from, + toField := p_to, + event := m_Event_reg, + pAccessNetworkInfo := *, + pAssertedID := p_pAssertedID, + pChargingVector := p_pChargingVector + } + } + + template(present) UPDATE_Request mw_UPDATE_Request_fromChange( + template CallId p_callId, + template(present) From p_from := ? + ) modifies mw_UPDATE_Request_Base := { + msgHeader := { + callId := p_callId, + fromField := p_from + } + } + + } // end group requestReceive + + group responseSend { + + group responseSend1xx { + + template(value) Response m_Response_18x_Base( + template(value) StatusLine_18x p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_Dummy := { + statusLine := p_statusLine, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + maxForwards := omit, + toField := p_to, + via := p_via + }, + messageBody := omit, + payload := omit + } + + template(value) Response m_Response_18XonINVITE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_18x_Base := { + msgHeader := { + contact := p_contact // mandatory field due to 24 229 rel 7.9 + } + } + + template(value) Response m_Response_18XonINVITE_AlertInfo( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) AlertInfo p_alertInfo + ) modifies m_Response_18x_Base := { + msgHeader := { + alertInfo := p_alertInfo + } + } + + template(value) Response m_Response_18XonINVITE_sdp_require( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb, + template(omit) Require p_require := omit + ) modifies m_Response_18x_Base := { + msgHeader := { + contact := p_contact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + require := p_require, + rSeq := m_rseq9999 + }, + messageBody := p_mb + } + + template(value) Response m_Response_18XonINVITE_AS( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit + ) modifies m_Response_18x_Base := { + msgHeader := { + contact := p_contact, + recordRoute := p_recordRoute + } + } + + template(value) Response m_Response_18XonINVITE_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_18x_Base := { + msgHeader := { + contact := p_contact, + rSeq := m_rseq9999 + } + } + + template(value) Response m_Response_18XonINVITE_HistoryInfo_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) HistoryInfo p_historyInfo + ) modifies m_Response_18XonINVITE_UE := { + msgHeader := { + historyInfo := p_historyInfo + } + } + + template(value) Response m_Response_18XonINVITE_PchargingVector( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) PChargingVector p_pChargingVector + ) modifies m_Response_18x_Base := { + msgHeader := { + contact := p_contact, + pChargingFunctionAddresses := m_pChargingFunctionAddresses_fixedValue, + pChargingVector := p_pChargingVector + } + } + + template(value) Response m_Response_18XonINVITE_pEearlyMedia( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) PEarlyMedia p_pEarlyMedia + ) modifies m_Response_18x_Base := { + msgHeader := { + pEarlyMedia := p_pEarlyMedia + } + } + + template(value) Response m_Response_18XonINVITE_pPreferred_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) PPreferredID p_pPreferredID + ) modifies m_Response_18XonINVITE_UE := { + msgHeader := { + pPreferredID := p_pPreferredID + } + } + + template(value) Response m_Response_18XonINVITE_pAsserted_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) PAssertedID p_pAssertedID + ) modifies m_Response_18XonINVITE_UE := { + msgHeader := { + pAssertedID := p_pAssertedID + } + } + + template(value) Response m_Response_18XonINVITE_pAsserted_privacy_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) PAssertedID p_pAssertedID, + template(value) Privacy p_privacy + ) modifies m_Response_18XonINVITE_pAsserted_UE := { + msgHeader := { + privacy := p_privacy + } + } + + template(value) Response m_Response_18XonINVITE_privacy_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) Privacy p_privacy + ) modifies m_Response_18XonINVITE_UE := { + msgHeader := { + privacy := p_privacy + } + } + + // NOTE STF471: changed order of parameter p_supported and p_privacy to be able to modify from m_Response_18XonINVITE_privacy_UE + template(value) Response m_Response_18XonINVITE_supported_privacy_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) Privacy p_privacy, + template(value) Supported p_supported + ) modifies m_Response_18XonINVITE_privacy_UE := { + msgHeader := { + supported := p_supported + } + } + + template(value) Response m_Response_18XonINVITE_recordRoute_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) RecordRoute p_recordRoute + ) modifies m_Response_18XonINVITE_UE := { + msgHeader := { + recordRoute := p_recordRoute // for INVITE response + } + } + + template(value) Response m_Response_18XonINVITE_Require( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Require p_require + ) modifies m_Response_18x_Base := { + msgHeader := { + require := p_require + } + } + + // NOTE STF471: removed m_Response_18XonINVITE_Require_ifpresent as it is same as m_Response_18XonINVITE_Require + template(value) Response m_Response_18XonINVITE_UserToUser( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) UserToUser.uuiData p_U2UData + ) modifies m_Response_18x_Base := { + msgHeader := { + userToUser := m_UserToUserData(p_U2UData) + } + } + + template(value) Response m_Response_18XonINVITE_Xml( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb + ) modifies m_Response_18XonINVITE_UE := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_xmlApplication) + }, + messageBody := p_mb + } + + template(value) Response m_Response_18XonINVITE_sdp_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb + ) modifies m_Response_18XonINVITE_Xml := { + msgHeader := { + contentType := m_contentType(c_sdpApplication) + } + } + + // NOTE STF471: changed order of parameter p_require and p_mb to be able to modify from m_Response_18XonINVITE_sdp_UE + template(value) Response m_Response_18XonINVITE_require_sdp_UE( + template(value) StatusLine_18x p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) MessageBody p_mb, + template(omit) Require p_require := omit, + template(omit) LibSip_SIPTypesAndValues.Allow p_allow := omit + ) modifies m_Response_18XonINVITE_sdp_UE := { + msgHeader := { + require := p_require, + allow := p_allow + } + } + + } // end group responseSend1xx + + group responseSend2xx { + + template(value) Response m_Response_2xx_Base( + template(value) StatusLine_2xx p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_Dummy := { + statusLine := p_statusLine, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + maxForwards := omit, + toField := p_to, + via := p_via + }, + messageBody := omit, + payload := omit + } + + template(value) Response m_Response_2xx_ext( + template(value) StatusLine_2xx p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordroute := omit + ) modifies m_Response_2xx_Base := { + msgHeader := { + route := p_route, // f_route(), + recordRoute := + p_recordroute // f_recordroute() + } + } + + template(value) Response m_Response_2xx_mbody( + template(value) StatusLine_2xx p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordroute := omit, + template(value) MessageBody p_mb + ) modifies m_Response_2xx_ext := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication) + }, + messageBody := p_mb + } + + template(value) Response m_Response_2xxonBYE_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_2xx_Base := { + msgHeader := { + contact := p_contact + } + } + + template(value) Response m_Response_2xxonINVITE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb + ) modifies m_Response_2xx_Base := { + msgHeader := { + contact := p_contact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + recordRoute := p_recordRoute // for INVITE response + }, + messageBody := p_mb + } + + // NOTE STF471: changed order of parameter p_historyInfo and p_mb to be able to modify from m_Response_2xxonINVITE + template(value) Response m_Response_2xxonINVITE_HistoryInfo( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) HistoryInfo p_historyInfo + ) modifies m_Response_2xxonINVITE := { + msgHeader := { + historyInfo := p_historyInfo + } + } + + template(value) Response m_Response_2xxonINVITE_Mime( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb + ) modifies m_Response_2xxonINVITE := { + msgHeader := { + contentType := m_contentType(m_mimeMultipart) + } + } + + template(value) Response m_Response_2xxonINVITE_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb + ) modifies m_Response_2xxonINVITE := { + } + + template(value) Response m_Response_2xxonINVITE_PchargingVector( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordroute := omit, + template(value) MessageBody p_mb, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) PChargingVector p_pChargingVector + ) modifies m_Response_2xx_mbody := { + msgHeader := { + contact := p_contact, + pChargingFunctionAddresses := m_pChargingFunctionAddresses_fixedValue, + pChargingVector := p_pChargingVector + } + } + + // NOTE STF471: changed order of parameter p_pPreferredID and p_mb to be able to modify from m_Response_2xxonINVITE + template(value) Response m_Response_2XXonINVITE_pPreferred_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) PPreferredID p_pPreferredID + ) modifies m_Response_2xxonINVITE := { + msgHeader := { + pPreferredID := p_pPreferredID + } + } + + // NOTE STF471: changed order of parameter p_pPreferredID and p_mb to be able to modify from m_Response_2xxonINVITE + template(value) Response m_Response_2XXonINVITE_pAsserted_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) PAssertedID p_pAssertedID + ) modifies m_Response_2xxonINVITE := { + msgHeader := { + pAssertedID := p_pAssertedID + } + } + + // NOTE STF471: changed order of parameter p_pAssertedID/p_privacy and p_mb to be able to modify from m_Response_2XXonINVITE_pAsserted_UE + template(value) Response m_Response_2XXonINVITE_pAsserted_privacy_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) PAssertedID p_pAssertedID, + template(value) Privacy p_privacy + ) modifies m_Response_2XXonINVITE_pAsserted_UE := { + msgHeader := { + privacy := p_privacy + } + } + + // NOTE STF471: changed order of parameter p_privacy and p_mb to be able to modify from m_Response_2xxonINVITE + template(value) Response m_Response_2XXonINVITE_privacy_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) Privacy p_privacy + ) modifies m_Response_2xxonINVITE := { + msgHeader := { + privacy := p_privacy + } + } + + // NOTE STF471: changed order of parameter p_supported/p_privacy and p_mb to be able to modify from m_Response_2XXonINVITE_privacy_UE + template(value) Response m_Response_2XXonINVITE_supported_privacy_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) Privacy p_privacy, + template(value) Supported p_supported + ) modifies m_Response_2XXonINVITE_privacy_UE := { + msgHeader := { + supported := p_supported + } + } + + template(value) Response m_Response_2xxonINVITE_UserToUser( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb, + template(value) UserToUser.uuiData p_U2UData + ) modifies m_Response_2xxonINVITE := { + msgHeader := { + userToUser := m_UserToUserData(p_U2UData) + } + } + + template(value) Response m_Response_2xxonREGISTER_IMS( + template(value) StatusLine_2xx p_statusLine, + template(omit) CallId p_callId := omit, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) SipUrl p_serviceroute_sip_url, + template(value) SipUrl p_passociated_uri + ) modifies m_Response_2xx_Base := { + msgHeader := { + contact := p_contact, + serviceRoute := { + fieldName := SERVICE_ROUTE_E, + routeBody := { + { + nameAddr := { + displayName := omit, + addrSpec := p_serviceroute_sip_url + }, + rrParam := omit + } + } + }, + pAssociatedURI := + m_pAssociatedURI( + { + displayName := omit, + addrSpec := p_passociated_uri + } + ) // PAssociatedURI RFC3455 + } + } + + template(value) Response m_Response_2xxonSUBSCRIBE_IMS( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_2xx_Base := { + msgHeader := { + contact := p_contact + } + } + + template(value) Response m_Response_2xxonSUBSCRIBE_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_2xxonSUBSCRIBE_IMS := { + } + + template(value) Response m_Response_2xxonMESSAGE_PAccessNetwInfo_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_2xx_Base := { + msgHeader := { + pAccessNetworkInfo := m_pAccessNetworkInfo_IEEE_11a + } + } + + template(value) Response m_Response_2xxonMESSAGE_PCharging_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) PChargingVector p_pChargingVector + ) modifies m_Response_2xx_Base := { + msgHeader := { + pChargingFunctionAddresses := m_pChargingFunctionAddresses_fixedValue, + pChargingVector := p_pChargingVector + } + } + + template(value) Response m_Response_2xxonMESSAGE_PCharging_IMS( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) PChargingVector p_pChargingVector + ) modifies m_Response_2xxonMESSAGE_PCharging_UE := { + } + + template(value) Response m_Response_2xxonMESSAGE_PMediaAuth_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_2xx_Base := { + msgHeader := { + pMediaAuthorization := m_pMediaAuthorization_fixedValue + } + } + + template(value) Response m_Response_2xxonMESSAGE_pPreferredID_UE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) PPreferredID p_pPreferredID + ) modifies m_Response_2xx_Base := { + msgHeader := { + pPreferredID := p_pPreferredID + } + } + + template(value) Response m_Response_2xxonUPDATE( + template(value) StatusLine_2xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(omit) RecordRoute p_recordRoute := omit, + template(value) MessageBody p_mb + ) modifies m_Response_2xx_Base := { + msgHeader := { + contact := p_contact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), + contentType := m_contentType(c_sdpApplication), + recordRoute := p_recordRoute + }, + messageBody := p_mb + } + + } // end group responseSend2xx + + group responseSend3xx { + + template(value) Response m_Response_3xx_Base( + template(value) StatusLine_3xx p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_Dummy := { + statusLine := p_statusLine, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + maxForwards := omit, + toField := p_to, + via := p_via + }, + messageBody := omit, + payload := omit + } + + template(value) Response m_Response_3XXonINVITE( + template(value) StatusLine_3xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_3xx_Base := { + msgHeader := { + contact := p_contact + } + } + + } // end group responseSend3xx + + group responseSend4xx { + + template(value) Response m_Response_4xx_Base( + template(value) StatusLine_4xx p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_Dummy := { + statusLine := p_statusLine, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + maxForwards := omit, + toField := p_to, + via := p_via + }, + messageBody := omit, + payload := omit + } + + template(value) Response m_Response_4XXonINVITE( + template(value) StatusLine_4xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_4xx_Base := { + msgHeader := { + contact := p_contact + } + } + + template(value) Response m_Response_4XXonINVITE_UE( + template(value) StatusLine_4xx p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_4xx_Base := { + msgHeader := { + contact := p_contact + } + } + + } // end group responseSend4xx + + template(value) Response m_Response_onCANCEL( + template(value) StatusLine p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_Base := { + } + + template(value) Response m_Response_onMESSAGE_IMS( + template(value) StatusLine p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_Base := { + msgHeader := { + contact := p_contact + } + } + + template(value) Response m_Response_onINVITE( + template(value) StatusLine p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit + ) modifies m_Response_Base := { + msgHeader := { + contact := p_contact + } + } + + template(value) Response m_Response_onINVITE_Reason( + template(value) StatusLine p_statusLine, + template(value) CallId p_callId, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) LibSip_SIPTypesAndValues.Contact p_contact := omit, + template(value) GenValue p_cause + ) modifies m_Response_onINVITE := { + msgHeader := { + reason := mw_Reason(p_cause) + } + } + + template(value) Response m_Response_WWWauthenticate_IMS( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(value) CSeq p_cSeq, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) WwwAuthenticate p_wwwAuthenticate + ) modifies m_Response_Base := { + msgHeader := { + wwwAuthenticate := p_wwwAuthenticate + } + } + + } // end group responseSend + + group responseReceive { + + group responseReceive2xx { + + // NOTE STF471: removed statusline parameter as it is fixed 200 status code + template(present) Response mw_Response_200onINVITE_noPChargingVector_UE( + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ? + ) modifies mw_Response_2xx_Base := { + statusLine := { + sipVersion := c_sipNameVersion, + statusCode := 200, + reasonPhrase := ? + }, + msgHeader := { + pChargingVector := omit + } + } + + // NOTE STF471: removed statusline parameter as it is fixed 200 status code + template(present) Response mw_Response_200onINVITE_SDP_UE( + template (present) CallId p_callId, + template (present) CSeq p_cSeq + ) modifies mw_Response_2xx_Base := { + statusLine := { + sipVersion := c_sipNameVersion, + statusCode := 200, + reasonPhrase := ? + }, + messageBody := { + sdpMessageBody := ? + } + } + + // NOTE STF471: removed statusline parameter as it is a 200.299 status code + template(present) Response mw_Response_2xxonMESSAGE_noPCharging_UE( + template (present) CallId p_callId, + template (present) CSeq p_cSeq + ) modifies mw_Response_2xx_Base := { + msgHeader := { + pChargingFunctionAddresses := omit, + pChargingVector := omit + } + } + + // NOTE STF471: removed statusline parameter as it is a 200..299 status code + template(present) Response mw_Response_2xxonMESSAGE_noPCharging_IMS( + template (present) CallId p_callId, + template (present) CSeq p_cSeq + ) modifies mw_Response_2xxonMESSAGE_noPCharging_UE := { + } + + // NOTE STF471: removed statusline parameter as it is a 200..299 status code + template(present) Response mw_Response_2xxonMESSAGE_noPAccessNetworkInfo_IMS( + template (present) CallId p_callId, + template (present) CSeq p_cSeq + ) modifies mw_Response_2xx_Base := { + msgHeader := { + pAccessNetworkInfo := omit + } + } + + // NOTE STF471: removed statusline parameter as it is a 200..299 status code + template(present) Response mw_Response_2xxonMESSAGE_noPMediaAuthorization_IMS( + template (present) CallId p_callId, + template (present) CSeq p_cSeq + ) modifies mw_Response_2xx_Base := { + msgHeader := { + pMediaAuthorization := omit + } + } + + // NOTE STF471: removed statusline parameter as it is a fixed 200 status code + template(present) Response mw_Response_200onREGISTER_IMS( + template (present) CallId p_callId, + template (present) CSeq p_cSeq, + template SipUrl p_ue_uri, + template LibSip_SIPTypesAndValues.Contact p_contact, + template SipUrl p_sut_scscf_uri + ) modifies mw_Response_2xx_Base := { + statusLine := { + sipVersion := c_sipNameVersion, + statusCode := 200, + reasonPhrase := ? + }, + msgHeader := { + pAssociatedURI := { + fieldName := P_ASSOCIATED_URI_E, + nameAddrList := { + *, + { + nameAddr := { + displayName := *, + addrSpec := p_ue_uri + }, + genericParams := * + }, + * + } + }, + path := ?, + serviceRoute := { + fieldName := SERVICE_ROUTE_E, + routeBody := { + { + nameAddr := { + displayName := *, + addrSpec := p_sut_scscf_uri + }, + rrParam := * + } + } + }, + pChargingFunctionAddresses := ?, + pChargingVector := ?, + contact := p_contact + } + } + + } // end group responseReceive2xx + + group responseReceive4xx { + + // NOTE STF471: removed statusline parameter as it is a fixed 401 status code + template(present) Response mw_Response_401onREGISTER_securityServer_UE( + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_4xx_Base := { + statusLine := { + sipVersion := c_sipNameVersion, + statusCode := 401, + reasonPhrase := ? + }, + msgHeader := { + securityServer := ?, + wwwAuthenticate := ? + } + } + + // NOTE STF471: removed statusline parameter as it is a fixed 400 status code + template(present) Response mw_Response_401onREGISTER_WWWauthenticate_IMS( + template CallId p_callId, + template CSeq p_cSeq, + template(present) WwwAuthenticate p_wwwAuthenticate := ? + ) modifies mw_Response_4xx_Base := { + statusLine := { + sipVersion := c_sipNameVersion, + statusCode := 401, + reasonPhrase := ? + }, + msgHeader := { + wwwAuthenticate := p_wwwAuthenticate + } + } + + } // end group responseReceive4xx + + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_SecServer_WWWAuth_UE( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) SecurityServer p_securityServer := ?, + template WwwAuthenticate p_wwwAuthenticate + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + securityServer := p_securityServer, + wwwAuthenticate := p_wwwAuthenticate + } + } + + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_PpreferredID_PassertedID( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) PPreferredID p_pPreferredID := ?, + template(present) PAssertedID p_pAssertedID := ? + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + pAssertedID := p_pAssertedID, + pPreferredID := p_pPreferredID + } + } + + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_PAsserted_Privacy_History( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) PAssertedID p_pAssertedID := ?, + template(present) Privacy p_privacy := ?, + template(present) HistoryInfo p_historyInfo := ? + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + pAssertedID := p_pAssertedID, + privacy := p_privacy, + historyInfo := p_historyInfo + } + } + + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_PAsserted_ContentType( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) PAssertedID p_pAssertedID := ?, + template(present) ContentType p_contentType := ? + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + pAssertedID := p_pAssertedID, + contentType := p_contentType + } + } + + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_PchargingVector( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) PChargingVector p_chargingVector := ? + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + pChargingVector := p_chargingVector + } + } + + // NOTE STF471: changed name from mw_Response_PchargingVecFctadrId + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_PchargingVector_PchargingFunctionAddr_PpreferredID( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) PChargingVector p_chargingVector := ?, + template(present) PChargingFunctionAddresses p_chargingFunctionAddresses := ?, + template(present) PPreferredID p_preferredID := ? + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + pChargingVector := p_chargingVector, + pChargingFunctionAddresses := p_chargingFunctionAddresses, + pPreferredID := p_preferredID + } + } + + // NOTE STF471: changed statusline parameter to statusCode parameter + template(present) Response mw_Response_PchargingFunctionAddr( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) PChargingFunctionAddresses p_chargingFunctionAddresses := ? + ) modifies mw_Response_StatusCode_Base := { + msgHeader := { + pChargingFunctionAddresses := p_chargingFunctionAddresses + } + } + + } // end group responseReceive + + } // end group modifiedTemplates + + } // end group messageTemplates + +} // end module LibIms_Templates diff --git a/ttcn/patch_lib_iot_titan/module.mk b/ttcn/patch_lib_iot_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..bcb2f7d1517fad0b0ed87055a1f46185e38b28c0 --- /dev/null +++ b/ttcn/patch_lib_iot_titan/module.mk @@ -0,0 +1,10 @@ +sources := \ + LibIot_Functions.ttcn \ + LibIot_TestConfiguration.ttcn \ + LibIot_TypesAndValues.ttcn \ + LibIot_VxLTE_PIXITS.ttcn \ + LibIot_PIXITS.ttcn \ + LibIot_TestInterface.ttcn \ + LibIot_VxLTE_Functions.ttcn \ + LibIot_VxLTE_Templates.ttcn \ + diff --git a/ttcn/patch_lib_msrp_titan/module.mk b/ttcn/patch_lib_msrp_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..d0428b335e44fe24ae55294fd715b5a5785b6352 --- /dev/null +++ b/ttcn/patch_lib_msrp_titan/module.mk @@ -0,0 +1,7 @@ +sources := \ + LibMsrp_Functions.ttcn \ + LibMsrp_PIXITS.ttcn \ + LibMsrp_Templates.ttcn \ + LibMsrp_TypesAndValues.ttcn \ + ../patch_lib_msrp_titan/ttcn/LibMsrp_EncDecDeclarations.ttcn \ + diff --git a/ttcn/patch_lib_msrp_titan/ttcn/LibMsrp_EncDecDeclarations.ttcn b/ttcn/patch_lib_msrp_titan/ttcn/LibMsrp_EncDecDeclarations.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..15f416d51ec44f5e4b53aa6810b062039cde54af --- /dev/null +++ b/ttcn/patch_lib_msrp_titan/ttcn/LibMsrp_EncDecDeclarations.ttcn @@ -0,0 +1,16 @@ +/* + * @author TTF T010 + * @version $Id:$ + * @desc This module provides the functions used by the test component + */ +module LibMsrp_EncDecDeclarations { + + // LibMsrp + import from LibMsrp_TypesAndValues all; + + external function fx_enc_MsrpURI(in MsrpURI p_MsrpURI) return bitstring + with {extension "prototype(convert) encode(MSRPCodec)"} + external function fx_dec_MsrpURI(inout bitstring pdu, out MsrpURI p_MsrpURI) return integer + with {extension "prototype(sliding) decode(MSRPCodec)"} + +} // End of module LibMsrp_EncDecDeclarations \ No newline at end of file diff --git a/ttcn/patch_lib_sip_titan/LibSip_Common.ttcn b/ttcn/patch_lib_sip_titan/LibSip_Common.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..e89697b196c4c3c3124fde88473dcfa7f7bc8335 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_Common.ttcn @@ -0,0 +1,39 @@ +/** + * @author STF160, STF471 + * @version $Id: LibSip_Common.ttcn 488 2014-09-18 10:17:19Z rennoch $ + * @desc This module provides the common definitions for SIP messages. + * This module is part of LibSipV3. +*/ +module LibSip_Common { + + type set length (1..infinity) of charstring Charstring_List; + + // [20.1, 20.3, 20.4, 20.7, 20.9, 20.10, 20.11, 20.18, 20.20, 20.27, 20.28, 20.30, 20.31, + // 20.33, 20.34, 20.39, 20.42, 20.44] + + + type union GenValue { + charstring tokenOrHost, + charstring quotedString + } + + type record GenericParam + { + charstring id, + GenValue paramValue optional + } + + // [?] + type set of GenericParam SemicolonParam_List; + + // [?] + type set of GenericParam AmpersandParam_List; + + // [?] + type set of GenericParam CommaParam_List; + //------------------------------------------------------------------------------ + +} +with { + encode "LibSip V3"; +} // end module LibSip_Common diff --git a/ttcn/patch_lib_sip_titan/LibSip_EncdecDeclarations.ttcn b/ttcn/patch_lib_sip_titan/LibSip_EncdecDeclarations.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..13c0f7830536a7010bf1253be42ca12b995dc55c --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_EncdecDeclarations.ttcn @@ -0,0 +1,120 @@ +module LibSip_EncdecDeclarations { + + import from LibSip_SIPTypesAndValues all; + import from LibSip_SMSTypesAndValues all; + import from LibSip_SimpleMsgSummaryTypes all; + import from LibSip_MessageBodyTypes all; + + external function fx_enc_Request (Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_REGISTER_Request (REGISTER_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_INVITE_Request (INVITE_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_OPTIONS_Request (OPTIONS_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_BYE_Request (BYE_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + + external function fx_enc_CANCEL_Request (CANCEL_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_ACK_Request (ACK_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_PRACK_Request (PRACK_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_NOTIFY_Request (NOTIFY_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_SUBSCRIBE_Request (SUBSCRIBE_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_PUBLISH_Request (PUBLISH_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_UPDATE_Request (UPDATE_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_REFER_Request (REFER_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_MESSAGE_Request (MESSAGE_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_INFO_Request (INFO_Request p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_Response (Response p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_Raw (Raw p) return bitstring + with {extension "prototype(convert) encode(SIPCodec)"} + + external function fx_enc_SMS(SimpleMsgSummary pdu) return bitstring + with { extension "prototype(convert) encode(SIPCodec)" }; + + external function fx_enc_MessageBody(in MessageBody pdu) return bitstring + with { extension "prototype(convert) encode(SIPCodec)" }; + + external function fx_dec_Request (inout bitstring pdu, out Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_REGISTER_Request (inout bitstring pdu, out REGISTER_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_INVITE_Request (inout bitstring pdu, out INVITE_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_OPTIONS_Request (inout bitstring pdu, out OPTIONS_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_BYE_Request (inout bitstring pdu, out BYE_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_CANCEL_Request (inout bitstring pdu, out CANCEL_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_ACK_Request (inout bitstring pdu, out ACK_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_PRACK_Request (inout bitstring pdu, out PRACK_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_NOTIFY_Request (inout bitstring pdu, out NOTIFY_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_SUBSCRIBE_Request (inout bitstring pdu, out SUBSCRIBE_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_PUBLISH_Request (inout bitstring pdu, out PUBLISH_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_UPDATE_Request (inout bitstring pdu, out UPDATE_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_REFER_Request (inout bitstring pdu, out REFER_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_MESSAGE_Request (inout bitstring pdu, out MESSAGE_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_INFO_Request (inout bitstring pdu, out INFO_Request p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_Response (inout bitstring pdu, out Response p) return integer + with {extension "prototype(sliding) decode(SIPCodec)"} + + external function fx_dec_SMS(inout bitstring pdu, out SimpleMsgSummary p) return integer + with { extension "prototype(sliding) decode(SIPCodec)" }; + + external function fx_dec_MessageBody(inout bitstring pdu, out MessageBody p) return integer + with { extension "prototype(sliding) decode(SIPCodec)" }; + +} // End of module module LibSip_EncdecDeclarations diff --git a/ttcn/patch_lib_sip_titan/LibSip_MessageBodyTypes.ttcn b/ttcn/patch_lib_sip_titan/LibSip_MessageBodyTypes.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..066a605b7b0b84fb6752159fe53f57ec31258214 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_MessageBodyTypes.ttcn @@ -0,0 +1,59 @@ +/****************************************************************************** + * @author STF 346, STF366, STF368, STF369, STF450, STF471 + * @version $Id: LibSip_MessageBodyTypes.ttcn 622 2014-07-10 14:50:54Z nikolajev $ + * @desc This module provides the types used for alternative SIP message + * body variants and combinations. + * This module is part of LibSipV3. + */ + +module LibSip_MessageBodyTypes { + import from LibSip_SDPTypes all; + import from LibSip_SimpleMsgSummaryTypes all; + import from LibSip_XMLTypes all; + + /* + * Simple body types that can be used instead of the more detailed XML and SDP + * without codec support + * */ + //type charstring XmlBody; + //type charstring SDP_Message; + type octetstring MsdBody; + + group MIMETypes { + type union MIME_Encapsulated_Parts { + SDP_Message sdpMessageBody, + XmlBody xmlBody, // if there is XML body + MsdBody msdBody // RFC 8147: Minimum Set of Data octets + } + + type record MIME_Encapsulated_Part { + charstring content_type, + charstring content_disposition optional, + charstring content_id optional, + MIME_Encapsulated_Parts mime_encapsulated_part + } + + type record MIME_Message { + charstring boundary, // len: + MimeEncapsulatedList mimeEncapsulatedList + } + + type record of MIME_Encapsulated_Part MimeEncapsulatedList; + + + } // group MIMETypes + + type union MessageBody { + SDP_Message sdpMessageBody, // if there is only SDP part + // XMLMessage xmlMessage, // if there is XML message (with header and body) + XmlBody xmlBody, // if there is XML body + MIME_Message mimeMessageBody, // if there is SDP and encapsulated ISUP part + charstring sipfrag, // if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2) + charstring textplain, // if content type is text/plain (for testing long messages) + SimpleMsgSummary simpleMsgSummary, // RFC 3842 + octetstring smsMessage // encoded SMS message 3GPP 23.040, 24.011 + } +} +with { + encode "SIPCodec"; variant ""; +} diff --git a/ttcn/patch_lib_sip_titan/LibSip_PIXITS.ttcn b/ttcn/patch_lib_sip_titan/LibSip_PIXITS.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..506cb03bdab8806435ef0d159b7f3415602bf670 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_PIXITS.ttcn @@ -0,0 +1,143 @@ +/** + * @author STF 346, STF366, STF368, STF369, STF450, STF471 + * @version $Id$ + * @desc This module provides module parameters used within the SIP + * protocol for timers, SDP formats etc. + * This module is part of LibSipV3. + */ +module LibSip_PIXITS { + // LibCommon + import from LibCommon_BasicTypesAndValues all; + import from LibCommon_DataStrings all; + + // ____________________________ PIXIT-S_______________________________ + group SIP_PIXITparameters { + group SDPParameter { + + /** + * @desc charstring for SDP user name + */ + modulepar charstring PX_SIP_SDP_USER_NAME := "voicesession"; + + /** + * @desc charstring for SDP session identifier + */ + modulepar charstring PX_SIP_SDP_SESSION_ID := "30000"; + + /** + * @desc charstring for SDP dynamic port + */ + modulepar charstring PX_SIP_SDP_DYN := "0"; + + /** + * @desc charstring for SDP bandwidth modifier + */ + modulepar charstring PX_SIP_SDP_B_MODIFIER := "AS"; + + /** + * @desc integer for SDP bandwidth value + */ + modulepar integer PX_SIP_SDP_B_BANDWIDTH := 64; + + /** + * @desc charstring for SDP media attribute encoding supported by the IUT + */ + modulepar charstring PX_SIP_SDP_ENCODING := "PCMU"; + + /** + * @desc charstring for SDP media attribute encoding clockrate supported by the IUT + */ + modulepar charstring PX_SIP_SDP_CLOCKRATE := "8000"; + + } // group SDP Parameter + group XMLCOnfiguration{ + + /** + * @desc boolean for MessageBody length calculation based on encvalue operation result + */ + modulepar boolean PX_MB_LENGTH_FROM_ENCVAL := true; + + /** + * @desc boolean for MessageBody length calculation to be performed by external function + */ + modulepar boolean PX_USE_FX_FOR_XML_LENGTH := false; + } + + group SupportedOptions { + + /** + * @desc charstring for Used Transport in upper case "UDP"/"TCP" + */ + modulepar charstring PX_SIP_TRANSPORT := "UDP"; + + + } // group SupportedOptions{ + + group RegistrationParameters { + + /** + * @desc boolean for the SIP user if it have to register itself before executing a test case + */ + modulepar boolean PX_SIP_REGISTRATION := false; + + /** + * @desc charstring for PX_AUTH_ALGORITHM security algorithm Possible values: MD5 or AKAv1-MD5 + */ + modulepar charstring PX_AUTH_ALGORITHM := "AKAv1-MD5"; + + + } // group Registration parameters + + group SwitchToEnableAuthentication { + /** + * @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages + */ + modulepar boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true; + + /** + * @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages + */ + modulepar boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false; + + + } // group SwitchToEnableAuthentication + + group SIP_Timers { + /** + * @desc float for TWait default value for waiting an operator action + */ + modulepar float PX_SIP_TWAIT := 30.0; + + /** + * @desc float for TAck default value for waiting an acknowledgement + */ + modulepar float PX_SIP_TACK := 8.0; + + /** + * @desc float for TResp default value for waiting for a response from the IUT + */ + modulepar float PX_SIP_TRESP := 15.0; + + /** + * @desc float for TNoAct default value for waiting no message from the IUT Value given for PX_TNOACT should be less than value of SHORT_REGISTRATION constant (which is currently "3" (seconds)) + */ + modulepar float PX_SIP_TNOACT := 1.0; + + } // group SIP_Timers + + group MimePart { + /** + * @desc charstring for delimiter value used in mime multipart message to separate message body parts + */ + modulepar charstring PX_SIP_MIME_BOUNDARY := "boundary1"; + + } // group MimePart + + } // group SIP_PIXITparameters + + /** + * @desc Set to true to force fixed random value (debug mode) + */ + modulepar boolean PX_SEED := false; + +} // end module LibSip_PIXITS diff --git a/ttcn/patch_lib_sip_titan/LibSip_SDPTypes.ttcn b/ttcn/patch_lib_sip_titan/LibSip_SDPTypes.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..a6d121ffa5e52d43af8d7ba320dfe5063c2fd4df --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_SDPTypes.ttcn @@ -0,0 +1,402 @@ +/** + * @author STF 346, STF366, STF368, STF369, STF450, STF471 + * @version $Id$ + * @desc This module defines message, attribute, structured and simple + * SDP types as well constants used by LipSip constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * This module is part of LibSipV3. + * @remark Adding of new attributes types is ok; Adding of new optional attributes in @see SDP_attribute type is ok; Existing attribute types shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org + */ +module LibSip_SDPTypes { + import from LibSip_Common all; + group Constants { + group SimpleConstants { + // SDP net_type + const charstring c_in := "IN"; + + // SDP addr_type + const charstring c_ip4 := "IP4"; + const charstring c_ip6 := "IP6"; + + // SDP_media_desc: media + const charstring c_audio := "audio"; + const charstring c_image := "image"; + const charstring c_video := "video"; + const charstring c_text := "text"; + const charstring c_msrp := "msrp"; + + // SDP_media_desc: transport + const charstring c_rtpAvp := "RTP/AVP"; + const charstring c_rtpAvpf := "RTP/AVPF"; + const charstring c_msrpTcp := "TCP/MSRP"; + const charstring c_udptl := "Udptl"; + + // SDP_attribute_list constants: + const charstring c_local := "local"; + const charstring c_mandatory := "mandatory"; + const charstring c_optional := "optional"; + const charstring c_none := "none"; + const charstring c_qos := "qos"; + const charstring c_remote := "remote"; + const charstring c_sendrecv := "sendrecv"; + const charstring c_sendonly := "sendonly"; + const charstring c_inactive := "inactive"; + const charstring c_send := "send"; + const charstring c_recv := "recv"; + const charstring c_e2e := "e2e"; + } + } + group Types { + group SubTypes { + group AttributeTypes { + type record SDP_attribute_cat { + charstring attr_value + } + + type record SDP_attribute_keywds { + charstring attr_value + } + + type record SDP_attribute_tool { + charstring attr_value + } + + type record SDP_attribute_ptime { + charstring attr_value + } + + type record SDP_attribute_recvonly { + } + + type record SDP_attribute_sendrecv { + } + + type record SDP_attribute_sendonly { + } + + type record SDP_attribute_inactive { + } + + type record SDP_attribute_orient { + charstring attr_value + } + + type record SDP_attribute_type { + charstring attr_value + } + + type record SDP_attribute_charset { + charstring attr_value + } + + type record SDP_attribute_sdplang { + charstring attr_value + } + + type record SDP_attribute_lang { + charstring attr_value + } + + type record SDP_attribute_framerate { + charstring attr_value + } + + type record SDP_attribute_quality { + charstring attr_value + } + + type union SDP_attribute_fmtp_format_specific_params { + SemicolonParam_List paramList, + charstring unstructured + } + + type record SDP_attribute_fmtp { + charstring format, + SDP_attribute_fmtp_format_specific_params params + } + + type record SDP_attribute_curr { + charstring preconditionType, + charstring statusType, + charstring direction + } + + type record SDP_attribute_des { + charstring preconditionType, + charstring strength, + charstring statusType, + charstring direction + } + + type record SDP_attribute_conf { + charstring preconditionType, + charstring statusType, + charstring direction + } + + type record SDP_attribute_rtpmap_codec { + charstring encoding, + charstring clockrate, + charstring parameters optional + } + + type record SDP_attribute_rtpmap { + charstring payload_type, + SDP_attribute_rtpmap_codec codec + } + + type record SDP_attribute_rtcp { + integer portnumber, + SDP_connection connection optional + } + + type record SDP_attribute_msrp { + charstring attr_value + } + + type record SDP_attribute_unknown { + charstring name, + charstring attr_value optional + } + + type record SDP_attribute_maxptime { + charstring attr_value + } + + type record SDP_attribute_tcap { + integer trpr_cap_num, + Charstring_List proto_list + } + + type record SDP_attribute_pcfg { + integer config_number, + Charstring_List pot_cfg_list optional + } + + type record SDP_attribute_acfg { + integer config_number, + Charstring_List sel_cfg_list optional + } + + type record SDP_attribute_ecn_capable_rtp { + Charstring_List init_list, + Charstring_List parm_list optional + } + + type record SDP_attribute_rtcp_fb { + charstring rtcp_fb_pt, + charstring rtcp_fb_val + } + + type record SDP_attribute_rtcp_xr { + Charstring_List xr_format_list optional + } + + type record SDP_attribute_rtcp_rsize { + } + + type record SDP_attribute_3ge2ae { + charstring indicator + } + + type record SDP_attribute_crypto { + charstring tag, + charstring crypto_suite, + charstring key_params, + Charstring_List session_params optional + } + + type record SDP_attribute_content { + Charstring_List content_params + } + + type record SDP_attribute_keymgmt { + charstring prtcl_id, + charstring data + } + + type union SDP_attribute { + SDP_attribute_cat cat, + SDP_attribute_keywds keywds, + SDP_attribute_tool tool, + SDP_attribute_ptime ptime, + SDP_attribute_recvonly recvonly, + SDP_attribute_sendrecv sendrecv, + SDP_attribute_sendonly sendonly, + SDP_attribute_inactive inactive, + SDP_attribute_orient orient, + SDP_attribute_type sdp_type, + SDP_attribute_charset charset, + SDP_attribute_sdplang sdplang, + SDP_attribute_lang lang, + SDP_attribute_framerate framerate, + SDP_attribute_quality quality, + SDP_attribute_fmtp fmtp, + SDP_attribute_curr curr, + SDP_attribute_des des, + SDP_attribute_conf conf, + SDP_attribute_rtpmap rtpmap, + SDP_attribute_rtcp rtcp, + SDP_attribute_msrp msrp, + SDP_attribute_maxptime maxptime, + SDP_attribute_tcap tcap, + SDP_attribute_pcfg pcfg, + SDP_attribute_acfg acfg, + SDP_attribute_ecn_capable_rtp ecn_capable_rtp, + SDP_attribute_rtcp_fb rtcp_fb, + SDP_attribute_rtcp_xr rtcp_xr, + SDP_attribute_rtcp_rsize rtcp_rsize, + SDP_attribute_3ge2ae e2ae, + SDP_attribute_crypto crypto, + SDP_attribute_content content, + SDP_attribute_keymgmt keymgmt, + //* unknown has to be the last else encoding/decoding won't work! + SDP_attribute_unknown unknown + } + + } //* group AttributeTypes + + type set of SDP_attribute SDP_attribute_list; + + type record SDP_bandwidth { + charstring modifier, + integer bandwidth + } + + type set of SDP_bandwidth SDP_bandwidth_list; + + type record SDP_connection { + charstring net_type, + charstring addr_type, + SDP_conn_addr conn_addr + } + + type record SDP_conn_addr { + charstring addr, + integer ttl optional, + integer num_of_addr optional + } + + type set of SDP_connection SDP_connection_list; + + type record SDP_contact { + charstring addr_or_phone, + charstring disp_name optional + } + + type SDP_contact SDP_contact_tel; + + type SDP_contact SDP_contact_email; + + type set of SDP_contact_email SDP_email_list; + + type record of charstring SDP_fmt_list; + + type record SDP_key { + charstring method, + charstring key optional + } + + type record SDP_media_desc { + SDP_media_field media_field, + charstring information optional, + SDP_connection_list connections optional, + SDP_bandwidth_list bandwidth optional, + SDP_key key optional, + SDP_attribute_list attributes optional + } + + type set of SDP_media_desc SDP_media_desc_list; + + type record SDP_media_port { + integer port_number, + integer num_of_ports optional + } + + type record SDP_media_field { + charstring media, + SDP_media_port ports, + charstring transport, + SDP_fmt_list fmts + } + + type record SDP_time { + SDP_time_field time_field, + SDP_repeat_list time_repeat optional + } + + type record SDP_time_field { + charstring start_time, + //* field is numeric strings that may not fit into 32-bit signed int + charstring + stop_time //* field is numeric strings that may not fit into 32-bit signed int + } + + type record SDP_repeat { + SDP_typed_time repeat_interval, + SDP_typed_time active, + SDP_typed_time_list offsets + } + + type set of SDP_repeat SDP_repeat_list; + + type record SDP_typed_time { + integer time, + charstring unit optional + } + + type set of SDP_typed_time SDP_typed_time_list; + + type set of SDP_time SDP_time_list; + + type record SDP_timezone { + charstring adjustment_time, + SDP_typed_time offset + } + + type set of SDP_timezone SDP_timezone_list; + + type record SDP_Origin { + charstring user_name, + charstring session_id, + //* field is numeric strings that may not fit into 32-bit signed int + charstring session_version, + //* field is numeric strings that may not fit into 32-bit signed int + charstring net_type, + charstring addr_type, + charstring addr + } + + type set of SDP_contact_tel SDP_phone_list; + + } //* group SubTypes + + + group MessageTypes { + type record SDP_Message { + integer protocol_version, + SDP_Origin origin, + charstring session_name, + charstring information optional, + charstring uri optional, + SDP_email_list emails optional, + SDP_phone_list phone_numbers optional, + SDP_connection connection optional, + SDP_bandwidth_list bandwidth optional, + SDP_time_list times, + SDP_timezone_list timezone_adjustments optional, + SDP_key key optional, + SDP_attribute_list attributes optional, + SDP_media_desc_list media_list optional + } + with { + encode "SDPCodec"; + } + + } // group MessageTypes + + } // group Types +} // end module LibSip_SDPTypes diff --git a/ttcn/patch_lib_sip_titan/LibSip_SIPTypesAndValues.ttcn b/ttcn/patch_lib_sip_titan/LibSip_SIPTypesAndValues.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..c3af534ed50fb7bbf05438441451ec7aa342c513 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_SIPTypesAndValues.ttcn @@ -0,0 +1,1984 @@ +/** + * @author STF 346, STF366, STF368, STF369, STF450, STF471, STF160 + * @version $Id$ + * @desc This module defines message, header, structured and simple SIP + * types as well constants used by LipSip constructs.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions + * This module is part of LibSipV3. + * @remark Adding of new message and header types is ok; Adding of new optional header fields in + * @see MessageHeader type is ok but should be done at same time as dummy template updates; Existing message or header types shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org + */ +module LibSip_SIPTypesAndValues { + import from LibSip_MessageBodyTypes all; + import from LibSip_Common all; + + group Constants { + group SimpleConstants { + // SIP name protocol plus version + const charstring c_sipNameVersion := "SIP/2.0"; + + // SIP name protocol + const charstring c_sipName := "SIP"; + + // SIP version + const charstring c_sipVersion := "2.0"; + + // SIP scheme + const charstring c_sipScheme := "sip"; + + // TEL scheme + const charstring c_telScheme := "tel"; + + // URN schema + const charstring c_urnScheme := "urn"; + + // TAG_ID + const charstring c_tagId := "tag"; + + // BRANCH_ID + const charstring c_branchId := "branch"; + + // BRANCH_COOKIE + const charstring c_branchCookie := "z9hG4bK"; + + // EXPIRES_ID + const charstring c_expiresId := "expires"; + + // MADDR_ID + const charstring c_maddrId := "maddr"; + + // METHOD_ID + const charstring c_methodId := "method"; + + // RECEIVED_ID + const charstring c_receivedId := "received"; + + // TTL_ID + const charstring c_ttlId := "ttl"; + + // USER_ID + const charstring c_userId := "user"; + + // SDP name application + const charstring c_sdpApplication := "application/sdp"; + + // XML name application + const charstring c_xmlApplication := "application/xml"; + + // XML name application + const charstring c_xmlreginfoApplication := "application/reginfo+xml"; + + // XML name resource-list + const charstring c_xmlresourcelistApplication := "application/resource-lists+xml"; + + // IMS 3GPP name application + const charstring c_ims3gppApplication := "application/3gpp-ims+xml"; + + // IMS 3GPP name CW application + const charstring c_ims3gppCwApplication := "application/vnd.3gpp.cw+xml"; + + // IMS ETSI name MCID application + const charstring c_imsEtsiMcidApplication := "application/vnd.etsi.mcid+xml"; + + // IMS ETSI name CUG application + const charstring c_imsEtsiCugApplication := "application/vnd.etsi.cug+xml"; + + // IMS ETSI name Simservs application(TIP/TIR, ACR, CDIV, OIP/OIR, CUG) + const charstring c_imsEtsiSimservsApplication := "application/vnd.etsi.simservs+xml"; + + // OCTET-STREAM name application + const charstring c_octetApplication := "application/octet-stream"; + + // PLAIN-TEXT name application + const charstring c_plainText := "text/plain"; + + // SIP fragment message + const charstring c_sipfragMessage := "message/sipfrag"; + + // text content of 1300 bytes for messages with message body + const charstring c_longMessageContent_1300Bytes := + "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & + "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" & oct2char('0D'O) & oct2char('0A'O); // CRLF + // Default SIP port number : 5060 + const integer c_defaultSipPort := 5060; + + // Default SIP protocol : UDP + const charstring c_defaultSipProt := "UDP"; + + // Fixed IP multicast address + const charstring c_mcastSipIpaddr := "224.0.1.75"; + + // Short delta-second used in expires parameter to acknowledge a registration + const charstring c_shortRegistration := "3600"; + + // ([RFC3891 ] Sec 6.1) + const charstring c_earlyFlag := "early-only"; + + // option tag replaces ([RFC3261 ] ) + const charstring c_replaces := "replaces"; + + // option tag 100rel (reliable provisional response [RFC3262 ] ) + const charstring c_tag100rel := "100rel"; + + // option tag from-change ([RFC4916 ] ) + const charstring c_tagFromChange := "from-change"; + + // option tag precondition (ch.11 [RFC3312 ] ) + const charstring c_tagPrecond := "precondition"; + + // due to problem with TAU compiler because hardcoded return statement constant is created + const HostPort c_hostport_dummy := { + host := "", + portField := c_defaultSipPort + }; + + // CLIP/CLIR information + const PrivacyValue c_privacy_none := "none"; + const PrivacyValue c_privacy_id := "id"; + const PrivacyValue c_privacy_header := "header"; + const PrivacyValue c_privacy_user := "user"; + const PrivacyValue c_privacy_critical := "critical"; + const PrivacyValue c_privacy_session := "session"; + + // + const charstring c_AT := "@"; // MRO + const charstring c_SP := oct2char('20'O); + const charstring c_SLASH := oct2char('2F'O); + const charstring c_LT := oct2char('3C'O); + const charstring c_GT := oct2char('3E'O); + + // * (wildchard) sign + const charstring c_WILDCARD := "*"; + + const integer c_CRlen := 2; + // length of new line (0d0a) + const GenericParam c_Integrity_protected_yes := {"integrity-protected", {tokenOrHost := "yes"}}; + const GenericParam c_Integrity_protected_no := {"integrity-protected", {tokenOrHost := "no"}}; + const GenericParam c_Integrity_protected_ip_assoc_pending := {"integrity-protected", {tokenOrHost := "ip-assoc-pending"}}; + + const charstring c_algorithm := "MD5"; + + } // end group SimpleConstants + + group AuthorizationConstants { + + const charstring c_ik := ""; + const charstring c_ck := ""; + const charstring c_nonce := ""; + const charstring c_nonce_value := "0edff6c521cc3f407f2d9e01cf6ed82b"; + + + } // end group AuthorizationConstants + + group PChargingVectorConstants { + + const charstring c_icid := "icid-value"; + const charstring c_icid_value := "123abc"; + const charstring c_icid_generated_at := "icid-generated-at"; + const charstring c_orig_ioi := "orig-ioi"; + const charstring c_term_ioi := "term-ioi"; + const charstring c_access_network_charging_info := "access-network-charging-info"; + + + } // end group PChargingVectorConstants + + group HeaderFieldConstants { + + const CallId c_empty_CallId := { + fieldName := CALL_ID_E, + callid := "" + }; + + const ContentType c_empty_ContentType := { + fieldName := CONTENT_TYPE_E, + mTypeSubtype := "", + mParams := omit + }; + + const CSeq c_empty_cSeq := { + fieldName := CSEQ_E, + seqNumber := 0, + method := "EMPTY" + }; + + const From c_empty_From := { + fieldName := FROM_E, + addressField := { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := "127.0.0.1", + portField := c_defaultSipPort + } + } + }, + urlParameters := omit, + headers := omit + } + } + }, + fromParams := omit + }; + + const MaxForwards c_maxForwards70 := { + fieldName := MAX_FORWARDS_E, + forwards := 70 + }; + + const SipUrl c_empty_RequestUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := "127.0.0.1", + portField := c_defaultSipPort + } + } + }, + urlParameters := omit, + headers := omit + }; + + const SipUrl c_unavailableUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "unavailable", + password := omit + }, + hostPort := { + host := "anonymous.invalid", + portField := c_defaultSipPort + } + } + }, + urlParameters := omit, + headers := omit + }; + + const To c_empty_To := { // value of To header + fieldName := TO_E, + addressField := { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := "127.0.0.1", + portField := c_defaultSipPort + } + } + }, + urlParameters := omit, + headers := omit + } + } + }, + toParams := omit + }; + + const Via c_empty_Via := { + fieldName := VIA_E, + viaBody := { + { + sentProtocol := { + protocolName := c_sipName, + protocolVersion := c_sipVersion, + transport := c_defaultSipProt + }, + sentBy := { + host := "127.0.0.1", + portField := c_defaultSipPort + }, + viaParams := omit + } + } + }; + + + } + + + group UserProfileConstants { + // number of user profile from 1-10 for SIP profile + const integer c_userProfile_SIP1_home := 1; + const integer c_userProfile_SIP2_home := 2; + + + } // end group UserProfileConstants + + group StatusLines { + const StatusLine c_statusLine100 := {c_sipNameVersion, 100, "Trying"}; + const StatusLine c_statusLine180 := {c_sipNameVersion, 180, "Ringing"}; + const StatusLine c_statusLine181 := {c_sipNameVersion, 181, "Call Is Being Forwarded"}; + const StatusLine c_statusLine182 := {c_sipNameVersion, 182, "Queued"}; + const StatusLine c_statusLine183 := {c_sipNameVersion, 183, "Session Progress"}; + + const StatusLine c_statusLine200 := {c_sipNameVersion, 200, "OK"}; + const StatusLine c_statusLine202 := {c_sipNameVersion, 202, "Accepted"}; + + const StatusLine c_statusLine300 := {c_sipNameVersion, 300, "Multiple Choices"}; + const StatusLine c_statusLine301 := {c_sipNameVersion, 301, "Moved Permanently"}; + const StatusLine c_statusLine302 := {c_sipNameVersion, 302, "Moved Temporarily"}; + const StatusLine c_statusLine305 := {c_sipNameVersion, 305, "Use Proxy"}; + const StatusLine c_statusLine380 := {c_sipNameVersion, 380, "Alternative Service"}; + + const StatusLine c_statusLine400 := {c_sipNameVersion, 400, "Bad Request"}; + const StatusLine c_statusLine401 := {c_sipNameVersion, 401, "Unauthorized"}; + const StatusLine c_statusLine402 := {c_sipNameVersion, 402, "Payment Required"}; + const StatusLine c_statusLine403 := {c_sipNameVersion, 403, "Forbidden"}; + const StatusLine c_statusLine404 := {c_sipNameVersion, 404, "Not Found"}; + const StatusLine c_statusLine405 := {c_sipNameVersion, 405, "Method Not Allowed"}; + const StatusLine c_statusLine406 := {c_sipNameVersion, 406, "Not Acceptable"}; + const StatusLine c_statusLine407 := {c_sipNameVersion, 407, "Proxy Authentication Required"}; + const StatusLine c_statusLine408 := {c_sipNameVersion, 408, "Request Timeout"}; + const StatusLine c_statusLine410 := {c_sipNameVersion, 410, "Gone"}; + const StatusLine c_statusLine413 := {c_sipNameVersion, 413, "Request Entity Too Large"}; + const StatusLine c_statusLine414 := {c_sipNameVersion, 414, "Request-URI Too Long"}; + const StatusLine c_statusLine415 := {c_sipNameVersion, 415, "Unsupported Media Type"}; + const StatusLine c_statusLine416 := {c_sipNameVersion, 416, "Unsupported URI Scheme"}; + const StatusLine c_statusLine420 := {c_sipNameVersion, 420, "Bad Extension"}; + const StatusLine c_statusLine421 := {c_sipNameVersion, 421, "Extension Required"}; + const StatusLine c_statusLine422 := {c_sipNameVersion, 422, "Session Interval Too Small"}; + const StatusLine c_statusLine423 := {c_sipNameVersion, 423, "Interval Too Brief"}; + const StatusLine c_statusLine433 := {c_sipNameVersion, 433, "Anonymity Disallowed"}; + const StatusLine c_statusLine480 := {c_sipNameVersion, 480, "Temporarily Unavailable"}; + const StatusLine c_statusLine481 := {c_sipNameVersion, 481, "Call/Transaction Does Not Exist"}; + const StatusLine c_statusLine482 := {c_sipNameVersion, 482, "Loop Detected"}; + const StatusLine c_statusLine483 := {c_sipNameVersion, 483, "Too Many Hops"}; + const StatusLine c_statusLine484 := {c_sipNameVersion, 484, "Address Incomplete"}; + const StatusLine c_statusLine485 := {c_sipNameVersion, 485, "Ambiguous"}; + const StatusLine c_statusLine486 := {c_sipNameVersion, 486, "Busy Here"}; + const StatusLine c_statusLine487 := {c_sipNameVersion, 487, "Request Terminated"}; + const StatusLine c_statusLine488 := {c_sipNameVersion, 488, "Not Acceptable Here"}; + const StatusLine c_statusLine493 := {c_sipNameVersion, 493, "Undecipherable"}; + const StatusLine c_statusLine500 := {c_sipNameVersion, 500, "Server Internal Error"}; + const StatusLine c_statusLine501 := {c_sipNameVersion, 501, "Not implemented"}; + const StatusLine c_statusLine502 := {c_sipNameVersion, 502, "Bad Gateway"}; + const StatusLine c_statusLine503 := {c_sipNameVersion, 503, "Service Unavailable"}; + const StatusLine c_statusLine504 := {c_sipNameVersion, 504, "Server Time-out"}; + const StatusLine c_statusLine505 := {c_sipNameVersion, 505, "Version Not Supported"}; + const StatusLine c_statusLine513 := {c_sipNameVersion, 513, "Message Too Large"}; + const StatusLine c_statusLine580 := {c_sipNameVersion, 580, "Precondition Failure"}; + const StatusLine c_statusLine600 := {c_sipNameVersion, 600, "Busy Everywhere"}; + const StatusLine c_statusLine603 := {c_sipNameVersion, 603, "Decline"}; + const StatusLine c_statusLine604 := {c_sipNameVersion, 604, "Does Not Exist Anywhere"}; + const StatusLine c_statusLine606 := {c_sipNameVersion, 606, "Not Acceptable"}; + + + } // end StatusLines + + group SIPSyncPointNames { + const charstring c_Ringing := "Ringing"; + const charstring c_uPlane := "uPlane"; + const charstring c_sync1 := "sync1"; + const charstring c_sync2 := "sync2"; + const charstring c_sync3 := "sync3"; + const charstring c_sync4 := "sync4"; + const charstring c_uPlaneStop := "uPlaneStop"; + const charstring c_annoucA := "announcementA"; + const charstring c_annoucB := "announcementB"; + const charstring c_annouc := "announcement"; + const charstring c_voicem := "voiceMessage"; + } + + + } // end group Constants + + group Types { + group SubTypes { + // Subtypes + group TokenTypes // TokensTypes + { + // [20 ] + type enumerated FieldName { + ACCEPT_E, + ACCEPT_ENCODING_E, + ACCEPT_LANGUAGE_E, + ALERT_INFO_E, + ALLOW_E, + AUTHENTICATION_INFO_E, + AUTHORIZATION_E, + CALL_ID_E, + CALL_INFO_E, + CONTACT_E, + CONTENT_DISPOSITION_E, + CONTENT_ENCODING_E, + CONTENT_LANGUAGE_E, + CONTENT_LENGTH_E, + CONTENT_TYPE_E, + CSEQ_E, + DATE_E, + ERROR_INFO_E, + EXPIRES_E, + FROM_E, + IN_REPLY_TO_E, + MAX_FORWARDS_E, + MIME_VERSION_E, + MIN_EXPIRES_E, + ORGANIZATION_E, + PRIORITY_E, + PROXY_AUTHENTICATE_E, + PROXY_AUTHORIZATION_E, + PROXY_REQUIRE_E, + RECORD_ROUTE_E, + REPLY_TO_E, + REQUIRE_E, + RETRY_AFTER_E, + ROUTE_E, + SERVER_E, + SUBJECT_E, + SUPPORTED_E, + TIMESTAMP_E, + TO_E, + UNSUPPORTED_E, + USER_AGENT_E, + VIA_E, + WARNING_E, + WWW_AUTHENTICATE_E, + // [3262/7.1 ] + RACK_E, + RSEQ_E, + // [3265/7.2 ] + ALLOW_EVENTS_E, + EVENT_E, + SUBSCRIPTION_STATE_E, + // [3313 ] + P_MEDIA_AUTHORIZATION_E, + // [3323 ] + PRIVACY_E, + // [3325 ] + P_ASSERTED_ID_E, + P_PREFERRED_ID_E, + P_PREFERRED_SERVICE_E, + // [3326 ] + REASON_E, + // [3515 ] - REFER method + REFER_TO_E, + // [4488 ] - REFER method + REFER_SUB_E, + // [3891 ] + REPLACES_E, + // [3892 ] - REFER method + REFERRED_BY_E, + // [4244 ] + HISTORY_INFO_E, + // [3313 ] + P_MEDIA_AUTH_E, + // [3327 ] + PATH_E, + // [3329 ] + SECURITY_CLIENT_E, + SECURITY_SERVER_E, + SECURITY_VERIFY_E, + // [3455 ] + P_ACCESS_NETWORK_INFO_E, + P_ASSOCIATED_URI_E, + P_CALLED_PARTY_E, + P_CHARGING_FUNCTION_ADDRESSES_E, + P_CHARGING_VECTOR_E, + P_VISITED_NETWORK_E, + // [3608 ] + SERVICE_ROUTE_E, + // [3841 ] + ACCEPT_CONTACT_E, + REQUEST_DISPOSITION_E, + // [4028 ] + MIN_SE_E, + SESSION_EXPIRES_E, + P_ASSERTED_SERVICE_E, + // [5009 ] + P_EARLY_MEDIA_E, + // http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07 + // Transporting User to User Call Control Information in SIP for ISDN Interworking + USER_TO_USER_E, + // [6442 ] /* + GEOLOCATION_E, + GEOLOCATION_ROUTING_E, + SESSION_ID_E, + SIP_ETAG_E, + SIP_IF_MATCH_E, + FEATURE_CAPS_E, + // 6086 + RECV_INFO_E, + INFO_PACKAGE_E, + // 2616 + HOST_E, + // + RESOURCE_PRIORITY_E, //4412 + ANSWER_MODE_E, //5373 + PRIV_ANSWER_MODE_E, //5373 + TARGET_DIALOG_E, //4538 + P_ANSWER_STATE_E //4964 + } + + // [7.1 ] + type enumerated Method { + ACK_E, + BYE_E, + CANCEL_E, + INVITE_E, + OPTIONS_E, + REGISTER_E, + PRACK_E // Note: this element is not defined in [5 ] + , + SUBSCRIBE_E, + NOTIFY_E // [3265 ] + , + PUBLISH_E // [3903/12 ] + , + REFER_E // [3515 ] + , + UPDATE_E // [3311 ] + , + MESSAGE_E // [3428 ] + , + INFO_E // [2976 ] + , + UNKNOWN_METHOD_E + } + + // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39, 20.42, 20.43 ] + type record HostPort { + charstring host optional, // hostname, IPv4 or IPv6 + integer portField optional // represented as an integer + } + + // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ] + /** + * @desc identifier for user or telephone subscriber + * @member userOrTelephoneSubscriber provides the username or a phone name identifying the subscriber + * @member password related password information + */ + type record UserInfo { + charstring userOrTelephoneSubscriber, + charstring password optional + } + + // [19.1.1 ;used in: 20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ] + /** + * @desc Uniform Resource Identifier (URI) + * @member scheme distinguishes call types, e.g. voice, fax etc. or related address scheme, e.g. tel, sip + * @member userInfo Contains user information (also in non-SIP URLs) with optional parameter as passwords + * @member hostPort Hostname or IP address information and port identifier of the target + * @member urlParameters Contains either SIP or TEL URL parameters, separated by semicolons, e.g. transport=tcp or user=phone + * @member headers Additional information added after the parameters, e.g. priority=urgent + */ + type record SipUriComponents { // sip-uri acc. to RFC 3261 cl. 19.1 + UserInfo userInfo optional, + HostPort hostPort + } + + type record TelUriComponents { // tel-uri acc. to RFC 3966 + charstring subscriber + } + + type record UrnUriComponents { // urn-uri acc. to RFC 2141 + charstring namespaceId, // e.g. "service" as acc. to RFC 5031 + charstring namespaceSpecificString // e.g. "sos" + } + + type union UriComponents { + SipUriComponents sip, // scheme: "sip" or sips" + TelUriComponents tel, // scheme: "tel" + UrnUriComponents urn, // scheme: "urn" + charstring other // scheme: none of the above schemes + } + + type record SipUrl { + charstring scheme, // e.g "sip" or "tel" + UriComponents components, // corresponding to the scheme + SemicolonParam_List urlParameters optional, + AmpersandParam_List headers optional + } + + // [20.1, RFC2616 14.1 ] + type record AcceptBody { + charstring mediaRange, + SemicolonParam_List acceptParam optional + } + + // [20.1, RFC2616 14.1 ] + type set of AcceptBody AcceptBody_List; + + // [20.4 ] + type record AlertInfoBody { + charstring url, // any URI + SemicolonParam_List genericParams optional + } + + // [20.4 ] + type set of AlertInfoBody AlertInfoBody_List; + + // [20.8 ] + type charstring CallidString; + // token [" + // [20.8 ] + type set of CallidString CallidString_List; + + // [20.9 ] + type record CallInfoBody { + charstring url, // any URI + SemicolonParam_List infoParams optional + } + + // [20.9 ] + type set of CallInfoBody CallInfoBody_List; + + // [20.27, 20.44, .......10.32, 10.48; RFC2616 14.33, 14.47; RFC2617 1.2 ] + type union Challenge { + CommaParam_List digestCln, + OtherAuth otherChallenge + } + + // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ] + type union DisplayName + { + charstring token, + charstring quotedString + } + + // [20.10, 20.20, 20.30, 20.31, 20.34, 20.39 ] + type record NameAddr { + DisplayName displayName optional, + SipUrl addrSpec + } + + // [20.10, 20.20, 20.31, 20.39 ] + type union Addr_Union { + NameAddr nameAddr, + SipUrl addrSpecUnion // STS: "Union" added to filed name to avoid dangerous name equivalence with 2nd NameAddr field + } + + // [20.10 ] + type record ContactAddress { + Addr_Union addressField, + SemicolonParam_List contactParams optional + } + + // [20.10 ] + type set of ContactAddress ContactAddress_List; // 1 or more elements + // [20.10 ] + type union ContactBody { + charstring wildcard, + ContactAddress_List contactAddresses + } + + // [20.2, 20.12; RFC2616 14.3, 14.11 ] + type charstring ContentCoding; + + // [20.2, 20.12; RFC2616 14.3, 14.11 ] + type set of ContentCoding ContentCoding_List; + + // [20.7, 20.28; RFC2616 14.35 RFC2617 1.2 ] + type union Credentials { + CommaParam_List digestResponse, + OtherAuth otherResponse + } + + // allow multiple Authorization headers due to RFC3261 ch. 20.7 and 20.28 + type record of Credentials CredentialsList; + + // [20.19, 20.23, 20.33 ] + type charstring DeltaSec; // an external operation can handle this field + // [20.18 ] + type record ErrorInfoBody { + charstring uri, // any URI + SemicolonParam_List genericParams optional + } + + // [20.18 ] + type set of ErrorInfoBody ErrorInfoBody_List; + + // [20.3 RFC2616 14.4 ] + type record LanguageBody { + charstring languageRange, + SemicolonParam_List acceptParam optional + } + + // [20.3 RFC2616 14.4 ] + type set of LanguageBody LanguageBody_List; + + // [20.13; RFC2616 14.12 ] + type charstring LanguageTag; + + // [20.13; RFC2616 14.12 ] + type set of LanguageTag LanguageTag_List; + + // [20.5 ] + type set of charstring Method_List; + + // [20.29, 20.32, 20.37, 20.40 ] + type charstring OptionTag; + + // [20.29, 20.32, 20.37, 20.40 ] + type set of OptionTag OptionTag_List; + + // [20.7, 20.27, 20.28, 20.44 ; RFC2616 14.33, 14.47; RFC2617 1.2 ] + type record OtherAuth { + charstring authScheme, + CommaParam_List authParams + } + + type record Payload { + integer payloadlength, + charstring payloadvalue + } + + // [20.30,20.34 ] + type record RouteBody { + NameAddr nameAddr, + SemicolonParam_List rrParam optional + } + + // [20.30,20.34 ] + type record of RouteBody RouteBody_List; + + // [20.42 ] + type record SentProtocol { + charstring protocolName, + charstring protocolVersion, + charstring transport + } + + // [20.35, 20.41; RFC2616 14.43 ] + type charstring ServerVal; + + // [20.35, 20.41; RFC2616 14.43 ] + type set of ServerVal ServerVal_List; + + // [20.38 ] + type record TimeValue { + integer majorDigit, // represented as an integer + integer minorDigit optional // represented as an integer + } + + // [20.42 ] + type record ViaBody { + SentProtocol sentProtocol, + HostPort sentBy, + SemicolonParam_List viaParams optional + } + + // [20.42 ] + type record of ViaBody ViaBody_List; + + // [20.43 ] + type union WarnAgent { + HostPort hostPort, + charstring pseudonym + } + + // [20.43 ] + type record WarningValue { + integer warnCode, // represented as an integer + WarnAgent warnAgent, + charstring warnText + } + + // [20.43 ] + type set of WarningValue WarningValue_List; + + type Addr_Union PAssertedIDValue; + + type record of PAssertedIDValue PAssertedIDValue_List; + + type charstring PAssertedServiceValue; + + type Addr_Union PPreferredIDValue; + + type record of PPreferredIDValue PPreferredIDValue_List; + + type charstring PrivacyValue; + + type record of PrivacyValue PrivacyValue_List; + + type set of FcValue FcValue_List; + type record FcValue { + charstring wildcard(c_WILDCARD), + SemicolonParam_List fcParams optional + } + + + } // end group TokensType + + + group HeaderFieldTypes // Header Fields + { + group CommonHeaderFieldTypes { + // [20.1, RFC2616 14.1 ] + type record Accept { + FieldName fieldName (ACCEPT_E) , + AcceptBody_List acceptArgs optional + } + + // [20.2, RFC2616 14.3 ] + type record AcceptEncoding { + FieldName fieldName (ACCEPT_ENCODING_E) , + ContentCoding_List contentCoding optional + } + + // [20.3, RFC2616 14.4 ] + type record AcceptLanguage { + FieldName fieldName (ACCEPT_LANGUAGE_E) , + LanguageBody_List languageBody optional + } + + // [20.4 ] + type record AlertInfo { + FieldName fieldName (ALERT_INFO_E) , + AlertInfoBody_List alertInfoBody optional + } + + // [20.5 ] + type record Allow { + FieldName fieldName (ALLOW_E) , + Method_List methods optional + } + + // [20.6 ] + type record AuthenticationInfo { + FieldName fieldName (AUTHENTICATION_INFO_E) , + CommaParam_List ainfo + } + + // [20.7 RFC2617 3.2.2 ] + type record Authorization { + FieldName fieldName (AUTHORIZATION_E) , + CredentialsList body // changed from Credentials to allow multiple Authorization headers + } + + // [20.8 ] + type record CallId { + FieldName fieldName (CALL_ID_E) , + CallidString callid + } + + // [20.9 ] + type record CallInfo { + FieldName fieldName (CALL_INFO_E) , + CallInfoBody_List callInfoBody optional + } + + // [20.10 ] + type record Contact { + FieldName fieldName (CONTACT_E) , + ContactBody contactBody + } + + // [20.11 ] + type record ContentDisposition { + FieldName fieldName (CONTENT_DISPOSITION_E) , + charstring dispositionType, + SemicolonParam_List dispositionParams optional + } + + // [20.12 RFC2616 14.11 ] + type record ContentEncoding { + FieldName fieldName (CONTENT_ENCODING_E) , + ContentCoding_List contentCoding + } + + // [20.13 RFC2616 14.12 ] + type record ContentLanguage { + FieldName fieldName (CONTENT_LANGUAGE_E) , + LanguageTag_List languageTag + } + + // [20.14 ] + type record ContentLength { + FieldName fieldName (CONTENT_LENGTH_E) , + integer len // this field is represented as an integer + } + + // [20.15 ] + type record ContentType { + FieldName fieldName (CONTENT_TYPE_E) , + charstring mTypeSubtype , + SemicolonParam_List mParams optional + } + + // [20.16 ] + type record CSeq { + FieldName fieldName (CSEQ_E) , + integer seqNumber, // this field is represented as an integer + charstring method + } + + // [20.17 ] + type record Date { + FieldName fieldName (DATE_E) , + charstring sipDate + } + + // [20.18 ] + type record ErrorInfo { + FieldName fieldName (ERROR_INFO_E) , + ErrorInfoBody_List errorInfo optional + } + + // [20.19 ] + type record Expires { + FieldName fieldName (EXPIRES_E) , + DeltaSec deltaSec + } + + //[6809] + type record FeatureCaps { + FieldName fieldName(FEATURE_CAPS_E), + FcValue_List fcValues + } + + // [20.20 ] + type record From { + FieldName fieldName (FROM_E) , + Addr_Union addressField, + SemicolonParam_List fromParams optional + } + + // [2616] + type record Host { + FieldName fieldName(HOST_E), + charstring host, // an empty value is represented by the empty charstring "" + integer portField optional + } + + // [20.21 ] + type record InReplyTo { + FieldName fieldName (IN_REPLY_TO_E) , + CallidString_List callids + } + + // [20.22 ] + type record MaxForwards { + FieldName fieldName (MAX_FORWARDS_E) , + integer forwards // this field is represented as an integer + } + + // [20.23 ] + type record MinExpires { + FieldName fieldName (MIN_EXPIRES_E) , + DeltaSec deltaSec + } + + // [20.24 RFC2616 19.4.1 ] + type record MimeVersion { + FieldName fieldName (MIME_VERSION_E) , + integer majorNumber, // this field is represented as an integer + integer minorNumber // this field is represented as an integer + } + + // [20.25 ] + type record Organization { + FieldName fieldName (ORGANIZATION_E) , + charstring organization + } + + // [20.26 ] + type record Priority { + FieldName fieldName (PRIORITY_E) , + charstring priorityValue + } + + // [20.27 RFC2616 14.33 RFC2617 1.2 ] + type record ProxyAuthenticate { + FieldName fieldName (PROXY_AUTHENTICATE_E) , + Challenge challenge + } + + // [20.28 RFC2616 14.35 RFC2617 1.2 ] + type record ProxyAuthorization { + FieldName fieldName (PROXY_AUTHORIZATION_E) , + CredentialsList + credentials // changed from Credentials to allow multiple Authorization headers + } + + // [20.29 ] + type record ProxyRequire { + FieldName fieldName (PROXY_REQUIRE_E) , + OptionTag_List optionsTags + } + + // [20.30 ] + type record RecordRoute { + FieldName fieldName (RECORD_ROUTE_E) , + RouteBody_List routeBody + } + + type set of InfoPackage_Type InfoPackage_List; + + type record InfoPackage_Type { + charstring infoPackageName, + SemicolonParam_List infoPackageParams optional + + } + + //[6086] + type record RecvInfo { + FieldName fieldName(RECV_INFO_E), + InfoPackage_List infoPackageList + } + + //[6086] + type record InfoPackage { + FieldName fieldName(INFO_PACKAGE_E), + InfoPackage_Type infoPackageType + } + + // [20.31 ] + type record ReplyTo { + FieldName fieldName (REPLY_TO_E) , + Addr_Union addressField, + SemicolonParam_List replyToParams optional + } + + // [20.32 ] + type record Require { + FieldName fieldName (REQUIRE_E) , + OptionTag_List optionsTags + } + + // [20.33 ] + type record RetryAfter { + FieldName fieldName (RETRY_AFTER_E) , + DeltaSec deltaSec, + charstring comment optional, + SemicolonParam_List retryParams optional + } + + // [20.34 ] + type record Route { + FieldName fieldName (ROUTE_E) , + RouteBody_List routeBody + } + + // [20.35 RFC2616 14.38 ] + type record Server { + FieldName fieldName (SERVER_E) , + ServerVal_List serverBody + } + + // [20.36 ] + type record Subject { + FieldName fieldName (SUBJECT_E) , + charstring summary + } + + // [20.37 ] + type record Supported { + FieldName fieldName (SUPPORTED_E) , + OptionTag_List optionsTags optional + } + + // [20.38 ] + type record Timestamp { + FieldName fieldName (TIMESTAMP_E) , + TimeValue timeValue optional, + TimeValue delay optional + } + + // [20.39 ] + type record To { + FieldName fieldName (TO_E) , + Addr_Union addressField, + SemicolonParam_List toParams optional + } + + // [20.40 ] + type record Unsupported { + FieldName fieldName (UNSUPPORTED_E) , + OptionTag_List optionsTags + } + + // Undefined header field + type record UndefinedHeader { + charstring headerName, + charstring headerValue + } + + type set of UndefinedHeader UndefinedHeader_List; + + // [20.41 RFC2616 14.43 ] + type record UserAgent { + FieldName fieldName (USER_AGENT_E) , + ServerVal_List userAgentBody + } + + // [20.42 ] + type record Via { + FieldName fieldName (VIA_E) , + ViaBody_List viaBody + } + + // [20.43 ] + type record Warning { + FieldName fieldName (WARNING_E) , + WarningValue_List warningValue + } + + // [20.44 RFC2616 14.47 RFC2617 1.2 ] + type record WwwAuthenticate { + FieldName fieldName (WWW_AUTHENTICATE_E) , + Challenge challenge + } + + } // end group CommonHeaderFieldTypes + group RFC3262HeaderFieldTypes { + // [3262/7.1 ] + type record RSeq { + FieldName fieldName (RSEQ_E) , + integer responseNum + } + + // [3262/7.2 ] + type record RAck { + FieldName fieldName (RACK_E) , + integer responseNum, + integer seqNumber, + charstring method + } + + } // end group RFC3262HeaderFieldTypes + + group RFC3265HeaderFieldTypes { + // [3265/7.2 ] + type record AllowEvents { + FieldName fieldName (ALLOW_EVENTS_E) , + EventType_List eventTypes + } + + type set of EventType EventType_List; + type charstring EventType; + + // [3265/7.2 ] + type record Event { + FieldName fieldName (EVENT_E) , + EventType eventType, + SemicolonParam_List eventParams optional + } + + // [3265/7.2 ] + type record SubscriptionState { + FieldName fieldName (SUBSCRIPTION_STATE_E) , + SubState subState, + SemicolonParam_List substateParams optional + } + + type charstring SubState; + + } // end group RFC3265HeaderFieldTypes + + group RFC3313HeaderFieldTypes { + // [3313/5 ] + type record PMediaAuthorization { + FieldName fieldName (P_MEDIA_AUTHORIZATION_E) , + PMediaAuthorization_List pMediaAuthorizations + } + + type charstring PMediaAuthValue; // HEXDIG "0"-"9", "A"-"F" + type record of PMediaAuthValue PMediaAuthorization_List; + + + } // end group RFC3265HeaderFieldTypes + + group RFC3323HeaderFieldTypes { + // [3323 ] + type record Privacy { + FieldName fieldName (PRIVACY_E) , + PrivacyValue_List privValueList + } + + } // end group RFC3323HeaderFieldTypes + + group RFC3325HeaderFieldTypes { + // [3325 ] + type record PAssertedID { + FieldName fieldName (P_ASSERTED_ID_E) , + PAssertedIDValue_List pAssertedIDValueList + } + + // [3325 ] + type record PPreferredID { + FieldName fieldName (P_PREFERRED_ID_E) , + PPreferredIDValue_List pPreferredIDValueList + } + // draft-drage-sipping-service-identification-01 (July 2007) + type record PPreferredService { + FieldName fieldName (P_PREFERRED_SERVICE_E) , + charstring serviceId + } + + + } // end group RFC3325HeaderFieldTypes + + group RFC3326HeaderFieldTypes { + // [3326 ] + type record of ReasonValue ReasonValues; + + type record ReasonValue { + charstring token, + SemicolonParam_List reasonParams optional + } + + type record Reason { + FieldName fieldName (REASON_E) , + ReasonValues reasonValues + } + + } // end group RFC3326HeaderFieldTypes + + group RFC3327HeaderFieldTypes { + // [3327 ] + type record Path { + FieldName fieldName (PATH_E) , + PathValues pathValues + } + + type record of PathValue PathValues; + + type record PathValue { + NameAddr nameAddr, + SemicolonParam_List rrParam optional + } + + } // end group RFC3515HeaderFieldTypes + + + group RFC4488HeaderFieldTypes { + // [4488 ] + type record ReferSub { + FieldName fieldName (REFER_SUB_E) , + boolean referSubValue, + SemicolonParam_List referSubParams optional + } + + } // end group RFC4488HeaderFieldTypes + + group RFC3329HeaderFieldTypes { + // [RFC3329/2.2 ] + type record SecurityMechanism { + charstring mechName, + SemicolonParam_List mechParams optional + } + + type set of SecurityMechanism SecurityMechanism_List; + + type record SecurityClient { + FieldName fieldName (SECURITY_CLIENT_E) , + SecurityMechanism_List securityMech + } + + type record SecurityServer { + FieldName fieldName (SECURITY_SERVER_E) , + SecurityMechanism_List securityMech + } + + type record SecurityVerify { + FieldName fieldName (SECURITY_VERIFY_E) , + SecurityMechanism_List securityMech + } + + } // end group RFC3329HeaderFieldTypes + + group RFC3455HeaderFieldTypes { + type record of NameAddrParam NameAddrParam_List; + + type record NameAddrParam { + NameAddr nameAddr, + SemicolonParam_List genericParams optional + } + // [3455/5.1 ] + type record PAssociatedURI { + FieldName fieldName (P_ASSOCIATED_URI_E) , + NameAddrParam_List nameAddrList + } + // [3455/5.2 ] + type record PCalledPartyID { + FieldName fieldName (P_CALLED_PARTY_E) , + NameAddrParam nameAddParams + } + + type record of VnetworkSpec VnetworkSpec_List; + + type record VnetworkSpec { + charstring vNetworkSpecToken, + SemicolonParam_List genericParams optional + } + + // [3455/5.3 ] + type record PVisitedNetworkID { + FieldName fieldName (P_VISITED_NETWORK_E) , + VnetworkSpec_List vNetWorkSpec + } + + // [3455/5.4 ] + type record PAccessNetworkInfo { + FieldName fieldName (P_ACCESS_NETWORK_INFO_E) , + charstring accessType, + SemicolonParam_List genericParams optional + } + + // [3455/5.5 ] + type record PChargingFunctionAddresses { + FieldName fieldName (P_CHARGING_FUNCTION_ADDRESSES_E) , + SemicolonParam_List chargeAddrParams optional + } + + // [3455/5.6 ] + type record PChargingVector { + FieldName fieldName (P_CHARGING_VECTOR_E) , + charstring icidValue, + SemicolonParam_List chargeParams optional + } + + } // end group RFC33455HeaderFieldTypes + + group RFC3515HeaderFieldTypes { + // [3515 ] + type record ReferTo { + FieldName fieldName (REFER_TO_E) , + NameAddr nameAddr, + SemicolonParam_List referToParams optional + } + + } // end group RFC3515HeaderFieldTypes + + group RFC3608HeaderFieldTypes { + // [3608 ] + type record ServiceRoute { + FieldName fieldName (SERVICE_ROUTE_E) , + RouteBody_List routeBody + } + + } // end group RFC33608HeaderFieldTypes + + + group RFC3841HeaderFieldTypes { + // [3841 ] + type record AcceptContact { + FieldName fieldName (ACCEPT_CONTACT_E) , + AcRcValue_List acValues + } + + type set of AcRcValue AcRcValue_List; + + type record AcRcValue { + charstring wildcard (c_WILDCARD) , + SemicolonParam_List acRcParams optional + } + // [RFC 3841 ] + type charstring Directive; + type set of Directive Directive_List; + type record RequestDisposition { + FieldName fieldName (REQUEST_DISPOSITION_E) , + Directive_List directives + } + + + } // end group RFC3841HeaderFieldTypes + + group RFC3891HeaderFieldTypes { + // [3891 ] + type record Replaces { + FieldName fieldName (REPLACES_E) , + CallidString callid, + SemicolonParam_List replacesParams optional + } + + } // end group RFC3891HeaderFieldTypes + + group RFC3892HeaderFieldTypes { + // [3892 ] + type record ReferredBy { + FieldName fieldName (REFERRED_BY_E) , + NameAddr nameAddr, + SemicolonParam_List referredbyIdParams optional + } + + } // end group RFC3892HeaderFieldTypes + + group RFC4028HeaderFieldTypes { + // [4028 ] + type record MinSE { + FieldName fieldName (MIN_SE_E) , + DeltaSec deltaSec, + SemicolonParam_List minSeParam optional + } + // [4028 ] + type record SessionExpires { + FieldName fieldName (SESSION_EXPIRES_E) , + DeltaSec deltaSec, + SemicolonParam_List seParam optional + } + + } // end group RFC4028HeaderFieldTypes + + group RFC4244HeaderFieldTypes { + // [4244 ] + type record HistoryInfo { + FieldName fieldName (HISTORY_INFO_E) , + HistoryInfo_List historyInfoList + } + + type record of HistoryInfoEntry HistoryInfo_List; + + type record of integer IntegerList; + + type record HistoryInfoEntry { + NameAddr nameAddr, + IntegerList hiIndex optional, + SemicolonParam_List hiExtention optional + } + + type record of charstring StringList; + + } // end group RFC4244HeaderFieldTypes + + group RFC5009PEarlyMediaHeader { + // [5009 ] + type record PEarlyMedia { + FieldName fieldName (P_EARLY_MEDIA_E) , + EM_Param_List em_param + } + type charstring EM_Param; + type set of EM_Param EM_Param_List; + + } // end group RFC5009PEarlyMediaHeader + + // http://tools.ietf.org/html/draft-johnston-sipping-cc-uui-07, expires 16.Aug.2009 + // Transporting User to User Call Control Information in SIP for ISDN Interworking + // type definition of SIP header mechanism + group UserToUser_PreliminaryRFCDraft { + type record UserToUser { + FieldName fieldName (USER_TO_USER_E) , + charstring uuiData length(256), + /*length limitation due to ISDN, max of allowed 128 hex digits are represented by 256 characters*/ + GenericParam uuiParam + } + + + } // end group UserToUser_PreliminaryRFCDraft + + type record PAssertedService { + FieldName fieldName (P_ASSERTED_SERVICE_E) , + PAssertedServiceValue pAssertedServiceValue + } + + group RFC6442GeolocationConveyance { + // [6442 ] + type record Geolocation { + // RFC6442 clause 4.1 + FieldName fieldName (GEOLOCATION_E) , + SipUrl addrSpec, + SemicolonParam_List geolocParam optional + } + type enumerated GeolocationRoutingState { + GEOLOCATION_ROUTING_YES_E, GEOLOCATION_ROUTING_NO_E, GEOLOCATION_ROUTING_OTHER_E + } + type record GeolocationRouting { + // RFC6442 clause 4.2 + FieldName fieldName (GEOLOCATION_ROUTING_E) , + GeolocationRoutingState state, + GenericParam genericValue optional + } + + } // end group RFC6442GeolocationConveyance + + type charstring SessIdString length(32); + + type record SessionId { + FieldName fieldName (SESSION_ID_E) , + SessIdString sessid, + GenericParam sessidParam optional + } + + type charstring EntityTag; + + type record SIP_ETag { + FieldName fieldName (SIP_ETAG_E) , + EntityTag entityTag + } + + type record SIP_If_Match { + FieldName fieldName (SIP_IF_MATCH_E) , + EntityTag entityTag + } + + // RFC4412 + type record ResourcePriority { + FieldName fieldName (RESOURCE_PRIORITY_E) , + ResourcePriority_List resourcePriorityList + } + type set of R_Value ResourcePriority_List; + type record R_Value { + charstring namespace, + charstring rPriority + } + + // RFC5373 + type record AnswerMode { + FieldName fieldName (ANSWER_MODE_E), + AnswerMode_Value answerMode_Value, + SemicolonParam_List answerModeParams optional + } + type record PrivAnswerMode { + FieldName fieldName (PRIV_ANSWER_MODE_E), + AnswerMode_Value answerMode_Value, + SemicolonParam_List answerModeParams optional + } + type charstring AnswerMode_Value; + + // RFC4538 + type record TargetDialog { + FieldName fieldName (TARGET_DIALOG_E), + CallidString callid, + TdParam tdParam optional + } + type record TdParam { + charstring remoteParam optional, + charstring localParam optional, + SemicolonParam_List genericParams optional + } + + // RFC4964 + type record PAnswerState { + FieldName fieldName (P_ANSWER_STATE_E), + charstring answerType, + SemicolonParam_List genericParams optional + } + + + } // end group HeaderFieldTypes + + group MessageHeaderTypes { + + // Message-Header for all SIP requests and responses [20 ] + type set MessageHeader { + Accept accept optional, + AcceptContact acceptContact optional, + AcceptEncoding acceptEncoding optional, + AcceptLanguage acceptLanguage optional, + AlertInfo alertInfo optional, + Allow allow optional, + AllowEvents allowEvents optional, + // 3265/7.2 + AuthenticationInfo authenticationInfo optional, + // only in responses + Authorization authorization optional, + // only in requests + CallId callId optional, + // optional only in Invalid test cases mandatory otherwise + CallInfo callInfo optional, + Contact contact optional, + // optional in response and all requests except INVITE where mandatory + ContentDisposition contentDisposition optional, + ContentEncoding contentEncoding optional, + ContentLanguage contentLanguage optional, + ContentLength contentLength optional, + // optional in responses and all requests except ACK where mandatory + ContentType contentType optional, + CSeq cSeq optional, + // optional only in Invalid test cases mandatory otherwise + Date date optional, + ErrorInfo errorInfo optional, + // only in responses + Event event optional, + // 3265/7.2 + Expires expires optional, + FeatureCaps featureCaps optional, // 6809 + From fromField, + Geolocation geolocation optional, + // 6442 + GeolocationRouting geolocationRouting optional, + // 6442 + HistoryInfo historyInfo optional, + // 4244 + InfoPackage infoPackage optional, + // 6086 + InReplyTo inReplyTo optional, + // only in requests + MaxForwards maxForwards optional, + // mandatory in requests not required in responses! + MimeVersion mimeVersion optional, + MinExpires minExpires optional, + // only in responses + MinSE minSE optional, + // 4028 + Organization organization optional, + PAccessNetworkInfo pAccessNetworkInfo optional, + // 3455 + PAssertedID pAssertedID optional, + // 3325 + PAssertedService pAssertedService optional, + PAssociatedURI pAssociatedURI optional, + // 3455 + Path path optional, + // 3327 + PCalledPartyID pCalledPartyID optional, + // 3455 + PChargingFunctionAddresses pChargingFunctionAddresses optional, + // 3455 + PChargingVector pChargingVector optional, + // 3455 + PEarlyMedia pEarlyMedia optional, + // 5009 + PMediaAuthorization pMediaAuthorization optional, + // 3313 + PPreferredID pPreferredID optional, + // 3325 + PPreferredService pPreferredService optional, + // draft-drage-sipping-service-identification-01 (July 2007) + Priority priority optional, + // only in requests + Privacy privacy optional, + // 3323 + ProxyAuthenticate proxyAuthenticate optional, + // only in responses + ProxyAuthorization proxyAuthorization optional, + // only in requests + ProxyRequire proxyRequire optional, + // only in requests + PVisitedNetworkID pVisitedNetworkID optional, + // 3455 + RAck rAck optional, + // 3262/7.1 + RSeq rSeq optional, + // 3262/7.1 + Reason reason optional, + // 3326 + RecordRoute recordRoute optional, + RecvInfo recvInfo optional, + // 6086 + RequestDisposition requestDisposition optional, + // 3841 + ReferredBy referredBy optional, + // 3892 - REFER method + ReferTo referTo optional, + // 3515 - REFER method + ReferSub referSub optional, + // 4488 - REFER method + Replaces replaces optional, + // 3891 + ReplyTo replyTo optional, + // optional in responses and INVITE requests + Require require optional, + RetryAfter retryAfter optional, + // only in responses + Route route optional, + // only in requests + SecurityClient securityClient optional, + // 3329 + SecurityServer securityServer optional, + // 3329 + SecurityVerify securityVerify optional, + // 3329 + Server server optional, + // only in responses + ServiceRoute serviceRoute optional, + // 3608 + SessionExpires sessionExpires optional, + // 4028 + SessionId sessionId optional, + SIP_ETag sipETag optional, + SIP_If_Match sipIfMatch optional, + Subject subject optional, + // only in requests + SubscriptionState subscriptionState optional, + // 3265/7.2 + Supported supported optional, + Timestamp timestamp_ optional, + To toField, + Unsupported unsupported optional, + // only in responses + UserToUser userToUser optional, + UserAgent userAgent optional, + Via via, + Warning warning optional, + WwwAuthenticate wwwAuthenticate optional, + ResourcePriority resourcePriority optional, + // RFC4412 + AnswerMode answerMode optional, + // RFC5373 + PrivAnswerMode privAnswerMode optional, + // RFC5373 + TargetDialog targetDialog optional, + // RFC4538 + PAnswerState pAnswerState optional, + // RFC4964 + // only in responses + UndefinedHeader_List undefinedHeader_List optional + } + + + } // end group MessageHeaderTypes + + group StartLineTypes { + // Request-Line [7.1 ] + type record RequestLine { + Method method, + SipUrl requestUri, + charstring sipVersion + } + + // Status-Line [7.2 ] + type record StatusLine { + charstring sipVersion, + integer statusCode, + charstring reasonPhrase + } + + + } // end group StartLineTypes + + + group otherTypes { + + type record SipUserProfile { + /** + * @desc integer for the userprofile identifier + */ + integer id, + /** + * @desc integer for Port number to exchange SIP messages + */ + integer currPort, + /** + * @desc charstring for IP address to exchange SIP messages + */ + charstring currIpaddr, + /** + * @desc integer for Port number to exchange SIP messages + */ + integer contactPort, + /** + * @desc charstring for IP address to exchange SIP messages + */ + charstring contactIpaddr, + /** + * @desc charstring for IP address used by the TS to exchange media streams + */ + charstring bearerIpaddr, + /** + * @desc charstring for identity of the tester local domain + */ + charstring homeDomain, + /** + * @desc charstring for identity of the tester local user + */ + charstring publUsername, + /** + * @desc charstring for RFC 2617 3.2.1 qop options: Quoted string of one or more tokens indicating the "quality of protection" values supported by the server. The value "auth" indicates authentication; the value "auth-int" indicates authentication with integrity protection. + */ + charstring qop, + /** + * @desc charstring for RFC 2617 3.2.2 username for authentication The name of user in the specified realm + */ + charstring privUsername, + /** + * @desc charstring for RFC 2617 3.2.2.2 passwd: A known shared secret, the password of user of the specified username + */ + charstring passwd, + /** + * @desc charstring for registrar domain for authentication and request line + */ + charstring registrarDomain + } + + + + } // end group otherTypes + + + } // end group Subtypes + + + + group MSGtypes { + + group RequestTypes { + // [7.1 ] + /** + * @desc generic type of a SIP request message + * @member statusLine contains a method name, a Request-URI, and the protocol version + * @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards + * @member messageBody depends on the request method, includes e.g. SDP message. + * @member payload contains the whole message as it has been received in its text format + */ + type record Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + // Note: the introduction of the following specific types is to enable better means for logging + // on the other side the generic type is useful for functions dealing with multiple SIP message types + type record REGISTER_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record INVITE_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record OPTIONS_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record BYE_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record CANCEL_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record ACK_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + // [3262/7.1 ] + type record PRACK_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + // [3265/7.1 ] + type record NOTIFY_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + // [3265/7.1 ] + type record SUBSCRIBE_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + // [3903/11.1 ] + type record PUBLISH_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + // [3311/7 ] + type record UPDATE_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record REFER_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record MESSAGE_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type record INFO_Request { + RequestLine requestLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + type union RequestUnion { + REGISTER_Request Register, + INVITE_Request Invite, + OPTIONS_Request Options, + BYE_Request Bye, + CANCEL_Request Cancel, + ACK_Request Ack, + PRACK_Request Prack, + NOTIFY_Request Notify, + SUBSCRIBE_Request Subscribe, + PUBLISH_Request Publish, + UPDATE_Request Update, + REFER_Request Refer, + MESSAGE_Request Message, + INFO_Request Info// [2976 ] + } + + } // end group RequestTypes + + group ResponseTypes { + // [7.2 ] + /** + * @desc generic type of a SIP response message + * @member statusLine consists of the protocol version followed by a numeric Status-Code and its associated textual phrase + * @member msgHeader include all possible header fields that are allowed to be present according to RFCs and other standards + * @member messageBody depends on the response method, includes e.g. SDP message. + * @member payload contains the whole message as it has been received in its text format + */ + type record Response { + StatusLine statusLine, + MessageHeader msgHeader, + MessageBody messageBody optional, + Payload payload optional + } + + } // end group ResponseTypes + + // This MSG type is defined for sending synctactic variations, ans syntactically + // erroneous messages, and receving messages failed parsing. + group SyntacticTypes { + type charstring Raw; + + } // end group SyntacticTypes + + + // This type is defined for particular SIP message body types like SDP + } // end group MSGTypes + + } // end group Types +} +with { + encode "SIPCodec"; variant ""; +} // end module LibSip_SIPTypesAndValues diff --git a/ttcn/patch_lib_sip_titan/LibSip_SMSFunctions.ttcn b/ttcn/patch_lib_sip_titan/LibSip_SMSFunctions.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..7f1d2b8ca3be68b43d96eb3ac68e02939fd04f53 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_SMSFunctions.ttcn @@ -0,0 +1,48 @@ +/** + * @author STF 435, 471 + * @version $Id$ + * @desc This module provides the functions used by the test component + * for SIP-SMS over IMS as specified in 3GPP 24-341 tests. + * This module is part of LibSipV3. + */ +module LibSip_SMSFunctions { + import from LibSip_SMSTypesAndValues all; + + function f_IA5_2oct( + charstring p_ASCII_String + ) return octetstring { + var integer i; + var integer j; + var integer v_Length := lengthof(p_ASCII_String); + var integer v_Temp; + var octetstring v_Noctets := ''O; + var bitstring v_TempBitSrc := ''B; + var bitstring v_TempBitDes := ''B; + + if ((v_Length <= 0) or (v_Length > 160) or (((v_Length * 7) mod 8) != 0)) { + log("*** " & __SCOPE__ & "INFO: Invalid value of input string length ***"); + } + + for (i := 0; i < v_Length; i := i + 1) { + v_Temp := char2int(p_ASCII_String[i]); + v_TempBitSrc := int2bit(v_Temp, 8); + + for (j := 1; j <= 7; j := j + 1) { + + v_TempBitDes := v_TempBitSrc[8 - j] & v_TempBitDes; + + if (((7 * i + j) mod 8) == 0) { + + v_Noctets := v_Noctets & bit2oct(v_TempBitDes); + v_TempBitDes := ''B; + } + } + } + + return v_Noctets; + } // f_IA5_2oct + + external function fx_GetSC_TimeStamp( + integer p_TimeZone + ) return TP_ServiceCentreTimeStamp_Type; +} // End of module LibSip_SMSFunctions \ No newline at end of file diff --git a/ttcn/patch_lib_sip_titan/LibSip_SMSTemplates.ttcn b/ttcn/patch_lib_sip_titan/LibSip_SMSTemplates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..720f5aab0674d9ef35ed3969ecad8ccb58fe6b20 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_SMSTemplates.ttcn @@ -0,0 +1,304 @@ +/** + * @author STF 435, STF 471 + * @version $Id$ + * @desc This module provides the types used by the test component + * for SIP-SMS over IMS as specified in 3GPP 24-341 tests. + * This module is part of LibSipV3. + */ +module LibSip_SMSTemplates { + import from LibCommon_DataStrings all; + import from LibSip_SMSTypesAndValues all; + import from LibSip_SMSFunctions all; + + group SMS_Templates_Group { + + /* Non-SMS Type Constraints */ + template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlanAny := { + extBit := ?, + typeOfNumber := ?, + numberingPlanId := ? + } + + template(value) TypeOfNumberingPlan m_TypeOfNumberingPlan := { + extBit := '1'B, + typeOfNumber := '001'B, // international number + numberingPlanId := + '0001'B // ISDN/telephony numbering plan (Rec. E.164/E.163) + } + + template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlan := mw_TypeOfNumberingPlanAny; + + /* End Non-SMS Type Constraints */ + template(value) RP_OriginatorAddress_dl m_RP_OriginatorAddress_dl := { + spare := omit, + iei := omit, + iel := '06'O, // 6 semi-octets + typeOfNumberingPlan := m_TypeOfNumberingPlan, + digits := '001122'O + } + + template(present) RP_OriginatorAddress_ul mw_RP_OriginatorAddress_ul := { + spare := omit, + iei := omit, + iel := '00'O + } + + template(present) RP_DestinationAddress_ul mw_RP_DestinationAddress_ul := { + spare := omit, + iei := omit, + iel := ?, + typeOfNumberingPlan := mw_TypeOfNumberingPlan, + digits := ? + } + template(omit) RP_DestinationAddress_dl m_RP_DestinationAddress_dl := { + spare := omit, + iei := omit, + iel := '00'O + } + + template(omit) RP_UserData m_RP_UserData_DELIVER( + octetstring p_Digits + ) := { + spare := omit, + iei := omit, + iel := int2oct((153 + lengthof(p_Digits)), 1), + tP_PDU := {SMS_DELIVER := m_SMS_DELIVER(p_Digits)} + } + + template(value) RP_UserData m_RP_UserData_SUBMIT_REPORT := { + spare := '0'B, + iei := c_IEI_RP_UserData, + iel := '0A'O, // the TPDU data length is 10 octets + tP_PDU := {SMS_SUBMIT_REPORT := m_SMS_SUBMIT_REPORT} + } + template(value) RP_UserData m_RP_UserData_STATUS_REPORT( + template(value) TP_MessageReference_Type p_MessageRef, + template(value) TP_Address_Type p_RecipientAddress, + template(value) TP_ServiceCentreTimeStamp_Type p_SCTP + ) modifies m_RP_UserData_SUBMIT_REPORT := { + tP_PDU := {SMS_STATUS_REPORT := m_SMS_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)} + } + + template(present) RP_UserData mw_RP_UserData_SUBMIT := { + spare := omit, + iei := omit, + iel := ?, + tP_PDU := {SMS_SUBMIT := mw_SMS_SUBMIT_VPF_REF} + } + + template(present) RP_UserData mw_RP_UserData_DELIVER_REPORT := { + spare := '0'B, + iei := c_IEI_RP_UserData, + iel := ?, + tP_PDU := {SMS_DELIVER_REPORT := mw_SMS_DELIVER_REPORT} + } + + /* End SM-RP Type Constraints */ + /* SM-RP PDU Constraints */ + template(value) RP_DATA_dl_Type m_RP_DATA_dl_base := { + spare5 := '00000'B, + rP_MessageTypeIndicator := c_MT_RP_DATA_dl, + rP_MessageReference := '00'O, + rP_OriginatorAddress := m_RP_OriginatorAddress_dl, + rP_DestinationAddress := m_RP_DestinationAddress_dl, + rP_UserData := m_RP_UserData_DELIVER('0000'O) + } + + template(value) RP_DATA_dl_Type m_RP_DATA_dl_DELIVER( + octetstring p_Digits + ) modifies m_RP_DATA_dl_base := {rP_UserData := m_RP_UserData_DELIVER(p_Digits)} + + template(value) RP_DATA_dl_Type m_RP_DATA_dl_STATUS_REPORT( + template(value) TP_MessageReference_Type p_MessageRef, + template(value) TP_Address_Type p_RecipientAddress, + template(value) TP_ServiceCentreTimeStamp_Type p_SCTP + ) modifies m_RP_DATA_dl_base := { + rP_UserData := m_RP_UserData_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP) + } + + + template(present) RP_DATA_ul_Type mw_RP_DATA_ul_SUBMIT := { + spare5 := '00000'B, + rP_MessageTypeIndicator := c_MT_RP_DATA_ul, + rP_MessageReference := ?, + rP_OriginatorAddress := mw_RP_OriginatorAddress_ul, + rP_DestinationAddress := mw_RP_DestinationAddress_ul, + rP_UserData := mw_RP_UserData_SUBMIT + } + + template(value) RP_ACK_Type m_RP_ACK_SUBMIT_REPORT( + template(value) Oct1 p_msgReference := '00'O + ) := { + spare5 := '00000'B, + rP_MessageTypeIndicator := c_MT_RP_ACK_dl, + rP_MessageReference := p_msgReference, + rP_UserData := m_RP_UserData_SUBMIT_REPORT + } + + template(present) RP_ACK_Type mw_RP_ACK_DELIVER_REPORT := { + spare5 := '00000'B, + rP_MessageTypeIndicator := c_MT_RP_ACK_ul, + rP_MessageReference := ?, + rP_UserData := mw_RP_UserData_DELIVER_REPORT + } + + /* End SM-RP PDU Constraints */ + /* SM-TP Type Constraints */ + template(value) TP_ProtocolIdentifier_Type mw_TP_ProtocolIdentifier := { + pidType := '01'B, + interworking := '0'B, + pidValue := '00000'B + } + + template(value) TP_ProtocolIdentifier_Type m_TP_ProtocolIdentifier := { + pidType := '01'B, + interworking := '0'B, + pidValue := '00000'B + } + + template(value) TP_DataCodingScheme_Type m_TP_DataCodingScheme := { + codingGroup := '0000'B, + codeValue := '0000'B + } + + template(present) TP_Address_Type mw_TP_AddressAny := { + iel := ?, + typeOfNumberingPlan := mw_TypeOfNumberingPlanAny, + digits := * + } + + template(value) TP_Address_Type m_TP_Address( + octetstring p_Digits + ) := { + iel := int2oct(2 * lengthof(p_Digits), 1), + // length is number of useful semi-octets + // as p_digits is declared as octetstring the number must be even + typeOfNumberingPlan := m_TypeOfNumberingPlan, + digits := p_Digits + } + + template(value) TP_ParameterIndicator_Type m_TP_ParameterIndicator := { + extBit1 := '0'B, + spare4 := '0000'B, + tP_UDL := '0'B, + tP_DCS := '0'B, + tP_PID := '1'B + } + + /* End SM-TP Type Constraints */ + /* SM-TP PDU Constraints */ + template(value) SMS_DELIVER_Type m_SMS_DELIVER( + octetstring p_Digits + ) := { + tP_ReplyPath := '0'B, + tP_UserDataHeaderIndicator := '0'B, + tP_StatusReportIndication := '1'B, + spare2 := '00'B, + tP_MoreMessagesToSend := '0'B, + tP_MessageTypeIndicator := c_MT_SMS_DELIVER, + tP_OriginatingAddress := m_TP_Address(p_Digits), + tP_ProtocolIdentifier := m_TP_ProtocolIdentifier, + tP_DataCodingScheme_Type := m_TP_DataCodingScheme, + tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed + tP_UserDataLength := int2oct(160, 1), + tP_UserData := f_IA5_2oct(c_Fox) + } + + template(present) SMS_DELIVER_REPORT_Type mw_SMS_DELIVER_REPORT := { + spare1 := '0'B, + tP_UserDataHeaderIndicator := '0'B, + spare4 := '0000'B, + tP_MessageTypeIndicator := c_MT_SMS_DELIVER_REPORT, + tP_FailureCause := omit, + tP_ParameterIndicator := ?, + tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier, + tP_DataCodingScheme_Type := *, + tP_UserDataLength := *, + tP_UserData := * + } + + template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT := { + tP_ReplyPath := '0'B, + tP_UserDataHeaderIndicator := '0'B, + tP_StatusReportRequest := '1'B, + tP_ValidityPeriodFormat := '??'B, + tP_RejectDuplicates := '0'B, + tP_MessageTypeIndicator := c_MT_SMS_SUBMIT, + tP_MessageReference := ?, + tP_DestinationAddress := mw_TP_AddressAny, + tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier, + tP_DataCodingScheme_Type := ?, + tP_ValidityPeriod := *, + tP_UserDataLength := int2oct(160, 1), + tP_UserData := + ? // any data will do: 140 octets + } + + template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_NP modifies mw_SMS_SUBMIT := { + tP_ValidityPeriodFormat := '00'B, + tP_ValidityPeriod := omit + } + + template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_REF modifies mw_SMS_SUBMIT := { + tP_ValidityPeriodFormat := '10'B, + tP_ValidityPeriod := ? + } + + template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ENH modifies mw_SMS_SUBMIT := { + tP_ValidityPeriodFormat := '01'B, + tP_ValidityPeriod := ? + } + + template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ABS modifies mw_SMS_SUBMIT := { + tP_ValidityPeriodFormat := '11'B, + tP_ValidityPeriod := ? + } + + template(value) SMS_SUBMIT_REPORT_Type m_SMS_SUBMIT_REPORT := { + spare1 := '0'B, + tP_UserDataHeaderIndicator := '0'B, + spare4 := '0000'B, + tP_MessageTypeIndicator := c_MT_SMS_SUBMIT_REPORT, + tP_FailureCause := omit, + tP_ParameterIndicator := m_TP_ParameterIndicator, + tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed + tP_ProtocolIdentifier := m_TP_ProtocolIdentifier, + tP_DataCodingScheme_Type := omit, + tP_UserDataLength := omit, + tP_UserData := omit + } + + template(value) SMS_STATUS_REPORT_Type m_SMS_STATUS_REPORT( + template(value) TP_MessageReference_Type p_MessageRef, + template(value) TP_Address_Type p_RA, + template(value) TP_ServiceCentreTimeStamp_Type p_SCTP + ) := { + // TS 34.229-1 clause A.7.5 + spare1 := '0'B, + tP_UserDataHeaderIndicator := '0'B, + tP_StatusReportQualifier := '0'B, + spare2 := '00'B, + tP_MoreMessagesToSend := '0'B, + tP_MessageTypeIndicator := c_MT_SMS_STATUS_REPORT, + tP_MessageReference := p_MessageRef, + tP_RecipientAddress := p_RA, + tP_ServiceCentreTimeStamp := p_SCTP, + tP_DischargeTime := '00000000000000'H, + tP_Status := { + reserved := '0'B, + status := '0000000'B + }, + tP_ParameterIndicator := m_TP_ParameterIndicator, + tP_ProtocolIdentifier := m_TP_ProtocolIdentifier, + tP_DataCodingScheme_Type := omit, + tP_UserDataLength := omit, + tP_UserData := omit + } + + + + + + /* End SM-TP PDU Constraints */ + } // group SMS_Templates_Group +} // End of module LibSip_SMSTypesAndValues \ No newline at end of file diff --git a/ttcn/patch_lib_sip_titan/LibSip_SMSTypesAndValues.ttcn b/ttcn/patch_lib_sip_titan/LibSip_SMSTypesAndValues.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..08d05444fe048ae8ab352e72a047bfdacf0d0675 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_SMSTypesAndValues.ttcn @@ -0,0 +1,489 @@ +/****************************************************************************** + * @author STF 435, STF471 + * @version $Id$ + * @desc This module contains the type definitions for SMS messages as specified in + * 3GPP 24-011 and 3GPP 23-040 Rel 8 and 9. + * SMS over IMS is specified in 3GPP 24-341. + * This module is part of LibSipV3. + */ +module LibSip_SMSTypesAndValues { + import from LibCommon_DataStrings all; + + group SMS_Declarations { + + const RP_MessageTypeIndicator_Type c_MT_RP_DATA_ul := '000'B; + /* RP_DATA_ul */ + const RP_MessageTypeIndicator_Type c_MT_RP_DATA_dl := '001'B; + /* RP_DATA_dl */ + const RP_MessageTypeIndicator_Type c_MT_RP_ACK_ul := '010'B; + /* RP_ACK_ul */ + const RP_MessageTypeIndicator_Type c_MT_RP_ACK_dl := '011'B; + /* RP_ACK_dl */ + const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_ul := '100'B; + /* RP_ERROR_ul */ + const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_dl := '101'B; + /* RP_ERROR_dl */ + const RP_MessageTypeIndicator_Type c_MT_RP_SMMA := '110'B; + /* RP_SMMA */ + const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER := '00'B; + /* SMS DELIVER */ + const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER_REPORT := '00'B; + /* SMS DELIVER REPORT */ + const TP_MessageTypeIndicator_Type c_MT_SMS_STATUS_REPORT := '10'B; + /* SMS STATUS REPORT */ + const TP_MessageTypeIndicator_Type c_MT_SMS_COMMAND := '10'B; + /* SMS COMMAND */ + const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT := '01'B; + /* SMS SUBMIT, SMS SUBMIT REPORT */ + const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT_REPORT := '01'B; + /* SMS SUBMIT, SMS SUBMIT REPORT */ + const Bit7 c_IEI_RP_UserData := '1000001'B; + /* 24.011 cl. 8.2.5.3 */ + const charstring c_Fox := "The quick brown fox jumps over the lazy dog's back. Kaufen Sie Ihrer Frau vier bequeme Pelze. - 0123456789 - THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'S BACK."; + + + + type record TypeOfNumberingPlan { + /* 24.008 cl. 10.5.4.7, 10.5.4.9, 10.5.4.13 */ + Bit1 extBit, + /* Extension Bit */ + Bit3 typeOfNumber, + /* Type Of Number */ + Bit4 numberingPlanId /* Numbering Plan Identification */ + } + /* SM-RP Type Declarations */ + type Bit3 RP_MessageTypeIndicator_Type; + /* 24.011 cl. 8.2.2 */ + type Oct1 RP_MessageReference_Type; + /* 24.011 cl. 8.2.3 */ + type record RP_OriginatorAddress_dl { + /* 24.011 cl. 8.2.5.1 */ + Bit1 spare optional, + /* 0 */ + Bit7 iei optional, + /* 0101 1110 */ + Oct1 iel, + /* min value 2 and max value is 11 */ + TypeOfNumberingPlan typeOfNumberingPlan, + /* */ + octetstring digits length(1 .. 10) + } + + type record RP_OriginatorAddress_ul { + /* 24.011 cl. 8.2.5.1 */ + Bit1 spare optional, + /* 0 */ + Bit7 iei optional, + /* 0101 1110 */ + Oct1 iel /* 0 */ + } + + type record RP_DestinationAddress_ul { + /* 24.011 cl. 8.2.5.2 */ + Bit1 spare optional, + /* 0 */ + Bit7 iei optional, + /* 0101 1110 */ + Oct1 iel, + /* min value 2 and max value is 11 */ + TypeOfNumberingPlan typeOfNumberingPlan, + /* */ + octetstring digits length(1 .. 10) + } + type record RP_DestinationAddress_dl { + /* 24.011 cl. 8.2.5.2 */ + Bit1 spare optional, + /* 0 */ + Bit7 iei optional, + /* 0101 1110 */ + Oct1 iel /* 0 */ + } + + type record RP_UserData { + /* 24.011 cl. 8.2.5.3 */ + Bit1 spare optional, + /* 0, present in case of TLV; omit in case of LV */ + Bit7 iei optional, + /* 1000001, present in case of TLV; omit in case of LV */ + Oct1 iel, + /* */ + TP_PDU_Type tP_PDU /* <= 232 octets */ + } + + type record RP_Cause { + /* 24.011 cl. 8.2.5.4 */ + Bit1 spare optional, + /* present in case of TLV; omit in case of LV */ + Bit7 iei optional, + /* present in case of TLV; omit in case of LV */ + Oct1 iel, + /* 2 or 3 */ + Bit1 extBit1, + /* 0 */ + Bit7 causeValue1, + /* Table 8.4/3GPP TS 24.011 */ + Bit1 extBit2, + /* 0 */ + Bit7 causeValue2, + /* Table 8.4/3GPP TS 24.011 */ + Oct1 diagnostic optional /* Parameters included in the return error from MAP */ + } + + /* End SM-RP Type Declarations */ + /* SM-RP PDU Declarations */ + type record RP_DATA_dl_Type { + /* 24.011 cl. 7.3.1.1 + Direction: n -> ue */ + Bit5 spare5, + /* cl. 8.2.2 M V 5 bits */ + RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, + /* cl. 8.2.2 M V 3 bits */ + RP_MessageReference_Type rP_MessageReference, + /* cl. 8.2.3 M LV 1 */ + RP_OriginatorAddress_dl rP_OriginatorAddress, + /* cl. 8.2.5.1 M LV 1-12 octets */ + RP_DestinationAddress_dl rP_DestinationAddress, + /* cl. 8.2.5.2 M LV 1 */ + RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */ + } + + type record RP_DATA_ul_Type { + /* 24.011 cl. 7.3.1.2 + Direction: ue -> n */ + Bit5 spare5, + /* cl. 8.2.2 M V 5 bits */ + RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, + /* cl. 8.2.2 M V 3 bits */ + RP_MessageReference_Type rP_MessageReference, + /* cl. 8.2.3 M LV 1 */ + RP_OriginatorAddress_ul rP_OriginatorAddress, + /* cl. 8.2.5.1 M LV 1 */ + RP_DestinationAddress_ul rP_DestinationAddress, + /* cl. 8.2.5.2 M LV 1 */ + RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */ + } + + type record RP_SMMA_Type { + /* 24.011 cl. 7.3.2 + Direction: ue -> n */ + Bit5 spare5, + /* cl. 8.2.2 M V 5 bits */ + RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, + /* cl. 8.2.2 M V 3 bits */ + RP_MessageReference_Type rP_MessageReference /* cl. 8.2.3 M LV 1 */ + } + + type record RP_ACK_Type { + /* 24.011 cl. 7.3.3 + Direction: ue <-> n */ + Bit5 spare5, + /* cl. 8.2.2 M V 5 bits */ + RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, + /* cl. 8.2.2 M V 3 bits */ + RP_MessageReference_Type rP_MessageReference, + /* cl. 8.2.3 M LV 1 */ + RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */ + } + + type record RP_ERROR_Type { + /* 24.011 cl. 7.3.4 + Direction: ue <-> n */ + Bit5 spare5, + /* cl. 8.2.2 M V 5 bits */ + RP_MessageTypeIndicator_Type rP_MessageTypeIndicator, + /* cl. 8.2.2 M V 3 bits */ + RP_MessageReference_Type rP_MessageReference, + /* cl. 8.2.3 M LV 1 */ + RP_Cause rP_Cause, + /* cl. 8.2.5.4 M LV 2-3 */ + RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */ + } + + type union RP_PDU_Type { + RP_DATA_dl_Type RP_DATA_dl, + RP_DATA_ul_Type RP_DATA_ul, + RP_SMMA_Type RP_SMMA, + RP_ACK_Type RP_ACK, + RP_ERROR_Type RP_ERROR + } + + /* End SM-RP PDU Declarations */ + /* SM-TP Type Declarations */ + type record TP_Address_Type { + /* 23.040 cl. 9.1.2.5 */ + Oct1 iel, + /* min value 2 and max value is 11 */ + TypeOfNumberingPlan typeOfNumberingPlan, + octetstring digits length(0 .. 10) optional + } + + type Bit2 TP_MessageTypeIndicator_Type; + /* 23.040 cl. 9.2.3.1 */ + type Oct1 TP_MessageReference_Type; + /* 23.040 cl. 9.2.3.6 */ + type Oct1 TP_UserDataLength_Type; + /* 23.040 cl. 9.2.3.16 */ + type record TP_ProtocolIdentifier_Type { + /* 23.040 cl. 9.2.3.9 */ + Bit2 pidType, + /* */ + Bit1 interworking, + /* */ + Bit5 pidValue /* */ + } + + type record TP_DataCodingScheme_Type { + /* 23.040 cl. 9.2.3.10 + 23.040 cl. 4 */ + Bit4 codingGroup, + /* */ + Bit4 codeValue /* */ + } + + type hexstring TP_ServiceCentreTimeStamp_Type length(14); + /* 23.040 cl. 9.2.3.11 */ + type Oct1 TP_ValidityPeriodRelative_Type; + /* 23.040 cl. 9.2.3.12.1 */ + type hexstring TP_ValidityPeriodAbsolute_Type length(14); + /* 23.040 cl. 9.2.3.12.2 */ + type record TP_ValidityPeriodEnhanced_Type { + /* 23.040 cl. 9.2.3.12.3 */ + Bit1 extBit, + /* */ + Bit1 singleShot, + /* */ + Bit3 spare3, + /* */ + Bit3 validityPeriodFormat, + /* */ + Oct6 validityPeriod /* */ + } + + type union TP_ValidityPeriod_Type { + /* 23.040 cl. 9.2.3.3 */ + TP_ValidityPeriodRelative_Type TP_ValidityPeriodRelative, + /* Relative format */ + TP_ValidityPeriodAbsolute_Type TP_ValidityPeriodAbsolute, + /* Absolute format */ + TP_ValidityPeriodEnhanced_Type TP_ValidityPeriodEnhanced /* Enhanced format */ + } + + type record TP_Status_Type { + /* 23.040 cl. 9.2.3.15 */ + Bit1 reserved, + /* */ + Bit7 status /* */ + } + + type Bit8 TP_Command_Type; + /* 23.040 cl. 9.2.3.19 */ + type record TP_ParameterIndicator_Type { + /* 23.040 cl. 9.2.3.27 */ + Bit1 extBit1, + /* */ + Bit4 spare4, + /* */ + Bit1 tP_UDL, + /* */ + Bit1 tP_DCS, + /* */ + Bit1 tP_PID /* */ + } + + /* End SM-TP Type Declarations */ + /* SM-TP PDU Declarations */ + type record SMS_DELIVER_Type { + /* 23.040 cl. 9.2.2.1 + Direction: n -> ue */ + Bit1 tP_ReplyPath, + /* 23.040 cl. 9.2.3.17 */ + Bit1 tP_UserDataHeaderIndicator, + /* 23.040 cl. 9.2.3.23 */ + Bit1 tP_StatusReportIndication, + /* 23.040 cl. 9.2.3.4 */ + Bit2 spare2, + /* */ + Bit1 tP_MoreMessagesToSend, + /* 23.040 cl. 9.2.3.2 */ + TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, + /* 23.040 cl. 9.2.3.1 */ + TP_Address_Type tP_OriginatingAddress, + /* 23.040 cl. 9.1.2.5 */ + TP_ProtocolIdentifier_Type tP_ProtocolIdentifier, + /* 23.040 cl. 9.2.3.9 */ + TP_DataCodingScheme_Type tP_DataCodingScheme_Type, + /* 23.040 cl. 9.2.3.10 */ + TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp, + /* 23.040 cl. 9.2.3.11 */ + TP_UserDataLength_Type tP_UserDataLength, + /* 23.040 cl. 9.2.3.16, derived from SUBMIT */ + octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24, derived from SUBMIT */ + } + + type record SMS_DELIVER_REPORT_Type { + /* 23.040 cl. 9.2.2.1a + Direction: ue -> n */ + Bit1 spare1, + /* */ + Bit1 tP_UserDataHeaderIndicator, + /* 23.040 cl. 9.2.3.23 */ + Bit4 spare4, + /* */ + TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, + /* 23.040 cl. 9.2.3.1 */ + Oct1 tP_FailureCause optional, + /* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */ + TP_ParameterIndicator_Type tP_ParameterIndicator, + /* 23.040 cl. 9.2.3.27 */ + TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional, + /* 23.040 cl. 9.2.3.9 */ + TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional, + /* 23.040 cl. 9.2.3.10 */ + TP_UserDataLength_Type tP_UserDataLength optional, + /* 23.040 cl. 9.2.3.16 */ + octetstring tP_UserData length(0 .. 159) optional /* 23.040 cl. 9.2.3.24 */ + } + + type record SMS_SUBMIT_Type { + /* 23.040 cl. 9.2.2.2 + Direction: ue -> n */ + Bit1 tP_ReplyPath, + /* 23.040 cl. 9.2.3.17 */ + Bit1 tP_UserDataHeaderIndicator, + /* 23.040 cl. 9.2.3.23 */ + Bit1 tP_StatusReportRequest, + /* 23.040 cl. 9.2.3.5 */ + Bit2 tP_ValidityPeriodFormat, + /* 23.040 cl. 9.2.3.3 */ + Bit1 tP_RejectDuplicates, + /* 23.040 cl. 9.2.3.25 */ + TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, + /* 23.040 cl. 9.2.3.1 */ + TP_MessageReference_Type tP_MessageReference, + /* 23.040 cl. 9.2.3.6 */ + TP_Address_Type tP_DestinationAddress, + /* 23.040 cl. 9.1.2.5 */ + TP_ProtocolIdentifier_Type tP_ProtocolIdentifier, + /* 23.040 cl. 9.2.3.9 */ + TP_DataCodingScheme_Type tP_DataCodingScheme_Type, + /* 23.040 cl. 9.2.3.10 */ + // one of the subsequent ValidityPeriod solutions has be removed + TP_ValidityPeriod_Type tP_ValidityPeriod optional, + /* 23.040 cl. 9.2.3.12 */ + // TP_ValidityPeriodRelative_Type tP_ValidityPeriodRelative optional, /* 23.040 cl. 9.2.3.12.1 */ + // TP_ValidityPeriodAbsolute_Type tP_ValidityPeriodAbsolute optional, /* 23.040 cl. 9.2.3.12.2 */ + // TP_ValidityPeriodEnhanced_Type tP_ValidityPeriodEnhanced optional, /* 23.040 cl. 9.2.3.12.3 */ + TP_UserDataLength_Type tP_UserDataLength, + /* 23.040 cl. 9.2.3.16 */ + octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24 */ + } + type record SMS_SUBMIT_REPORT_Type { + /* 23.040 cl. 9.2.2.2a + Direction: n -> ue */ + Bit1 spare1, + /* */ + Bit1 tP_UserDataHeaderIndicator, + /* 23.040 cl. 9.2.3.23 */ + Bit4 spare4, + /* */ + TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, + /* 23.040 cl. 9.2.3.1 */ + Oct1 tP_FailureCause optional, + /* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */ + TP_ParameterIndicator_Type tP_ParameterIndicator, + /* 23.040 cl. 9.2.3.27 */ + TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp, + /* 23.040 cl. 9.2.3.11 */ + TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional, + /* 23.040 cl. 9.2.3.9 */ + TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional, + /* 23.040 cl. 9.2.3.10 */ + TP_UserDataLength_Type tP_UserDataLength optional, + /* 23.040 cl. 9.2.3.16 */ + octetstring tP_UserData length(0 .. 152) optional /* 23.040 cl. 9.2.3.24 */ + } + + type record SMS_STATUS_REPORT_Type { + /* 23.040 cl. 9.2.2.3 + Direction: n -> ue */ + Bit1 spare1, + /* */ + Bit1 tP_UserDataHeaderIndicator, + /* 23.040 cl. 9.2.3.23 */ + Bit1 tP_StatusReportQualifier, + /* 23.040 cl. 9.2.3.26 */ + Bit2 spare2, + /* */ + Bit1 tP_MoreMessagesToSend, + /* 23.040 cl. 9.2.3.2 */ + TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, + /* 23.040 cl. 9.2.3.1 */ + TP_MessageReference_Type tP_MessageReference, + /* 23.040 cl. 9.2.3.6 */ + TP_Address_Type tP_RecipientAddress, + /* 23.040 cl. 9.1.2.5 */ + TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp, + /* 23.040 cl. 9.2.3.11 */ + TP_ServiceCentreTimeStamp_Type tP_DischargeTime, + /* 23.040 cl. 9.2.3.12 */ + TP_Status_Type tP_Status, + /* 23.040 cl. 9.2.3.15 */ + TP_ParameterIndicator_Type tP_ParameterIndicator optional, + /* 23.040 cl. 9.2.3.27 */ + TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional, + /* 23.040 cl. 9.2.3.9 */ + TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional, + /* 23.040 cl. 9.2.3.10 */ + TP_UserDataLength_Type tP_UserDataLength optional, + /* 23.040 cl. 9.2.3.16 */ + octetstring tP_UserData length(0 .. 143) optional /* 23.040 cl. 9.2.3.24 */ + } + + type record SMS_COMMAND_Type { + /* 23.040 cl. 9.2.2.4 + Direction: ue -> n */ + Bit1 spare1, + /* */ + Bit1 tP_UserDataHeaderIndicator, + /* 23.040 cl. 9.2.3.23 */ + Bit1 tP_StatRptReq, + /* Table 8.4/3GPP TS 24.011 */ + Bit3 spare3, + /* */ + TP_MessageTypeIndicator_Type tP_MessageTypeIndicator, + /* 23.040 cl. 9.2.3.1 */ + TP_MessageReference_Type tP_MessageReference, + /* 23.040 cl. 9.2.3.6 */ + TP_ProtocolIdentifier_Type tP_ProtocolIdentifier, + /* 23.040 cl. 9.2.3.9 */ + TP_Command_Type tP_CommandType, + /* 23.040 cl. 9.2.3.19 */ + TP_MessageReference_Type tP_MessageNumber, + /* 23.040 cl. 9.2.3.18 */ + TP_Address_Type tP_DestinationAddress, + /* 23.040 cl. 9.1.2.5 */ + TP_UserDataLength_Type tP_CommandDataLength, + /* 23.040 cl. 9.2.3.20 (number of octets) */ + octetstring tP_CommandData length(0 .. 156) optional /* 23.040 cl. 9.2.3.21 */ + } + + type union TP_PDU_Type { + SMS_DELIVER_Type SMS_DELIVER, + SMS_DELIVER_REPORT_Type SMS_DELIVER_REPORT, + SMS_SUBMIT_Type SMS_SUBMIT, + SMS_SUBMIT_REPORT_Type SMS_SUBMIT_REPORT, + SMS_STATUS_REPORT_Type SMS_STATUS_REPORT, + SMS_COMMAND_Type SMS_COMMAND + } + + + + /* End SM-TP PDU Declarations */ + } + with { + encode "SMSCodec"; + } // group SMS_Declarations + +} +with { + encode "SIPCodec"; variant ""; +} // End of module LibSip_SMSTypesAndValues diff --git a/ttcn/patch_lib_sip_titan/LibSip_SimpleMsgSummaryTypes.ttcn b/ttcn/patch_lib_sip_titan/LibSip_SimpleMsgSummaryTypes.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..6364931d665a0cfdce1d147d76eeff857a8f69ec --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_SimpleMsgSummaryTypes.ttcn @@ -0,0 +1,60 @@ +/** + * @author STF 406, 471 + * @version $Id: LibSip_SimpleMsgSummaryTypes.ttcn 488 2010-11-08 10:17:19Z pintar $ + * @desc This module provides the SMS type system for SIP tests. + * This module is part of LibSipV3. +*/ +module LibSip_SimpleMsgSummaryTypes { + // RFC 3842 + group SMSConstants { + + // IMS ETSI name MWI application + const charstring c_imsEtsiMwiApplication := "application/simple-message-summary"; + + // msg_status line := "Message-Waiting" + const charstring c_messageWaiting := "Message-Waiting"; + + // msg_status line := "Message-Account" + const charstring c_messageAccount := "Message-Account"; + + // msg_summary line := "Voice-Message" + const charstring c_voiceMessage := "Voice-Message"; + + } + + group SMSTypes { + type record SimpleMsgSummary { + // Simple_message_summary + Msg_status_line msg_status_line, + Msg_account msg_account optional, + Msg_summary_line_list msg_summary_line_list optional, + Opt_msg_headers opt_msg_headers optional + } + + type record Msg_status_line { + charstring msg_type, + charstring msg_status + } + + type record Msg_account { + charstring msg_type_account, + charstring account_URI + } + + type set of Msg_summary_line Msg_summary_line_list; + + type record Msg_summary_line { + charstring msg_context_class, + charstring msgs, + charstring urgent_msgs optional + } + + type set of charstring Opt_msg_headers; + + + // type integer msgcount length(1); //msgs and urgent_msgs can be dividet into subtypes + } +} +with { + encode "SIPCodec"; variant ""; +} \ No newline at end of file diff --git a/ttcn/patch_lib_sip_titan/LibSip_Steps.ttcn b/ttcn/patch_lib_sip_titan/LibSip_Steps.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..af7ce02a75b64dd710684f1085e97a2dd46d9ec5 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_Steps.ttcn @@ -0,0 +1,4924 @@ +/** + * @author STF 346, STF366, STF368, STF369, STF450, STF471 + * @version $Id$ + * @desc This module provides the functions, altsteps and external functions used + * for SIP-IMS tests. + * This module is part of LibSipV3. +*/ +module LibSip_Steps { + // LibCommon + import from LibCommon_Sync all; + import from LibCommon_VerdictControl all; + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_SDPTypes all; + import from LibSip_Templates all; + import from LibSip_Interface all; + import from LibSip_PIXITS all; + import from LibSip_XMLTypes all; + import from LibSip_Common all; + + group externalfunctions { + + /** + * @desc External function to return random charstring + */ + external function fx_rndStr( + ) return charstring; + + /** + * @desc External function to return the equivalent string in lower case + */ + external function fx_putInLowercase( + charstring p_string + ) return charstring; + + /** + * @desc External function to get IP address. + */ + external function fx_getIpAddr( + charstring p_host_name + ) return charstring; + + /** + * @desc External function to generate a digest response. + * @reference RFC 2617 HTTP Authentication: Basic and Digest Access Authentication, and RFC 1321 The MD5 Message-Digest Algorithm + * @see RFC 2617, chapter 5 Sample implementation, for example usage, as the signature of calculateDigestResponse is according to the example given in the RFC. + */ + external function fx_calculateDigestResponse( + charstring p_nonce, + charstring p_cnonce, + charstring p_user, + charstring p_realm, + charstring p_passwd, + charstring p_alg, + charstring p_nonceCount, + charstring p_method, + charstring p_qop, + charstring p_URI, + charstring p_HEntity + ) return charstring; + + } + + group ParameterOperations { + + /** + * @desc function to generate a 32 bits random number as a charstring for tag field (used as e.g.: tag in from-header field, or branch parameter in via header) + * @return random value with at least 32 bits of randomness + */ + function f_getRndTag( + ) return charstring { + var charstring v_tag_value; + // tag_value is initialized with a random value with at least 32 bits of randomness + // 4294967296 is a 32 bits integer + v_tag_value := fx_rndStr() & fx_rndStr(); + return (v_tag_value); + } + + /** + * @desc Function to prepare credentials for request that has an empty entity body such as a REGISTER message. + * @param p_userprofile to get important parameters + * @param p_algorithm Algorthm to be used. Default: omit + * @return Credentials field + */ + function f_calculatecCredentials_empty( + in SipUserProfile p_userprofile, + in boolean p_algorithm := false + ) return Credentials { + var Credentials v_result; + + + // RFC 2617 3.2.2 username: + // The name of user in the specified realm. + var charstring v_username := p_userprofile.privUsername; + var charstring v_realm := p_userprofile.registrarDomain; + var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain; + var CommaParam_List v_digestResponse := {}; + // Construct credentials for an Authorization field of a request. + v_digestResponse := f_addParameter(v_digestResponse, { + id := "username", + paramValue := { quotedString := v_username } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "realm", + paramValue := { quotedString := v_realm } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "uri", + paramValue := { quotedString := v_uri } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nonce", + paramValue := { quotedString := "" } + }); // already enclosed to " characters + v_digestResponse := f_addParameter(v_digestResponse, { + id := "response", + paramValue := { quotedString := "" } + }); // already enclosed to " characters + + if (p_algorithm) { + v_digestResponse := f_addParameter(v_digestResponse, { + id := "algorithm", + paramValue := { tokenOrHost := PX_AUTH_ALGORITHM } + }); // already enclosed to " characters + } + v_result := {digestResponse := v_digestResponse}; + + return v_result; + } + + + /** + * @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message. + * @param p_userprofile to get important parameters + * @param p_method (can be "REGISTER", "INVITE",....) + * @param p_challenge parameter from 4xx response + * @return Credentials field + * @verdict + */ + function f_calculatecCredentials( + in SipUserProfile p_userprofile, + in charstring p_method, + in CommaParam_List p_challenge + ) return Credentials { + var Credentials v_result; + var charstring v_nonce := ""; + var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265); + + // RFC 2617 3.2.2 username: + // The name of user in the specified realm. + var charstring v_username := p_userprofile.privUsername; + var charstring v_realm; + + // RFC 2617 3.2.2.2 passwd: + // A known shared secret, the password of user of the specified + // username. + var charstring v_passwd := p_userprofile.passwd; + var charstring v_algorithm; + + // a new pseudo-random cnonce value is used every time + // that assumes it is only used once + const charstring cl_nonceCount := "00000001"; + var charstring v_qop := p_userprofile.qop; + var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain; + + // MD5 hash of empty entity body. + const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e"; + var charstring v_response; + var charstring v_opaque; + var CommaParam_List v_digestResponse := {}; + + + // extract nonce, realm, algorithm, and opaque from challenge + v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce"); + v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); + v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm"); + v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque"); + + // calculate a digest response for the Authorize header + v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity); + + // Construct credentials for an Authorization field of a request. + v_digestResponse := f_addParameter(v_digestResponse, { + id := "username", + paramValue := { quotedString := v_username } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "realm", + paramValue := { quotedString := v_realm } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nonce", + paramValue := { quotedString := v_nonce } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "uri", + paramValue := { quotedString := v_uri } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "response", + paramValue := { quotedString := v_response } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "algorithm", + paramValue := { tokenOrHost := "md5" } + }); // algorithm is not enclosed to " characters + v_digestResponse := f_addParameter(v_digestResponse, { + id := "cnonce", + paramValue := { quotedString := v_cnonce } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "qop", + paramValue := { tokenOrHost := v_qop } + }); // qop + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nc", + paramValue := { tokenOrHost := cl_nonceCount } + }); // nonceCount + if (v_opaque != "") { + v_digestResponse := f_addParameter(v_digestResponse, { + id := "opaque", + paramValue := { quotedString := v_opaque } + }); // already enclosed to " characters + } + v_result := {digestResponse := v_digestResponse}; + + return v_result; + } + + /** + * @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message. NO RESPONSE value to cause an error! + * @param p_userprofile to get important parameters + * @param p_method (can be "REGISTER", "INVITE",....) + * @param p_challenge parameter from 4xx response + * @return Credentials field + * @verdict + */ + function f_calculatecCredentials_wo_response( + in SipUserProfile p_userprofile, + in charstring p_method, + in CommaParam_List p_challenge + ) return Credentials { + var Credentials v_result; + var charstring v_nonce := ""; + var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265); + + // RFC 2617 3.2.2 username: + // The name of user in the specified realm. + var charstring v_username := p_userprofile.privUsername; + var charstring v_realm; + + // RFC 2617 3.2.2.2 passwd: + // A known shared secret, the password of user of the specified + // username. + var charstring v_passwd := p_userprofile.passwd; + var charstring v_algorithm; + + + // a new pseudo-random cnonce value is used every time + // that assumes it is only used once + const charstring cl_nonceCount := "00000001"; + var charstring v_qop := p_userprofile.qop; + var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain; + + // MD5 hash of empty entity body. + const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e"; + var charstring v_response; + var charstring v_opaque; + var CommaParam_List v_digestResponse := {}; + + // extract nonce, realm, algorithm, and opaque from challenge + v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce"); + v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); + v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm"); + v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque"); + + // calculate a digest response for the Authorize header + v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity); + + v_digestResponse := f_addParameter(v_digestResponse, { + id := "username", + paramValue := { quotedString := v_username } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "realm", + paramValue := { quotedString := v_realm } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nonce", + paramValue := { quotedString := v_nonce } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "uri", + paramValue := { quotedString := v_uri } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "algorithm", + paramValue := { tokenOrHost := "md5" } + }); // algorithm is not enclosed to " characters + v_digestResponse := f_addParameter(v_digestResponse, { + id := "cnonce", + paramValue := { quotedString := v_cnonce } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "qop", + paramValue := { tokenOrHost := v_qop } + }); // qop + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nc", + paramValue := { tokenOrHost := cl_nonceCount } + }); // nonceCount + if (v_opaque == "") { + v_digestResponse := f_addParameter(v_digestResponse, { + id := "opaque", + paramValue := { quotedString := v_opaque } + }); // already enclosed to " characters + } + v_result := {digestResponse := v_digestResponse}; + + return v_result; + } + + /** + * @desc Function to calculate credentials for response 401 - WWW-Authorization + * @param p_qop of the peer UE (alternatively ) + * @param p_authorization parameter from 1st REGISTER request + * @return Credentials field + * @verdict + */ + function f_calculatecChallenge_forWWWAuthorizationBody( + in charstring p_qop, + in Authorization p_authorization + ) return Challenge { + var CommaParam_List v_challenge; + + if (ischosen(p_authorization.body[0].digestResponse)) { + v_challenge := p_authorization.body[0].digestResponse; + } + else { + v_challenge := p_authorization.body[0].otherResponse.authParams; + } + + return (f_calculatecChallenge_forWWWAuthorization(p_qop, v_challenge)); + } + + /** + * @desc Function to calculate credentials for response 401 - WWW-Authorization + * @param p_qop of the peer UE (alternatively ) + * @param p_challenge parameter from 1st REGISTER request + * @return Credentials field + * @verdict + */ + function f_calculatecChallenge_forWWWAuthorization( + in charstring p_qop, + in CommaParam_List p_challenge + ) return Challenge { + var Challenge v_result; + + var charstring v_realm; + + var charstring v_qop := p_qop; + + v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); + + // Construct credentials for an Authorization field of a request. + v_result := { + digestCln := { + { + id := "realm", + paramValue := { quotedString := v_realm } + }, + { + id := "nonce", + paramValue := { quotedString := "0edff6c521cc3f407f2d9e01cf6ed82b" } + }, + { + id := "algorithm", + paramValue := { tokenOrHost := PX_AUTH_ALGORITHM } + }, // algorithm is not enclosed with " characters + { + id := "ck", + paramValue := { quotedString := "00112233445566778899aabbccddeeff" } + }, + { + id := "ik", + paramValue := { quotedString := "ffeeddccbbaa99887766554433221100" } + }, // already enclosed to " characters + { + /** + * This directive is optional, but is made so only for backward compatibility with RFC 2069 + * it SHOULD be used by all implementations compliant with this version of the Digest scheme + */ + id := "qop", + paramValue := { tokenOrHost := v_qop } + } // qop + } + }; + + return v_result; + } + + /** + * @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message and at the end put different private name + * @param p_userprofile to get important parameters + * @param p_method (can be "REGISTER", "INVITE",....) + * @param p_challenge parameter from 4xx response + * @return Credentials field + * @verdict + */ + function f_calculatecCredentialsAndChangeUserName( + in SipUserProfile p_userprofile, + in charstring p_method, + in CommaParam_List p_challenge + ) return Credentials { + var Credentials v_result; + var charstring v_nonce := ""; + var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265); + + // RFC 2617 3.2.2 username: + // The name of user in the specified realm. + var charstring v_username := p_userprofile.privUsername; + var charstring v_realm; + + // RFC 2617 3.2.2.2 passwd: + // A known shared secret, the password of user of the specified + // username. + var charstring v_passwd := p_userprofile.passwd; + var charstring v_algorithm; + + + // a new pseudo-random cnonce value is used every time + // that assumes it is only used once + const charstring cl_nonceCount := "00000001"; + var charstring v_qop := p_userprofile.qop; + var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain; + + + // MD5 hash of empty entity body. + const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e"; + var charstring v_response; + var charstring v_opaque; + var CommaParam_List v_digestResponse := {}; + + + // extract nonce, realm, algorithm, and opaque from challenge + v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce"); + v_realm := f_extractParamValueFromChallenge(p_challenge, "realm"); + v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm"); + v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque"); + + // calculate a digest response for the Authorize header + v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity); + + // Construct credentials for an Authorization field of a request. + v_digestResponse := f_addParameter(v_digestResponse, { + id := "username", + paramValue := { quotedString := "DifferentToPrivateUser" } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "realm", + paramValue := { quotedString := v_realm } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nonce", + paramValue := { quotedString := v_nonce } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "uri", + paramValue := { quotedString := v_uri } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "response", + paramValue := { quotedString := v_response } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "algorithm", + paramValue := { tokenOrHost := "md5" } + }); // algorithm is not enclosed to " characters + v_digestResponse := f_addParameter(v_digestResponse, { + id := "cnonce", + paramValue := { quotedString := v_cnonce } + }); + v_digestResponse := f_addParameter(v_digestResponse, { + id := "qop", + paramValue := { tokenOrHost := v_qop } + }); // qop + v_digestResponse := f_addParameter(v_digestResponse, { + id := "nc", + paramValue := { tokenOrHost := cl_nonceCount } + }); + if (v_opaque != "") { + v_digestResponse := f_addParameter(v_digestResponse, { + id := "opaque", + paramValue := { quotedString := "" } + }); // already enclosed to " characters + } + v_result := {digestResponse := v_digestResponse}; + + return v_result; + } + + + /** + * @desc Function to check if param related to id from CommanParam_List exist containing challenge. + * @param p_challenge parameter from 4xx response + * @param p_id name of parameter("nonce", "realm", "ck", "ik"...) + * @return parameter p_id value + */ + function f_checkParamValueFromChallengeIfPresent( + in CommaParam_List p_challenge, + in charstring p_id + ) return boolean { + var boolean v_result := false; + var integer v_len := lengthof(p_challenge); + var charstring v_id := fx_putInLowercase(p_id); + var integer i; + + for (i := 0; i < v_len; i := i + 1) { + if (fx_putInLowercase(p_challenge[i].id) == v_id) { + v_result := true; + } + } + + return v_result; + } + + /** + * @desc Function to check if tag is present in SemicolonParam_List + * @param p_param_l SemicolonParam_List + * @return boolean true if tag is present + */ + function f_checkTagPresent( + SemicolonParam_List p_param_l + ) runs on SipComponent + return boolean { + var integer v_numberOfParams; + var integer i := 0; + + v_numberOfParams := lengthof(p_param_l); + while (i < v_numberOfParams) { + if (fx_putInLowercase(p_param_l[i].id) == c_tagId) { + return (true); + } + i := i + 1; + } + return (false); + } + + /** + * @desc Function to remove a parameter from SemicolonParam_List + * @param p_param_l SemicolonParam_List + * @return SemicolonParam_List new parameter list + */ + function f_removeParameter( + SemicolonParam_List p_param_l, + charstring p_id + ) runs on SipComponent + return SemicolonParam_List { + var integer v_numberOfParams; + var integer i := 0; + var integer j := 0; + var SemicolonParam_List v_newParamList; + + v_numberOfParams := lengthof(p_param_l); + while (i < v_numberOfParams) { + if (not fx_putInLowercase(p_param_l[i].id) == p_id) { + v_newParamList[j] := p_param_l[i]; + j := j + 1; + } + i := i + 1; + } + return v_newParamList; + } + + /** + * @desc Function to add a parameter to SemicolonParam_List + * @param p_param_l SemicolonParam_List + * @return SemicolonParam_List new parameter list + */ + function f_addParameter( + SemicolonParam_List p_param_l, + GenericParam p_genparam + ) + return SemicolonParam_List { + var SemicolonParam_List v_newParamList := p_param_l; + var integer v_numberOfParams := lengthof(p_param_l); + v_newParamList[v_numberOfParams] := p_genparam; + return v_newParamList; + } + + /** + * @desc Function to extract paramValue related to id from CommanParam_List containing challenge. + * @param p_challenge parameter from 4xx response + * @param p_id name of parameter("nonce", "realm",...) + * @return parameter p_id value + */ + function f_extractParamValueFromChallenge( + in CommaParam_List p_challenge, + in charstring p_id + ) return charstring { + var charstring v_result := ""; + var integer v_len := lengthof(p_challenge); + var charstring v_id := fx_putInLowercase(p_id); + var integer i; + var charstring v_tmpchar; + + for (i := 0; i < v_len; i := i + 1) { + if (fx_putInLowercase(p_challenge[i].id) == v_id) { + if (isvalue(p_challenge[i].paramValue)) { + if(ischosen(p_challenge[i].paramValue.quotedString)) { + v_result := valueof(p_challenge[i].paramValue.quotedString); + } else { + v_result := valueof(p_challenge[i].paramValue.tokenOrHost); + } + } + } + } + + if (v_result == "") { + if (match(p_id, "algorithm")) { + v_result := "MD5"; + } + else if (match(p_id, "opaque")) { + v_result := ""; + } + else { + v_tmpchar := "Cannot acquire value from credentials."; + log("*** " & __SCOPE__ &": INFO: Cannot acquire value from credentials ***"); + setverdict(inconc); + stop; + } + } + + return v_result; + } + + /** + * @desc Return the updated component variable of via header + * @return component variable of via header + */ + function f_updateViaHeaderAS( + in Via p_via + ) runs on SipComponent + return Via { + var Via v_via; + var ViaBody_List v_viaBody_List := p_via.viaBody; + var integer v_size_via := lengthof(v_viaBody_List); + var integer v_size_via_updated := v_size_via + 1; + var ViaBody_List v_viaBody_List_updated; + var integer i; + vc_branch := c_branchCookie & f_getRndTag(); + v_viaBody_List_updated[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile)); + // p_viaBody_List_updated[0 ] := vc_request.msgHeader.route.routeBody[0 ] ; + for (i := 1; i < v_size_via_updated; i := i + 1) { + v_viaBody_List_updated[i] := v_viaBody_List[i - 1]; + } + v_via.fieldName := p_via.fieldName; + v_via.viaBody := v_viaBody_List_updated; + return (v_via); + } + + /** + * @desc Return the updated component variable of route header + * @return component variable of route header + */ + function f_updateRouteHeaderAS( + in Route p_route + ) runs on SipComponent + return Route { + var Route v_route; + var RouteBody_List v_routeBody_List := p_route.routeBody; + var integer v_size_route := lengthof(v_routeBody_List); + var integer v_size_route_updated := v_size_route - 1; + var RouteBody_List v_routeBody_List_updated; + var integer i; + + for (i := 0; i < v_size_route_updated; i := i + 1) { + v_routeBody_List_updated[i] := v_routeBody_List[i + 1]; + } + v_route.fieldName := p_route.fieldName; + v_route.routeBody := v_routeBody_List_updated; + return (v_route); + } + + /** + * @desc Return the updated component variable of record route header + * @return component variable of record route header + */ + function f_updateRecordRouteHeaderAS( + in template(value) RecordRoute p_recordRoute + ) runs on SipComponent + return RecordRoute { + var + RecordRoute + v_recordRoute := + valueof( + m_recordRoute_currIpAddr_params( + vc_userprofile, + { + { + "lr", + omit + } + } + ) + ); + var integer v_size_recordRoute := 0; + var integer i; + + if (isvalue(p_recordRoute)) { + v_size_recordRoute := lengthof(valueof(p_recordRoute).routeBody); + } + for (i := 1; i < v_size_recordRoute + 1; i := i + 1) { + v_recordRoute.routeBody[i] := valueof(p_recordRoute).routeBody[i - 1]; + } + + return (v_recordRoute); + } + + + + } // end group ParameterOperations + + group FieldOperations { + + /** + * @desc function adds "Tag"-parameter in "To"-headerfield + * @param p_to To header field that should get a Tag parameter + */ + function f_addTagInTo( + inout To p_to + ) runs on SipComponent { + f_addParameterTagIfNotPresent(c_tagId, { tokenOrHost := f_getRndTag() }, p_to); + } + + /** + * @desc addition of a single parameter in the via header field + * @param p_parameter_name name of parameter to be added + * @param p_parameter_value value of parameter to be added + * @param p_viaBody the via parameter to be extended + * @verdict + */ + function f_addParameterIfNotPresent( + in charstring p_parameter_name, + in GenValue p_parameter_value, + inout ViaBody p_viaBody + ) { + if (isvalue(p_viaBody.viaParams)) { + return; + } + p_viaBody.viaParams := { + { + p_parameter_name, + p_parameter_value + } + }; + } + + /** + * @desc function to addd a parameter to the "To" header field (if there is not any parameter) + * @param p_parameter_name name of the parameter to be added + * @param p_parameter_value value of the paramter to be added + * @param p_to "To" header field to be extended + * @verdict + */ + function f_addParameterTagIfNotPresent( + in charstring p_parameter_name, + in GenValue p_parameter_value, + inout To p_to + ) { + if (isvalue(p_to.toParams)) { + return; + } + p_to.toParams := { + { + p_parameter_name, + p_parameter_value + } + }; + } + + /** + * @desc function compares the IP address of two hosts + * @param p_host1 hostname + * @param p_host2 hostname + * @return boolean value that is true if the IP addresses are identical + * @verdict + */ + function f_equivalentHostAddr( + in charstring p_host1, + in charstring p_host2 + ) return boolean { + // A DNS server may be used + return (fx_getIpAddr(p_host1) == fx_getIpAddr(p_host2)); + } + + + /** + * @desc function checks if Require contains Precondition + * @param p_message (request or response) SIP message to be analysed + * @return true if p_id parameter exist + */ + function f_checkRequirePrecondition( + in Request p_message + ) { + var boolean v_precondition_found; + var integer i; + if (isvalue(p_message.msgHeader.require)) { + v_precondition_found := false; + for (i := 0; i < lengthof(p_message.msgHeader.require.optionsTags); i := i + 1) { + if (match(p_message.msgHeader.require.optionsTags[i], c_tagPrecond)) { + v_precondition_found := true; + } + } + if (not (v_precondition_found)) { + setverdict(fail); + log("*** " & __SCOPE__ & ": FAIL: precondition not found in Require options list! ***"); + } + } + else { + setverdict(fail); + log("*** " & __SCOPE__ & ": FAIL: Require options is not present! ***"); + } + } + + /** + * @desc function checks if P-Charging-Vector contains a particular parameter + * @param p_message (request or response) SIP message to be analysed + * @param p_id name of parameter + * @return true if p_id parameter exist + */ + function f_checkPChargingVectorHeaderParamId( + in Request p_message, + charstring p_id + ) return boolean { + var integer i; + + if (isvalue(p_message.msgHeader.pChargingVector)) { + for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) { + if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) { + return (true); + } + } + } + return (false); + } + + /** + * @desc function checks if P-Charging-Vector contains a particular parameter + * @param p_message (request or response) SIP message to be analysed + * @param p_id name of parameter + * @return true if p_id parameter exist + */ + function f_checkPChargingVectorHeaderParamIdResponse( + in Response p_message, + charstring p_id + ) return boolean { + var integer i; + + if (isvalue(p_message.msgHeader.pChargingVector)) { + for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) { + if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) { + return true; + } + } + } + return (false); + } + + /** + * @desc function returns the Host/Port of a given Contact header field + * @param p_contact contact header field to be analysed + * @return Host/Port record from the contact header field + */ + function f_getContactUri( + in ContactAddress p_contact + ) runs on SipComponent + return SipUrl { + var SipUrl v_SipUrl; + + if (ischosen(p_contact.addressField.nameAddr)) { + v_SipUrl := p_contact.addressField.nameAddr.addrSpec; + } + else { + v_SipUrl := p_contact.addressField.addrSpecUnion; + } + + return (v_SipUrl); + } // end f_getContactUri + + /** + * @desc function returns the Host/Port of a given Contact header field + * @param p_contact contact header field to be analysed + * @return Host/Port record from the contact header field + */ + function f_getContactAddr( + in ContactAddress p_contact + ) runs on SipComponent + return HostPort { + var HostPort v_locAddr; + var SipUrl v_SipUrl; + + if (ischosen(p_contact.addressField.nameAddr)) { + v_SipUrl := p_contact.addressField.nameAddr.addrSpec; + } + else { + v_SipUrl := p_contact.addressField.addrSpecUnion; + } + + v_locAddr.host := v_SipUrl.components.sip.hostPort.host; + + if (isvalue(v_SipUrl.components.sip.hostPort.portField)) { + v_locAddr.portField := v_SipUrl.components.sip.hostPort.portField; + } + else { + v_locAddr.portField := c_defaultSipPort; + } + + return (v_locAddr); + } // end f_getContactAddr + + /** + * @desc function checks if History-Info-Header of the p_message contains a particular URI + * @param p_message (request or response) SIP message to be analysed + * @param p_URI name of parameter + * @return true if p_URI parameter exist + */ + function f_checkHeaderInfoURI( + in Response p_message, + SipUrl p_URI + ) return boolean { + var integer i; + + if (isvalue(p_message.msgHeader.historyInfo)) { + for (i := 0; i < lengthof(p_message.msgHeader.historyInfo.historyInfoList); i := i + 1) { + if (p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI) { + return (true); + } + } + } + return (false); + } + + /** + * @desc function returns the Userinfo from a given To header field + * @param p_to To header field to be analysed + * @return Userinfo from the To header field as a charstring + */ + function f_getUserfromTo( + in To p_to + ) runs on SipComponent + return charstring { + var SipUrl v_SipUrl; + + if (ischosen(p_to.addressField.nameAddr)) { + v_SipUrl := p_to.addressField.nameAddr.addrSpec; + } + else { + v_SipUrl := p_to.addressField.addrSpecUnion; + } + + return (v_SipUrl.components.sip.userInfo.userOrTelephoneSubscriber); + } // end f_getUserfromTo + + /** + * @desc function to generate a 32 bits random number as a charstring for tag field + * @param p_cSeq_s CSeq parameter used to modify the tag field value + * @return tag value + */ + function f_getRndCallId( + ) return charstring { + var charstring v_tag_value := fx_rndStr() & fx_rndStr(); + // v_tag_value is initialized with a random value with at least 32 bits of randomness + // 4294967296 is a 32 bits integer + // v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber ); + return (v_tag_value); + } + + /** + * @desc function give access to the top element of the Path header field. + * @param p_Request SIP message to be analysed + * @return NameAddr (e.g. ) or omit + */ + function f_getPathHeaderTop( + inout Request p_Request + ) return template(omit) NameAddr { + if (isvalue(p_Request.msgHeader.path)) { + if (lengthof(p_Request.msgHeader.path.pathValues) > 0) { + return (p_Request.msgHeader.path.pathValues[0].nameAddr); + } + } + return (omit); + } + + /** + * @desc function updates first element of a Via headerfield list + * @param p_viaBody_List address list of a Via header field + * @param p_source_address address to be inserted in the top element + */ + function f_getViaReplyAddr( + inout ViaBody_List p_viaBody_List, + inout Address4SIP p_source_address + ) runs on SipComponent { + var ViaBody v_viaBody; + // The address to send message shall be updated after getting information + // in the Via header fied and according to 18.2.2 + v_viaBody := p_viaBody_List[0]; + + // received parameter has to be addded to the via hader field + // Be careful it could be an Host name and not an IP Address + // One of the reasons this error can occur is if no DNS server is available. + // As a workaround, it is possible to adapt the configuration on the local machine the test + // suite is running on (e.g. under Windows the following file could be configured: + // C:\WINDOWS\system32\drivers\etc\hosts). + // Check if host address can be rosolved + if (not f_equivalentHostAddr(valueof(v_viaBody.sentBy.host), valueof(p_source_address.host))) { + f_addParameterIfNotPresent(c_receivedId, { tokenOrHost := valueof(p_source_address.host) }, v_viaBody); + } + if (isvalue(v_viaBody.sentBy.portField)) { + p_source_address.portField := valueof(v_viaBody.sentBy.portField); + } + else { + p_source_address.portField := c_defaultSipPort; + } + } + + /** + * @desc functions give access to an element of the Route header field (record). + * @param p_message (request) SIP message to be analysed + * @param p_index index of Route record element to be retrieved + * @return HostPort value of the Route element or omit + */ + function f_getRouteHeaderElementAddressFromRequest( + in Request p_message, + in integer p_index + ) return HostPort { + if (isvalue(p_message.msgHeader.route)) { + if (lengthof(p_message.msgHeader.route.routeBody) > p_index) { + return (p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort); + } + } + setverdict(fail); + return (c_hostport_dummy); + } + + /** + * @desc functions give access to an element of the Record-Route header field (record). + * @param p_message (request) SIP message to be analysed + * @param p_index index of recordRoute record element to be retrieved + * @return HostPort value of the Record-Route element or omit + */ + function f_getRecordRouteHeaderElementAddressFromRequest( + in Request p_message, + in integer p_index + ) return HostPort { + if (isvalue(p_message.msgHeader.recordRoute)) { + if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) { + return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort); + } + } + setverdict(fail); + return (c_hostport_dummy); + } + + /** + * @desc functions give access to an element of the Record-Route header field (record). + * @param p_message (response) SIP message to be analysed + * @param p_index index of recordRoute record element to be retrieved + * @return HostPort value of the Record-Route element or omit + */ + function f_getRecordRouteHeaderElementAddressFromResponse( + in Response p_message, + in integer p_index + ) return HostPort { + if (isvalue(p_message.msgHeader.recordRoute)) { + if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) { + return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort); + } + } + setverdict(fail); + return (c_hostport_dummy); + } + + /** + * @desc functions give access to an element of the Via header field (record). + * @param p_message (request) SIP message to be analysed + * @param p_index index of via record element to be retrieved + * @return HostPort value of the Via element or omit + */ + function f_getViaHeaderElementHostPort( + in Request p_message, + in integer p_index + ) return HostPort { + + if (lengthof(p_message.msgHeader.via.viaBody) > p_index) { + return (p_message.msgHeader.via.viaBody[p_index].sentBy); + } + setverdict(fail); + return (c_hostport_dummy); + } + + /** + * @desc functions give access to an element of the Via header field (record). + * @param p_message (response) SIP message to be analysed + * @param p_index index of via record element to be retrieved + * @return HostPort value of the Via element or omit + */ + function f_getViaHeaderElementHostPortResponse( + in Response p_message, + in integer p_index + ) return HostPort { + + if (lengthof(p_message.msgHeader.via.viaBody) > p_index) { + return (p_message.msgHeader.via.viaBody[p_index].sentBy); + } + setverdict(fail); + return (c_hostport_dummy); + } + + /** + * @desc function checks indicators if topology hiding (TH) has been applied: - second element in via-header record has tokenized-by parameter + * @param p_Request SIP message to be analysed + * @return boolean value (true indicate TH, false otherwise) + */ + function f_topologyHiding( + inout Request p_request + ) runs on SipComponent + return boolean { + var GenericParam v_viaParameter; + + if (lengthof(p_request.msgHeader.via.viaBody) <2 ) { + return (false); + } + v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0]; + // second element + if (not v_viaParameter.id == "tokenized-by") { + return (false); + } + return (true); + } + + /** + * @desc function checks indicators if topology hiding (TH) has been applied: - any element in via-header record has tokenized-by parameter + * @param Response SIP message to be analysed + * @return boolean value (true indicate TH, false otherwise) + */ + function f_topologyHidingResponse( + inout Response p_response + ) runs on SipComponent + return boolean { + var GenericParam v_viaParameter; + var integer i; + + for (i := 0; i < lengthof(p_response.msgHeader.via.viaBody); i := i + 1) { + + v_viaParameter := p_response.msgHeader.via.viaBody[i].viaParams[0]; // first parameter + if (not v_viaParameter.id == "tokenized-by") { + return (false); + } + } + return (true); + } + + + + group SetHeaders { + + + /** + * @desc function for setting of component variables related to message header fields (message type independent: CSeq, contact, via), function uses information from userprofile + * @param p_cSeq_s CSeq parameter + * @param p_method method name for cSeq header field + */ + function f_setHeadersGeneral( + inout CSeq p_cSeq_s, + in charstring p_method + ) runs on SipComponent { + p_cSeq_s.fieldName := CSEQ_E; + p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1; + p_cSeq_s.method := p_method; + vc_cSeq := p_cSeq_s; + + vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile))); + vc_branch := c_branchCookie & f_getRndTag(); + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + } // end function f_setHeadersGeneral + + + + /** + * @desc function for setting of component variables related to message header fields (message type independent: CSeq, contact, via), function uses information from userprofile + * @param p_cSeq_s CSeq parameter + * @param p_method method name for cSeq header field + */ + function f_setHeadersACK( + ) runs on SipComponent { + // vc_requestUri.hostPort := vc_reqHostPort; + if (vc_response.statusLine.statusCode >= 200 and vc_response.statusLine.statusCode <= 299) + // ref. RFC3261 8.1.1.7 Via + { + vc_branch := c_branchCookie & f_getRndTag(); + } + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + } // end function f_setHeadersGeneral + + /** + * @desc setting of general and basic Bye header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersBYE( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "BYE"); // cseq, contact, branch, via + // vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr }; + f_addTagInTo(vc_to); + + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersBYE + + /** + * @desc setting of general and basic CANCEL header fields + * @param p_cSeq_s + */ + function f_setHeadersCANCEL( + inout CSeq p_cSeq_s + ) runs on SipComponent { + + p_cSeq_s.method := "CANCEL"; + // vc_branch := c_branchCookie & f_getRndTag(); // STF 406: CANCEL and ACK should have the same branch as the INVITE + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + } // end function f_setHeadersCANCEL + + /** + * @desc function sets header field for the next outgoing REGISTER message + * @param p_cSeq_s CSeq parameter to be applied + * @param p_emergency Set to true in case of emergency + */ + function f_setHeaders_REGISTER( + inout CSeq p_cSeq_s, + boolean p_emergency := false + ) runs on SipComponent { + var SemicolonParam_List v_params := {}; + + f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via + vc_requestUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := vc_userprofile.registrarDomain, + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + }; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + vc_callIdReg := vc_callId; // remember callId for de-registration + vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile))); + vc_cancel_To := vc_to; + v_params := f_addParameter(v_params, + { + id := c_tagId, + paramValue := { + tokenOrHost := f_getRndTag() + } + }); + vc_from := { + fieldName := FROM_E, + addressField := vc_to.addressField, + fromParams := v_params + }; + + if (not vc_firstREGISTER_sent) { + if (p_emergency) { + v_params := { + { + "sos", + omit + } + }; + vc_contact.contactBody.contactAddresses[0].addressField.addrSpecUnion.urlParameters := v_params; + } + else { + v_params := { + { + id := c_expiresId, + paramValue := { + tokenOrHost := c_shortRegistration + } + } + }; + vc_contact.contactBody.contactAddresses[0].contactParams := v_params; + } + } + + vc_firstREGISTER_sent := true; // f_setHeaders_Register is called in deREGISTER function + vc_authorization := { + fieldName := AUTHORIZATION_E, + body := {f_calculatecCredentials_empty(vc_userprofile)} + }; + + vc_via_REG := vc_via; + } // end function setHeaders_REGISTER + + /** + * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER + * @verdict + */ + function f_setHeaders_2ndREGISTER( + inout CSeq p_cSeq_s + ) runs on SipComponent { + var CommaParam_List v_challenge; + + // Increment CSeq sequence number + p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1; + vc_cSeq := p_cSeq_s; + + vc_requestUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := vc_userprofile.registrarDomain, + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + }; + + // new branch tag due to different branch tag in new REGISTER method + vc_branch := c_branchCookie & f_getRndTag(); + + vc_via_REG := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + + // Extract challenge and calculate credentials for a response. + v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln; + + + // Prepair right answer + vc_authorization := { + fieldName := AUTHORIZATION_E, + body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)} + }; + } // end function f_setHeaders_2ndREGISTER + + /** + * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER NO response in Authorization header to cause an error + * @verdict + */ + function f_setHeaders_2ndREGISTER_wo_response( + ) runs on SipComponent { + var CommaParam_List v_challenge; + + vc_branch := c_branchCookie & f_getRndTag(); + + vc_via_REG := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + + if (ischosen(vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge)) + // Extract challenge and calculate credentials for a response. + { + v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams; + } + else { + v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln; + } + + // Increment CSeq sequence number + vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1; + + // Prepair right answer + vc_authorization := { + fieldName := AUTHORIZATION_E, + body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)} + }; + } // end function f_setHeaders_2ndREGISTER_wo_response + + /** + * @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER + * @verdict + */ + function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName( + ) runs on SipComponent { + var CommaParam_List v_challenge; + + vc_branch := c_branchCookie & f_getRndTag(); + + vc_requestUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := vc_userprofile.registrarDomain, + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + }; + + vc_via_REG := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + + // Extract challenge and calculate credentials for a response. + v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams; + + // Increment CSeq sequence number + vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1; + + // Prepair right answer + vc_authorization := { + fieldName := AUTHORIZATION_E, + body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)} + }; + } // end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName + + + /** + * @desc function sets header fields for the next outgoing REGISTER (de-registration) + * @param p_cSeq_s cSeq to be used + * @verdict + */ + function f_setHeaders_deREGISTER( + inout CSeq p_cSeq_s + ) runs on SipComponent { + var SemicolonParam_List v_params := {}; + + f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via + // reset authorization header to not use nonce from registration (otherwise we have to increase nc) + vc_authorization := { + fieldName := AUTHORIZATION_E, + body := {f_calculatecCredentials_empty(vc_userprofile)} + }; + vc_requestUri := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := omit, + hostPort := { + host := vc_userprofile.registrarDomain, + portField := omit + } + } + }, + urlParameters := omit, + headers := omit + }; + vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile))); + v_params := f_addParameter(v_params, + { + id := c_tagId, + paramValue := { + tokenOrHost := f_getRndTag() + } + }); + vc_from := { + fieldName := FROM_E, + addressField := vc_to.addressField, + fromParams := v_params + }; + + vc_contact := { + fieldName := CONTACT_E, + contactBody := {wildcard := "*"} + }; + } // end function f_setHeaders_deREGISTER + + + /** + * @desc setting of general and basic Invite header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersINVITE( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + if (ischosen(vc_requestUri.components.sip)) { + // sip/sips call + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } + else if (ischosen(vc_requestUri.components.urn)) { + // Emergency call + vc_reqUrnUri := vc_requestUri.components.urn; + } + else { + log("*** " & __SCOPE__ &": INFO:f_setHeadersINVITE: unsupported field: ", vc_requestUri," ***"); + setverdict(fail); + } + } + + /** + * @desc setting of general and basic Update header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersUPDATE( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "UPDATE"); // cseq, contact, branch, via + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersUPDATE + + /** + * @desc setting of general and basic Message header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersMESSAGE( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersMESSAGE + + /** + * @desc setting of general and basic Notify header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersNOTIFY( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersNOTIFY + + /** + * @desc setting of general and basic Notify header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersOPTIONS( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "OPTIONS"); // cseq, contact, branch, via + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersOPTIONS + + /** + * @desc setting of general and basic Publish header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersPUBLISH( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "PUBLISH"); // cseq, contact, branch, via + // after SUBSCRIBE message callid shall be same + // vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr }; + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersPUBLISH + + /** + * @desc function sets header field for the next outgoing SUBSCRIBE message + * @param p_cSeq_s CSeq parameter to be applied + */ + function f_setHeaders_SUBSCRIBE( + inout CSeq p_cSeq_s + ) runs on SipComponent { + var SemicolonParam_List v_params := {}; + + f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via + vc_requestUri := valueof(m_SipUrl_currDomain(vc_userprofile)); + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + + // store callId from Subscribe message + vc_callIdSub := vc_callId; + + vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile))); + vc_cancel_To := vc_to; + v_params := f_addParameter(v_params, + { + id := c_tagId, + paramValue := { + tokenOrHost := f_getRndTag() + } + }); + vc_from := { + fieldName := FROM_E, + addressField := vc_to.addressField, + fromParams := v_params + }; + } // end function setHeaders_SUBSCRIBE + + /** + * @desc setting of general and basic Subscribe header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersSUBSCRIBE( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via + vc_callId := { + fieldName := CALL_ID_E, + callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr + }; + + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersMESSAGE + + /** + * @desc setting of general and basic REFER header fields in additon to the addresses (To, From, ReqUri) + * @param p_cSeq_s + */ + function f_setHeadersREFER( + inout CSeq p_cSeq_s + ) runs on SipComponent { + f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via + // vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr }; + vc_cancel_To := vc_to; + vc_caller_To := vc_to; + + vc_caller_From := vc_from; + + vc_reqHostPort := vc_requestUri.components.sip.hostPort; + } // end function f_setHeadersREFER + + /** + * @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer + * @param p_Request REGISTER that has been received + */ + function f_setHeadersOnReceiptOfREGISTER( + Request p_Request + ) runs on SipComponent { + + f_setHeadersOnReceiptOfRequest(p_Request); + + vc_callId := p_Request.msgHeader.callId; + vc_caller_From := vc_from; + f_addTagInTo(vc_to); + vc_caller_To := vc_to; + vc_requestUri := p_Request.requestLine.requestUri; + + vc_cancel_To := p_Request.msgHeader.toField; + + if (isvalue(p_Request.msgHeader.contact) and (not ischosen(p_Request.msgHeader.contact.contactBody.wildcard))) { + vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]); + } + + // update callee information and pick up tag if the call need to be canceled + vc_callee_To := { + fieldName := TO_E, + addressField := vc_caller_From.addressField, + toParams := vc_caller_From.fromParams + }; + + vc_callee_From := { + fieldName := FROM_E, + addressField := vc_caller_To.addressField, + fromParams := vc_caller_To.toParams + }; + + if (isvalue(p_Request.msgHeader.authorization)) { + vc_authorization := valueof(p_Request.msgHeader.authorization); + } + } // end f_setHeadersOnReceiptOfREGISTER + + /** + * @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer + * @param p_Request SUBSCRIBE that has been received + */ + function f_setHeadersOnReceiptOfSUBSCRIBE( + Request p_Request + ) runs on SipComponent { + + f_setHeadersOnReceiptOfRequest(p_Request); + + vc_callId := p_Request.msgHeader.callId; + vc_caller_From := vc_from; + f_addTagInTo(vc_to); + vc_caller_To := vc_to; + vc_requestUri := p_Request.requestLine.requestUri; + + vc_cancel_To := p_Request.msgHeader.toField; + + if (isvalue(p_Request.msgHeader.contact)) { + vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]); + } + + // update callee information and pick up tag if the call need to be canceled + vc_callee_To := { + fieldName := TO_E, + addressField := vc_caller_From.addressField, + toParams := vc_caller_From.fromParams + }; + + vc_callee_From := { + fieldName := FROM_E, + addressField := vc_caller_To.addressField, + fromParams := vc_caller_To.toParams + }; + } // end f_setHeadersOnReceiptOfSUBSCRIBE + + function f_setHeadersOnReceiptOfREFER( + Request p_Request + ) runs on SipComponent { + + f_setHeadersOnReceiptOfRequest(p_Request); + + vc_requestUri := p_Request.requestLine.requestUri; + vc_cancel_To := p_Request.msgHeader.toField; + + if (isvalue(p_Request.msgHeader.contact)) { + vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]); + vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]); + } + + // update callee information and pick up tag if the call need to be canceled + vc_callee_To := { + fieldName := TO_E, + addressField := vc_caller_From.addressField, + toParams := vc_caller_From.fromParams + }; + + vc_callee_From := { + fieldName := FROM_E, + addressField := vc_caller_To.addressField, + fromParams := vc_caller_To.toParams + }; + } // end f_setHeadersOnReceiptOfREFER + + /** + * @desc function reads all necessary headers from the received INVITE message and generate the tag for the answer + * @param p_Request received INVITE message + * @verdict + */ + function f_setHeadersOnReceiptOfINVITE( + Request p_Request + ) runs on SipComponent { + var integer i, j; + var integer v_length; + + f_setHeadersOnReceiptOfRequest(p_Request); + + vc_callId := p_Request.msgHeader.callId; + + vc_requestUri2 := p_Request.requestLine.requestUri; + + vc_cancel_To := p_Request.msgHeader.toField; + f_addTagInTo(vc_to); + vc_caller_From := vc_from; + vc_caller_To := vc_to; + + if (isvalue(p_Request.msgHeader.contact)) { + vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]); + vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]); + } + + // update callee information and pick up tag if the call need to be canceled + vc_callee_To := { + fieldName := TO_E, + addressField := vc_caller_From.addressField, + toParams := vc_caller_From.fromParams + }; + + vc_callee_From := { + fieldName := FROM_E, + addressField := vc_caller_To.addressField, + fromParams := vc_caller_To.toParams + }; + + if (isvalue(p_Request.msgHeader.privacy)) { + vc_privacy := p_Request.msgHeader.privacy; + } + + if (isvalue(p_Request.messageBody)) { + // cleaning of attributes before assignment + if (isvalue(vc_sdp_remote.media_list)) { + v_length := lengthof(vc_sdp_remote.media_list); + for (i := 0; i < v_length; i := i + 1) { + if (isvalue(vc_sdp_remote.media_list[i].attributes)) { + vc_sdp_remote.media_list[i].attributes := omit; + } + } + } + + // save SDP if present + if (ischosen(p_Request.messageBody.sdpMessageBody)) { + vc_sdp_remote := p_Request.messageBody.sdpMessageBody; + vc_sdp_remote_is_valid := true; + f_prepare_SDP_answer(); + } + + // save XML if present + if (ischosen(p_Request.messageBody.xmlBody)) { + vc_xml_remote := p_Request.messageBody.xmlBody; + } + + if (ischosen(p_Request.messageBody.mimeMessageBody)) { + + for (j := 0; j < lengthof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) { + if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) { + vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody; + vc_sdp_remote_is_valid := true; + f_prepare_SDP_answer(); + } + if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) { + vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody; + } + } + } + } + + if (isvalue(p_Request.msgHeader.supported.optionsTags)) { + for (i := lengthof(p_Request.msgHeader.supported.optionsTags); i > 0; i := i - 1) { + if (p_Request.msgHeader.supported.optionsTags[i - 1] == "100rel") { + vc_supported_100rel := true; + } + if (p_Request.msgHeader.supported.optionsTags[i - 1] == "precondition") { + vc_supported_precondition := true; + } + } + } + } // end f_setHeadersOnReceiptOfINVITE + + /** + * @desc function reads header field of a received BYE message + * @param p_Request received BYE + */ + function f_setHeadersOnReceiptOfBYE( + Request p_BYE_Request + ) runs on SipComponent { + + f_setHeadersOnReceiptOfRequest(p_BYE_Request); + vc_callId := p_BYE_Request.msgHeader.callId; + } // end f_setHeadersOnReceiptOfBYE + + /** + * @desc function reads header field from an incoming Request message + * @param p_Request received Request message + */ + function f_setHeadersOnReceiptOfRequest( + Request p_Request + ) runs on SipComponent { + vc_request := p_Request; + vc_callId := p_Request.msgHeader.callId; + vc_cSeq := valueof(p_Request.msgHeader.cSeq); // CSeq is mandatory + vc_iut_CSeq := p_Request.msgHeader.cSeq; + vc_from := p_Request.msgHeader.fromField; + vc_caller_From := p_Request.msgHeader.fromField; + vc_to := p_Request.msgHeader.toField; + vc_caller_To := p_Request.msgHeader.toField; + vc_via := p_Request.msgHeader.via; + // update sent_label according to received via header field + f_getViaReplyAddr(vc_via.viaBody, vc_sent_label); + + // Catch route + vc_boo_recordRoute := false; + + // add tag field into To header if tag is not present + if (not (isvalue(p_Request.msgHeader.toField.toParams))) { + vc_to.toParams := { + { + id := c_tagId, + paramValue := { + tokenOrHost := f_getRndTag() + } + } + }; + vc_caller_To := vc_to; + } + if (isvalue(p_Request.msgHeader.recordRoute.fieldName)) {//Due to ES 201 873-1/C.3.3 Better to check if fieldName of Record Route is present + vc_boo_recordRoute := true; + vc_recordRoute := p_Request.msgHeader.recordRoute; + } + } // end f_setHeadersOnReceiptOfRequest + + /** + * @desc functions reads header fields from an incoming Response message + * @param p_cSeq + * @param p_response received response message + * @verdict + */ + function f_setHeadersOnReceiptOfResponse( + Response p_response + ) runs on SipComponent { + var integer i, j, v_nbroute; + var template(omit) Contact v_contact; + // only for local purpose + vc_response := p_response; + // vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq + vc_to := p_response.msgHeader.toField; + vc_from := p_response.msgHeader.fromField; + vc_caller_To := vc_to; + vc_caller_From := vc_from; + + if (isvalue(p_response.msgHeader.contact)) { + v_contact := p_response.msgHeader.contact; + if (ischosen(v_contact.contactBody.contactAddresses)) { + vc_reqHostPort := f_getContactAddr(valueof(v_contact.contactBody.contactAddresses[0])); + vc_requestUri := f_getContactUri(valueof(v_contact.contactBody.contactAddresses[0])); + } + } + else { + if (ischosen(vc_to.addressField.addrSpecUnion.components.sip)) { + // sip/sips call + vc_reqHostPort := vc_to.addressField.addrSpecUnion.components.sip.hostPort; + } + else if (ischosen(vc_to.addressField.addrSpecUnion.components.urn)) { + // Emergency call + vc_reqUrnUri := vc_to.addressField.addrSpecUnion.components.urn; + } + else { + log("*** f_setHeadersOnReceiptOfResponse: INFO: unsupported field: ", vc_to, " ***"); + setverdict(fail); + } + vc_requestUri := vc_to.addressField.addrSpecUnion; + } + + vc_callee_To := { + fieldName := TO_E, + addressField := vc_caller_From.addressField, + toParams := vc_caller_From.fromParams + }; + + vc_callee_From := { + fieldName := FROM_E, + addressField := vc_caller_To.addressField, + fromParams := vc_caller_To.toParams + }; + + vc_via := p_response.msgHeader.via; + + // Route Management + if (isvalue(p_response.msgHeader.recordRoute)) { + vc_recordRoute := p_response.msgHeader.recordRoute; + v_nbroute := lengthof(vc_recordRoute.routeBody); + // copy and reverse the order of the routes in route header + for (i := 0; i <= (v_nbroute - 1); i := i + 1) { + j := v_nbroute - 1 - i; + vc_route.routeBody[j] := vc_recordRoute.routeBody[i]; + } + vc_route.fieldName := ROUTE_E; + vc_boo_recordRoute := true; + vc_boo_route := true; + } + else { + vc_boo_recordRoute := false; + vc_boo_route := false; + } + + + // extentions due to new fields in PRACK and UPDATE messages + if (isvalue(p_response.msgHeader.rSeq)) { + vc_rAck := { + fieldName := RACK_E, + responseNum := valueof(p_response.msgHeader.rSeq.responseNum), + seqNumber := valueof(p_response.msgHeader.cSeq.seqNumber), + method := valueof(p_response.msgHeader.cSeq.method) + }; + } + + // extentions due to new HistoryInfo fields 180 or 200OK messages + if (isvalue(p_response.msgHeader.historyInfo)) { + vc_historyInfoList := valueof(p_response.msgHeader.historyInfo.historyInfoList); + vc_history_is_valid := true; + } + else { + vc_history_is_valid := false; + } + + // sdpMessageBody answer + if (isvalue(p_response.messageBody)) { + if (ischosen(p_response.messageBody.sdpMessageBody)) { + vc_sdp_remote := p_response.messageBody.sdpMessageBody; + vc_sdp_remote_is_valid := true; + } + + if (ischosen(p_response.messageBody.xmlBody)) { + vc_xml_remote := p_response.messageBody.xmlBody; + } + + if (ischosen(p_response.messageBody.mimeMessageBody)) { + + for (j := 0; j < lengthof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) { + if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) { + vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody; + } + if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) { + vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody; + } + } + } + } + } // end function f_setHeadersOnReceiptOfResponse + + /** + * @desc functions reads ServiceRoute header field from an incoming 200 Response message in registration + * @param p_cSeq + * @param p_response received response message + */ + function f_getServiceRouteMapIntoRouteInRegistration( + Response p_response + ) runs on SipComponent { + var integer i, j, v_nbroute; + var template(omit) ServiceRoute v_serviceRoute; + + // Route Management + if (isvalue(p_response.msgHeader.serviceRoute.fieldName)) {////Due to ES 201 873-1/C.3.3 Better to check if fieldName of Record Route is present + v_serviceRoute := p_response.msgHeader.serviceRoute; + v_nbroute := lengthof(v_serviceRoute.routeBody); + // copy and reverse the order of the routes in route header + for (i := 0; i <= (v_nbroute - 1); i := i + 1) { + j := v_nbroute - 1 - i; + vc_route.routeBody[j] := v_serviceRoute.routeBody[i]; + } + vc_route.fieldName := ROUTE_E; + vc_route_REG := vc_route; + vc_boo_route := true; + } + } // end function f_getServiceRouteMapIntoRouteInRegistration + + /** + * @desc functions reads Route header field from an incoming Request message and generate RecordRoute + * @param p_cSeq + * @param p_request received request message + */ + function f_getRouteMapIntoRecordRoute( + Request p_request + ) runs on SipComponent { + var integer i, j, v_nbroute; + var template(omit) Route v_route; + + // Route Management + if (isvalue(p_request.msgHeader.route)) { + v_route := p_request.msgHeader.route; + v_nbroute := lengthof(v_route.routeBody); + // copy and reverse the order of the routes in route header + for (i := 0; i <= (v_nbroute - 1); i := i + 1) { + j := v_nbroute - 1 - i; + vc_recordRoute.routeBody[j] := v_route.routeBody[i]; + } + vc_recordRoute.fieldName := RECORD_ROUTE_E; + + vc_boo_recordRoute := true; + } + } // end function f_getRouteMapIntoRecordRoute + + + } // end group SetHeaders + + + + } // end group FieldOperations + + group SDPOperations { + + /** + * @desc check if message body include SDP attribute (2nd parameter) for any media + */ + function f_check_attribute( + in SDP_Message p_sdp, + in template SDP_attribute p_attribute + ) runs on SipComponent + return boolean { + var integer i, j; + + if (isvalue(p_sdp.media_list)) { + for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) { + if (isvalue(p_sdp.media_list[j].attributes)) { + for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) { + if (match(p_sdp.media_list[j].attributes[i], p_attribute)) { + return (true); + } + } + } + } + } + if (isvalue(p_sdp.attributes)) { + for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) { + if (match(p_sdp.attributes[j], p_attribute)) { + return (true); + } + } + } + + return (false); + } + + /** + * @desc check if message body include SDP (session level) attribute (2nd parameter) for any media + */ + function f_check_session_attribute( + in SDP_Message p_sdp, + in template SDP_attribute p_attribute + ) runs on SipComponent + return boolean { + var integer j; + + if (isvalue(p_sdp.attributes)) { + for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) { + if (match(p_sdp.attributes[j], p_attribute)) { + return (true); + } + } + } + + return (false); + } + + /** + * @desc identify an SDP direction attribute (session or first media attribute) in a SDP message and return its answer value + * @param p_sdp the SDP message that has been received + * @param p_attribute incoming SDP attribute that need to be used for the SDP direction (answer) + * @return the new attribute (to be send out) derived from the incoming SDP value + * @verdict + */ + function f_get_attribute_answer( + in SDP_Message p_sdp, + in template SDP_attribute p_attribute + ) runs on SipComponent + return SDP_attribute { + var integer i, j; + var template SDP_attribute v_attribute := p_attribute; + + // check if the selected attribute is included in the SDP offer (session attributes) + if (isvalue(p_sdp.attributes)) { + for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) { + if (match(p_sdp.attributes[j], p_attribute)) { + v_attribute := p_sdp.attributes[j]; + } + } + } + else + // check if the selected attribute is included in the SDP offer (any of the media attributes) + { + if (isvalue(p_sdp.media_list)) { + for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) { + if (isvalue(p_sdp.media_list[j].attributes)) { + for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) { + if (match(p_sdp.media_list[j].attributes[i], p_attribute)) { + v_attribute := p_sdp.media_list[j].attributes[i]; + } + } + } + } + } + } + + select (valueof(v_attribute)) { + case (mw_attribute_sendonly) { + return (valueof(m_attribute_recvonly)); + } + case (mw_attribute_sendrecv) { + return (valueof(m_attribute_sendrecv)); + } // MRO + case (mw_attribute_inactive) { + return (valueof(m_attribute_inactive)); + } // MRO + case (mw_attribute_recvonly) { + return (valueof(m_attribute_sendonly)); + } // MRO + } + return (valueof(m_attribute_sendrecv)); // the default return value in case of missing attribute offer + } + + /** + * @desc check if message body include SDP bandwidth (2nd parameter) either for the session or a media description + */ + function f_check_bandwidth( + in SDP_Message p_loc_sdp, + in template SDP_bandwidth p_loc_bandw + ) runs on SipComponent + return boolean { + var integer i, j; + if (isvalue(p_loc_sdp.bandwidth)) { + for (j := 0; j < lengthof(p_loc_sdp.bandwidth); j := j + 1) { + if (match(p_loc_sdp.bandwidth[j], p_loc_bandw)) { + return (true); + } + } + } + if (isvalue(p_loc_sdp.media_list)) { + for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) { + if (isvalue(p_loc_sdp.media_list[j].bandwidth)) { + for (i := 0; i < lengthof(p_loc_sdp.media_list[j].bandwidth); i := i + 1) { + if (match(p_loc_sdp.media_list[j].bandwidth[i], p_loc_bandw)) { + return (true); + } + } + } + } + } + + return (false); + } + + /** + * @desc check if message body include SDP media (2nd parameter) + */ + function f_check_media( + in SDP_Message p_loc_sdp, + in template(present) SDP_media_desc p_loc_media + ) runs on SipComponent + return boolean { + var integer j; + if (isvalue(p_loc_sdp.media_list)) { + for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) { + if (match(p_loc_sdp.media_list[j].media_field.transport, p_loc_media.media_field.transport) and match(p_loc_sdp.media_list[j].media_field.fmts, p_loc_media.media_field.fmts)) { + return (true); + } + } + } + return (false); + } + + /** + * @desc check if message body include precondition mechanism (a=des and a=curr) retrun true, else false + * @param loc_sdp SDP message + */ + function f_check_precondition( + in SDP_Message p_loc_sdp + ) runs on SipComponent + return boolean { + if (f_check_attribute(p_loc_sdp, mw_attribute_des) or f_check_attribute(p_loc_sdp, mw_attribute_curr)) { + return (true); + } + + return (false); + } + + + /** + * @desc check if message body include SDP media direction return true, else false + */ + function f_check_media_direction( + in SDP_Message p_loc_sdp + ) runs on SipComponent + return boolean { + + if (f_check_attribute(p_loc_sdp, mw_attribute_sendonly) or f_check_attribute(p_loc_sdp, mw_attribute_recvonly) or f_check_attribute(p_loc_sdp, mw_attribute_sendrecv) or f_check_attribute(p_loc_sdp, mw_attribute_inactive)) { + return (true); + } + + return (false); + } + + /** + * @desc copy media/attribute lines from remote to local SDP variable + */ + function f_check_SDP( + integer p_loc_sdp, + integer p_loc_codec + ) runs on SipComponent + return boolean { + var SDP_media_desc v_media := f_prepare_media(p_loc_sdp, p_loc_codec); + if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media) { + return false; + } + if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport) { + return false; + } + if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts) { + return false; + } + + return true; + } + + /** + * @desc replace the first curr media attribute with the given value. + * @param p_sdp SDP message to modify + * @param p_curr new curr attribute + */ + function f_replace_curr_attribute( + inout SDP_Message p_sdp, + in SDP_attribute_curr p_curr + ) { + var integer i; + var integer v_mn; + if (isvalue(p_sdp.media_list)) { + v_mn := lengthof(p_sdp.media_list[0].attributes); + for (i := 0; i < v_mn; i := i + 1) { + if (ischosen(p_sdp.media_list[0].attributes[i].curr)) { + p_sdp.media_list[0].attributes[i].curr := p_curr; + i := v_mn; + } + } + } + } + + /** + * @desc append new media attribute to the first media description. + * @param p_sdp SDP message to modify + * @param p_att SDP attribute to appand + */ + function f_append_media_attribute( + inout SDP_Message p_sdp, + in SDP_attribute p_att + ) { + var integer v_mn; + if (isvalue(p_sdp.media_list)) { + v_mn := lengthof(p_sdp.media_list[0].attributes); + p_sdp.media_list[0].attributes[v_mn] := p_att; + } + } + + + /** + * @desc append new media to the existing media list in SDP + */ + function f_append_media( + inout SDP_Message p_loc_SDP, + template(value) SDP_media_desc p_loc_media + ) { + var integer v_mn := lengthof(p_loc_SDP.media_list); + p_loc_SDP.media_list[v_mn] := valueof(p_loc_media); + } + + /** + * @desc repare media/attribute lines + */ + function f_prepare_media( + integer p_loc_sdp, + integer p_loc_codec + ) runs on SipComponent + return SDP_media_desc { + var SDP_attribute_rtpmap_codec v_codecs[32] := { + {"PCMU", "8000", omit}, {"GSM", "8000", omit}, {"G723", "8000", omit}, {"DVI4", "8000", omit}, + {"DVI4", "16000", omit}, {"LPC", "8000", omit}, {"PCMA", "8000", omit}, {"G722", "8000", omit}, + {"L16", "44100", "2"}, {"L16", "44100", omit}, {"QCELP", "8000", omit}, {"CN","8000", omit}, + {"MPA", "90000", omit}, {"G728", "8000", omit}, {"DVI4", "11025", omit}, {"DVI4", "22050", omit}, + {"G729", "8000", omit}, {"G726-40", "8000", omit}, {"G726-32", "8000", omit}, {"G726-24", "8000", omit}, + {"G726-16", "8000", omit}, {"G726D", "8000", omit}, {"G726E", "8000", omit}, {"GSM-EFR", "8000", omit}, + {"CelB", "90000", omit}, {"JPEG", "90000", omit}, {"Nv", "90000", omit}, {"H261", "90000", omit}, + {"MPV", "90000", omit}, {"MP2T" ,"90000", omit}, {"H263", "90000", omit}, {"H263-1998", "90000", omit}}; + var SDP_media_desc v_media := { + media_field := { + media := "audio", + ports := { + port_number := 10000, + num_of_ports := omit + }, + transport := "RTP/AVP", + fmts := {"0"} + }, // m=audio + // 8500 + // RTP/AVP + // 0 + information := omit, + connections := omit, + bandwidth := omit, + key := omit, + attributes := omit + }; + + if (32 < p_loc_codec or p_loc_codec < 1) { + log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***"); + setverdict(inconc); + return (v_media); + } + + if (p_loc_sdp == 1) { + } + else if (p_loc_sdp == 2) { + v_media.media_field.fmts := {PX_SIP_SDP_DYN}; // { "98", "0" }; + v_media.attributes := { + { + rtpmap := { + payload_type := PX_SIP_SDP_DYN, + codec := v_codecs[p_loc_codec - 1] + } + } + }; + } + else if (p_loc_sdp == 3) { + v_media.media_field.fmts := {"8"}; + } + else if (p_loc_sdp == 4) { + v_media.media_field.fmts := {"99", "8"}; + v_media.attributes := { + { + rtpmap := { + payload_type := "99", + codec := v_codecs[p_loc_codec - 1] + } + } + }; + } + else if (p_loc_sdp == 5) { + v_media.media_field.media := "image"; + v_media.media_field.transport := "udptl"; + v_media.media_field.fmts := {"t38"}; + } + else if (p_loc_sdp == 6) { + v_media.media_field.media := "image"; + v_media.media_field.transport := "tcptl"; + v_media.media_field.fmts := {"t38"}; + } + else { + log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***"); + setverdict(inconc); + } + + return (v_media); + } + + /** + * @desc repare media/attribute lines + */ + function f_prepare_SDP( + integer p_loc_sdp, + integer p_loc_codec + ) runs on SipComponent { + + vc_sdp_local.media_list := {f_prepare_media(p_loc_sdp, p_loc_codec)}; + } + + /** + * @desc function that copy media/attribute lines from remote to local SDP variable + */ + function f_prepare_SDP_answer( + ) runs on SipComponent { + var integer v_mn, v_cn := 0, i, j, k := 0; + var charstring v_PT; + var SDP_attribute_rtpmap_codec v_rtpmap := { "", "", omit}; + var SDP_attribute_list v_mediaAttributes := {}; + // increase session version + vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1); + // if more than one codec, select the firs one + v_mn := lengthof(vc_sdp_remote.media_list); + for (i := 0; i < v_mn; i := i + 1) { + // for every single media + if (isvalue(vc_sdp_remote.media_list[i].attributes)) { + v_cn := lengthof(vc_sdp_remote.media_list[i].attributes); + } + if (lengthof(vc_sdp_remote.media_list[i].media_field.fmts) > 0) { + // select the first one + v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0]; + vc_sdp_local.media_list[i].media_field.fmts := {v_PT}; + for (j := 0; j < v_cn; j := j + 1) { + if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap)) { + if (v_PT == vc_sdp_remote.media_list[i].attributes[j].rtpmap.payload_type) { + v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].rtpmap.codec; + v_mediaAttributes[k] := {rtpmap := {v_PT, v_rtpmap}}; + k := k + 1; + } // else line is not copied + } + else { + // simple copy of attribute + v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j]; + k := k + 1; + } + } + vc_sdp_local.media_list[i].attributes := v_mediaAttributes; + + if (isvalue(vc_sdp_local.media_list[i].attributes)) { + v_cn := lengthof(vc_sdp_local.media_list[i].attributes); + for (j := 0; j < v_cn; j := j + 1) { + // simplified handling of status attributes (copy/keep status from peer): + // a) copy/keep SDP_attribute_curr (invert tags if applicable) + if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr)) { + // invert local/remote status tags + if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local") { + vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote"; + } + if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote") { + vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local"; + } + // invert send/recv direction tags + if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send") { + vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv"; + } + if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv") { + vc_sdp_local.media_list[i].attributes[j].curr.direction := "send"; + } + } + else + if ( + // b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable) + ischosen(vc_sdp_local.media_list[i].attributes[j].des) + ) { + // invert local/remote status tags + if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local") { + vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote"; + } + if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote") { + vc_sdp_local.media_list[i].attributes[j].des.statusType := "local"; + } + // invert send/recv direction tags + if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send") { + vc_sdp_local.media_list[i].attributes[j].des.direction := "recv"; + } + if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv") { + vc_sdp_local.media_list[i].attributes[j].des.direction := "send"; + } + } + else + if ( + // c) simplification: assume no SDP_attribute_conf + ischosen(vc_sdp_local.media_list[i].attributes[j].conf) + ) { + // handle SDP_attribute_conf + } + } + } + } + } + // add handling of prenegotiation, change ports if required etc. + // if prenegotiation... + } + + /** + * @desc reject SDP offer by setting media ports to 0 + */ + function f_reject_SDP_offer( + ) runs on SipComponent { + var integer mn, i; + f_copy_SDP(); // TO BE DONE with more details! + // increase session version + vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1); + // if more than one codec, select the firs one + mn := lengthof(vc_sdp_local.media_list); + for (i := 0; i < mn; i := i + 1) { + vc_sdp_local.media_list[i].media_field.ports := {0, omit}; + vc_sdp_local.media_list[i].attributes := omit; // {}; + } + } + + /** + * @desc copies SDP message elements from remote to local component variable: - bandwidth - session version (will be incremented) - media list modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local) + * @param p_medianum list position number of the media (if value 0 identifies first media list element) + * @param p_direction the new direction attribute to be included in the media entry + * @verdict + */ + function f_SIP_modMediaDirection( + integer p_medianum, + template(value) SDP_attribute p_direction + ) runs on SipComponent { + var boolean v_set_direction; + + // flag indicates if direction attribute has been modified + var integer v_mn := 0; + + // length of media list (number of entries) + var integer v_cn := 0; + + // number of attributes of a media entry + var integer i, j, k := 0; + var SDP_attribute_list v_mediaAttributes := {}; + // collect the media attributes (to be assigned at end of function) + f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable + // increment session version + vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1); + + // if more than one codec, select the first one + v_mn := lengthof(vc_sdp_local.media_list); + + if (p_medianum == 0) + // specific media requested + { + p_medianum := 1; // start checking from first media + } + if (p_medianum > 0) + // specific media requested + { + if (not (p_medianum > v_mn)) { + v_mn := p_medianum; + } + } + + // handling of media list elements + for (i := 0; i < v_mn; i := i + 1) { + v_cn := 0; // initialize the number of attributes of the media list entry + if (isvalue(vc_sdp_local.media_list)) + // media_list is optional + { + // log("vc_sdp_local.media_list[i ] ",vc_sdp_local.media_list[i ] ); + if (isvalue(vc_sdp_local.media_list[i].attributes)) { + v_cn := lengthof(vc_sdp_local.media_list[i].attributes); + } + + v_set_direction := false; + + // if (lengthof(vc_sdp_local.media_list[i ] .media_field.fmts)>1) + // select the first one + for (j := 0; j < v_cn; j := j + 1) { + if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv)) { + v_mediaAttributes[k] := valueof(p_direction); + v_set_direction := true; + } + else + // non-direction attributes will be copied + { + v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j]; + } + k := k + 1; + } + + if (not v_set_direction) { + v_mediaAttributes[k] := valueof(p_direction); + } + vc_sdp_local.media_list[i].attributes := v_mediaAttributes; + // } + } + } + // add handling of prenegotiation, change ports if required etc. + // if prenegotiation... + } + + /** + * @desc modify session and media attributes direction + */ + function f_SIP_modSessionDirection( + template(value) SDP_attribute p_direction + ) runs on SipComponent { + var boolean v_set_direction := false; + var integer v_mn := 0, i := 0; + + if (isvalue(vc_sdp_local.attributes)) { + v_mn := lengthof(vc_sdp_local.attributes); + + for (i := 0; i < v_mn; i := i + 1) { + // for every single attribute (that is not omit) + if (ischosen(vc_sdp_local.attributes[i].recvonly) or ischosen(vc_sdp_local.attributes[i].sendonly) or ischosen(vc_sdp_local.attributes[i].inactive) or ischosen(vc_sdp_local.attributes[i].sendrecv)) { + vc_sdp_local.attributes[i] := valueof(p_direction); + v_set_direction := true; + } + } + if (not v_set_direction) + // if not sent before + { + vc_sdp_local.attributes[v_mn] := valueof(p_direction); + } + } + else { + vc_sdp_local.attributes[0] := valueof(p_direction); + } + } + + /** + * @desc check (from remote) and set (local) the session/media attribute lines on directions + * @param p_direction_in incoming SDP attribute that need to be checked + * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer) + * @return + * @verdict + */ + function f_SIP_checksetSDPreqDirection( + template(value) SDP_attribute p_direction_in, + template(value) SDP_attribute p_direction_out + ) runs on SipComponent { + var template(value) SDP_attribute v_direction_out := p_direction_out; + // check incoming SDP attribute + if (not (isvalue(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) { + if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) { + log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***"); + } + else { + setverdict(fail); + } + } + else { + setverdict(pass); + log("*** " &__SCOPE__& ": INFO: attribute found in message body ***"); + } + if (not isbound(p_direction_out)) + // not isvalue(v_direction_out))//MRO + { + v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in); + } + f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description + f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session + } + + /* + * + * @desc check (from remote) and set (local) the session/media attribute lines on directions + * @param p_direction_in incoming SDP attribute that need to be checked + * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer) + * @return + * @verdict + */ + function f_SIP_checkResponsesetSDPreqDirection( + template(value) SDP_attribute p_direction_in, + template(value) SDP_attribute p_direction_out + ) runs on SipComponent { + var template(value) SDP_attribute v_direction_out := p_direction_out; + // check incoming SDP attribute + if (not (isvalue(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) { + if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) { + log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***"); + } + else { + setverdict(fail); + } + } + else { + setverdict(pass); + log("*** " &__SCOPE__& ": INFO: attribute found in message body ***"); + } + if (not isbound(p_direction_out)) + // not isvalue(v_direction_out))//MRO + { + v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in); + } + f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description + f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session + } + + /* + * + * @desc check (from remote) and set (local) the session attribute lines on directions + * @param p_direction_in incoming SDP attribute that need to be checked + * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer) + * @return + * @verdict + */ + function f_SIP_checksetSDPreqDirectionSession( + template(value) SDP_attribute p_direction_in, + template(value) SDP_attribute p_direction_out + ) runs on SipComponent { + var template(value) SDP_attribute v_direction_out := p_direction_out; + // check incoming SDP attribute + if (not (isvalue(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) { + if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) { + log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***"); + } + else { + setverdict(fail); + } + } + if (not isbound(p_direction_out)) + // not isvalue(v_direction_out))//MRO + { + v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in); + } + f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session + } + + /* + * + * @desc check (from remote) and set (local) the session attribute lines on directions + * @param p_direction_in incoming SDP attribute that need to be checked + * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer) + * @return + * @verdict + */ + function f_SIP_checkResponsesetSDPreqDirectionSession( + template(value) SDP_attribute p_direction_in, + template(value) SDP_attribute p_direction_out + ) runs on SipComponent { + var template(value) SDP_attribute v_direction_out := p_direction_out; + // check incoming SDP attribute + if (not (isvalue(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) { + if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) { + log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***"); + } + else { + setverdict(fail); + } + } + if (not isbound(p_direction_out)) + // not isvalue(v_direction_out))//MRO + { + v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in); + } + f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session + } + + + /* + * + * @desc check (from remote) and set (local)the session/media attribute lines on directions + * @param p_direction_in attribute to be check + * @param p_direction_out attrubyte to be + * @return + * @verdict + */ + function f_SIP_checkSDPrespDirection( + template SDP_attribute p_direction_in + ) runs on SipComponent { + // check incoming SDP attribute + if (not (isvalue(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in))) { + setverdict(fail); + } + } + + /** + * @desc check media/attribute lines from remote + */ + function f_SIP_checkMediaDirection( + integer p_medianum, + template SDP_attribute p_direction + ) runs on SipComponent + return boolean { + var integer v_mn, v_cn := 0, i, j; + var boolean v_result := false; + // increase session version + vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1); + // if more than one codec, select the firs one + v_mn := lengthof(vc_sdp_remote.media_list); + if (p_medianum == 0) + // specific media requested + { + p_medianum := 1; // start checking from first media + } + if (p_medianum > 0) + // specific media requested + { + if (p_medianum > v_mn) { + return false; + } + else { + v_mn := p_medianum; + } + } + for (i := p_medianum - 1; i < v_mn; i := i + 1) { + // for every single media + if (isvalue(vc_sdp_remote.media_list[i].attributes)) { + v_cn := lengthof(vc_sdp_remote.media_list[i].attributes); + } + if (lengthof(vc_sdp_remote.media_list[i].attributes) > 0) { + // select the first one + for (j := 0; j < lengthof(vc_sdp_remote.media_list[i].attributes); j := j + 1) { + if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv)) { + if (match(vc_sdp_remote.media_list[i].attributes[j], p_direction)) { + v_result := true; + } + else { + return false; + } + } + } + } + } + return v_result; + } + + /** + * @desc copy media/attribute lines from remote to local SDP variable + */ + function f_copy_SDP( + ) runs on SipComponent { + if (isvalue(vc_sdp_remote.connection)) { + vc_sdp_local.connection := vc_sdp_remote.connection; + } + else { + vc_sdp_local.connection := omit; + } + + vc_sdp_local.origin := vc_sdp_remote.origin; + vc_sdp_local.session_name := vc_sdp_remote.session_name; + + if (isvalue(vc_sdp_remote.bandwidth)) { + vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth; + } + else { + vc_sdp_local.bandwidth := {}; + } + + if (isvalue(vc_sdp_remote.media_list)) { + // // cleaning of media before assignment + // if (isvalue(vc_sdp_local.media_list)) + // { + // for (var integer i:=0; i value v_request sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfREGISTER(v_request); + } + [] tc_wait.timeout { + setverdict(fail); + f_componentStop(); + } + } + } + + /** + * @desc function awaits SUBSCRIBE + * @param p_register expected SUBSCRIBE request + */ + function f_awaitingSUBSCRIBE( + in template(present) SUBSCRIBE_Request p_subscribe := ? + ) runs on SipComponent { + var SUBSCRIBE_Request v_request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfSUBSCRIBE(v_request); + } + [] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label { + tc_wait.stop; + setverdict(fail); + f_setHeadersOnReceiptOfSUBSCRIBE(v_request); + // f_send200OK(); + } + } + } + + /** + * @desc function awaits REGISTER and sends a 200 OK response + * @param p_reply flag used to avoid the 200OK response sending + */ + function f_awaitingREGISTER_sendReply( + in template(present) REGISTER_Request p_register := ?, + in boolean p_reply + ) runs on SipComponent { + var REGISTER_Request v_request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_register) -> value v_request sender vc_sent_label { + tc_wait.stop; + vc_request := v_request; + f_setHeadersOnReceiptOfREGISTER(v_request); + // Answer to the Request + if (p_reply) { + f_send200OK(); + } + } + [] tc_wait.timeout { + setverdict(fail); + f_componentStop(); + } + } + } + + + /** + * @desc Function waiting for a 200 OK response + * @param p_cSeq_s current cSeq expectation + */ + function f_awaitingOkResponse( + inout CSeq p_cSeq_s + ) runs on SipComponent { + + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + setverdict(pass); + } + } + } // end awaitingOkResponse + + /** + * @desc Function waiting for a response + * @param p_Response expected response message + */ + function f_awaitingResponse( + in template(present) Response p_Response := ? + ) runs on SipComponent { + tc_resp.start; + a_awaitingResponse(p_Response); + } // end f_awaitingResponse + + altstep a_awaitingResponse( + in template(present) Response p_Response := ? + ) runs on SipComponent { + [] SIPP.receive(p_Response) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + // setverdict(pass) + } + } // end f_awaitingResponse + + /** + * @desc Function waiting for a response, repeat if 100 Trying is received + * @param p_Response expected response message + */ + function f_awaitingResponseIgnore100Trying( + in template(present) Response p_Response := ? + ) runs on SipComponent { + tc_resp.start; + alt { + [] SIPP.receive(p_Response) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + // setverdict(pass) + } + [] SIPP.receive(mw_Response_Base(c_statusLine100, vc_callId, vc_cSeq)) -> value vc_response { + repeat; + } + } + } // end f_awaitingResponseIgnore100Trying + + /** + * @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx + * @param p_Response expected response message + */ + function f_awaitingResponseSendACK( + in template(present) Response p_Response := ? + ) runs on SipComponent { + tc_resp.start; + alt { + [] SIPP.receive(p_Response) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + LibSip_Steps.f_setHeadersACK(); + f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)); + setverdict(pass); + } + } + } // end f_awaitingResponse + + /** + * @desc Function waiting for a response + * @param p_Response expected response message + */ + function f_awaitingResponsePassOnTimeout( + in template(present) Response p_Response := ? + ) runs on SipComponent { + tc_resp.start; + alt { + [] SIPP.receive(p_Response) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + vc_boo_response := true; + // setverdict(pass) + } + [] tc_resp.timeout { + vc_boo_response := false; + // setverdict (pass) + } + } + } // end f_awaitingResponsePassOnTimeout + + /** + * @desc Function waiting for a 200 OK response + * @param p_cSeq_s current cSeq expectation + */ + function f_awaitingOkResponseAndNOTIFY_sendReply( + inout CSeq p_cSeq_s, + in template(present) NOTIFY_Request p_MSG := ? + ) runs on SipComponent { + + var boolean v_received_OK := false; + var boolean v_received_NOTIFY := false; + var NOTIFY_Request v_MSG; + tc_resp.start; + tc_wait.start(PX_SIP_TWAIT); + + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response { + tc_resp.stop; + vc_subscribed := true; + f_setHeadersOnReceiptOfResponse(vc_response); + v_received_OK := true; + setverdict(pass); + if (not (v_received_NOTIFY)) { + repeat; + } + } + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_getRouteMapIntoRecordRoute(v_MSG); + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the NOTIFY + f_send200OK(); + v_received_NOTIFY := true; + if (not (v_received_OK)) { + repeat; + } + } + } + } // end f_awaitingOkResponseAndNOTIFY_sendReply + + /** + * @desc await INFO request reply with 200 OK + */ + function f_awaitingINFO_sendReply( + in template(value) INFO_Request p_info + ) runs on SipComponent { + var INFO_Request v_request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_info) -> value v_request sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_request); + // Answer to the INFO + f_send200OK(); + } + } + } // end of f_awaitingINFO_sendReply + + /** + * @desc function awaiting for an incoming INVITE + * @param p_request expected message + */ + function f_awaitingINVITE( + template(present) INVITE_Request p_request := ? + ) runs on SipComponent { + var INVITE_Request v_INVITE_Request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label { + tc_wait.stop; + vc_ignore_invite := true; + vc_first_recv := true; // communication has started + f_setHeadersOnReceiptOfINVITE(v_INVITE_Request); + SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label; + } + [vc_interface_isc] SIPP.receive(mw_INVITE_Request_Base) -> value v_INVITE_Request sender vc_sent_label { + tc_wait.stop; + setverdict(fail); + f_setHeadersOnReceiptOfINVITE(v_INVITE_Request); + SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label; + // clear session - send 486 and await ACK + f_sendResponse(m_Response_Base(c_statusLine486, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via)); + f_awaitingACK(mw_ACK_Request_Base(?)); + // await 486 which go towards and send ACK + f_awaitingResponse(mw_Response_Base(c_statusLine486, ?, ?)); + f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)); + syncPort.send(m_syncClientStop); + stop; + } + } + } // end f_awaitingINVITE + + /** + * @desc function awaiting for an incoming INVITE + * @param p_request expected message + */ + function f_awaitingINVITE_No100Response( + template(present) INVITE_Request p_request := ? + ) runs on SipComponent { + var INVITE_Request v_INVITE_Request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label { + tc_wait.stop; + vc_ignore_invite := true; + vc_first_recv := true; // communication has started + f_setHeadersOnReceiptOfINVITE(v_INVITE_Request); + // SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label; + } + } + } // end f_awaitingInviteRequest + + /** + * @desc function awaiting for an incoming INVITE + * @param p_request expected message + */ + function f_awaitingINVITE_PassOnTimeout( + template(present) INVITE_Request p_request := ? + ) runs on SipComponent { + var INVITE_Request v_INVITE_Request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label { + tc_wait.stop; + vc_ignore_invite := true; + vc_first_recv := true; // communication has started + vc_boo_request := true; + f_setHeadersOnReceiptOfINVITE(v_INVITE_Request); + SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label; + } + [] tc_wait.timeout { + vc_boo_request := false; + } + } + } // end f_awaitingInviteRequest + + /** + * @desc function awaiting ACK request + */ + function f_awaitingACK( + in template(present) ACK_Request p_ACK := ? + ) runs on SipComponent { + f_awaitingACK_setHeaders(p_ACK, false); + } // end f_awaitingACK + + /** + * @desc function awaiting ACK request + */ + function f_awaitingACK_setHeaders( + in template(present) ACK_Request p_ACK := ?, + in boolean p_setHeaders + ) runs on SipComponent { + var ACK_Request v_ACK_Request; + tc_ack.start; + + alt { + [] SIPP.receive(p_ACK) -> value v_ACK_Request { + tc_ack.stop; + if (p_setHeaders) { + f_setHeadersOnReceiptOfRequest(v_ACK_Request); + } + } + } + } // end f_awaitingACK_setHeaders + + /** + * @desc function awaiting BYE and sending 200OK response + * @param p_BYE expected BYE + */ + function f_awaitingBYE( + in template(present) BYE_Request p_BYE := ? + ) runs on SipComponent { + var BYE_Request v_BYE_Request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label { + tc_wait.stop; + vc_ignore_bye := true; + f_setHeadersOnReceiptOfBYE(v_BYE_Request); + // f_send200OK(); + } + } + } // end f_awaitingBYE + + /** + * @desc function awaiting BYE and sending 200OK response + * @param p_BYE expected BYE + */ + function f_awaitingBYE_sendReply( + in template(present) BYE_Request p_BYE := ? + ) runs on SipComponent { + var BYE_Request v_BYE_Request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label { + tc_wait.stop; + vc_ignore_bye := true; + f_setHeadersOnReceiptOfBYE(v_BYE_Request); + f_send200OK(); + } + } + } // end f_awaitingBYE_sendReply + + /** + * @desc function awaiting BYE and sending 200OK response + * @param p_BYE expected BYE + */ + function f_awaitingBYE_sendReply_PassOnTimeout( + in template(present) BYE_Request p_BYE := ? + ) runs on SipComponent { + var BYE_Request v_BYE_Request; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label { + tc_wait.stop; + vc_ignore_bye := true; + vc_boo_request := true; + f_setHeadersOnReceiptOfBYE(v_BYE_Request); + f_send200OK(); + } + [] tc_wait.timeout { + vc_boo_request := false; + } + } + } // end f_awaitingBYE_sendReply_PassOnTimeout + + /** + * @desc function awaiting CANCEL + * @param p_CANCEL expected CANCEL + */ + function f_awaitingCANCEL( + in template(present) CANCEL_Request p_CANCEL := ? + ) runs on SipComponent { + var CANCEL_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + } + } + } // end f_awaitingCANCEL + /** + * @desc await MESSAGE request + */ + function f_awaitingMESSAGE( + in template(present) MESSAGE_Request p_MSG := ? + ) runs on SipComponent { + var MESSAGE_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + } + [] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + log("*** " &__SCOPE__& ": INFO: Received MESSAGE not as expected! ***"); + setverdict(fail); + } + } + } // end of f_awaitingMESSAGE + + /** + * @desc await MESSAGE request reply with 200 OK + */ + function f_awaitingMESSAGE_sendReply( + ) runs on SipComponent { + var MESSAGE_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the MESSAGE + f_send200OK(); + } + } + } // end of f_awaitingMESSAGE_sendReply + + /** + * @desc await MESSAGE request + */ + function f_awaitingMESSAGE_sendReply_PassOnTimeout( + in template(present) MESSAGE_Request p_MSG := ? + ) runs on SipComponent { + var MESSAGE_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the MESSAGE + // f_send200OK(); + vc_boo_request := true; + f_send200OK(); + // setverdict (pass); + } + [] tc_wait.timeout { + vc_boo_request := false; + // setverdict (pass); + } + } + } // end of f_awaitingMESSAGE_PassOnTimeout + + /** + * @desc await NOTIFY request + */ + function f_awaitingNOTIFY( + in template(present) NOTIFY_Request p_MSG := ? + ) runs on SipComponent { + var NOTIFY_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_getRouteMapIntoRecordRoute(v_MSG); + f_setHeadersOnReceiptOfRequest(v_MSG); + } + } + } // end of f_awaitingNOTIFY + + /** + * @desc await NOTIFY request reply with 200 OK + */ + function f_awaitingNOTIFY_sendReply( + in template(present) NOTIFY_Request p_MSG := ? + ) runs on SipComponent { + var NOTIFY_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_getRouteMapIntoRecordRoute(v_MSG); + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the NOTIFY + f_send200OK(); + } + } + } // end of f_awaitingNOTIFY_sendReply + + function f_awaitingNOTIFY_sendReply_postamble( + in template(present) NOTIFY_Request p_MSG := ? + ) runs on SipComponent { + var NOTIFY_Request v_MSG; + + tc_wait.start(5.0); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_getRouteMapIntoRecordRoute(v_MSG); + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the NOTIFY + f_send200OK(); + } + [] tc_wait.timeout { + // do nothing as receiving the Notify in de-registration is not part of the test body + } + } + } // end of f_awaitingNOTIFY_sendReply_postamble + + /** + * @desc await PRACK request reply with 200 OK + */ + function f_awaitingPRACK_sendReply( + in template(present) PRACK_Request p_MSG := ? + ) runs on SipComponent { + var PRACK_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the PRACK + if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) { + f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local))); + } + else { + f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute())); + } + } + } + } // end of f_awaitingPRACK_sendReply + + function f_awaitingPRACK( + in template(present) PRACK_Request p_MSG := ? + ) runs on SipComponent { + var PRACK_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + } + } + } // end of f_awaitingPRACK + + /** + * @desc await PUBLISH request reply with 200 OK + */ + function f_awaitingPUBLISH_sendReply( + in template(present) PUBLISH_Request p_MSG := ? + ) runs on SipComponent { + var PUBLISH_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the PUBLISH + f_send200OK(); + } + } + } // end of f_awaitingPUBLISH_sendReply + + /** + * @desc await UPDATE request + */ + function f_awaitingUPDATE( + in template(present) UPDATE_Request p_MSG := ? + ) runs on SipComponent { + var UPDATE_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + } + } + } // end of f_awaitingUPDATE + + /** + * @desc await UPDATE request reply with 200 OK + */ + function f_awaitingUPDATE_sendReply( + in template(present) UPDATE_Request p_MSG := ? + ) runs on SipComponent { + var UPDATE_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the UPDATE + if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) { + f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local))); + } + else { + f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute())); + } + } + } + } // end of f_awaitingUPDATE_sendReply + + + /** + * @desc await REFER request + */ + function f_awaitingREFER( + in template(present) REFER_Request p_MSG := ? + ) runs on SipComponent { + var REFER_Request v_MSG; + + tc_wait.start(PX_SIP_TWAIT); + alt { + [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + tc_wait.stop; + f_setHeadersOnReceiptOfREFER(v_MSG); + } + } + } // end of f_awaitingUPDATE + + + + } // end AwaitingMessage + + group SendMessage { + + /** + * @desc send ACK message, update the route and recordRoute header fields depending on boolean flags + * @param p_request template of the message to be sent + */ + function f_SendACK( + template(value) ACK_Request p_request + ) runs on SipComponent { + // p_request.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route + // n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send BYE message, update the route and recordRoute header fields depending on boolean flags + * @param p_request template of the message to be sent + */ + function f_SendBYE( + template(value) BYE_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send CANCEL message + * @param p_request template of the message to be sent + */ + function f_SendCANCEL( + template(value) CANCEL_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send INFO message + * @param p_request template of the message to be sent + */ + function f_SendINFO( + template(value) INFO_Request p_request + ) runs on SipComponent { + f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send INVITE message + * @param p_request template of the message to be sent + */ + function f_SendINVITE( + template(value) INVITE_Request p_request + ) runs on SipComponent { + vc_requestFor407 := valueof(p_request); + SIPP.send(p_request) to vc_sent_label; + vc_request := vc_requestFor407; + if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) { + a_altstep_401or407(); + } + } + + /** + * @desc send PRACK message + * @param p_request template of the message to be sent + */ + function f_SendPRACK( + ) runs on SipComponent { + var integer responseNum := 1; + var PRACK_Request prackReq; + if (isvalue(vc_response.msgHeader.rSeq) and + isvalue(vc_response.msgHeader.rSeq.responseNum)){ + responseNum := vc_response.msgHeader.rSeq.responseNum; + } + vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method)); + f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via + prackReq := valueof(m_PRACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_rAck)); + if (isvalue(vc_response.msgHeader.recordRoute)){ + prackReq.msgHeader.route := valueof(f_route()); + } + SIPP.send(prackReq) to vc_sent_label; + } + + /** + * @desc send PUBLISH message + * @param p_request template of the message to be sent + */ + function f_SendPUBLISH( + template(value) PUBLISH_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send REGISTER message + * @param p_request template of the message to be sent + */ + function f_SendREGISTER( + template(value) REGISTER_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send SUBSCRIBE message + * @param p_request template of the message to be sent + */ + function f_SendSUBSCRIBE( + template(value) SUBSCRIBE_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send UPDATE message + * @param p_request template of the message to be sent + */ + function f_SendUPDATE( + template(value) UPDATE_Request p_request + ) runs on SipComponent { + f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via + p_request.msgHeader.cSeq := vc_cSeq; + p_request.msgHeader.contact := vc_contact; + p_request.msgHeader.via := vc_via; + vc_requestFor407 := valueof(p_request); + SIPP.send(p_request) to vc_sent_label; + if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) { + a_altstep_401or407(); + } + } + + /** + * @desc function send MESSAGE message + * @param p_request template of the message to be sent + */ + function f_SendMESSAGE( + template(value) MESSAGE_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc function send NOTIFY message + * @param p_request template of the notify to be sent + */ + function f_SendNOTIFY( + template(value) NOTIFY_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send REFER message + * @param p_request template of the message to be sent + */ + function f_SendREFER( + template(value) REFER_Request p_request + ) runs on SipComponent { + SIPP.send(p_request) to vc_sent_label; + } + + /** + * @desc send 200 OK + */ + function f_send200OK( + ) runs on SipComponent { + f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via)); + } + + /** + * @desc send response + * @param p_request template of the message to be sent + */ + function f_sendResponse( + template(value) Response p_response + ) runs on SipComponent { + p_response.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route + p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route + SIPP.send(p_response) to vc_sent_label; + } + + + + } // end SendMessage + + group GlobalSteps { + /** + * @desc component initialization + * @param p_cSeq_s cSeq value to be assigned to the component variable + */ + function f_init_component( + inout CSeq p_cSeq_s + ) runs on SipComponent { + // Variables + vc_cSeq := p_cSeq_s; + + // Defaults + vc_def_catchSyncStop := activate(a_Sip_catchSyncStop()); + vc_default := activate(a_clearRegistration()); + } + + /** + * @desc component termination + */ + function f_terminate_component( + ) runs on SipComponent { + log("*** " &__SCOPE__& ": INFO: component terminated - forced! ***"); + deactivate; + stop; + } + + /** + * @desc component termination + */ + function f_componentStop( + ) runs on SipComponent { + syncPort.send(m_syncClientStop); + SIPP.clear; + stop; + } + + /** + * @desc function waits for particular time that allows the SUT to return to idle state + */ + function f_awaitSUTidle( + ) runs on SipComponent { + vc_ignore4xx := true; // allow 4xx in default + tc_noAct.start; + alt { + [] tc_noAct.timeout { + } + } + } + + /** + * @desc function waits for particular time before next expected message + */ + function f_wait( + float p_time + ) runs on SipComponent { + tc_noAct.start(p_time); + alt { + [] tc_noAct.timeout { + } + } + } + + /** + * @desc function cause termination of a PTC + * @param p_syncPoint dummy parameter (copied from the common lib) + */ + function f_check2Null( + in charstring p_syncPoint + ) runs on SipComponent { + // != pass does not work, because in case of "none" execution shall continue + if (getverdict == inconc or getverdict == fail) { + log("*** f_check2Null: INFO: Verdict evaluated to fail or inconc. Stopping test execution now ***"); + f_selfOrClientSyncAndVerdict(p_syncPoint, e_error); + } // end if + } + + /* + * + * @desc original copied from older LibCommon_VerdictControl + */ + function f_getVerdict( + ) return FncRetCode { + var FncRetCode v_ret := e_error; + if (getverdict == pass or getverdict == none) { + v_ret := e_success; + } + return v_ret; + } + + + + } // end group GlobalSteps + + group Registration { + + /** + * @desc registration and authentication with MD5 + * @param p_cSeq_s cseq parameter + * @param p_register register template + * @param p_auth flag indicating if authentication is needed + * @param p_emergency Set to true in case of emergency call + */ + function f_Registration( + inout CSeq p_cSeq_s, + out template(value) REGISTER_Request p_register, + in boolean p_auth, + in boolean p_emergency := false + ) runs on SipComponent { + if (PX_SIP_REGISTRATION) { + f_setHeaders_REGISTER(p_cSeq_s, p_emergency); + p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization); + f_SendREGISTER(p_register); // LibSip + // awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER + if (p_auth) { + // receiving 401 Unauthorized response. + // and Re-send REGISTER request with Authorization header + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + // set headers via, cseq and authorization + f_setHeaders_2ndREGISTER(p_cSeq_s); + p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization); + // Re-send protected REGISTER + f_SendREGISTER(p_register); // LibSip + // awaiting 200 OK REGISTER + f_awaitingOkResponse(p_cSeq_s); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + } + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***"); + } + } + } + else { + f_awaitingOkResponse(p_cSeq_s); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + } + } + } // end function f_Registration + + /** + * @desc registration and authentication with MD5 + * @param p_cSeq_s cseq parameter + * @param p_register register template + * @param p_auth flag indicating if authentication is needed + */ + function f_Registration_withTemplate( + inout CSeq p_cSeq_s, + inout template(value) REGISTER_Request p_register, + in boolean p_auth + ) runs on SipComponent { + if (PX_SIP_REGISTRATION) { + if(not isbound(p_register)){ + f_setHeaders_REGISTER(p_cSeq_s); + p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization); + } + f_SendREGISTER(p_register); // LibSip + // awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER + if (p_auth) { + // receiving 401 Unauthorized response. + // and Re-send REGISTER request with Authorization header + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + // set headers via, cseq and authorization + f_setHeaders_2ndREGISTER(p_cSeq_s); + // p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, + // vc_authorization); + // Re-send protected REGISTER + p_register.requestLine.requestUri := vc_requestUri; + p_register.msgHeader.cSeq := vc_cSeq; + p_register.msgHeader.via := vc_via_REG; + p_register.msgHeader.authorization := vc_authorization; + f_SendREGISTER(p_register); // LibSip + // awaiting 200 OK REGISTER + f_awaitingOkResponse(p_cSeq_s); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + } + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***"); + } + } + } + else { + f_awaitingOkResponse(p_cSeq_s); + f_getServiceRouteMapIntoRouteInRegistration(vc_response); + } + } + } // end function f_Registration_withTemplate + + + /** + * @desc remove registration + * @param p_cSeq_s cseq parameter + */ + function f_RemoveRegistration( + inout CSeq p_cSeq + ) runs on SipComponent { + var template(value) REGISTER_Request v_request; + var boolean v_receivedNotify := false; + + // + if (vc_DeregDone) { + f_componentStop(); + } + else { + vc_DeregDone := true; + } + + if (PX_SIP_REGISTRATION) { + f_setHeaders_deREGISTER(p_cSeq); + v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0"); + + f_SendREGISTER(v_request); + if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED) { + // receiving 401 Unauthorized response. + // and Re-send REGISTER request with Authorization header + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + // set headers via, cseq and authorization + f_setHeaders_2ndREGISTER(p_cSeq); + v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0"); + // v_request.msgHeader.route := f_route(); + // Re-send protected REGISTER + f_SendREGISTER(v_request); // LibSip + // awaiting 200 OK REGISTER + f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)); + } + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) -> value vc_response { + tc_resp.stop; + f_setHeadersOnReceiptOfResponse(vc_response); + // log ("Authorization was not requested as expected"); + } + [] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) { + } + } + } + else { + tc_resp.start; + alt { + [] a_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) { + } + [] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) { + } + } + } + + // await NOTIFY and send reply 200 OK + if (vc_subscribed and v_receivedNotify == false) { + f_awaitingNOTIFY_sendReply_postamble(mw_NOTIFY_Request_Base(vc_callIdReg)); + } + } + } // end f_RemoveRegistration + + /** + * @desc remove registration without authorization + * @param p_cSeq_s cseq parameter + */ + function f_RemoveRegistration_wo_authorization( + inout CSeq p_cSeq + ) runs on SipComponent { + if (PX_SIP_REGISTRATION) { + f_setHeaders_deREGISTER(p_cSeq); + f_SendREGISTER(m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0")); + f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)); + } + } // end f_RemoveRegistration_wo_authorization + + + + } // end group Registration + + group Subscription { + + /** + * @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK + * @param p_cSeq_s cseq parameter + * @param p_subscribe subscribe template + */ + function f_Subscription( + inout CSeq p_cSeq_s, + template(value) SUBSCRIBE_Request p_subscribe + ) runs on SipComponent { + // send SUBSCRIBE + f_SendSUBSCRIBE(p_subscribe); + // awaiting 200 OK SUBSCRIBE + // await NOTIFY and send reply 200 OK + f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, mw_NOTIFY_Request_Base(vc_callId)); + } // end function f_Subscription + + /** + * @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK + * @param p_cSeq_s cseq parameter + * @param p_subscribe subscribe template + * @param p_notify notify template + */ + function f_SubscriptionWithNotification( + inout CSeq p_cSeq_s, + template(value) SUBSCRIBE_Request p_subscribe, + template(present) NOTIFY_Request p_notify := ? + ) runs on SipComponent { + f_setHeaders_SUBSCRIBE(p_cSeq_s); + // send SUBSCRIBE + f_SendSUBSCRIBE(p_subscribe); + // awaiting 200 OK SUBSCRIBE + // await NOTIFY and send reply 200 OK + f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, p_notify); + } // end function f_SubscriptionWithNotification + + /** + * @desc UE await subscrbe, send on 200 OK; possibility to handle also other SUBSCRIBE methods where event is different than reg + * @param p_cSeq_s cseq parameter + * @param p_subscribe subscribe template + */ + function f_awaitingSubscription( + template(present) SUBSCRIBE_Request p_subscribe := ? + ) runs on SipComponent { + var SUBSCRIBE_Request v_request; + + tc_wait.start(2.0); // awaiting of all SUBSCRIBES + alt { + [] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label { + f_setHeadersOnReceiptOfSUBSCRIBE(v_request); + f_send200OK(); + repeat; + } + [] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label { + f_setHeadersOnReceiptOfSUBSCRIBE(v_request); + f_send200OK(); + repeat; + } + [] tc_wait.timeout { + setverdict(pass); + } + } + } // end function f_awaitingSubscription + + + + } // end group Subscription + + group Preambles { + + /** + * @desc Set variables and default initialization for user profile + * @param p_userprofile user profile of call + * @param p_cSeq_s cseq parameter + */ + function f_SIP_preamble_woREG( + inout CSeq p_cSeq_s + ) runs on SipComponent { + // varables and altsteps + f_init_component(p_cSeq_s); + + // Preamble + //NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable + vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile)); + } + + /** + * @desc Set variables and default initialization for user profile and handle registration and authentication with MD5 + * @param p_userprofile user profile of call + * @param p_cSeq_s cseq parameter + * @param p_register register template + */ + function f_SIP_preamble_withREG( + inout CSeq p_cSeq_s, + template(value) REGISTER_Request p_register + ) runs on SipComponent { + // preamble + f_SIP_preamble_woREG(p_cSeq_s); + + // Registration, Awaiting + f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED); + } + + + + } // end group Preambles + + group Postambles { + + /** + * @desc function send BYE and awaits reponse + * @param p_CallId parameter for outgoing BYE + * @param p_cSeq parameter for outgoing BYE + * @param p_from parameter for outgoing BYE + * @param p_to parameter for outgoing BYE + * @param p_reqHostPort parameter for outgoing BYE + * @param p_byeCause parameter for Release cause to be used + * in BYE and in Failure messages, former PX_SIP_BYE_CAUSE + */ + function f_terminateCall( + SipUrl p_requestUri, + CallId p_CallId, + inout CSeq p_cSeq, + From p_from, + template(value) To p_to, + integer p_byeCause + ) runs on SipComponent { + // Sending of a BYE request to release the call and expect a final response + f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, p_to, vc_via, p_byeCause)); + + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq)) { + repeat; + } + [] SIPP.receive(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq)) { + tc_resp.stop; + } + } + } // end function f_terminateCall + + function f_cancelCall( + template(value) CANCEL_Request p_request + ) runs on SipComponent { + // This function is called to bring back the IUT in idle condition + // in case of errors or unexpected behaviour. + // Sending of a CANCEL request with the same Cseq + f_setHeadersCANCEL(vc_cSeq); + f_SendCANCEL(p_request); + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq)) { + tc_resp.stop; + } + } + } + + function f_cancelCall_await487( + template(value) CANCEL_Request p_request + ) runs on SipComponent { + // This function is called to bring back the IUT in idle condition + // in case of errors or unexpected behaviour. + // Sending of a CANCEL request with the same Cseq + f_cancelCall(p_request); + // set method on INVITE + vc_cSeq.method := "INVITE"; + + // await on 487 response and send ACK + f_awaitingResponse(mw_Response_Base(c_statusLine487, vc_callId, vc_cSeq)); + f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)); + } + + function f_awaitCancelCall_send487( + template(present) CANCEL_Request p_request := ? + ) runs on SipComponent { + f_awaitingCANCEL(p_request); + f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via)); + + // set method on INVITE + vc_cSeq.method := "INVITE"; + + // send 487 response and await ACK + f_sendResponse(m_Response_Base(c_statusLine487, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via)); + // await ACK + f_awaitingACK(mw_ACK_Request_Base(vc_callId)); + } + + altstep a_receiveCANCELorNothing( + in template(present) CANCEL_Request p_CANCEL := ? + ) runs on SipComponent { + var CANCEL_Request v_MSG; + [] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the CANCEL + f_send200OK(); + } + } + + altstep a_awaitNotify( + in template(present) NOTIFY_Request p_MSG := ?, + inout boolean p_receivedNotify + ) runs on SipComponent { + var NOTIFY_Request v_MSG; + [vc_subscribed] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label { + p_receivedNotify := true; + f_getRouteMapIntoRecordRoute(v_MSG); + f_setHeadersOnReceiptOfRequest(v_MSG); + // Answer to the NOTIFY + f_send200OK(); + repeat; + } + } + + + + } // end group Postambles + + group SipChecks { + + + /** + * @desc check the presence of conversation at SIP side + * @param p_checkConversation boolean to perform check if conversation check is implemented. + * former PX_SIP_CHECK_CONVERSATION + */ + function f_check_Conversation( + boolean p_checkConversation := false + ) runs on SipComponent { + var charstring v_question := "confirm if conversation at SIP port"; + + if (p_checkConversation) { + opPort + .call( + s_SIP_conversation: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_conversation: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_conversation: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_uPlane, f_getVerdict()); // Note: implemented in test bodies + return; + } // end of f_check_Conversation + + /** + * @desc check the presence of conversation at SIP side + * @param p_checkRinging boolean to perform check if ringing check is implemented. + * former PX_SIP_CHECK_RINGING + */ + function f_check_Ringing( + boolean p_checkRinging := false + ) runs on SipComponent { + var charstring v_question := "confirm if ringing at SIP port"; + + if (p_checkRinging) { + opPort + .call( + s_SIP_ringing: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_ringing: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_ringing: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_Ringing, f_getVerdict()); + return; + } // end of f_check_Ringing + + /** + * @desc check the announcement at SIP side (UE A) + * @param p_checkConversation boolean to perform check if conversation check is implemented. + * former PX_SIP_CHECK_CONVERSATION + */ + function f_check_AnnouncementUE_A( + boolean p_checkConversation := false + ) runs on SipComponent { + var charstring v_question := "confirm if announcement at UE A"; + + if (p_checkConversation) { + opPort + .call( + s_SIP_announcementA: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_announcementA: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_announcementA: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_annoucA, f_getVerdict()); + return; + } // end of f_check_AnnouncementUE_A + + /** + * @desc check the announcement at SIP side (UE B) + * @param p_checkConversation boolean to perform check if conversation check is implemented. + * former PX_SIP_CHECK_CONVERSATION + */ + function f_check_AnnouncementUE_B( + boolean p_checkConversation := false + ) runs on SipComponent { + var charstring v_question := "confirm if announcement at UE B"; + + if (p_checkConversation) { + opPort + .call( + s_SIP_announcementB: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_announcementB: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_announcementB: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_annoucB, f_getVerdict()); + return; + } // end of f_check_AnnouncementUE_B + + /** + * @desc check the announcement at SIP side + * @param p_checkConversation boolean to perform check if conversation check is implemented. + * former PX_SIP_CHECK_CONVERSATION + */ + function f_check_Announcement( + boolean p_checkConversation := false + ) runs on SipComponent { + var charstring v_question := "confirm if announcement at SIP side"; + + if (p_checkConversation) { + opPort + .call( + s_SIP_announcement: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_announcement: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_announcement: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_annouc, f_getVerdict()); + return; + } // end of f_check_Announcement + + /** + * @desc check the Voice message at SIP side + * @param p_checkConversation boolean to perform check if conversation check is implemented. + * former PX_SIP_CHECK_CONVERSATION + */ + function f_check_VoiceMessage( + boolean p_checkConversation := false + ) runs on SipComponent { + var charstring v_question := "confirm if voice message at SIP side"; + + if (p_checkConversation) { + opPort + .call( + s_SIP_voiceMessage: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_voiceMessage: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_voiceMessage: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_voicem, f_getVerdict()); + return; + } // end of f_check_Announcement + + /** + * @desc check the stop of media stream + * @param p_checkConversation boolean to perform check if conversation check is implemented. + * former PX_SIP_CHECK_CONVERSATION + */ + function f_check_MediaStopped( + boolean p_checkConversation := false + ) runs on SipComponent { + var charstring v_question := "confirm if media stream stopped"; + + if (p_checkConversation) { + opPort + .call( + s_SIP_mediastopped: + { + v_question, + - + } + ) { + [] opPort + .getreply( + s_SIP_mediastopped: + { + -, + true + } + ) { + } + [] opPort + .getreply( + s_SIP_mediastopped: + { + -, + false + } + ) { + all timer.stop; + setverdict(fail); + syncPort.send(m_syncClientStop); + stop; + } + }; + } + + f_selfOrClientSyncAndVerdict(c_uPlaneStop, f_getVerdict()); + return; + } // end of f_check_MediaStopped + + } + + group DefaultsTestStep { + + + /** + * @desc This default handles receiving of the sync server STOP message and calls the RT HUT postamble. (copy from common lib) + */ + altstep a_Sip_catchSyncStop( + ) runs on SipComponent { + [] syncPort.receive(m_syncServerStop) { + tc_sync.stop; + log("*** a_Sip_catchSyncStop: INFO: Test component received STOP signal from MTC - going to IDLE state *** "); + syncPort.send(m_syncClientStop); + // in case if deregistration was not done + // f_RemoveRegistration(vc_cSeq); + f_terminate_component(); + log("*** a_Sip_catchSyncStop: INFO: TEST COMPONENT NOW STOPPING ITSELF! *** "); + setverdict(inconc); + stop; + } + } + + + /** + * @desc main default altstep to handle unexpected messages and timeout + * @verdict fail for all unexpected branches + */ + altstep a_clearRegistration( + ) runs on SipComponent { + var Response v_response; + var Request v_request; + var INFO_Request v_info_request; + var NOTIFY_Request v_notify_request; + var SUBSCRIBE_Request v_subscribe_request; + var BYE_Request v_bye_request; + var CANCEL_Request v_cancel_request; + var REGISTER_Request v_register_request; + var CSeq v_cSeq; + [] any timer.timeout { + setverdict(fail); + all timer.stop; + // f_SendCANCEL(m_CANCEL_Request(vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_reqHostPort, vc_via )); // difference between registration + // state or transaction state + vc_callId := vc_callIdReg; + f_RemoveRegistration(vc_cSeq); + } + // allow repeated INVITEs + [vc_ignore_invite] SIPP.receive(mw_INVITE_Request_Base) { + repeat; + } + // allow repeated BYEs after ack of the first BYE + [vc_ignore_bye] SIPP.receive(mw_BYE_Request_Base(?)) { + repeat; + } + [] SIPP.receive(mw_ACK_Request_Base(?)) { + repeat; + } + // allow 100 replies + [] SIPP.receive(mw_Response_Base(c_statusLine100, ?, ?)) { + repeat; + } + // ignore 181 if flag is set (following TS 183004 4.5.2.1) + [vc_ignore181] SIPP.receive(mw_Response_Base(c_statusLine181, vc_callId, vc_cSeq)) -> value v_response sender vc_sent_label { + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory + repeat; + } + // according to SIP chap.8.1.3.2 + [] SIPP.receive(mw_Response_Base(c_statusLine183, vc_callId, vc_cSeq)) { + repeat; + } + // ignore 484 if flag is set + [vc_ignore484] SIPP.receive(mw_Response_Base(c_statusLine484, vc_callId, vc_cSeq)) { + repeat; + } + [vc_ignore4xx] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label { + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory + f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route)); + repeat; + } + [vc_ignore200OKinv] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, ?)) { + repeat; + } + [] SIPP.receive(mw_INFO_Request_Base(vc_callId)) -> value v_info_request sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_info_request); + f_send200OK(); + repeat; + } + // awaiting of Notify + [] SIPP.receive(mw_NOTIFY_Request_Base(vc_callId)) -> value v_notify_request sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_notify_request); + f_send200OK(); + repeat; + } + // awaiting of subscribe from UE + [vc_ignore_subscribe] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_subscribe_request sender vc_sent_label { + f_setHeadersOnReceiptOfSUBSCRIBE(v_subscribe_request); + f_send200OK(); + repeat; + } + // awaiting of subscribe on proxy + [] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_subscribe_request sender vc_sent_label { + f_setHeadersOnReceiptOfRequest(v_subscribe_request); + f_sendResponse(m_Response_Contact(c_statusLine200, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact)); + // f_setHeadersGeneral(vc_cSeq, "NOTIFY"); // cseq, contact, branch, via + // f_SendNOTIFY(m_NOTIFY_Request_contact(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_contact)); + f_SendNOTIFY(m_NOTIFY_Request_contact(v_subscribe_request.msgHeader.contact.contactBody.contactAddresses[0].addressField.nameAddr.addrSpec, vc_callId, vc_cSeq, vc_callee_From, vc_callee_To, vc_via, vc_contact)); + f_awaitingOkResponse(vc_cSeq); + repeat; + } + // unexpected BYE is acknowledged to avoid retransmissions + [] SIPP.receive(mw_BYE_Request_Base(?)) -> value v_bye_request sender vc_sent_label { + setverdict(fail); + f_setHeadersOnReceiptOfRequest(v_bye_request); + f_send200OK(); + f_RemoveRegistration(vc_cSeq); + } + // unexpected CANCEL is acknowledged to avoid retransmissions + [] SIPP.receive(mw_CANCEL_Request_Base(?)) -> value v_cancel_request sender vc_sent_label { + setverdict(fail); + f_setHeadersOnReceiptOfRequest(v_cancel_request); + // Answer to the CANCEL + f_send200OK(); + f_RemoveRegistration(vc_cSeq); + } + // catch 4xx response + [] SIPP.receive(mw_Response_Base(mw_statusLine4xx, vc_callId, ?)) -> value v_response sender vc_sent_label { + setverdict(fail); + if (v_response.msgHeader.cSeq.method == "INVITE") { + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory + LibSip_Steps.f_setHeadersACK(); + f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route)); + } + f_RemoveRegistration(vc_cSeq); + } + // catch 5xx response + [] SIPP.receive(mw_Response_Base(mw_statusLine5xx, vc_callId, ?)) -> value v_response sender vc_sent_label { + setverdict(fail); + if (v_response.msgHeader.cSeq.method == "INVITE") { + v_cSeq := valueof(v_response.msgHeader.cSeq); + f_setHeadersOnReceiptOfResponse(v_response); // CSeq is mandatory + LibSip_Steps.f_setHeadersACK(); + f_SendACK(m_ACK_Request_route(vc_requestUri, vc_callId, v_response.msgHeader.cSeq, vc_from, vc_to, vc_via, vc_route)); + } + f_RemoveRegistration(vc_cSeq); + } + // catch invalid REGISTER + [] SIPP.receive(mw_REGISTER_Request_Base) -> value v_register_request sender vc_sent_label { + setverdict(fail); + f_componentStop(); + } + // any + [] SIPP.receive { + setverdict(fail); + all timer.stop; + // f_setHeadersCANCEL(vc_cSeq); + // f_SendCANCEL(m_CANCEL_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_cancel_To, vc_via )); // difference between + // registration state or transaction state + f_RemoveRegistration(vc_cSeq); + } + } + + /** + * @desc altstep handle authentication for INVITE message + */ + altstep a_altstep_401or407( + ) runs on SipComponent { + var CommaParam_List v_challenge; + var Credentials v_Credentials; + var Response v_Response; + var Request v_Request := vc_requestFor407; + [] any port.check(receive) { + + tc_resp.start; + alt { + [] SIPP.receive(mw_Response_Base((c_statusLine401, c_statusLine407), vc_callId, vc_cSeq)) -> value v_Response { + tc_resp.stop; + // get tag from To header if available + vc_to := v_Response.msgHeader.toField; + if (vc_cSeq.method == "INVITE") { + // send ACK + f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)); + } + // resent the INVITE message with Proxyauthorization header include + // Extract challenge and calculate credentials for a response. + if ( + ischosen( + v_Response.msgHeader.proxyAuthenticate.challenge + .otherChallenge // instead of digestCln (changed by axr to comply to alcatel) + ) + ) { + v_challenge := v_Response.msgHeader.proxyAuthenticate.challenge.otherChallenge.authParams; + v_Credentials := f_calculatecCredentials(vc_userprofile, vc_requestFor407.msgHeader.cSeq.method, v_challenge); + } + else { + log("*** " &__SCOPE__& ": INFO: No scheme in Proxy Authenticate header!!! ***"); + setverdict(inconc); + stop; + } + + vc_branch := c_branchCookie & f_getRndTag(); + vc_via := { + fieldName := VIA_E, + viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))} + }; + + v_Request.msgHeader.via := vc_via; + // Increment CSeq sequence number of and add the credentials + // to the original saved INVITE message. + vc_cSeq.method := vc_requestFor407.msgHeader.cSeq.method; + vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1; + v_Request.msgHeader.cSeq.seqNumber := vc_cSeq.seqNumber; + v_Request.msgHeader.proxyAuthorization.fieldName := PROXY_AUTHORIZATION_E; + v_Request.msgHeader.proxyAuthorization.credentials := {v_Credentials}; + + // Re-send the saved INVITE with Authorization header + // included. + SIPP.send(v_Request) to vc_sent_label; + } + } + } + } + + } // end of group DefaultsTestStep +} // end module LibSip_Steps diff --git a/ttcn/patch_lib_sip_titan/LibSip_Templates.ttcn b/ttcn/patch_lib_sip_titan/LibSip_Templates.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..25dbe019b4349c92addd7de160762eab61666385 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_Templates.ttcn @@ -0,0 +1,4648 @@ +/** + * @author STF 346, STF366, STF368, STF369, STF450, STF471 + * @version $Id$ + * @desc This module defines SIP Templates for message, header, and + * structured types.
+ * Note that any changes made to the definitions in this module + * may be overwritten by future releases of this library + * End users are encouraged to contact the distributers of this + * module regarding their modifications or additions. + * This module is part of LibSipV3. + * @remark Any additions to the templates shall follow the design rules and always modify base templates only; Existing templates shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org + */ +module LibSip_Templates { + // LibSip + import from LibSip_SIPTypesAndValues all; + import from LibSip_SDPTypes all; + import from LibSip_Interface all; + import from LibSip_PIXITS all; + import from LibSip_XMLTypes all; + import from LibSip_SimpleMsgSummaryTypes all; + import from LibSip_MessageBodyTypes all; + import from LibSip_Common all; + + import from NoTargetNamespace language "XSD" all + with { + extension "File:../xsd/Ims3gpp.xsd"; + } + + import from urn_ietf_params_xml_ns_conference_info language "XSD" all + with { + extension "File:../xsd/CONF.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all + with { + extension "File:../xsd/PSTN.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all + with { + extension "File:../xsd/SupplementaryServices.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all + with { + extension "File:../xsd/MCID.xsd"; + } + + import from urn_ietf_params_xml_ns_resource_lists language "XSD" all + with { + extension "File:../xsd/ResourceList.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all + with { + extension "File:../xsd/CDIVN.xsd"; + } + + import from urn_3gpp_ns_cw_1_0 language "XSD" all + with { + extension "File:../xsd/cw.xsd"; + } + + group SubFields { + + template(value) Addr_Union m_AddrUnion_NameAddr(template(value) NameAddr p_nameAddr) := {nameAddr := p_nameAddr} + + template(value) Addr_Union m_AddrUnion_DisplayAndSipUrl( + template(value) DisplayName p_displayName, + template(value) SipUrl p_addrSpec + ) := { + nameAddr := m_CallingAddr(p_displayName, p_addrSpec) + } + + template(value) NameAddr m_NameAddr( + template(omit) DisplayName p_displayName := omit, + template(value) SipUrl p_addrSpec + ) := { + displayName := p_displayName, + addrSpec := p_addrSpec + } + + template(value) NameAddr m_CallingAddr( + template(value) DisplayName p_displayName, + template(value) SipUrl p_addrSpec + ) := m_NameAddr(p_displayName, p_addrSpec); + + template(present) NameAddr mw_NameAddr( + template DisplayName p_displayName, + template(present) SipUrl p_addrSpec := ? + ) := { + displayName := p_displayName, + addrSpec := p_addrSpec + } + + template(present) CommaParam_List mw_digestResponse( + template(present) GenericParam p_genericParam := ? + ) := superset(p_genericParam); + + //* c_Integrity_protected_yes + /** + * @desc send template for parameter list with CPC set to a specific value + * @param p_ISUP_CPC_value CPC parameter value + * former PX_SIP_ISUP_CPC_VALUE + */ + template(value) SemicolonParam_List m_cpc( + template(value) charstring p_ISUP_CPC_value := "prison" + ) := { + { + "cpc", + {tokenOrHost := p_ISUP_CPC_value} + } + } + + template(value) SemicolonParam_List m_ReasonParams( + template(omit) GenValue p_cause := omit, + template(value) GenValue p_text + ) := { + m_Cause(p_cause), m_Text(p_text) + } + + template(present) SemicolonParam_List mw_ReasonParams( + template GenValue p_cause, + template GenValue p_text + ) := { + mw_Cause_base(p_cause), mw_Text(p_text) + } + + template(value) ReasonValue m_ReasonValue_Base := { + token := "", + reasonParams := omit + } + + template(present) ReasonValue mw_ReasonValue_Base := { + token := ?, + reasonParams := * + } + + template(value) ReasonValue m_ReasonValue_param( + template(value) GenValue p_cause, + template(value) GenValue p_text + ) modifies m_ReasonValue_Base := { + reasonParams := m_ReasonParams(p_cause, p_text) + } + + template(present) ReasonValue mw_ReasonValue_param( + template GenValue p_cause, + template GenValue p_text + ) modifies mw_ReasonValue_Base := { + reasonParams := mw_ReasonParams(p_cause, p_text) + } + + template(value) ReasonValue m_ReasonValue( + template(value) GenValue p_cause, + template(value) GenValue p_text + ) modifies m_ReasonValue_param := { + token := "Q.850" + } + + template(present) ReasonValue mw_ReasonValue( + template GenValue p_cause, + template GenValue p_text + ) modifies mw_ReasonValue_param := { + token := "Q.850" + } + + template(value) ReasonValue m_ReasonValueSIP( + template(value) GenValue p_cause, + template(value) GenValue p_text + ) modifies m_ReasonValue_param := { + token := "SIP" + } + + template(present) ReasonValue mw_ReasonValueSIP( + template GenValue p_cause, + template GenValue p_text + ) modifies mw_ReasonValue_param := { + token := "SIP" + } + + template(present) RouteBody mw_routeBody( + template(present) SipUrl p_sipurl := ? + ) := { + nameAddr := mw_NameAddr(*, p_sipurl), + rrParam := * + } + + template(value) SentProtocol m_SentProtocol( + template(value) charstring p_protocol + ) := { + protocolName := c_sipName, + protocolVersion := c_sipVersion, + transport := p_protocol + } + + template(value) SipUrl m_BasicSipUrl := { + scheme := (c_sipScheme), + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "", //* charstring + password := + omit //* optional charstring + }, + hostPort := { + host := omit, //* hostname, IPv4 or IPv6 as a charstring + portField := + omit //* p_userprofile.currPort - optional integer + } + } + }, + urlParameters := omit, + headers := omit + } + + template(value) SipUrl m_SipUrl_currDomain_Base( + template(value) SipUserProfile p_userprofile + ) modifies m_BasicSipUrl := { + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := p_userprofile.publUsername + } + } + } + } + + template(value) SipUrl m_SipUrl_currDomain( + template(value) SipUserProfile p_userprofile + ) modifies m_SipUrl_currDomain_Base := { + components := { + sip := { + hostPort := { + host := + p_userprofile + .homeDomain //* hostname, IPv4 or IPv6 as a charstring + } + } + } + } + + template(value) SipUrl m_SipUrl_contactIpaddr( + template(value) SipUserProfile p_userprofile + ) modifies m_SipUrl_currDomain_Base := { + components := { + sip := { + hostPort := { + host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring + portField := + p_userprofile + .contactPort //* optional integer + } + } + } + } + /** + * @desc send template with SIP userinfo + * @param p_userprofile SIP user profile values + * @param p_ISUP_CPC_value CPC parameter value + * former PX_SIP_ISUP_CPC_VALUE + */ + template(value) SipUrl m_SipUrl_contactIpaddrAndCpc( + template(value) SipUserProfile p_userprofile, + template(value) charstring p_ISUP_CPC_value := "prison" + ) modifies m_SipUrl_contactIpaddr := { + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := + valueof(p_userprofile.publUsername) & "; cpc=" & + valueof(p_ISUP_CPC_value) + } + } + } + } + + template(value) SipUrl m_SipUrl_currIpaddr( + template(value) SipUserProfile p_userprofile + ) modifies m_SipUrl_currDomain_Base := { + components := { + sip := { + hostPort := { + host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring + portField := + p_userprofile + .currPort //* optional integer + } + } + } + } + + template(value) SipUrl m_SipUrl_Anonymous modifies m_BasicSipUrl := { + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := + "Anonymous" //* charstring + }, + hostPort := { + host := + "Anonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring + } + } + } + } + + template(value) SipUrl m_SipUrl_NumberHostHeader( + template(value) charstring p_number, + template(value) charstring p_host, + template(omit) AmpersandParam_List p_urlParameters := omit + ) modifies m_BasicSipUrl := { + components := { + sip := { + userInfo := {userOrTelephoneSubscriber := p_number}, + hostPort := {host := p_host} + } + }, + urlParameters := p_urlParameters + } + + template(value) SipUrl m_SipUrl_NumberHostParam( + template(value) charstring p_number, + template(value) charstring p_host, + template(omit) AmpersandParam_List p_urlParameters := omit + ) modifies m_SipUrl_NumberHostHeader := { + components := {sip := {hostPort := {portField := c_defaultSipPort}}} + } + + template(value) SipUrl m_SipUrl_NumberHostParam_woPort( + template(value) charstring p_number, + template(value) charstring p_host, + template(omit) AmpersandParam_List p_urlParameters := omit + ) modifies m_SipUrl_NumberHostParam := { + components := {sip := {hostPort := {portField := omit}}} + } + + template(present) SipUrl m_BasicTelUrl := { + scheme := (c_telScheme), + components := {tel := {subscriber := ""}}, + urlParameters := omit, + headers := omit + } + + template(value) SipUrl m_TelUrl_publUser( + template(value) SipUserProfile p_userprofile + ) modifies m_BasicTelUrl := { + components := { + tel := { + subscriber := + p_userprofile + .publUsername //* charstring + } + } + } + + template(present) SipUrl mw_TelUrl := { + scheme := c_telScheme, + components := {tel := {subscriber := ?}}, + urlParameters := *, + headers := * + } + + template(present) SipUrl mw_SipUrl := { + scheme := c_sipScheme, + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := ?, + password := * + }, + hostPort := { + host := *, + portField := * + } + } + }, + urlParameters := *, + headers := * + } + + template(present) SipUrl mw_TelSip_unavailableInvalidUri := (mw_TelSip_unavailableInvalidUri1, mw_TelSip_unavailableInvalidUri2); + + template(present) SipUrl mw_TelSip_unavailableInvalidUri1 modifies mw_SipUrl := { + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "unavailable" + }, + hostPort := { + host := "anonymous.invalid", + portField := c_defaultSipPort + } + } + } + } + template(present) SipUrl mw_TelSip_unavailableInvalidUri2 modifies mw_TelUrl := { + components := {tel := {subscriber := "unavailable"}} + } + + template(present) SipUrl mw_TelSip_unavailableUri( + template(value) charstring p_host + ) := (mw_TelSip_unavailableUri1, mw_TelSip_unavailableUri2(p_host)); + + template(present) SipUrl mw_TelSip_unavailableUri1 modifies mw_TelUrl := { + components := {tel := {subscriber := "unavailable"}} + } + + template(present) SipUrl mw_TelSip_unavailableUri2( + template(value) charstring p_host + ) modifies mw_SipUrl := { + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := "unavailable" + }, + hostPort := { + host := p_host, + portField := c_defaultSipPort + } + } + } + } + + template(present) SipUrl mw_SipUrl_Number( + template(present) charstring p_number := ? + ) modifies mw_SipUrl := { + components := { + sip := { + userInfo := {userOrTelephoneSubscriber := p_number}, + hostPort := ? + } + } + } + + template(present) SipUrl mw_TelSipUrl_Number( + template(present) charstring p_number := ? + ) := (mw_SipUrl_Number(p_number), mw_TelSipUrl_Number2(p_number)); + + template(present) SipUrl mw_TelSipUrl_Number1( + template(present) charstring p_number := ? + ) := mw_SipUrl_Number(p_number); + + template(present) SipUrl mw_TelSipUrl_Number2( + template(present) charstring p_number := ? + ) modifies mw_TelUrl := { + components := { + tel := { + subscriber := p_number + } + } + } + + template(present) SipUrl mw_SipUrl_Host( + template(present) charstring p_host := ? + ) modifies mw_SipUrl := { + components := { + sip := { + userInfo := *, + hostPort := {host := p_host} + } + } + } + + template(present) SipUrl mw_SipUrl_User_Host( + template(present) charstring p_user := ?, + template(present) charstring p_host := ? + ) modifies mw_SipUrl := { + components := { + sip := { + userInfo := {userOrTelephoneSubscriber := p_user}, + hostPort := { + host := + p_host //* hostname, IPv4 or IPv6 as a charstring + } + } + }, + urlParameters := * // FSCOM Strange {m_UserPhone} + } + + template(present) SipUrl mw_SipUrl_Anonymous modifies mw_SipUrl := { + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := pattern "[a,A][n,N][o,O][n,N][y,Y][m,M][o,O][u,U][s,s]" //* charstring + }, + hostPort := { + host := + pattern + "[a,A]nonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring + } + } + } + } + + template(present) SipUrl mw_SipUrl_urlParam( + template SemicolonParam_List p_urlParameters + ) modifies mw_SipUrl := { + urlParameters := p_urlParameters + } + + template(present) ContactAddress mw_ContactAddress := { + addressField := ?, + contactParams := * + } + + template(present) HostPort mw_hostPort( + template charstring p_host, + template integer p_portField + ) := { + host := p_host, + portField := p_portField + } + + template(present) StatusLine mw_statusLine_any := { + sipVersion := c_sipNameVersion, + statusCode := ?, + reasonPhrase := ? + } + + template(present) StatusLine mw_statusLine( + in template(present) integer p_statusCode := ?, + in template(present) charstring p_reasonPhrase := ? + ) modifies mw_statusLine_any := { + statusCode := p_statusCode, + reasonPhrase := p_reasonPhrase + } + + template(present) StatusLine mw_statusLine1xx modifies mw_statusLine_any := {statusCode := (100 .. 199)} + + template(present) StatusLine mw_statusLine2xx modifies mw_statusLine_any := {statusCode := (200 .. 299)} + + template(present) StatusLine mw_statusLine3xx modifies mw_statusLine_any := {statusCode := (300 .. 399)} + + template(present) StatusLine mw_statusLine4xx modifies mw_statusLine_any := {statusCode := (400 .. 499)} + + template(present) StatusLine mw_statusLine5xx modifies mw_statusLine_any := {statusCode := (500 .. 599)} + + template(present) StatusLine mw_statusLine6xx modifies mw_statusLine_any := {statusCode := (600 .. 699)} + + template(present) StatusLine mw_statusLineFinal modifies mw_statusLine_any := {statusCode := (200 .. 699)} + + template(present) NameAddr mw_NameAddr_DispName_User_Host( + template DisplayName p_dn, + template(present) charstring p_user := ?, + template charstring p_host + ) := { + displayName := p_dn, + addrSpec := { + scheme := c_sipScheme, //* contains "sip" + components := { + sip := { + userInfo := { + userOrTelephoneSubscriber := p_user, + password := * + }, + hostPort := { + host := p_host, //* hostname, IPv4 or IPv6 as a charstring + portField := + * //* optional integer + } + } + }, + urlParameters := *, // FSCOM: Strange: {m_UserPhone}, + headers := * + } + } + + template(present) Addr_Union mw_AddrUnion_Nameaddr( + template DisplayName p_dn, + template(present) charstring p_user := ?, + template charstring p_host + ) := { + nameAddr := mw_NameAddr_DispName_User_Host(p_dn, p_user, p_host) + } + + template(present) Addr_Union mw_AddrUnion_SipUrl( + template(present) charstring p_user := ?, + template charstring p_host + ) := { + addrSpecUnion := mw_SipUrl_User_Host(p_user, p_host) + } + + template(present) Addr_Union mw_AddrUnion_TelUrl( + template(present) charstring p_number := ? + ) := { + addrSpecUnion := mw_TelSipUrl_Number(p_number) + } + + + } //* end group Subfields + + group HeaderFieldTemplates { + template(value) LibSip_SIPTypesAndValues.Allow m_Allow( + template(value) Method_List p_methods + ) := { + fieldName := ALLOW_E, + methods := p_methods + } + + template(present) LibSip_SIPTypesAndValues.Allow mw_Allow( + template(value) charstring p_method + ) := { + fieldName := ALLOW_E, + methods := superset(p_method) + } + + template(value) GenericParam m_Cause( + template(omit) GenValue p_cause := omit + ) := { + id := "cause", + paramValue := p_cause + } + + template(present) GenericParam mw_Cause_base( + template GenValue p_cause + ) := { + id := "cause", + paramValue := p_cause + } + + template(present) GenericParam mw_Cause( + template(value) charstring p_cause + ) := { + id := ?, + paramValue := { tokenOrHost := pattern "*{p_cause}*" } + } + + template(value) Authorization m_Authorization( + template(value) Credentials p_credentials + ) := { + fieldName := AUTHORIZATION_E, + body := {p_credentials} + } + + template(present) Authorization mw_Authorization( + template(present) Credentials p_credentials := ? + ) := { + fieldName := AUTHORIZATION_E, + body := {p_credentials} + } + + template(value) Authorization m_Authorization_digest( + template(value) CommaParam_List p_commaParam_List + ) := { + fieldName := AUTHORIZATION_E, + body := {{digestResponse := p_commaParam_List}} + } + + template(present) Authorization mw_Authorization_digest( + template(present) CommaParam_List p_commaParam_List := ? + ) := { + fieldName := AUTHORIZATION_E, + body := {{digestResponse := p_commaParam_List}} + } + + template(value) Authorization m_add_Authorization_digest( + template(value) Authorization p_auth, + template(value) CommaParam_List p_commaParam_List + ) := { + fieldName := AUTHORIZATION_E, + body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse, p_commaParam_List)}} + } + + template(present) Authorization mw_Authorization_other := { + fieldName := AUTHORIZATION_E, + body := {{otherResponse := ?}} + } + + template(value) Contact m_Contact( + template(value) SipUrl p_sipUrl + ) := { + fieldName := CONTACT_E, + contactBody := { + contactAddresses := { + { + addressField := {addrSpecUnion := p_sipUrl}, + contactParams := omit + } + } + } //* end contactBody + } //* end m_Contact + + template(value) Contact m_Contact_profile( + template(value) SipUserProfile p_userprofile + ) := { + fieldName := CONTACT_E, + contactBody := { + contactAddresses := { + { + addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)}, + contactParams := omit + } + } + } //* end + //* contactBody + } //* end m_Contact + + + template(value) Contact m_Contact_profile_expires( + template(value) SipUserProfile p_userprofile, + template(value) GenValue p_expires + ) := { + fieldName := CONTACT_E, + contactBody := { + contactAddresses := { + { + addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)}, + contactParams := { + { + "expires", + p_expires + } + } + } + } + } //* end contactBody + } //* end m_Contact + + template(value) From m_From( + template(value) NameAddr p_nameAddr, + template(value) GenValue p_tag_str + ) := { + fieldName := FROM_E, + addressField := {nameAddr := p_nameAddr}, //* end addressField + fromParams := { + { + id := c_tagId, + paramValue := p_tag_str + } + } + } + + template(value) From m_From_Anonymous( + template(value) GenValue p_tag_str + ) := { + fieldName := FROM_E, + addressField := { + nameAddr := + m_NameAddr( + {token:="Anonymous"}, + //* optional charstring + m_SipUrl_Anonymous //* SipUrl + ) + }, //* end addressField + fromParams := { + { + id := c_tagId, + paramValue := p_tag_str + } + } + } + + template(value) From m_From_SipUrl( + template(value) SipUrl p_sipUrl + ) := { + fieldName := FROM_E, + addressField := { + nameAddr := + m_NameAddr( + omit, + //* optional charstring + p_sipUrl //* SipUrl + ) + }, //* end addressField + fromParams := omit + } + + template(value) Event m_Event_base := { + fieldName := EVENT_E, + eventType := "", + eventParams := omit + } + + template(value) Event m_Event_refer modifies m_Event_base := {eventType := "refer"} + + template(value) Event m_Event_conference modifies m_Event_base := {eventType := "conference"} + + template(value) Event m_Event_presence modifies m_Event_base := {eventType := "presence"} + + template(value) Event m_Event_reg modifies m_Event_base := {eventType := "reg"} + + template(value) Event m_Event_cdiv modifies m_Event_base := {eventType := "comm-div-info"} + + template(value) Event m_Event_mcid := m_Event_cdiv; + + template(value) Expires m_Expires_base := { + fieldName := EXPIRES_E, + deltaSec := "" + } + + template(value) Expires m_Expires_600000 modifies m_Expires_base := {deltaSec := "600000"} + + template(value) Expires m_Expires( + template(value) charstring p_deltaSec + ) modifies m_Expires_base := { + deltaSec := p_deltaSec + } + + template(present) Expires mw_Expires( + template(present) charstring p_deltaSec := ? + ) := { + fieldName := EXPIRES_E, + deltaSec := p_deltaSec + } + + template(value) HistoryInfo m_HistoryInfo( + template(value) HistoryInfo_List p_HistoryInfo_List + ) := { + fieldName := HISTORY_INFO_E, + historyInfoList := p_HistoryInfo_List + } + + template(present) HistoryInfo mw_HistoryInfo( + template(present) HistoryInfo_List p_HistoryInfo_List := ? + ) := { + fieldName := HISTORY_INFO_E, + historyInfoList := p_HistoryInfo_List + } + + template(value) HistoryInfoEntry m_HistoryInfoEntry( + template(value) SipUrl p_Url, + template(omit) IntegerList p_index := omit, + template(omit) SemicolonParam_List p_paramlist := omit + ) := { + nameAddr := m_NameAddr(omit, p_Url), + hiIndex := p_index, + hiExtention := p_paramlist + } + + template(present) HistoryInfoEntry mw_HistoryInfoEntry( + template(present) SipUrl p_Url := ?, + template IntegerList p_index, + template SemicolonParam_List p_paramlist + ) := { + nameAddr := mw_NameAddr(*, p_Url), + hiIndex := p_index, + hiExtention := p_paramlist + } + + template(value) PAssertedID m_PAssertedID( + template(value) Addr_Union p_pAssertedIDValue + ) := { + fieldName := P_ASSERTED_ID_E, + pAssertedIDValueList := {p_pAssertedIDValue} + } + + template(value) PAssertedID m_PAssertedID_2x( + template(value) Addr_Union p_pAssertedIDValue, + template(value) Addr_Union p_pAssertedIDValue2 + ) modifies m_PAssertedID := { + pAssertedIDValueList := {p_pAssertedIDValue, p_pAssertedIDValue2} + } + + template(present) PAssertedID mw_PAssertedID( + template(present) PAssertedIDValue p_pAssertedIDValue := ? + ) := { + fieldName := P_ASSERTED_ID_E, + pAssertedIDValueList := {p_pAssertedIDValue} + } + + template(present) PAssertedIDValue mw_PAssertedIDValue( + template(present) SipUrl p_SipUrl := ? + ) := { + nameAddr := { + displayName := *, + addrSpec := p_SipUrl + } + } + + template(value) PPreferredID m_PPreferredID( + template(value) Addr_Union p_pPreferredIDValue + ) := { + fieldName := P_PREFERRED_ID_E, + pPreferredIDValueList := {p_pPreferredIDValue} + } + + template(value) Privacy m_Privacy( + template(value) PrivacyValue p_privacy + ) := { + fieldName := PRIVACY_E, + privValueList := {p_privacy} + } + + template(present) Privacy mw_Privacy_Base( + template(present) charstring p_value := ? + ) := { + fieldName := PRIVACY_E, + privValueList := {*, p_value, *} + } + + template(present) Privacy mw_Privacy_id := mw_Privacy_Base("id"); + + template(present) Privacy mw_Privacy_user := mw_Privacy_Base("user"); + + template(value) RAck m_RAck( + integer p_responseNum, + integer p_seqNumber, + charstring p_method + ) := { + fieldName := RACK_E, + responseNum := p_responseNum, + seqNumber := p_seqNumber, + method := p_method + } + + template(value) Reason m_Reason( + template(value) integer p_cause + ) := { + fieldName := REASON_E, + reasonValues := {m_ReasonValue({tokenOrHost := int2str(valueof(p_cause))}, { tokenOrHost := "dummy"})} + } + + template(value) Reason m_Reason21 := { + fieldName := REASON_E, + reasonValues := {m_ReasonValue({tokenOrHost := int2str(21)}, { tokenOrHost := "call reject"})} + } + + template(present) Reason mw_Reason_Base := { + fieldName := REASON_E, + reasonValues := {} + } + + template(present) Reason mw_Reason( + template(value) GenValue p_cause + ) modifies mw_Reason_Base := { + reasonValues := {mw_ReasonValue(p_cause, ?)} + } + + template(present) Reason mw_ReasonSIP( + template(value) GenValue p_cause + ) modifies mw_Reason_Base := { + reasonValues := {mw_ReasonValueSIP(p_cause, ?)} + } + + template(value) RecordRoute m_recordRoute_currIpAddr( + template(value) SipUserProfile p_userprofile + ) := { + fieldName := RECORD_ROUTE_E, + routeBody := { + { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, //* contains "sip" + components := { + sip := { + userInfo := omit, + hostPort := { + host := p_userprofile.currIpaddr, + portField := p_userprofile.currPort + } + } + }, + urlParameters := omit, + headers := omit + } + }, + rrParam := omit + } + } + } + + template(value) RecordRoute m_recordRoute_currIpAddr_params( + template(value) SipUserProfile p_userprofile, + template(value) SemicolonParam_List p_urlParameters + ) := { + fieldName := RECORD_ROUTE_E, + routeBody := { + { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, //* contains "sip" + components := { + sip := { + userInfo := omit, + hostPort := { + host := p_userprofile.currIpaddr, + portField := p_userprofile.currPort + } + } + }, + urlParameters := p_urlParameters, + headers := omit + } + }, + rrParam := omit + } + } + } + + template(value) RouteBody m_routeBody_currIpAddr( + template(value) SipUserProfile p_userprofile + ) := { + nameAddr := { + displayName := omit, + addrSpec := { + scheme := c_sipScheme, //* contains "sip" + components := { + sip := { + userInfo := omit, + hostPort := { + host := p_userprofile.homeDomain, + portField := p_userprofile.currPort + } + } + }, + urlParameters := omit, + headers := omit + } + }, + rrParam := omit + } + + template(value) ReferredBy m_ReferredBy_SipUrl( + template(value) SipUrl p_sipUrl + ) := { + fieldName := REFERRED_BY_E, + nameAddr := + m_NameAddr( + // STF471 {displayName + omit, + // := omit, + p_sipUrl // addrSpec:=p_sipUrl} + ), + referredbyIdParams := omit + } + + template(value) ReferTo m_ReferTo_SipUrl( + template(value) SipUrl p_sipUrl, + template(value) GenValue p_method + ) := { + fieldName := REFER_TO_E, + nameAddr := + m_NameAddr( + // STF471 {displayName + omit, + // := omit, + p_sipUrl // addrSpec:=p_sipUrl} + ), + referToParams := { + { + id := "method", + paramValue := p_method + } + } + } + + template(value) ReferSub m_ReferSub( + template(value) boolean p_value + ) := { + fieldName := REFER_SUB_E, + referSubValue := p_value, + referSubParams := omit + } + + template(value) Replaces m_Replaces( + template(value) charstring p_callId, + template(value) GenValue p_toTag, + template(value) GenValue p_fromTag + ) := { + fieldName := REPLACES_E, + callid := p_callId, + replacesParams := { + { + id := "to-tag", + paramValue := p_toTag + }, + { + id := "from-tag", + paramValue := p_fromTag + } + } + } + + template(value) Require m_Require_empty := { + fieldName := REQUIRE_E, + optionsTags := {""} + } + + template(value) Require m_Require_replaces modifies m_Require_empty := {optionsTags := {c_replaces}} + + template(value) Require m_Require_100rel modifies m_Require_empty := {optionsTags := {c_tag100rel}} + + template(value) Require m_Require_prec modifies m_Require_empty := {optionsTags := {c_tagPrecond}} + + template(value) SubscriptionState m_SubscriptionState_active := { + fieldName := SUBSCRIPTION_STATE_E, + subState := "active", + substateParams := { + { + id := "expires", + paramValue := {tokenOrHost := "60000"} + } + } + } + + template(value) Supported m_Supported_empty := { + fieldName := SUPPORTED_E, + optionsTags := {""} + } + + template(value) Supported m_Supported_fromChange modifies m_Supported_empty := {optionsTags := {c_tagFromChange}} + + template(value) Supported m_Supported_prec modifies m_Supported_empty := {optionsTags := {c_tagPrecond}} + + template(value) Supported m_Supported_100rel modifies m_Supported_empty := {optionsTags := {c_tag100rel}} + + template(value) Supported m_Supported_100rel_prec modifies m_Supported_empty := {optionsTags := {c_tag100rel, c_tagPrecond}} + + template(value) GenericParam m_Text( + template(value) GenValue p_text + ) := { + id := "text", + paramValue := p_text + } + + template(present) GenericParam mw_Text( + template GenValue p_text + ) := { + id := "text", + paramValue := p_text + } + + template(value) GenericParam m_UserPhone := { + id := "user", + paramValue := { quotedString := "phone" } + } + + template(value) GenericParam m_UserToUserEncodingHex := { + id := "encoding", + paramValue := { quotedString := "hex" } + } + + template(value) UserToUser m_UserToUserData( + template(value) UserToUser.uuiData p_U2UData + ) := { + fieldName := USER_TO_USER_E, + uuiData := p_U2UData, + uuiParam := m_UserToUserEncodingHex + } + + template(value) To m_To( + template(value) SipUrl p_sipUrl + ) := { + fieldName := TO_E, + addressField := { + nameAddr := + m_NameAddr( + {token:="ETSI Tester"}, + //* optional charstring + p_sipUrl //* SipUrl + ) + }, //* end addressField + toParams := omit + } + + template(value) To m_To_SipUrl( + template(value) SipUrl p_sipUrl + ) modifies m_To := { + addressField := { + nameAddr := { + displayName := + omit //* optional charstring + } + } //* end addressField + } + + template(present) To mw_To_NameAddr_SipUrl( + template DisplayName p_dn, + template(present) charstring p_user := ?, + template charstring p_host := ? + ) := { + fieldName := TO_E, + addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)), + toParams := * + } + + template(present) To mw_To( + template(present) SipUrl p_sipUrl := ? + ) := { + fieldName := TO_E, + addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)}, + toParams := * + } + + template(present) From mw_From( + template(present) SipUrl p_sipUrl := ? + ) := { + fieldName := FROM_E, + addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)}, + fromParams := * + } + + template(present) From mw_From_NameAddr_SipUrl( + template DisplayName p_dn, + template(present) charstring p_user := ?, + template charstring p_host + ) := { + fieldName := FROM_E, + addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)), + fromParams := * + } + template(value) ViaBody m_ViaBody_currIpaddr( + template(value) charstring p_branch_val, + template(value) SipUserProfile p_userprofile + ) := { + sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT), + sentBy := { + host := p_userprofile.currIpaddr, + portField := p_userprofile.currPort + }, + viaParams := { + { + id := c_branchId, + paramValue := { + tokenOrHost := p_branch_val + } + } + } + } + + template(present) ViaBody mw_ViaBody_interface( + template(present) HostPort p_hostport := ? + ) := { + sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT), + sentBy := { + host := p_hostport.host, + portField := p_hostport.portField + }, + viaParams := * + } + + template(present) Via mw_Via( + template(present) ViaBody p_viabody := ? + ) := { + fieldName := VIA_E, + viaBody := {*, p_viabody, *} // superset(p_viabody) + } + + template(present) CallId mw_CallId_any := { + fieldName := CALL_ID_E, + callid := ? + } + + template(present) Require mw_Require_Base := { + fieldName := REQUIRE_E, + optionsTags := {} + } + + template(present) Require mw_Require_not_100rel modifies mw_Require_Base := {optionsTags := superset(complement(c_tag100rel))} + + template(present) Require mw_require_100rel modifies mw_Require_Base := {optionsTags := superset(c_tag100rel)} + + template(present) RecordRoute mw_recordroute( + template(present) RouteBody p_routeBody := ? + ) := { + fieldName := RECORD_ROUTE_E, + routeBody := {*, p_routeBody, *} // superset(p_routeBody) + } + + template(present) Route mw_route( + template(present) RouteBody_List p_routeBody := ? + ) := { + fieldName := ROUTE_E, + routeBody := p_routeBody + } + + template(present) Supported mw_Supported_Base := { + fieldName := SUPPORTED_E, + optionsTags := {} + } + + template(present) Supported mw_Supported_100rel_prec modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel, c_tagPrecond)} + + template(present) Supported mw_Supported_100rel modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel)} + + template(present) Supported mw_Supported_fromChange modifies mw_Supported_Base := {optionsTags := superset(c_tagFromChange)} + + template(present) UserToUser mw_UserToUserData( + template(present) UserToUser.uuiData p_U2UData := ? + ) := { + fieldName := USER_TO_USER_E, + uuiData := p_U2UData, + uuiParam := ? + } + + template(present) Contact mw_Contact_conference := { + fieldName := CONTACT_E, + contactBody := { + contactAddresses := { + { + addressField := { + nameAddr := { + displayName := *, + addrSpec := { + scheme := ?, + components := ?, + urlParameters := { + { + "isfocus", + * + }, + * + }, + headers := * + } + } + }, + contactParams := * + } + } + } + } + + template(value) AlertInfo m_AlertInfo_Base := { + fieldName := ALERT_INFO_E, + alertInfoBody := {} + } + + template(value) AlertInfo m_AlertInfo( + template(value) charstring p_urn + ) modifies m_AlertInfo_Base := { + alertInfoBody := { + { + p_urn, + omit + } + } + } + + template(present) AlertInfo mw_AlertInfo( + template(present) charstring p_urn := ? + ) modifies m_AlertInfo_Base := { + alertInfoBody := + superset( + { + p_urn, + omit + } + ) + } + + + } //* end of group HeaderFieldTemplates + + + group MessageTemplates { + + group dummy_templates { + + group dummy_parameter_send { + + template(value) RequestLine m_requestLine_dummy( + template(value) Method p_method + ) := { + method := p_method, + requestUri := c_unavailableUri, + sipVersion := c_sipNameVersion + } + + template(value) MessageHeader m_msgHeader_dummy := { + accept := omit, + acceptContact := omit, + acceptEncoding := omit, + acceptLanguage := omit, + alertInfo := omit, + allow := omit, + allowEvents := omit, //* RFC3265 + authenticationInfo := omit, + authorization := omit, + callId := c_empty_CallId, + callInfo := omit, + contact := omit, + contentDisposition := omit, + contentEncoding := omit, + contentLanguage := omit, + contentLength := { + fieldName := CONTENT_LENGTH_E, + len := 0 + }, + contentType := omit, //* if message body present m, + //* else not present + cSeq := c_empty_cSeq, + date := omit, + errorInfo := omit, + event := omit, //* RFC3265 + expires := omit, + featureCaps := omit, + fromField := c_empty_From, + geolocation := omit, + geolocationRouting := omit, + historyInfo := omit, //* RFC4244 + infoPackage := omit, + inReplyTo := omit, + maxForwards := c_maxForwards70, + mimeVersion := omit, + minExpires := omit, + minSE := omit, //* RFC4028 + organization := omit, + pAccessNetworkInfo := omit, //* RFC3455 + pAssertedID := omit, + pAssertedService := omit, + pAssociatedURI := omit, + path := omit, //* RFC3327 + pCalledPartyID := omit, //* RFC3455 + pChargingFunctionAddresses := omit, //* RFC3455 + pChargingVector := omit, //* RFC3455 + pEarlyMedia := omit, //* RFC5009 + pMediaAuthorization := omit, //* RFC3313 + pPreferredID := omit, + pPreferredService := omit, + priority := omit, + privacy := omit, + proxyAuthenticate := omit, + proxyAuthorization := omit, + proxyRequire := omit, + pVisitedNetworkID := omit, //* RFC3455 + rAck := omit, + rSeq := omit, + reason := omit, + recordRoute := omit, + recvInfo := omit, + requestDisposition := omit, + referredBy := omit, //* RFC3892 - REFER method + referTo := omit, //* RFC3515 - REFER method + referSub := omit, //* RFC4488 - REFER method + replaces := omit, //* RFC3891 + replyTo := omit, + require := omit, + retryAfter := omit, + route := omit, + securityClient := omit, //* RFC3329 + securityServer := omit, //* RFC3329 + securityVerify := omit, //* RFC3329 + server := omit, + serviceRoute := omit, //* RFC3608 + sessionExpires := omit, //* RFC4028 + sessionId := omit, + sipETag := omit, + sipIfMatch := omit, + subject := omit, + subscriptionState := omit, //* RFC3265 + supported := omit, + timestamp_ := omit, + toField := c_empty_To, + unsupported := omit, + userToUser := omit, + userAgent := omit, + via := c_empty_Via, + warning := omit, + wwwAuthenticate := omit, + resourcePriority := omit, + answerMode := omit, + privAnswerMode := omit, + targetDialog := omit, + pAnswerState := omit, + undefinedHeader_List := omit + } + + + } //* group dummy_parameter_send + + group dummy_parameter_receive { + + template(present) RequestLine mw_requestLine_dummy( + Method p_method + ) := { + method := p_method, + requestUri := ?, + sipVersion := c_sipNameVersion + } + + template(present) MessageHeader mw_msgHeader_dummy := { + accept := *, + acceptContact := *, + acceptEncoding := *, + acceptLanguage := *, + alertInfo := *, + allow := *, + allowEvents := *, //* RFC3265 + authenticationInfo := *, + authorization := *, + callId := ?, + callInfo := *, + contact := *, + contentDisposition := *, + contentEncoding := *, + contentLanguage := *, + contentLength := ?, + contentType := *, + cSeq := ?, + date := *, + errorInfo := *, + event := *, //* RFC3265 + expires := *, + featureCaps := *, + fromField := ?, + geolocation := *, + geolocationRouting := *, + historyInfo := *, //* RFC4244 + infoPackage := *, + inReplyTo := *, + maxForwards := *, + mimeVersion := *, + minExpires := *, + minSE := *, //* RFC4028 + organization := *, + pAccessNetworkInfo := *, //* RFC3455 + pAssertedID := *, + pAssertedService := *, + pAssociatedURI := *, + path := *, //* RFC3327 + pCalledPartyID := *, //* RFC3455 + pChargingFunctionAddresses := *, //* RFC3455 + pChargingVector := *, //* RFC3455 + pEarlyMedia := *, //* RFC5009 + pMediaAuthorization := *, //* RFC3313 + pPreferredID := *, + pPreferredService := *, + priority := *, + privacy := *, + proxyAuthenticate := *, + proxyAuthorization := *, + proxyRequire := *, + pVisitedNetworkID := *, //* RFC3455 + rAck := *, + rSeq := *, + reason := *, + recordRoute := *, + recvInfo := *, + requestDisposition := *, + referredBy := *, //* RFC3892 - REFER method + referTo := *, //* RFC3515 - REFER method + referSub := *, //* RFC4488 - REFER method + replaces := *, //* RFC 3891 + replyTo := *, + require := *, + retryAfter := *, + route := *, + securityClient := *, //* RFC3329 + securityServer := *, //* RFC3329 + securityVerify := *, //* RFC3329 + server := *, + serviceRoute := *, //* RFC3608 + sessionExpires := *, //* RFC4028 + sessionId := *, + sipETag := *, + sipIfMatch := *, + subject := *, + subscriptionState := *, //* RFC3265 + supported := *, + timestamp_ := *, + toField := ?, + unsupported := *, + userToUser := *, + userAgent := *, + via := ?, + warning := *, + wwwAuthenticate := *, + resourcePriority := *, + answerMode := *, + privAnswerMode := *, + targetDialog := *, + pAnswerState := *, + undefinedHeader_List := * + } + + + } //* end group dummy_parameter_receive + + group dummy_request_templates_send { + + template(value) ACK_Request m_ACK_Dummy := { + requestLine := m_requestLine_dummy(ACK_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) BYE_Request m_BYE_Dummy := { + requestLine := m_requestLine_dummy(BYE_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) CANCEL_Request m_CANCEL_Dummy := { + requestLine := m_requestLine_dummy(CANCEL_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) INFO_Request m_INFO_Dummy := { + requestLine := m_requestLine_dummy(INFO_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) INVITE_Request m_INVITE_Dummy := { + requestLine := m_requestLine_dummy(INVITE_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) MESSAGE_Request m_MESSAGE_Dummy := { + requestLine := m_requestLine_dummy(MESSAGE_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) NOTIFY_Request m_NOTIFY_Dummy := { + requestLine := m_requestLine_dummy(NOTIFY_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) OPTIONS_Request m_OPTIONS_Dummy := { + requestLine := m_requestLine_dummy(OPTIONS_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) PRACK_Request m_PRACK_Dummy := { + requestLine := m_requestLine_dummy(PRACK_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) PUBLISH_Request m_PUBLISH_Dummy := { + requestLine := m_requestLine_dummy(PUBLISH_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) REGISTER_Request m_REGISTER_Dummy := { + requestLine := m_requestLine_dummy(REGISTER_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) REFER_Request m_REFER_Dummy := { + requestLine := m_requestLine_dummy(REFER_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Dummy := { + requestLine := m_requestLine_dummy(SUBSCRIBE_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + template(value) UPDATE_Request m_UPDATE_Dummy := { + requestLine := m_requestLine_dummy(UPDATE_E), + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + + } //* end group dummy_request_templates_send + group dummy_request_templates_receive { + + template(present) ACK_Request mw_ACK_Dummy := { + requestLine := mw_requestLine_dummy(ACK_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) BYE_Request mw_BYE_Dummy := { + requestLine := mw_requestLine_dummy(BYE_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) CANCEL_Request mw_CANCEL_Dummy := { + requestLine := mw_requestLine_dummy(CANCEL_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) INFO_Request mw_INFO_Dummy := { + requestLine := mw_requestLine_dummy(INFO_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) INVITE_Request mw_INVITE_Dummy := { + requestLine := mw_requestLine_dummy(INVITE_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) MESSAGE_Request mw_MESSAGE_Dummy := { + requestLine := mw_requestLine_dummy(MESSAGE_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) OPTIONS_Request mw_OPTIONS_Dummy := { + requestLine := mw_requestLine_dummy(OPTIONS_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) NOTIFY_Request mw_NOTIFY_Dummy := { + requestLine := mw_requestLine_dummy(NOTIFY_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) PRACK_Request mw_PRACK_Dummy := { + requestLine := mw_requestLine_dummy(PRACK_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) PUBLISH_Request mw_PUBLISH_Dummy := { + requestLine := mw_requestLine_dummy(PUBLISH_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) REFER_Request mw_REFER_Dummy := { + requestLine := mw_requestLine_dummy(REFER_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) REGISTER_Request mw_REGISTER_Dummy := { + requestLine := mw_requestLine_dummy(REGISTER_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Dummy := { + requestLine := mw_requestLine_dummy(SUBSCRIBE_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + template(present) UPDATE_Request mw_UPDATE_Dummy := { + requestLine := mw_requestLine_dummy(UPDATE_E), + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + + } //* end group dummy_request_templates_receive + + group dummy_response_templates_send { + + template(value) Response m_Response_Dummy := { + statusLine := c_statusLine100, + msgHeader := m_msgHeader_dummy, + messageBody := omit, + payload := omit + } + + + } //* group dummy_response_templates_send + + group dummy_response_templates_receive { + + template(present) Response mw_Response_Dummy := { + statusLine := ?, + msgHeader := mw_msgHeader_dummy, + messageBody := *, + payload := * + } + + + } //* group dummy_response_templates_receive + } + + group base_templates { + + template(value) CSeq m_cSeq( + template(value) integer p_seqNumber, + template(value) charstring p_method + ) := { + fieldName := CSEQ_E, + seqNumber := p_seqNumber, + method := p_method + } + + template(value) ContentLength m_contentLength( + template(value) integer p_len + ) := { + fieldName := CONTENT_LENGTH_E, + len := p_len + } + + template(value) ContentType m_contentType( + template(value) charstring p_mTypeSubtype, + template(omit) SemicolonParam_List p_mParams := omit + ) := { + fieldName := CONTENT_TYPE_E, + mTypeSubtype := p_mTypeSubtype, + mParams := p_mParams + } + + template(present) ContentType mw_contentType( + in template(present) charstring p_mTypeSubtype := ?, + in template SemicolonParam_List p_mParams := * + ) := { + fieldName := CONTENT_TYPE_E, + mTypeSubtype := p_mTypeSubtype, + mParams := p_mParams + } + + group request_send { + + template(value) ACK_Request m_ACK_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_ACK_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := m_cSeq(p_cSeq.seqNumber, "ACK"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "ACK"}, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) ACK_Request m_ACK_Request_withRecordRoute( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Route p_route + ) modifies m_ACK_Request_Base := { + msgHeader := { + route := p_route, + contentLength := m_contentLength(0) + } + } + + template(value) BYE_Request m_BYE_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_BYE_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) CANCEL_Request m_CANCEL_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_CANCEL_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) INFO_Request m_INFO_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_INFO_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) INVITE_Request m_INVITE_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Contact p_contact + ) modifies m_INVITE_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + contact := p_contact, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) MESSAGE_Request m_MESSAGE_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_MESSAGE_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) NOTIFY_Request m_NOTIFY_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_NOTIFY_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := m_cSeq(p_cSeq.seqNumber, "NOTIFY"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "NOTIFY"}, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) OPTIONS_Request m_OPTIONS_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_OPTIONS_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := m_cSeq(p_cSeq.seqNumber, "OPTIONS"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "OPTIONS"}, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) PRACK_Request m_PRACK_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) RAck p_RAck + ) modifies m_PRACK_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := m_cSeq(p_cSeq.seqNumber, "PRACK"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "PRACK"}, + fromField := p_from, + rAck := p_RAck, + toField := p_to, + via := p_via + }, + messageBody := omit + } + + template(value) PUBLISH_Request m_PUBLISH_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Event p_event := omit, + template(omit) RAck p_RAck := omit, + template(value) MessageBody p_mb + ) modifies m_PUBLISH_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(valueof(p_mb))}, + contentType := m_contentType(c_plainText), // STF471 + // {fieldName + // := + // CONTENT_TYPE_E, + // mTypeSubType + // := + // c_plainText/*c_sdp*/}, + cSeq := m_cSeq(p_cSeq.seqNumber, "PUBLISH"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "PUBLISH"}, + event := p_event, + rAck := p_RAck, + fromField := p_from, + toField := p_to, + via := p_via + }, + messageBody := p_mb + } + + template(value) REFER_Request m_REFER_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(omit) Contact p_contact := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) ReferTo p_referTo := omit, + template(omit) ReferredBy p_referredBy := omit + ) modifies m_REFER_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + contact := p_contact, + cSeq := m_cSeq(p_cSeq.seqNumber, "REFER"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "REFER"}, + fromField := p_from, + referTo := p_referTo, + referredBy := p_referredBy, + toField := p_to, + via := p_via + } + } + + template(value) REFER_Request m_REFER_Request_replaces( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(omit) Contact p_contact := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) ReferTo p_referTo, + template(value) ReferredBy p_referredBy, + template(value) Replaces p_replaces, + template(omit) Require p_require := omit + ) modifies m_REFER_Request_Base := { + msgHeader := { + replaces := p_replaces, + require := p_require + } + } + + template(value) REGISTER_Request m_REGISTER_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Contact p_contact := omit, + template(omit) Authorization p_authorization := omit + ) modifies m_REGISTER_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + authorization := p_authorization, + callId := p_callId, + contact := p_contact, + cSeq := p_cSeq, + fromField := p_from, + toField := p_to, + supported := { + fieldName := SUPPORTED_E, + optionsTags := {"path"} + }, + via := p_via + } + } + + template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_SUBSCRIBE_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "SUBSCRIBE"}, + fromField := p_from, + toField := p_to, + via := p_via + } + } + + template(value) UPDATE_Request m_UPDATE_Request_Base( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Contact p_contact := omit, + template(value) MessageBody p_mb + ) modifies m_UPDATE_Dummy := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + contact := p_contact, + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(valueof(p_mb))}, + contentType := m_contentType(c_sdpApplication), // STF471 + // {fieldName + // := + // CONTENT_TYPE_E, + // mTypeSubtype + // := + // c_sdp}, + cSeq := m_cSeq(p_cSeq.seqNumber, "UPDATE"), // STF471 + // {fieldName:=CSEQ_E, + // seqNumber:= + // p_cSeq.seqNumber, + // method:= + // "UPDATE"}, + fromField := p_from, + toField := p_to, + via := p_via + }, + messageBody := p_mb + } + + + } //* end of group message_send + + group request_receive { + + template(present) ACK_Request mw_ACK_Request_Base( + template CallId p_callId := ? + ) modifies mw_ACK_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) BYE_Request mw_BYE_Request_Base( + template CallId p_callId := ? + ) modifies mw_BYE_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) CANCEL_Request mw_CANCEL_Request_Base( + template CallId p_callId := ? + ) modifies mw_CANCEL_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) INFO_Request mw_INFO_Request_Base( + template CallId p_callId := ? + ) modifies mw_INFO_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy := {requestLine := {method := INVITE_E}} + + template(present) MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy := {msgHeader := {contact := *}} + + template(present) NOTIFY_Request mw_NOTIFY_Request_Base( + template CallId p_callId := ? + ) modifies mw_NOTIFY_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) OPTIONS_Request mw_OPTIONS_Request_Base( + template CallId p_callId := ? + ) modifies mw_OPTIONS_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) PRACK_Request mw_PRACK_Request_Base( + template CallId p_callId := ? + ) modifies mw_PRACK_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) PUBLISH_Request mw_PUBLISH_Request_Base( + template CallId p_callId := ? + ) modifies mw_PUBLISH_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) REFER_Request mw_REFER_Request_Base( + template CallId p_callId := ? + ) modifies mw_REFER_Dummy := { + msgHeader := {callId := p_callId} + } + + template(present) REFER_Request mw_REFER_Request( + template CallId p_callId := ?, + template(value) SipUrl p_requestUri, + template(value) SipUrl p_referredBy + ) modifies mw_REFER_Request_Base := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + referredBy := { + fieldName := REFERRED_BY_E, + nameAddr := mw_NameAddr(*, p_referredBy), // STF471 + // {displayName + // := + // *, + // addrSpec + // := + // p_referredBy}, + referredbyIdParams := * + } + } + } + + template(present) INVITE_Request mw_INVITE_Request( + template Require p_require, + template(value) SipUrl p_referredBy + ) modifies mw_INVITE_Request_Base := { + msgHeader := { + require := p_require, + referredBy := { + fieldName := REFERRED_BY_E, + nameAddr := mw_NameAddr(*, p_referredBy), // STF471 + // {displayName + // := + // *, + // addrSpec + // := + // p_referredBy}, + referredbyIdParams := * + } + } + } + + template(present) REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy := {requestLine := {method := REGISTER_E}} + + template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy := {requestLine := {method := SUBSCRIBE_E}} + + template(present) UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy := {msgHeader := {callId := p_callId}} + + + } //* end group request_receive + + group response_send { + + template(value) Response m_Response_Base( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via + ) modifies m_Response_Dummy := { + statusLine := p_statusLine, + msgHeader := { + callId := p_callId, + cSeq := p_cSeq, + fromField := p_from, + maxForwards := omit, + toField := p_to, + via := p_via + }, + messageBody := omit, + payload := omit + } + + + } //* end group response_send + + group response_receive { + + template(present) Response mw_Response_Base( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId := *, + template CSeq p_cSeq := * + ) modifies mw_Response_Dummy := { + statusLine := p_statusLine, + msgHeader := { + callId := p_callId, + contentLength := *, + cSeq := p_cSeq, + fromField := ?, + maxForwards := *, + toField := ?, + via := ? + } + } + + template(present) Response mw_Response_StatusCode_Base( + template(present) StatusLine.statusCode p_statusCode := ?, + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_Dummy := { + statusLine := mw_statusLine(p_statusCode, ?), + msgHeader := { + callId := p_callId, + contentLength := *, + cSeq := p_cSeq, + fromField := ?, + maxForwards := *, + toField := ?, + via := ? + } + } + + template(present) Response mw_Response_1xx_Base( + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_Dummy := { + statusLine := mw_statusLine1xx, + msgHeader := { + callId := p_callId, + contentLength := *, + cSeq := p_cSeq, + fromField := ?, + maxForwards := *, + toField := ?, + via := ? + } + } + + template (present) Response mw_Response_2xx_Base( + template (present) CallId p_callId := ?, + template (present) CSeq p_cSeq := ? + ) modifies mw_Response_1xx_Base := { + statusLine := mw_statusLine2xx + } + + template(present) Response mw_Response_3xx_Base( + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_1xx_Base := { + statusLine := mw_statusLine3xx + } + + template(present) Response mw_Response_4xx_Base( + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_1xx_Base := { + statusLine := mw_statusLine4xx + } + + template(present) Response mw_Response_5xx_Base( + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_1xx_Base := { + statusLine := mw_statusLine5xx + } + + template(present) Response mw_Response_6xx_Base( + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_1xx_Base := { + statusLine := mw_statusLine6xx + } + + template(present) Response mw_Response_Algorithm( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) CredentialsList p_credentialsList + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := { + authorization := { + fieldName := AUTHORIZATION_E, + body := p_credentialsList + } + } + } + + + } //* end group message_receive + + + } //* end group full_templates + + group modified_templates { + + group request_send { + + template(value) ACK_Request m_ACK_Request_route( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit + ) modifies m_ACK_Request_Base := { + msgHeader := {route := p_route} + } + + template(value) ACK_Request m_ACK_Request_sdp( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) MessageBody p_mb + ) modifies m_ACK_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(valueof(p_mb))}, + contentType := m_contentType(c_sdpApplication) + }, + messageBody := p_mb + } + + template(value) BYE_Request m_BYE_Request_cause( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) integer p_cause + ) modifies m_BYE_Request_Base := { + msgHeader := {reason := m_Reason(p_cause)} + } + + template(value) INVITE_Request m_INVITE_Request_sdp( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Contact p_contact, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(valueof(p_mb))}, + contentType := m_contentType(c_sdpApplication) + }, + messageBody := p_mb + } + + template(value) INVITE_Request m_INVITE_Request_ResourceList( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Contact p_contact, + template(value) MessageBody p_mb + ) modifies m_INVITE_Request_Base := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(p_mb)}, + contentType := m_contentType(c_xmlresourcelistApplication), // STF471 + // {fieldName + // := + // CONTENT_TYPE_E, + // mTypeSubtype + // := + // "application/resource-lists+xml"}, + contentDisposition := { + fieldName := CONTENT_DISPOSITION_E, + dispositionType := "recipient-list", + dispositionParams := omit + }, + require := { + fieldName := REQUIRE_E, + optionsTags := {"recipient-list-invite"} + } + }, + messageBody := p_mb + } + + template(value) REFER_Request m_REFER_Request_route( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(omit) Contact p_contact := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) ReferTo p_referTo, + template(value) ReferredBy p_referredBy, + template(value) Route p_route + ) modifies m_REFER_Request_Base := { + msgHeader := {route := p_route} + } + + template(value) REGISTER_Request m_REGISTER_Request_expires( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Contact p_contact := omit, + template(omit) Authorization p_authorization := omit, + template(value) charstring p_expires + ) modifies m_REGISTER_Request_Base := { + msgHeader := { + authorization := p_authorization, + expires := m_Expires(p_expires) + } + } + + template(value) NOTIFY_Request m_NOTIFY_Request_contact( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Contact p_contact := omit + ) modifies m_NOTIFY_Request_Base := { + msgHeader := { + contact := p_contact, + event := m_Event_reg, + subscriptionState := m_SubscriptionState_active + } + } + + template(value) NOTIFY_Request m_NOTIFY_Request_sipfrag( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) charstring p_state, + template(value) charstring p_sipfrag + ) modifies m_NOTIFY_Request_Base := { + requestLine := { + method := NOTIFY_E, + requestUri := { + //scheme := ?, FSCOM Not allowed here + components := { + sip := { + userInfo := omit,//*, FSCOM Not allowed here + hostPort := p_requestUri.components.sip.hostPort + } + } + } + }, + msgHeader := { + contentLength := m_contentLength(lengthof(p_sipfrag)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // lengthof(p_sipfrag)}, + contentType := m_contentType(c_sipfragMessage), // STF471 + // {fieldName + // := + // CONTENT_TYPE_E, + // mTypeSubtype + // := + // "message/sipfrag"}, + subscriptionState := { + fieldName := SUBSCRIPTION_STATE_E, + subState := p_state, + substateParams := omit + }, + event := m_Event_refer + }, + messageBody := {sipfrag := p_sipfrag} + } + + template(value) UPDATE_Request m_UPDATE_Request_route( + template(value) SipUrl p_requestUri, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Contact p_contact := omit, + template(value) MessageBody p_mb, + template(value) Route p_route + ) modifies m_UPDATE_Request_Base := { + msgHeader := {route := p_route} + } + + + } //* end group request_send + + + group request_receive { + + template(present) BYE_Request mw_BYE_Request_Reason( + template CallId p_callId, + template(value) GenValue p_cause + ) modifies mw_BYE_Request_Base := { + msgHeader := {reason := mw_Reason(p_cause)} + } + + template(present) BYE_Request mw_BYE_Request_ReasonSIP( + template CallId p_callId, + template(value) GenValue p_cause + ) modifies mw_BYE_Request_Base := { + msgHeader := {reason := mw_ReasonSIP(p_cause)} + } + + template(present) BYE_Request mw_BYE_Request_headerfieldlist( + template CallId p_callId, + template(present) SipUrl p_requestUri, + template(present) To p_to := ?, + template(present) From p_from := ?, + template CSeq p_cSeq, + template Route p_route, + template RecordRoute p_recordRoute, + template Reason p_reason + ) modifies mw_BYE_Request_Base := { + requestLine := {requestUri := p_requestUri}, + msgHeader := { + callId := p_callId, + toField := p_to, + fromField := p_from, + cSeq := p_cSeq, + route := p_route, + recordRoute := p_recordRoute, + reason := p_reason + } + } + + template(present) BYE_Request mw_BYE_Request_UserToUser( + template CallId p_callId + ) modifies mw_BYE_Request_Base := { + msgHeader := {userToUser := ?} + } + + + template(present) INVITE_Request mw_INVITE_Request_RequestURI( + template(present) SipUrl p_sipUrl := ? + ) modifies mw_INVITE_Dummy := { + requestLine := { + requestUri := p_sipUrl, + sipVersion := c_sipNameVersion + } + } + + template(present) INFO_Request mw_INFO_Request_MB( + template CallId p_callId, + template MessageBody p_mb + ) modifies mw_INFO_Request_Base := { + messageBody := p_mb + } + + template(present) INVITE_Request mw_INVITE_Request_expires modifies mw_INVITE_Request_Base := {msgHeader := {expires := ?}} + + template(present) INVITE_Request mw_INVITE_Request_callid( + template CallId p_callId + ) modifies mw_INVITE_Request_Base := { + msgHeader := {callId := p_callId} + } + + template(present) INVITE_Request mw_INVITE_Request_MB( + template CallId p_callId, + template MessageBody p_mb + ) modifies mw_INVITE_Request_callid := { + messageBody := p_mb + } + + template(present) INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo( + template CallId p_callId + ) modifies mw_INVITE_Request_callid := { + msgHeader := {pAccessNetworkInfo := omit} + } + + template(present) INVITE_Request mw_INVITE_Request_PaccessNetworkInfo( + template CallId p_callId + ) modifies mw_INVITE_Request_callid := { + msgHeader := {pAccessNetworkInfo := ?} + } + + template(present) INVITE_Request mw_INVITE_MSRP_Session( + template(present) SDP_media_field p_media_MSRP := ? + ) modifies mw_INVITE_Request_Base := { + messageBody := { + sdpMessageBody := { + protocol_version := ?, + origin := ?, + session_name := ?, + information := *, + uri := *, + emails := *, + phone_numbers := *, + connection := *, + bandwidth := *, + times := ?, + timezone_adjustments := *, + key := *, + attributes := *, + media_list := { + { + media_field := p_media_MSRP, + information := *, + connections := *, + bandwidth := *, + key := *, + attributes := { + { + msrp := { + attr_value := + pattern + "path:msrp://*" + } + } + } + } + } + } + } + } + + template(present) REGISTER_Request mw_REGISTER_Request_ISC( + template PAccessNetworkInfo p_access, + template PVisitedNetworkID p_visited + ) modifies mw_REGISTER_Request_Base := { + msgHeader := { + pAccessNetworkInfo := p_access, + pVisitedNetworkID := p_visited + } + } + + template(present) UPDATE_Request mw_UPDATE_Request_SDP( + template CallId p_callId, + template MessageBody p_mb + ) modifies mw_UPDATE_Request_Base := { + messageBody := p_mb + } + + template(present) NOTIFY_Request mw_NOTIFY_Request_MB( + template CallId p_callId, + template MessageBody p_mb + ) modifies mw_NOTIFY_Request_Base := { + messageBody := p_mb + } + + + } //* end group request_receive + + group response_send { + + template(value) Response m_Response_AlertInfo( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Contact p_contact, + template(value) AlertInfo p_alertInfo + ) modifies m_Response_Contact := { + msgHeader := {alertInfo := p_alertInfo} + } + + template(value) Response m_Response_Contact( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Contact p_contact := omit + ) modifies m_Response_Base := { + msgHeader := {contact := p_contact} + } + + template(value) Response m_Response_ext( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordroute := omit + ) modifies m_Response_Base := { + msgHeader := { + route := p_route, // f_route(), + recordRoute := + p_recordroute // f_recordroute() + } + } + + template(value) Response m_Response_mbody( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordroute := omit, + template(value) MessageBody p_mb + ) modifies m_Response_ext := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(valueof(p_mb))}, + contentType := m_contentType(c_sdpApplication) + }, + messageBody := p_mb + } + + template(value) Response m_Response_mbody_contact ( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(omit) Route p_route := omit, + template(omit) RecordRoute p_recordroute := omit, + template(value) MessageBody p_mb, + template(value) Contact p_contact + ) modifies m_Response_mbody := { + msgHeader := { + contact := p_contact + } + } + + + template(value) Response m_Response_PAsserted_Privacy( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Route p_route, + template(value) RecordRoute p_recordroute, + template(value) PAssertedID p_pAssertedID, + template(value) Privacy p_privacy + ) modifies m_Response_ext := { + msgHeader := { + pAssertedID := p_pAssertedID, + privacy := p_privacy + } + } + + template(present) Response mw_Response_PAsserted_Privacy_Supported( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template PAssertedID p_pAssertedID, + template Privacy p_privacy, + template Supported p_supported + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := { + pAssertedID := p_pAssertedID, + privacy := p_privacy, + supported := p_supported + } + } + + template(value) Response m_Response_PAsserted_Privacy_mbody( + template(value) StatusLine p_statusLine, + template(omit) CallId p_callId := omit, + template(omit) CSeq p_cSeq := omit, + template(value) From p_from, + template(value) To p_to, + template(value) Via p_via, + template(value) Route p_route, + template(value) RecordRoute p_recordroute, + template(value) PAssertedID p_pAssertedID, + template(value) Privacy p_privacy, + template(value) MessageBody p_mb + ) modifies m_Response_ext := { + msgHeader := { + contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471 + // {fieldName + // := + // CONTENT_LENGTH_E, + // len:= + // f_MessageBodyLength(valueof(p_mb))}, + contentType := m_contentType(c_sdpApplication), // STF471 + // {fieldName + // := + // CONTENT_TYPE_E, + // mTypeSubtype + // := + // c_sdpApplication + // }, + pAssertedID := p_pAssertedID, + privacy := p_privacy + }, + messageBody := p_mb + } + + + } //* end group response_send + + + group response_receive { + + template(present) Response mw_Response_Expires( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) DeltaSec p_deltaSec := ? + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {expires := mw_Expires(p_deltaSec)} + } + + template(present) Response mw_Response_PAsserted_Privacy( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template PAssertedID p_pAssertedID, + template Privacy p_privacy + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := { + pAssertedID := p_pAssertedID, + privacy := p_privacy + } + } + + template(present) Response mw_Response_Reason( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(value) GenValue p_cause + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {reason := mw_Reason(p_cause)} + } + + template(present) Response mw_Response_RecordRoute( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template RecordRoute p_recordRoute + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {recordRoute := p_recordRoute} + } + + template(present) Response mw_Response_Via( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) Via p_via := ? + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {via := p_via} + } + + template(present) Response mw_Response_Contact( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template Contact p_contact + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {contact := p_contact} + } + + template(present) Response mw_Response_AlertInfo( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template AlertInfo p_alertInfo + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {alertInfo := p_alertInfo} + } + + template(present) Response mw_Response_HistoryInfo( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template HistoryInfo p_historyInfo + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {historyInfo := p_historyInfo} + } + + template(present) Response mw_Response_messageBody( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template Require p_require, + template MessageBody p_mb + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {require := p_require}, + messageBody := p_mb + } + + template(present) Response mw_Response_Require( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template Require p_require + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {require := p_require} + } + + template(present) Response mw_Response_Require_ifpresent( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template(present) Require p_require + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {require := p_require ifpresent} + } + + template(present) Response mw_Response_Supported( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq, + template Supported p_supported + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {supported := p_supported} + } + + template(present) Response mw_Response_UserToUser( + template(present) StatusLine p_statusLine := ?, + template CallId p_callId, + template CSeq p_cSeq + ) modifies mw_Response_Base := { + statusLine := mw_statusLine(p_statusLine.statusCode, ?), + msgHeader := {userToUser := ?} + } + + + } //* end group response_receive + + + } //* end group modified_templates + + + } //* end group MessageTemplates + + group SDP_Templates { + + group SDP_Messages { + + group base_templates { + + template(value) SDP_Message m_SDP_base := { + protocol_version := 0, //* v=0 + origin := { + user_name := PX_SIP_SDP_USER_NAME, + session_id := PX_SIP_SDP_SESSION_ID, + session_version := "0", + net_type := c_in, + addr_type := c_ip4, + addr := "" + }, + //* o=voicesession 12345 12345 IN IP4 172.27.1.219 + session_name := "Voice Session", //* s=Voice Session + information := omit, + uri := omit, + emails := omit, + phone_numbers := omit, + connection := omit, + bandwidth := omit, + times := { + { + time_field := {"0", "0"}, + time_repeat := omit + } + }, //* t=0 0 + timezone_adjustments := omit, + key := omit, + attributes := omit, + media_list := omit + } + + template(value) SDP_Message m_SDP( + template(value) SDP_media_desc p_media, + template(value) SipUserProfile p_userprofile + ) modifies m_SDP_base := { + origin := { + addr := p_userprofile.contactIpaddr + }, + //* o=voicesession 12345 12345 IN IP4 172.27.1.219 + connection := { + net_type := c_in, + addr_type := c_ip4, + conn_addr := { + addr := p_userprofile.bearerIpaddr, + ttl := omit, + num_of_addr := omit + } + }, //* c=IN + //* IP4 + //* 172.27.1.219 + media_list := {p_media} + } + + template(value) SDP_Message m_SDP_mediaList( + template(value) SDP_media_desc_list p_media_list, + template(value) SipUserProfile p_userprofile + ) modifies m_SDP_base := { + origin := { + addr := p_userprofile.contactIpaddr + }, + //* o=voicesession 12345 12345 IN IP4 172.27.1.219 + connection := { + net_type := c_in, + addr_type := c_ip4, + conn_addr := { + addr := p_userprofile.bearerIpaddr, + ttl := omit, + num_of_addr := omit + } + }, //* c=IN + //* IP4 + //* 172.27.1.219 + media_list := p_media_list + } + + template(value) SDP_Message m_SDP_media_attr_preconditions( + template(value) SDP_media_desc p_media, + template(value) SipUserProfile p_userprofile, + template(value) SDP_attribute_list p_attribute_list + ) modifies m_SDP := { + media_list := { + { + media_field := { + media := c_audio, + ports := { + port_number := 8500, + num_of_ports := omit + }, + transport := c_rtpAvp, + fmts := {"0"} + }, //* m=audio + //* 8500 + //* RTP/AVP + //* 0 + information := omit, + connections := omit, + bandwidth := omit, + key := omit, + attributes := p_attribute_list + } + } + } + + template(value) SDP_Message m_SDP_attribute( + template(value) SDP_media_desc p_media, + template(value) SipUserProfile p_userprofile, + template(value) SDP_attribute p_loc_attribute + ) modifies m_SDP := { + attributes := {p_loc_attribute} + } + + template(present) SDP_Message mw_SDP := { + protocol_version := 0, //* v=0 + origin := ?, + session_name := ?, + information := omit, + uri := omit, + emails := omit, + phone_numbers := omit, + connection := ?, + bandwidth := omit, + times := { + { + time_field := {"0", "0"}, + time_repeat := omit + } + }, //* t=0 0 + timezone_adjustments := omit, + key := omit, + attributes := omit, + media_list := ? + } + + + } //* end group base_templates + + group modified_templates { + template(value) SDP_Message m_SDP_bandwidth( + template(value) SDP_media_desc p_media, + template(value) SipUserProfile p_userprofile + ) modifies m_SDP := { + bandwidth := { + { + PX_SIP_SDP_B_MODIFIER, + PX_SIP_SDP_B_BANDWIDTH + } + } + } + + template(value) SDP_Message m_SDP_unacceptable( + template(value) SDP_media_desc p_media, + template(value) SipUserProfile p_userprofile + ) modifies m_SDP := { + protocol_version := 1, //* v=1 unacceptable version of + //* SDP + bandwidth := { + { + PX_SIP_SDP_B_MODIFIER, + PX_SIP_SDP_B_BANDWIDTH + } + } + } + + template(value) SDP_Message m_SDP_encrypted( + template(value) SDP_media_desc p_media, + template(value) SipUserProfile p_userprofile + ) modifies m_SDP := { + bandwidth := { + { + PX_SIP_SDP_B_MODIFIER, + PX_SIP_SDP_B_BANDWIDTH + } + }, + key := { + method := "base64", // prompt + key := "blablabla" + } + } + + + } //* end group modified_templates + + + } //* end group SDP_Messages + + group SDP_Fields { + + template(value) SDP_media_desc m_media(template(value) SDP_media_field p_mf) := { + media_field := p_mf, + information := omit, + connections := omit, + bandwidth := omit, + key := omit, + attributes := omit + } + + template(value) SDP_media_desc m_mediaFieldBandwdthAttributes( + template(value) SDP_media_field p_mf, + template(omit) SDP_bandwidth_list p_bw_l := omit, + template(omit) SDP_attribute_list p_attributes := omit + ) := { + media_field := p_mf, + information := omit, + connections := omit, + bandwidth := p_bw_l, + key := omit, + attributes := p_attributes + } + + template(value) SDP_media_desc m_media_dynPT( + template(value) charstring p_payloadType, + template(value) charstring p_encoding, + template(value) charstring p_clockrate, + template(omit) charstring p_parameters := omit, + template(omit) SDP_key p_sdpKey := omit + ) := { + media_field := { + media := c_audio, //* "audio", + ports := { + port_number := 8500, + num_of_ports := omit + }, + transport := c_rtpAvp, //* "RTP/AVP", + fmts := { p_payloadType } + }, //* m=audio 8500 RTP/AVP 8 + information := omit, + connections := omit, + bandwidth := omit, + key := p_sdpKey, + attributes := {{rtpmap := { + payload_type := p_payloadType, + codec := { + encoding := p_encoding, + clockrate := p_clockrate, + parameters := p_parameters + } + } + }} //* a=rtpmap:8 PCMA/8000 + } + + /** + * @desc send template with specific media transport and attribute values + * @param p_mediaAttribute parameter for SDP media transport supported by the IUT + * former PX_SIP_SDP_media_transport + * @param p_mediaAttribute parameter for SDP media attribute supported by the IUT, + * former PX_SIP_SDP_media_attribute_Exp & PX_SIP_SDP_media_transport_Exp + * @param p_mTypeSubtype parameter for SDP media type supported by the IUT, + * former PX_SIP_SDP_MEDIA_VIDEO + */ + template(value) SDP_media_desc m_media_unsupported( + template(value) charstring p_mediaTransport, + template(value) SDP_attribute_rtpmap p_mediaAttribute, + template(value) charstring p_mTypeSubtype := "video" + ) := { + media_field := { + media := p_mTypeSubtype, + ports := { + port_number := 11500, + num_of_ports := omit + }, + transport := p_mediaTransport, + fmts := {"99"} + }, //* m=audio 8500 RTP/AVP 0 + information := omit, + connections := omit, + bandwidth := omit, + key := omit, + attributes := {{rtpmap := p_mediaAttribute}} + } + + template(value) SDP_bandwidth m_bandwidth( + template(value) charstring p_loc_m, + template(value) integer p_loc_b + ) := { + modifier := p_loc_m, + bandwidth := p_loc_b + } + + template(value) SDP_bandwidth m_bandwidth_as_64 := { + modifier := "AS", + bandwidth := 64 + } + + template(present) SDP_bandwidth mw_bandwidth_rs := { + modifier := "RS", + bandwidth := ? + } + + template(present) SDP_bandwidth mw_bandwidth_rr := { + modifier := "RR", + bandwidth := ? + } + + template(value) SDP_media_field m_media_field( + template(value) charstring p_media, + template(value) integer p_portNum, + template(value) charstring p_transport, + template(value) charstring p_fmts + ) := { + media := p_media, + ports := { + port_number := p_portNum, + num_of_ports := omit + }, + transport := p_transport, + fmts := {p_fmts} + } + + template(present) SDP_media_field mw_media_PCMU := { + media := c_audio, + ports := { + port_number := ?, + num_of_ports := * + }, + transport := c_rtpAvp, + fmts := {"0"} + } + + template(present) SDP_media_field mw_media_PCMA := { + media := c_audio, + ports := { + port_number := 8500, + num_of_ports := omit + }, + transport := c_rtpAvp, + fmts := {"8"} + } + + template(present) SDP_media_field mw_media_PCMA_U_DPT := { + media := c_audio, + ports := { + port_number := ?, + num_of_ports := * + }, + transport := c_rtpAvp, + fmts := {*} + } + + template(present) SDP_media_field mw_media_T38 := { + media := c_image, + ports := { + port_number := ?, + num_of_ports := * + }, + transport := pattern "*ptl", //* udptl,tcptl + fmts := {"t38"} + } + + template(present) SDP_media_field mw_media_G722 := { + media := c_audio, + ports := { + port_number := ?, + num_of_ports := * + }, + transport := "RTP/AVP", + fmts := {"9"} + } + + template(present) SDP_media_field mw_media_AMR_DPT := { + media := c_audio, + ports := { + port_number := ?, + num_of_ports := * + }, + transport := c_rtpAvp, + fmts := {*} + } + + template(present) SDP_media_field mw_media_MSRP := { + media := c_msrp, + ports := { + port_number := ?, + num_of_ports := omit + }, + transport := c_msrpTcp, + fmts := {*} + } + + template(value) SDP_attribute m_attribute_sendonly := {sendonly := {}} + template(present) SDP_attribute mw_attribute_sendonly := {sendonly := {}} + // MRO + template(value) SDP_attribute m_attribute_recvonly := {recvonly := {}} + template(present) SDP_attribute mw_attribute_recvonly := {recvonly := {}} + // MRO + template(value) SDP_attribute m_attribute_sendrecv := {sendrecv := {}} + template(present) SDP_attribute mw_attribute_sendrecv := {sendrecv := {}} + // MRO + template(value) SDP_attribute m_attribute_inactive := {inactive := {}} + template(present) SDP_attribute mw_attribute_inactive := {inactive := {}} + // MRO + template(present) SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly, mw_attribute_inactive); + template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv, mw_attribute_recvonly, omit); + template(value) SDP_attribute m_attribute_base( + template(value) SDP_attribute_rtpmap p_attr_value + ) := { + rtpmap := p_attr_value + } + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_AMR + */ + template(value) SDP_attribute m_attribute_AMR_DPT(//"0 AMR" + template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"AMR", "8000", omit}} + ) := m_attribute_base(p_attr_value); + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_CLE + */ + template(value) SDP_attribute m_attribute_CLEARMODE_DPT(//"0 CLEARMODE/8000" + template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"CLEARMODE", "8000", omit}} + ) := m_attribute_base(p_attr_value); + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_G222 + */ + template(value) SDP_attribute m_attribute_G722(//"9 G722/8000" + template(value) SDP_attribute_rtpmap p_attr_value := {"9", {"G722", "8000", omit}} + ) := m_attribute_base(p_attr_value); + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMU + */ + template(value) SDP_attribute m_attribute_PCMU(//"0 PCMU/8000" + template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}} + ) := m_attribute_base(p_attr_value); + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMU + */ + template(value) SDP_attribute m_attribute_PCMU_DPT(//"0 PCMU/8000" + template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}} + ) := m_attribute_base(p_attr_value); + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMA + */ + template(value) SDP_attribute m_attribute_PCMA(//"8 PCMA/8000" + template(value) SDP_attribute_rtpmap p_attr_value := {"8", {"PCMA", "8000", omit}} + ) := m_attribute_base(p_attr_value); + /** + * @desc send template for a specific media attribute + * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMA + */ + template(value) SDP_attribute m_attribute_PCMA_DPT(//"0 PCMA/8000" + template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMA", "8000", omit}} + ) := m_attribute_base(p_attr_value); + + template(present) SDP_attribute mw_attribute_T38 := { + unknown := { + name := ?, + attr_value := pattern "*t38*" + } + } + + template(value) SDP_attribute m_attribute_curr( + template(value) charstring p_preconditionType, + template(value) charstring p_statusType, + template(value) charstring p_direction + ) := { + curr := { + preconditionType := p_preconditionType, + statusType := p_statusType, + direction := p_direction + } + } + + template(present) SDP_attribute mw_attribute_curr := {curr := ?} + + template(value) SDP_attribute m_attribute_des( + template(value) charstring p_preconditionType, + template(value) charstring p_strength, + template(value) charstring p_statusType, + template(value) charstring p_direction + ) := { + des := { + preconditionType := p_preconditionType, + strength := p_strength, + statusType := p_statusType, + direction := p_direction + } + } + + template(present) SDP_attribute mw_attribute_des := {des := ?} + + template(value) SDP_attribute m_attribute_conf( + template(value) charstring p_preconditionType, + template(value) charstring p_statusType, + template(value) charstring p_direction + ) := { + conf := { + preconditionType := p_preconditionType, + statusType := p_statusType, + direction := p_direction + } + } + + + } //* end group SDP_Fields + + + } //* end group SDP_Templates + + group SimpleMsgSummary_Templates { + + template(value) SimpleMsgSummary m_SMS( + template(value) Msg_summary_line_list p_summaryLineList, + template(value) charstring p_uri + ) := { + msg_status_line := m_msgStatusLine_yes, + msg_account := m_msgAccount(p_uri), + msg_summary_line_list := p_summaryLineList, + opt_msg_headers := omit + } + + template(present) SimpleMsgSummary mw_SMS := { + msg_status_line := ?, + msg_account := *, + msg_summary_line_list := *, + opt_msg_headers := * + } + + template(present) SimpleMsgSummary mw_SMS_yes modifies mw_SMS := { + msg_status_line := mw_msgStatusLine_yes + } + + template(present) SimpleMsgSummary mw_SMS_yesUri modifies mw_SMS_yes := { + msg_account := mw_msgAccount + } + + template(present) SimpleMsgSummary mw_SMS_yesVoice modifies mw_SMS_yes := { + msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)} + } + + template(present) SimpleMsgSummary mw_SMS_yesUriVoice modifies mw_SMS_yesUri := { + msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)} + } + + template(value) Msg_status_line m_msgStatusLine_yes := { + msg_type := c_messageWaiting, + msg_status := "yes" + } + + template(present) Msg_status_line mw_msgStatusLine_yes := { + msg_type := c_messageWaiting, + msg_status := "yes" + } + + template(value) Msg_account m_msgAccount( + template(value) charstring p_uri + ) := { + msg_type_account := c_messageAccount, + account_URI := + p_uri // m_SipUrl_NumberHostParam(PX_IMS_SUT_UE2_PUBLIC_USER,PX_IMS_SUT_UE2_HOME_DOMAIN,omit) + } + + template(present) Msg_account mw_msgAccount := { + msg_type_account := c_messageAccount, + account_URI := ? + } + + template(value) Msg_summary_line m_msgSummaryLine( + template(value) charstring p_msgContexClass, + template(value) charstring p_msgs, + template(value) charstring p_urgent_msgs + ) := { + msg_context_class := p_msgContexClass, + msgs := p_msgs, + urgent_msgs := p_urgent_msgs + } + + template(present) Msg_summary_line mw_msgSummaryLine( + template(present) charstring p_msgContexClass := ? + ) := { + msg_context_class := p_msgContexClass, + msgs := ?, + urgent_msgs := * + } + + + } // end group Templates_SMS + + group MessageBodies { + + template(value) MessageBody m_MBody_SDP( + template(value) SDP_Message p_SDP + ) := { + sdpMessageBody := p_SDP + } + + template(value) MessageBody m_MBody_XML( + template(value) XmlBody p_xmlBody + ) := { + xmlBody := p_xmlBody + } + + template(value) MessageBody m_mBody_SMS( + template(value) SimpleMsgSummary p_SMS + ) := { + simpleMsgSummary := p_SMS + } + + template(value) MessageBody m_MBody_longPlainText := {textplain := c_longMessageContent_1300Bytes} + + template(value) MessageBody m_mBody_plainText( + template(value) charstring p_plaitext + ) := { + textplain := p_plaitext + } + + template(value) MessageBody m_MBody_sipfrag( + template(value) charstring p_sipfrag + ) := { + sipfrag := p_sipfrag + } + + template(value) MessageBody m_MBody_MIMESdpXml( + template(value) SDP_Message p_sdp, + template(value) XmlBody p_xmlBody + ) := { + mimeMessageBody := { + boundary := "--" & PX_SIP_MIME_BOUNDARY, + mimeEncapsulatedList := { + { + content_type := c_sdpApplication, + content_disposition := omit, + content_id := omit, + mime_encapsulated_part := {sdpMessageBody := p_sdp} + }, + { + content_type := c_ims3gppCwApplication, + content_disposition := omit, + content_id := omit, + mime_encapsulated_part := {xmlBody := p_xmlBody} + } + } + } + } + + template(value) MessageBody m_MBody_MIMESdpEncrypted( + template(value) SDP_Message p_sdp + ) := { + mimeMessageBody := { + boundary := "--" & PX_SIP_MIME_BOUNDARY, + mimeEncapsulatedList := { + { + content_type := "application/sdp", + content_disposition := "attachment;handling=required;filename=smime.p7", + content_id := omit, + mime_encapsulated_part := {sdpMessageBody := p_sdp} + } + } + } + } + + template(present) MessageBody mw_MBody_SDP( + template(present) SDP_Message p_SDP := ? + ) := { + sdpMessageBody := p_SDP + } + + template(present) MessageBody mw_MBody_XML( + template(present) XmlBody p_xmlBody := ? + ) := { + xmlBody := p_xmlBody + } + + template(present) MessageBody mw_mBody_SMS( + template(present) SimpleMsgSummary p_SMS := ? + ) := { + simpleMsgSummary := p_SMS + } + + template(present) MessageBody mw_MBody_MIMESdpXml( + template(present) SDP_Message p_sdp := ?, + template(present) XmlBody p_xmlBody := ? + ) := { + mimeMessageBody := { + boundary := ?, + mimeEncapsulatedList := { + { + content_type := ?, + content_disposition := *, + content_id := *, + mime_encapsulated_part := {sdpMessageBody := p_sdp} + }, + { + content_type := ?, + content_disposition := *, + content_id := *, + mime_encapsulated_part := {xmlBody := p_xmlBody} + } + } + } + } + + template(present) MessageBody mw_MBody_MIME_Ims3gpp( + template charstring p_disposition, + template(present) Ims_3gpp p_ims3gpp := ? + ) := { + mimeMessageBody := { + boundary := ?, + mimeEncapsulatedList := { + *, + { + content_type := c_ims3gppApplication, + content_disposition := p_disposition, + content_id := *, + mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}} + }, + * + } + } + } + + template(present) MessageBody mw_MBody_MIME_Ims3gppCW( + template charstring p_disposition, + template(present) Ims_3gpp p_ims3gpp := ? + ) := { + mimeMessageBody := { + boundary := ?, + mimeEncapsulatedList := { + *, + { + content_type := c_ims3gppCwApplication, + content_disposition := p_disposition, + content_id := *, + mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}} + }, + * + } + } + } + + } + /* + * + * @desc group TemplatePreparationFunctions contain functions which are used for templates + */ + group TemplatePreparationFunctions { + + group MessageBody_Calculation { + + /** + * @desc Calculation of Message Body length + * @param p_mb_par contain message body part + * @return message body length + */ + function f_MessageBodyLength( + template(value) MessageBody p_mb_par + ) return integer { + + var integer v_result := 0; + if (PX_MB_LENGTH_FROM_ENCVAL) { + // by default it is set to true + // in case the codec encodes the variant selector, this + // needs to be changed to ischosen... + v_result := lengthof(encvalue(p_mb_par)) / 8; // length + // in + // bytes, + // let get + // length + // of + // encoded + // value + } + else { + + // assume SDP_Message ONLY in the message body + if (ischosen(p_mb_par.sdpMessageBody)) { + v_result := f_SDPlength(valueof(p_mb_par.sdpMessageBody)); + } + + // assume XML_Body ONLY in the message body + if (ischosen(p_mb_par.xmlBody)) { + v_result := f_XMLBody_Length(valueof(p_mb_par.xmlBody), PX_USE_FX_FOR_XML_LENGTH); + } + + // assume simpleMsgSummary_Body ONLY in the message body + if (ischosen(p_mb_par.simpleMsgSummary)) { + v_result := f_simpleMsgSummaryBody_Length(valueof(p_mb_par.simpleMsgSummary)); + } + + // assume MIME_Message in the message body + if (ischosen(p_mb_par.mimeMessageBody)) { + v_result := f_MIMElength(valueof(p_mb_par.mimeMessageBody)); + } + + // assume sipfrag in the message body + if (ischosen(p_mb_par.sipfrag)) { + v_result := f_TextPlainLength(p_mb_par); // same + // function + // due to + // same + // type + // with + // textplain + } + + // assume textplain in the message body + if (ischosen(p_mb_par.textplain)) { + v_result := f_TextPlainLength(p_mb_par); + } + } + + return v_result; + } + + + group SDP_Len_calculation { + /** + * @desc Calculation of SDP length + * @param p_mb contain sdp message + * @return sdp_lenght + */ + function f_SDPlength( + SDP_Message p_mb + ) return integer { + var integer i, j, k, v_len_con0, v_len_con1, v_len_con2, v_len_attr; + var integer v_result := 2; + //* due to empty line beginning of message body + var charstring v_auxstring; + + v_result := 2 + c_CRlen + lengthof(int2str(p_mb.protocol_version)); //* "v=" + v_auxstring := p_mb.origin.user_name & " " & p_mb.origin.session_id & " " & p_mb.origin.session_version & " " & p_mb.origin.net_type & " " & p_mb.origin.addr_type & " " & p_mb.origin.addr; + v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "o=" + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.session_name); //* "s=" + if (isvalue(p_mb.information)) { + v_auxstring := valueof(p_mb.information); + v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); + } //* "i= " + if (isvalue(p_mb.uri)) { + v_auxstring := valueof(p_mb.uri); + v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); + } //* "u=" + if (isvalue(p_mb.emails)) { + for (i := 0; i < lengthof(p_mb.emails); i := i + 1) { + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //* "e=" + if (isvalue(p_mb.emails[i].disp_name)) { + v_auxstring := valueof(p_mb.emails[i].disp_name); + v_result := v_result + 1 + lengthof(v_auxstring); + } + } + } + + if (isvalue(p_mb.phone_numbers)) { + for (i := 0; i < lengthof(p_mb.phone_numbers); i := i + 1) { + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //* "p= + //* " + if (isvalue(p_mb.phone_numbers[i].disp_name)) { + v_auxstring := valueof(p_mb.phone_numbers[i].disp_name); + v_result := v_result + 1 + lengthof(v_auxstring); + } + } + } + + if (isvalue(p_mb.connection)) { + v_len_con0 := f_SDPlength_connection(valueof(p_mb.connection)); + v_result := v_result + v_len_con0; + } //* "c=" + if (isvalue(p_mb.bandwidth)) { + for (i := 0; i < lengthof(p_mb.bandwidth); i := i + 1) { + //* "b= " + v_auxstring := p_mb.bandwidth[i].modifier & " "; + v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring) + lengthof(int2str(p_mb.bandwidth[i].bandwidth)); + } + } + + for (i := 0; i < lengthof(p_mb.times); i := i + 1) { + v_auxstring := p_mb.times[i].time_field.start_time & " " & p_mb.times[i].time_field.stop_time; + v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "t=" + if (isvalue(p_mb.times[i].time_repeat)) { + for (j := 0; j < lengthof(p_mb.times[i].time_repeat); j := j + 1) { + v_result := v_result + 2 + c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //* "r=" + if (isvalue(p_mb.times[i].time_repeat[j].repeat_interval.unit)) { + v_auxstring := valueof(p_mb.times[i].time_repeat[j].repeat_interval.unit); + v_result := v_result + 1 + lengthof(v_auxstring); + } + + v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time)); + if (isvalue(p_mb.times[i].time_repeat[j].active.unit)) { + v_auxstring := valueof(p_mb.times[i].time_repeat[j].active.unit); + v_result := v_result + 1 + lengthof(v_auxstring); + } + + for (k := 0; k < lengthof(p_mb.times[i].time_repeat[j].offsets); k := k + 1) { + v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time)); + if (isvalue(p_mb.times[i].time_repeat[j].offsets[k].unit)) { + v_auxstring := valueof(p_mb.times[i].time_repeat[j].offsets[k].unit); + v_result := v_result + 1 + lengthof(v_auxstring); + } + } + } + } + } + + if (isvalue(p_mb.timezone_adjustments)) { + log("*** " & __SCOPE__ & ": INFO: timezone adjustments have not been considered in SDP length calculation yet ***"); + } //* "z=" + if (isvalue(p_mb.key)) { + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.key.method); //* "k= + //* " + if (isvalue(p_mb.key.key)) { + v_auxstring := valueof(p_mb.key.key); + v_result := v_result + 1 + lengthof(v_auxstring); + } + } + if (isvalue(p_mb.attributes)) { + for (i := 0; i < lengthof(p_mb.attributes); i := i + 1) { + + + //* "a= " + v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]); + v_result := v_result + v_len_con1; + } + } //* "a=" + if (isvalue(p_mb.media_list)) { + for (i := 0; i < lengthof(p_mb.media_list); i := i + 1) { + //* "m= " + //* for each media_field + //* log("p_mb.media_list[i ] ",p_mb.media_list[i + //* ] ); + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].media_field.media) + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number)); + + + if (isvalue(p_mb.media_list[i].media_field.ports.num_of_ports)) { + v_result := v_result + 1 + lengthof(int2str(valueof(p_mb.media_list[i].media_field.ports.num_of_ports))); + } + v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport); + for (j := 0; j < lengthof(p_mb.media_list[i].media_field.fmts); j := j + 1) { + v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.fmts[j]); + } + + if (isvalue(p_mb.media_list[i].information)) { + v_auxstring := valueof(p_mb.media_list[i].information); + v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "i= " + } + if (isvalue(p_mb.media_list[i].connections)) { + for (j := 0; j < lengthof(p_mb.media_list[i].connections); j := j + 1) { + v_len_con2 := f_SDPlength_connection(p_mb.media_list[i].connections[j]); + v_result := v_result + v_len_con2; + } //* end for + } + if (isvalue(p_mb.media_list[i].bandwidth)) { + //* "b= " + for (j := 0; j < lengthof(p_mb.media_list[i].bandwidth); j := j + 1) { + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].bandwidth[j].modifier) + 1 + lengthof(int2str(p_mb.media_list[i].bandwidth[j].bandwidth)); + } //* end for + } + if (isvalue(p_mb.media_list[i].key)) { + //* "k= " + v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method); + if (isvalue(p_mb.media_list[i].key.key)) { + v_auxstring := valueof(p_mb.media_list[i].key.key); + v_result := v_result + 1 + lengthof(v_auxstring); + } + } + if (isvalue(p_mb.media_list[i].attributes)) { + for (j := 0; j < lengthof(p_mb.media_list[i].attributes); j := j + 1) { + + //* "a= " + v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]); + v_result := v_result + v_len_attr; + } //* end for j + } + } //* end for i + } //* end if media_list + return v_result; + } + //* end function f_SDPlength + function f_SDPlength_connection( + SDP_connection p_element + ) return integer { + //* "c=" + var integer v_result := 0; + v_result := v_result + 2 + c_CRlen + lengthof(p_element.net_type & " " & p_element.addr_type & " " & p_element.conn_addr.addr); + if (isvalue(p_element.conn_addr.ttl) and p_element.conn_addr.ttl > 0) { + v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.ttl))); + } + if (isvalue(p_element.conn_addr.num_of_addr) and p_element.conn_addr.num_of_addr > 0) { + v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.num_of_addr))); + } + return v_result; + } //* f_SDPlength_connection + + function f_SDPlength_attribute( + SDP_attribute p_element + ) return integer { + //* "a=" + var integer v_result := 0; + if (ischosen(p_element.cat)) { + v_result := v_result + 2 + c_CRlen + lengthof("cat:" & p_element.cat.attr_value); + } + if (ischosen(p_element.keywds)) { + v_result := v_result + 2 + c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value); + } + if (ischosen(p_element.tool)) { + v_result := v_result + 2 + c_CRlen + lengthof("tool:" & p_element.tool.attr_value); + } + if (ischosen(p_element.ptime)) { + v_result := v_result + 2 + c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value); + } + if (ischosen(p_element.recvonly)) { + v_result := v_result + c_CRlen + lengthof("recvonly"); + } + if (ischosen(p_element.sendrecv)) { + v_result := v_result + c_CRlen + lengthof("sendrecv"); + } + if (ischosen(p_element.sendonly)) { + v_result := v_result + c_CRlen + lengthof("sendonly"); + } + if (ischosen(p_element.inactive)) { + v_result := v_result + c_CRlen + lengthof("inactive"); + } + if (ischosen(p_element.orient)) { + v_result := v_result + 2 + c_CRlen + lengthof("orient:" & p_element.orient.attr_value); + } + if (ischosen(p_element.sdp_type)) { + v_result := v_result + 2 + c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value); + } + if (ischosen(p_element.charset)) { + v_result := v_result + 2 + c_CRlen + lengthof("charset" & p_element.charset.attr_value); + } + if (ischosen(p_element.sdplang)) { + v_result := v_result + 2 + c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value); + } + if (ischosen(p_element.lang)) { + v_result := v_result + 2 + c_CRlen + lengthof("lang:" & p_element.lang.attr_value); + } + if (ischosen(p_element.framerate)) { + v_result := v_result + 2 + c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value); + } + if (ischosen(p_element.quality)) { + v_result := v_result + 2 + c_CRlen + lengthof("quality:" & p_element.quality.attr_value); + } + if (ischosen(p_element.fmtp)) { + v_result := v_result + 2 + c_CRlen + lengthof("fmtp:" & p_element.fmtp.format & " " & f_fmtpparams_to_charstring(p_element.fmtp.params)); + } + if (ischosen(p_element.curr)) { + v_result := v_result + 2 + c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " " & p_element.curr.statusType & " " & p_element.curr.direction); + } + if (ischosen(p_element.des)) { + v_result := v_result + 2 + c_CRlen + lengthof("des:" & p_element.des.preconditionType & " " & p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction); + } + if (ischosen(p_element.conf)) { + v_result := v_result + 2 + c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " " & p_element.conf.statusType & " " & p_element.conf.direction); + } + if (ischosen(p_element.rtpmap)) { + v_result := v_result + 2 + c_CRlen + lengthof("rtpmap:" & f_rtpmap_to_charstring(p_element.rtpmap)); + } + if (ischosen(p_element.rtcp)) { + v_result := v_result + 2 + c_CRlen + lengthof("rtcp:" & f_rtcp_to_charstring(p_element.rtcp)); + } + if (ischosen(p_element.unknown)) { + v_result := v_result + 2 + c_CRlen + lengthof(p_element.unknown.name); + if (isvalue(p_element.unknown.attr_value)) { + v_result := v_result + lengthof(":" & p_element.unknown.attr_value); + } + } + //* log("axr: length attribute=", v_result); + return v_result; + } //* f_SDPlength_attribute + + function f_fmtpparams_to_charstring( + SDP_attribute_fmtp_format_specific_params p_params + ) return charstring { + var charstring v_result := ""; + if(ischosen(p_params.unstructured)){ + v_result := p_params.unstructured; + } + else + { + for(var integer v_idx := 0; v_idx < lengthof(p_params.paramList); v_idx := v_idx + 1) { + if(v_idx != 0) + { + v_result := v_result & "; " + } + v_result := v_result & p_params.paramList[v_idx].id; + if(ispresent(p_params.paramList[v_idx].paramValue)){ + if(ischosen(p_params.paramList[v_idx].paramValue.tokenOrHost)) + { + v_result := v_result & "=" & p_params.paramList[v_idx].paramValue.tokenOrHost; + } + else + { + v_result := v_result & "=""" & p_params.paramList[v_idx].paramValue.quotedString & """"; + } + } + } + } + return v_result; + } + + function f_rtpmap_to_charstring( + SDP_attribute_rtpmap p_rtpmap + ) return charstring { + var charstring v_result := ""; + v_result := p_rtpmap.payload_type & " " & p_rtpmap.codec.encoding & "/" & p_rtpmap.codec.clockrate; + if(ispresent(p_rtpmap.codec.parameters)) + { + v_result := v_result & "/" & p_rtpmap.codec.parameters; + } + return v_result; + } + + function f_rtcp_to_charstring( + SDP_attribute_rtcp p_rtcp + ) return charstring { + var charstring v_result := int2str(p_rtcp.portnumber); + if(ispresent(p_rtcp.connection)) + { + v_result := v_result & " " & p_rtcp.connection.net_type & " " & p_rtcp.connection.addr_type & " " & p_rtcp.connection.conn_addr.addr; + if(ispresent(p_rtcp.connection.conn_addr.ttl)) + { + v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.ttl); + if(ispresent(p_rtcp.connection.conn_addr.num_of_addr)) + { + v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.num_of_addr); + } + } + } + return v_result; + } + + } //* group SDPlen_calculation + + group XML_Len_calculation { + + /** + * @desc Declaration of external functions to calculate length of message bodies switching of internal or external functions are made by boolean module parameter/PIXIT USE_FX_FOR_XML_LENGTH declared at top of this module + */ + external function fx_calculateXMLBodyLen( + XmlBody p_mb + ) return integer; + + /** + * @desc Calculation of XML body length + * @param p_mb contain XML body + * @return xml_length + */ + function f_XMLBody_Length( + XmlBody p_mb, + boolean p_ext_func + ) return integer { + var integer v_result := 0; + + if (p_ext_func) { + v_result := fx_calculateXMLBodyLen(p_mb); + } + else { + // assume ConferenceInfo ONLY in the XML message + // body + if (ischosen(p_mb.conference)) { + v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conference); + } + + // assume CUG ONLY in the XML message body + if (ischosen(p_mb.cug)) { + v_result := f_XMLBody_Cug_Length(p_mb.cug); + } + + // assume MCID ONLY in the XML message body + if (ischosen(p_mb.mcid)) { + v_result := f_XMLBody_Mcid_Length(p_mb.mcid); + } + + // assume CW ONLY in the XML message body + if (ischosen(p_mb.cw)) { + v_result := f_XMLBody_Cw_Length(p_mb.cw); + } + + // assume CDIV ONLY in the XML message body + if (ischosen(p_mb.cdivn)) { + v_result := f_XMLBody_Cdivn_Length(p_mb.cdivn); + } + + // assume PSTNTransit ONLY in the XML message body + if (ischosen(p_mb.pstnTransit)) { + v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit); + } + + // assume Simservs ONLY in the XML message body + if (ischosen(p_mb.simservs)) { + v_result := f_XMLBody_Simservs_Length(p_mb.simservs); + } + + // assume ResourceLists ONLY in the XML message body + if (ischosen(p_mb.resourceLists)) { + v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists); + } + + // assume Ims3GPP ONLY in the XML message body + if (ischosen(p_mb.ims3gpp)) { + v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp); + } + /** + * Add aditional checks regarding to new variants, also implement appropriate function for calculation + */ + } + return v_result; + } //* f_XMLBodyLength + + group XMLBodies_calculation { + + /** + * @desc Calculation of XML ConferenceInfo element length + * @param p_mb contain XML ConfInfo body + * @return xml_length + */ + function f_XMLBody_ConferenceInfo_Length( + template(value) Conference_type p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + return v_result; + } //* f_XMLBody_ConferenceInfo_Length + + /** + * @desc Calculation of XML CUG element length + * @param p_mb contain XML CUG body + * @return xml_length + */ + function f_XMLBody_Cug_Length( + template(value) Cug p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + return v_result; + } //* f_XMLBody_Cug_Length + + /** + * @desc Calculation of XML MCID element length + * @param p_mb contain XML MCID body + * @return xml_length + */ + function f_XMLBody_Mcid_Length( + template(value) Mcid p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + + return v_result; + } //* f_XMLBody_Mcid_Length + + /** + * @desc Calculation of XML CW element length + * @param p_mb contain XML CW body + * @return xml_length + */ + function f_XMLBody_Cw_Length( + template(value) Ims_cw p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + + return v_result; + } //* f_XMLBody_Cw_Length + + /** + * @desc Calculation of XML CDIVN element length + * @param p_mb contain XML CDIVN body + * @return xml_length + */ + function f_XMLBody_Cdivn_Length( + template(value) Comm_div_info_type p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + + return v_result; + } //* f_XMLBody_Cdivn_Length + + /** + * @desc Calculation of XML PSTNTransit element length + * @param p_mb contain XML PSTNTransit body + * @return xml_length + */ + function f_XMLBody_PSTNTransit_Length( + template(value) PSTN_transit p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + return v_result; + } //* f_XMLBody_PSTNTransit_Length + + /** + * @desc Calculation of XML Simservs element length + * @param p_mb contain XML Simservs body + * @return xml_length + */ + function f_XMLBody_Simservs_Length( + template(value) Simservs p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + return v_result; + } //* f_XMLBody_Simservs_Length + + /** + * @desc Calculation of XML ResourceList length + * @param p_mb contain XML ResourceList body + * @return xml_length + */ + function f_XMLBody_ResourceList_Length( + template(value) Resource_lists p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + return v_result; + } //* f_XMLBody_ResourceList_Length + + /** + * @desc Calculation of XML Ims3GPP length + * @param p_mb contain XML Ims3GPP body + * @return xml_length + */ + function f_XMLBody_Ims3GPP_Length( + template(value) TIMS3GPP p_mb + ) return integer { + var integer v_result := lengthof(encvalue(p_mb)) / 8; + return v_result; + } //* f_XMLBody_Ims3GPP_Length + + + } //* XMLBodies_calculation + + + } //* group XMLlen_calculation + + group simpleMsgSummaryBody_Length { + + function f_simpleMsgSummaryBody_Length( + SimpleMsgSummary p_mb + ) return integer { + var integer i; + var integer v_result := 2; + + + //* due to empty line beginning of message body + var charstring v_auxstring; + + v_result := 2 + lengthof(p_mb.msg_status_line.msg_type) + 2 + lengthof(p_mb.msg_status_line.msg_status) + c_CRlen; //* "Message-Waiting: + //* yes" + if (isvalue(p_mb.msg_account)) + //* "Message-Account" + { + v_result := v_result + 2 + lengthof(p_mb.msg_account.msg_type_account) + 2 + lengthof(p_mb.msg_account.account_URI) + c_CRlen; + } + if (isvalue(p_mb.msg_summary_line_list)) { + for (i := 0; i < lengthof(p_mb.msg_summary_line_list); i := i + 1) { + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.msg_summary_line_list[i].msg_context_class) + 2 + lengthof(p_mb.msg_summary_line_list[i].msgs); + if (isvalue(p_mb.msg_summary_line_list[i].urgent_msgs)) { + v_auxstring := valueof(p_mb.msg_summary_line_list[i].urgent_msgs); + v_result := v_result + 1 + lengthof(v_auxstring); + } + } + } + if (isvalue(p_mb.opt_msg_headers)) { + for (i := 0; i < lengthof(p_mb.opt_msg_headers); i := i + 1) { + v_result := v_result + 2 + c_CRlen + lengthof(p_mb.opt_msg_headers[i]); + } + } + return v_result; + } + } + + group MIME_Len_calculation { + /** + * @desc Calculation of MIME length + * @param p_mb contain MIME message + * @return xml_length + */ + function f_MIMElength( + MIME_Message p_mb + ) return integer { + var integer i; + var integer v_result := 2; + // 0d0a + v_result := v_result + lengthof(p_mb.boundary) + 2 /*0d0a*/; + + for (i := 0; i < lengthof(p_mb.mimeEncapsulatedList); i := i + 1) { + + v_result := v_result + lengthof("Content-Type: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2 /*0d0a*/; + + if (isvalue(p_mb.mimeEncapsulatedList[i].content_disposition)) { + v_result := v_result + lengthof("Content-Disposition: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2 /*0d0a*/; + } + + // v_result := v_result +2/*0d0a*/; ??? to check + // assume SDP_Message ONLY in the message body + if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody)) { + v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody); + } + + // assume XML_Body ONLY in the message body + if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody)) { + v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, PX_USE_FX_FOR_XML_LENGTH); + } + // //assume XML_Message ONLY in the message body + // if (ischosen(p_mb.mimeEncapsulatedList[i ] + // .mime_encapsulated_part.xmlMessage)) + // { + // v_result := v_result + + // f_XMLlength(p_mb.mimeEncapsulatedList[i ] + // .mime_encapsulated_part.xmlMessage, + // USE_FX_FOR_XML_LENGTH ); + // }; + // v_result := v_result +2/*0d0a*/; ??? to check + } + + // v_result := v_result +2/*0d0a*/; ??? to check + return v_result; + } //* f_MIMElength + + + } //* group MIMElen_calculation + + group TextPlain_Len_calculation { + /** + * @desc Calculation of messagebody-textplain type length + * @param p_mb contain textplain message + * @return lenght + */ + function f_TextPlainLength( + template(value) MessageBody p_mb + ) return integer { + var integer v_result := 0; + + v_result := v_result + lengthof(p_mb.textplain); + + return v_result; + } //* end function f_TextPlainLength + + + } //* end group TextPlainLen_calculation + + + } //* group MessageBody_Calculation + + + group GiveHeaders { + /** + * @desc Return component variable of recordRoute header if vc_boo_recordRoute is true + * @return component variable of recordRoute header + */ + function f_recordroute( + ) runs on SipComponent + return template(omit) RecordRoute { + var template(omit) RecordRoute v_recordRoute := omit; + if (vc_boo_recordRoute) { + return vc_recordRoute; + } + else { + return (v_recordRoute); + } + } + + /** + * @desc Return component variable of Route header if vc_boo_route is true + * @return component variable of recordRoute header + */ + function f_route( + ) runs on SipComponent + return template(omit) Route { + var template(omit) Route v_route := omit; + if (vc_boo_route) { + return vc_route; + } + else { + return (v_route); + } + } + + + } //* end group GiveHeaders + + group others { + + /* + * + * @desc function combines two comma parameter lists + * @param p_list1 first list + * @param p_list2 second list + * @return comma parameter list that contains parameters from both input lists + * @verdict + */ + function f_merge_CommaParam_List( + template(value) CommaParam_List p_list1, + template(value) CommaParam_List p_list2 + ) return template(value) CommaParam_List { + var template(value) CommaParam_List p_result; + var integer i, v_limit1 := lengthof(p_list1); + for (i := 0; i < v_limit1; i := i + 1) { + p_result[i] := p_list1[i]; + } + for (i := 0; i < lengthof(p_list2); i := i + 1) { + p_result[i + v_limit1] := p_list2[i]; + } + return p_result; + } + + + } //* end group others + + + } //* group TemplatePreparationFunctions +} //* end module LibSip_Templates diff --git a/ttcn/patch_lib_sip_titan/LibSip_XMLTypes.ttcn b/ttcn/patch_lib_sip_titan/LibSip_XMLTypes.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..af46476bc01a8dc167078e9705d9662278ab3ca4 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/LibSip_XMLTypes.ttcn @@ -0,0 +1,113 @@ +/** + * @author STF 346, STF366, STF368, STF369, STF471 + * @version $Id$ + * @desc + * This module provides the XML type system for SIP tests. The types have been generated automatically, followed by manual modifications: - bitType substituted by OneBitType - twobitType substituted by TwoBitType - addition of pattern for: OneBitType, TwoBitType, ThreeBitType, FourBitType, FourBitType, SixBitType - application of enumerated for: State_type, Endpoint_status_type, Joining_type, Disconnection_type, Media_status_type, Originating_identity_presentation_restriction, Terminating_identity_presentation_restriction - addition of length value: NetworkIdentityType, SixteenbitType - addition of value restriction: CugIndexType - substitution of "content" by "choice": Call_type, Mcid - additional type renaming (upper first letter): AbsService, Anonymous, Busy, Communication_diverted, + * Conference_description_type, Conference_info, Conference_media_type, Conference_medium_type, Conference_state_type, Conference_type, Cug, CugRequestType, Empty_element_type, Endpoint_type, Execution_type, Host_type, Keywords_type, Media, Media_type, No_answer, Not_reachable, Not_registered, Originating_identity_presentation, Presence_status, Presence_status_activity_type, RequestType, ResponseType, Roaming, Rule_deactivated, Sidebars_by_val_type, Simservs, SimservType, Terminating_identity_presentation, Uri_type, Uris_type, User_roles_type, User_languages_type, User_type, Users_type - new group CDIV added by STF369 - new group ACR_CD added by STF38 - new types RegInfo and Pidf_Lo added by STF160. + * This module is part of LibSipV3. + */ +module LibSip_XMLTypes { + import from http_www_w3_org_XML_1998_namespace language "XSD" all + with { + extension "File:../xsd/xml.xsd"; + } + + import from urn_ietf_params_xml_ns_common_policy language "XSD" all + with { + extension "File:../xsd/common-policy.xsd"; + } + + import from urn_ietf_params_xml_ns_resource_lists language "XSD" all + with { + extension "File:../xsd/ResourceList.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all + with { + extension "File:../xsd/SupplementaryServices.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all + with { + extension "File:../xsd/MCID.xsd"; + } + + import from NoTargetNamespace language "XSD" all + with { + extension "File:../xsd/Ims3gpp.xsd"; + } + + import from urn_3gpp_ns_cw_1_0 language "XSD" all + with { + extension "File:../xsd/cw.xsd"; + } + + import from urn_ietf_params_xml_ns_conference_info language "XSD" all + with { + extension "File:../xsd/CONF.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all + with { + extension "File:../xsd/PSTN.xsd"; + } + + import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all + with { + extension "File:../xsd/CDIVN.xsd"; + } + + import from urn_oma_xml_xdm_common_policy language "XSD" all + with { + extension "File:../xsd/xdm_commonPolicy-v1_0.xsd"; + } + // RFC 3680 Registration Info + import from urn_ietf_params_xml_ns_reginfo language "XSD" all + with { + extension "File:../xsd/regInfo.xsd"; + } + // RFC 3863 Presence Information Data Format + import from urn_ietf_params_xml_ns_pidf language "XSD" all + with { + extension "File:../xsd/pidf.xsd"; + } + // RFC 4119 Presence Information Data Format, Location Object extension + import from urn_ietf_params_xml_ns_pidf_geopriv10_basicPolicy language "XSD" all + with { + extension "File:../xsd/geopriv10basic.xsd"; + } + + // RFC 4119 Presence Information Data Format, Location Object extension + import from urn_ietf_params_xml_ns_pidf_geopriv10 language "XSD" all + with { + extension "File:../xsd/pidf_lo.xsd"; + } + + group XmlTypes { + type union XmlBody { + Mcid mcid, + // if there is XML Mcid + Comm_div_info_type cdivn, + // if there is XML cdivn + Simservs simservs, + // if there is XML simservs (Oip/r, Tip/r, Call Diversion, ICB, OCB ...) + Conference_type conference, + // if there is XML conf + Ims_cw cw, + // if there is XML cw (defined in X_3gpp_ns_cw_1_0.ttcn3view) + Cug cug, + // if there is XML cug (defined in org_etsi_uri__ngn_params_xml_simservs_xcap.ttcn3view) + TIMS3GPP ims3gpp, + // if there is XML IMS 3GPP + PSTN_transit pstnTransit, + // if there is XML PSTN_transit + Resource_lists resourceLists, + // if there is XML Resource List data + Reginfo regInfo, + // if it is a NG 112 event + Presence presence, // if it is a Presence Information Data Format Location Object + // if it is a registration event + Geopriv geopriv // if it is a Presence Information Data Format Location Object + } + } +} diff --git a/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_comm_div_info.ttcn b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_comm_div_info.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..7b45b703def52265d5b7f5d3d66b4dca4bbfccbe --- /dev/null +++ b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_comm_div_info.ttcn @@ -0,0 +1,389 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: http_uri_etsi_org_ngn_params_xml_comm_div_info.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - CDIVN.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/comm-div-info" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module http_uri_etsi_org_ngn_params_xml_comm_div_info { + + +import from XSD all; + + +import from http_www_w3_org_XML_1998_namespace all; + + +/* This import brings in the XML language definition */ + + +/* Communication Diversion Information. This is the top-level XML element */ + + +type Comm_div_info_type Comm_div_info +with { + variant "name as 'comm-div-info'"; + variant "element"; +}; + + +/* Communication Diversion Information Type. This is the top-level XML element */ + + +type record Comm_div_info_type +{ + XSD.AnyURI entity, + Comm_div_subs_info_type comm_div_subs_info optional, + Comm_div_ntfy_info_type comm_div_ntfy_info optional, + record of XSD.String elem_list +} +with { + variant "name as 'comm-div-info-type'"; + variant (entity) "attribute"; + variant (comm_div_subs_info) "name as 'comm-div-subs-info'"; + variant (comm_div_ntfy_info) "name as 'comm-div-ntfy-info'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; +}; + + +/* - + Communication Diversion Subscription Type. + Used at Subscription time to + select Communication Diversions for notification, + when to notify them and + what to notify. */ + + +type record Comm_div_subs_info_type +{ + record of XSD.String attr optional, + Comm_div_selection_criteria_type comm_div_selection_criteria optional, + Comm_div_ntfy_trigger_criteria_type comm_div_ntfy_trigger_criteria optional, + Comm_div_info_selection_criteria_type comm_div_info_selection_criteria optional, + record of XSD.String elem_list +} +with { + variant "name as 'comm-div-subs-info-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (comm_div_selection_criteria) "name as 'comm-div-selection-criteria'"; + variant (comm_div_ntfy_trigger_criteria) "name as 'comm-div-ntfy-trigger-criteria'"; + variant (comm_div_info_selection_criteria) "name as 'comm-div-info-selection-criteria'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; +}; + + +/* - + Communication Diversion Notification Information Type + Used while notifying the User about the Communication Diversion */ + + +type record Comm_div_ntfy_info_type +{ + record of XSD.String attr optional, + User_info_type originating_user_info optional, + XSD.AnyURI diverting_user_info optional, + XSD.AnyURI diverted_to_user_info optional, + XSD.DateTime diversion_time_info optional, + Diversion_reason_info_type diversion_reason_info optional, + Diversion_rule_info_type diversion_rule_info optional, + record of XSD.String elem_list +} +with { + variant "name as 'comm-div-ntfy-info-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (originating_user_info) "name as 'originating-user-info'"; + variant (diverting_user_info) "name as 'diverting-user-info'"; + variant (diverted_to_user_info) "name as 'diverted-to-user-info'"; + variant (diversion_time_info) "name as 'diversion-time-info'"; + variant (diversion_reason_info) "name as 'diversion-reason-info'"; + variant (diversion_rule_info) "name as 'diversion-rule-info'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; +}; + + +/* COMMUNICATION DIVERSION SELECTION CRITERIA */ + + +type record Comm_div_selection_criteria_type +{ + record of XSD.String attr optional, + User_selection_criteria_type originating_user_selection_criteria optional, + XSD.AnyURI diverting_user_selection_criteria optional, + XSD.AnyURI diverted_to_user_selection_criteria optional, + Time_range_selection_criteria_type diversion_time_selection_criteria optional, + Diversion_reason_selection_criteria_type diversion_reason_selection_criteria optional, + record of XSD.String elem_list +} +with { + variant "name as 'comm-div-selection-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (originating_user_selection_criteria) "name as 'originating-user-selection-criteria'"; + variant (diverting_user_selection_criteria) "name as 'diverting-user-selection-criteria'"; + variant (diverted_to_user_selection_criteria) "name as 'diverted-to-user-selection-criteria'"; + variant (diversion_time_selection_criteria) "name as 'diversion-time-selection-criteria'"; + variant (diversion_reason_selection_criteria) "name as 'diversion-reason-selection-criteria'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; +}; + + +/* COMMUNICATION DIVERSION NOTIFICATION TRIGGER CRITERIA */ + + +type record Comm_div_ntfy_trigger_criteria_type +{ + record of XSD.String attr optional, + Time_range_selection_criteria_type notification_time_selection_criteria optional, + Presence_status_selection_criteria_type presence_status_selection_criteria optional, + XSD.Integer notification_buffer_interval (-infinity .. 86400) optional, + record of XSD.String elem_list +} +with { + variant "name as 'comm-div-ntfy-trigger-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (notification_time_selection_criteria) "name as 'notification-time-selection-criteria'"; + variant (presence_status_selection_criteria) "name as 'presence-status-selection-criteria'"; + variant (notification_buffer_interval) "name as 'notification-buffer-interval'"; + variant (notification_buffer_interval) "defaultForEmpty as '86400'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; +}; + + +/* COMMUNICATION DIVERSION INFORMATION SELECTION CRITERIA */ + + +type record Comm_div_info_selection_criteria_type +{ + record of XSD.String attr optional, + XSD.Boolean disable_originating_user_info optional, + XSD.Boolean disable_diverting_user_info optional, + XSD.Boolean disable_diverted_to_user_info optional, + XSD.Boolean disable_diversion_time_info optional, + XSD.Boolean disable_diversion_reason_info optional, + XSD.Boolean disable_diversion_rule_info optional, + record of XSD.String elem_list +} +with { + variant "name as 'comm-div-info-selection-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (disable_originating_user_info) "name as 'disable-originating-user-info'"; + variant (disable_originating_user_info) "defaultForEmpty as 'false'"; + //variant (disable_originating_user_info) "text 'true' as '1'"; + //variant (disable_originating_user_info) "text 'false' as '0'"; + variant (disable_diverting_user_info) "name as 'disable-diverting-user-info'"; + variant (disable_diverting_user_info) "defaultForEmpty as 'false'"; + //variant (disable_diverting_user_info) "text 'true' as '1'"; + //variant (disable_diverting_user_info) "text 'false' as '0'"; + variant (disable_diverted_to_user_info) "name as 'disable-diverted-to-user-info'"; + variant (disable_diverted_to_user_info) "defaultForEmpty as 'false'"; + //variant (disable_diverted_to_user_info) "text 'true' as '1'"; + //variant (disable_diverted_to_user_info) "text 'false' as '0'"; + variant (disable_diversion_time_info) "name as 'disable-diversion-time-info'"; + variant (disable_diversion_time_info) "defaultForEmpty as 'false'"; + //variant (disable_diversion_time_info) "text 'true' as '1'"; + //variant (disable_diversion_time_info) "text 'false' as '0'"; + variant (disable_diversion_reason_info) "name as 'disable-diversion-reason-info'"; + variant (disable_diversion_reason_info) "defaultForEmpty as 'false'"; + //variant (disable_diversion_reason_info) "text 'true' as '1'"; + //variant (disable_diversion_reason_info) "text 'false' as '0'"; + variant (disable_diversion_rule_info) "name as 'disable-diversion-rule-info'"; + variant (disable_diversion_rule_info) "defaultForEmpty as 'false'"; + //variant (disable_diversion_rule_info) "text 'true' as '1'"; + //variant (disable_diversion_rule_info) "text 'false' as '0'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; +}; + + +/* User Info Type */ + + +type record User_info_type +{ + record of XSD.String attr optional, + XSD.String user_name optional, + XSD.AnyURI user_URI +} +with { + variant "name as 'user-info-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (user_name) "name as 'user-name'"; + variant (user_URI) "name as 'user-URI'"; +}; + + +/* DIVERSION REASON INFO */ + + +type record of Diversion_reason_info_type Diversion_reason_info_types +with { + variant "name as 'diversion-reason-info-types'"; + variant "list"; +}; + + +type enumerated Diversion_reason_info_type +{ + int302(302), + int404(404), + int408(408), + int480(480), + int486(486), + int487(487), + int503(503) +} +with { + variant "useNumber"; + variant "name as 'diversion-reason-info-type'"; +}; + + +/* DIVERSION RULE INFO */ + + +type record Diversion_rule_info_type +{ + record of XSD.String attr optional, + XSD.String diversion_rule +} +with { + variant "name as 'diversion-rule-info-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (diversion_rule) "name as 'diversion-rule'"; +}; + + +/* ORIGINATING USER SELECTION CRITERIA */ + + +type record User_selection_criteria_type +{ + record of XSD.String attr optional, + record of User_info_type user_info_list +} +with { + variant "name as 'user-selection-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (user_info_list) "untagged"; + variant (user_info_list[-]) "name as 'user-info'"; +}; + + +/* DIVERSION REASON SELECTION CRITERIA */ + + +type record Diversion_reason_selection_criteria_type +{ + record of XSD.String attr optional, + Diversion_reason_info_types diversion_reason_info +} +with { + variant "name as 'diversion-reason-selection-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (diversion_reason_info) "name as 'diversion-reason-info'"; +}; + + +/* TIME RANGE SELECTION CRITERIA */ + + +type record Time_range_selection_criteria_type +{ + record of XSD.String attr optional, + record of Time_range_type time_range_list +} +with { + variant "name as 'time-range-selection-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (time_range_list) "untagged"; + variant (time_range_list[-]) "name as 'time-range'"; +}; + + +/* TIME RANGE INFO */ + + +type record Time_range_type +{ + record of XSD.String attr optional, + XSD.DateTime start_time, + XSD.DateTime end_time +} +with { + variant "name as 'time-range-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (start_time) "name as 'start-time'"; + variant (end_time) "name as 'end-time'"; +}; + + +/* PRESENCE STATUS SELECTION CRITERIA */ + + +type record Presence_status_selection_criteria_type +{ + record of XSD.String attr optional, + record of Presence_status_info_type presence_status_info_list +} +with { + variant "name as 'presence-status-selection-criteria-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (presence_status_info_list) "untagged"; + variant (presence_status_info_list[-]) "name as 'presence-status-info'"; +}; + + +/* PRESENCE STATUS INFo */ + + +type record Presence_status_info_type +{ + record of XSD.String attr optional, + XSD.String presence_status +} +with { + variant "name as 'presence-status-info-type'"; + variant (attr) "anyAttributes except unqualified, 'http://uri.etsi.org/ngn/params/xml/comm-div-info'"; + variant (presence_status) "name as 'presence-status'"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'http://uri.etsi.org/ngn/params/xml/comm-div-info' prefix 'tns'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_mcid.ttcn b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_mcid.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..050f79154249d52cbe72e60b41e741bca888381e --- /dev/null +++ b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_mcid.ttcn @@ -0,0 +1,105 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: http_uri_etsi_org_ngn_params_xml_simservs_mcid.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - MCID.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/mcid" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module http_uri_etsi_org_ngn_params_xml_simservs_mcid { + + +import from XSD all; + + +/* XML Schema Definition to the mcid request-response to the Malicious Communication */ +/* Identification simulation service */ + + +/* Definition of simple types */ + + +type XSD.String BitType (pattern "[0-1]") +with { + variant "name as uncapitalized"; +}; + + +/* Definition of complex types */ + + +type record RequestType +{ + BitType mcidRequestIndicator, + BitType holdingIndicator +} +with { + variant "name as uncapitalized"; + variant (mcidRequestIndicator) "name as capitalized"; + variant (holdingIndicator) "name as capitalized"; +}; + + +type record ResponseType +{ + BitType mcidResponseIndicator, + BitType holdingProvidedIndicator +} +with { + variant "name as uncapitalized"; + variant (mcidResponseIndicator) "name as capitalized"; + variant (holdingProvidedIndicator) "name as capitalized"; +}; + + +/* Definition of document structure */ + + +type record Mcid +{ + union { + RequestType request, + ResponseType response + } choice +} +with { + variant "name as uncapitalized"; + variant "element"; + variant (choice) "untagged"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'http://uri.etsi.org/ngn/params/xml/simservs/mcid'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_pstn.ttcn b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_pstn.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..3d6f1fdeea7a208db46f8b05bb66adccf5c42df5 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_pstn.ttcn @@ -0,0 +1,689 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: http_uri_etsi_org_ngn_params_xml_simservs_pstn.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - PSTN.xsd +// /* xml version = "1.0" encoding = "UTF-8" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/pstn" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module http_uri_etsi_org_ngn_params_xml_simservs_pstn { + + +import from XSD all; + + +/* XML Schema definition for mapping of some PSTN into SIP MIME Bodies */ + + +/* Definition of simple types */ + + +type XSD.String OneBitType (pattern "[0-1]"); + + +type XSD.String TwoBitType (pattern "[0-1][0-1]"); + + +type XSD.String ThreeBitType (pattern "[0-1][0-1][0-1]"); + + +type XSD.String FourBitType (pattern "[0-1][0-1][0-1][0-1]"); + + +type XSD.String FiveBitType (pattern "[0-1][0-1][0-1][0-1][0-1]"); + + +type XSD.String SixBitType (pattern "[0-1][0-1][0-1][0-1][0-1][0-1]"); + + +type XSD.String SevenBitType (pattern "[0-1][0-1][0-1][0-1][0-1][0-1][0-1]"); + + +/* Definition of complex types */ + + +/* Definition of BearerCapability Octets */ + + +type record BCOctet3Type +{ + TwoBitType codingStandard, + FiveBitType informationTransferCabability +} +with { + variant (codingStandard) "name as capitalized"; + variant (informationTransferCabability) "name as capitalized"; +}; + + +type record BCOctet4Type +{ + TwoBitType transferMode, + FiveBitType informationTransferRate +} +with { + variant (transferMode) "name as capitalized"; + variant (informationTransferRate) "name as capitalized"; +}; + + +type record BCOctet4_1Type +{ + SevenBitType rateMultiplier +} +with { + variant "name as 'BCOctet4-1Type'"; + variant (rateMultiplier) "name as capitalized"; +}; + + +type record BCOctet5Type +{ + TwoBitType layer1Identification, + FiveBitType userInfoLayer1Protocol +} +with { + variant (layer1Identification) "name as capitalized"; + variant (userInfoLayer1Protocol) "name as capitalized"; +}; + + +type record BCOctet5aType +{ + OneBitType synchronousAsynchronous, + OneBitType negotiation, + FiveBitType userRate +} +with { + variant (synchronousAsynchronous) "name as capitalized"; + variant (negotiation) "name as capitalized"; + variant (userRate) "name as capitalized"; +}; + + +type record BCOctet5bV110Type +{ + TwoBitType intermediateRate, + OneBitType nIConTX, + OneBitType nIConRX, + OneBitType flowControlOnTX, + OneBitType flowControlOnRX +} +with { + variant (intermediateRate) "name as capitalized"; + variant (nIConTX) "name as capitalized"; + variant (nIConRX) "name as capitalized"; + variant (flowControlOnTX) "name as capitalized"; + variant (flowControlOnRX) "name as capitalized"; +}; + + +type record BCOctet5bV120Type +{ + OneBitType rateAdaptionHeader, + OneBitType multipleFrameEstablishmentSupport, + OneBitType modeOfOperation, + OneBitType logicalLinkIdentifier, + OneBitType assignor, + OneBitType inbandOutbandNegotiation +} +with { + variant (rateAdaptionHeader) "name as capitalized"; + variant (multipleFrameEstablishmentSupport) "name as capitalized"; + variant (modeOfOperation) "name as capitalized"; + variant (logicalLinkIdentifier) "name as capitalized"; + variant (assignor) "name as capitalized"; + variant (inbandOutbandNegotiation) "name as capitalized"; +}; + + +type record BCOctet5cType +{ + TwoBitType numberOfStopBits, + TwoBitType numberOfDataBits, + ThreeBitType parity +} +with { + variant (numberOfStopBits) "name as capitalized"; + variant (numberOfDataBits) "name as capitalized"; + variant (parity) "name as capitalized"; +}; + + +type record BCOctet5dType +{ + OneBitType duplexMode, + SixBitType modemType +} +with { + variant (duplexMode) "name as capitalized"; + variant (modemType) "name as capitalized"; +}; + + +type record BCOctet6Type +{ + TwoBitType layer2Identification, + FiveBitType userInfoLayer2Protocol +} +with { + variant (layer2Identification) "name as capitalized"; + variant (userInfoLayer2Protocol) "name as capitalized"; +}; + + +type record BCOctet7Type +{ + TwoBitType layer3Identification, + FiveBitType userInfoLayer3Protocol +} +with { + variant (layer3Identification) "name as capitalized"; + variant (userInfoLayer3Protocol) "name as capitalized"; +}; + + +type record BCOctet7aType +{ + FourBitType additionalLayer3Info +} +with { + variant (additionalLayer3Info) "name as capitalized"; +}; + + +type record BCOctet7bType +{ + FourBitType additionalLayer3Info +} +with { + variant (additionalLayer3Info) "name as capitalized"; +}; + + +/* Definition of High Layer Compatibility Octets */ + + +type record HLOctet3Type +{ + TwoBitType codingStandard, + ThreeBitType interpretation, + TwoBitType presentationMethod +} +with { + variant (codingStandard) "name as capitalized"; + variant (interpretation) "name as capitalized"; + variant (presentationMethod) "name as capitalized"; +}; + + +type record HLOctet4Type +{ + SevenBitType highLayerCharacteristics +} +with { + variant (highLayerCharacteristics) "name as capitalized"; +}; + + +type record HLOctet4aMaintenanceType +{ + SevenBitType highLayerCharacteristics +} +with { + variant (highLayerCharacteristics) "name as capitalized"; +}; + + +type record HLOctet4aAudioType +{ + SevenBitType videoTelephonyCharacteristics +} +with { + variant (videoTelephonyCharacteristics) "name as capitalized"; +}; + + +/* Definition of Low Layer Compatibility Octets */ + + +type record LLOctet3Type +{ + TwoBitType codingStandard, + FiveBitType informationTransferCapability +} +with { + variant (codingStandard) "name as capitalized"; + variant (informationTransferCapability) "name as capitalized"; +}; + + +type record LLOctet3aType +{ + OneBitType negotiationIndicator +} +with { + variant (negotiationIndicator) "name as capitalized"; +}; + + +type record LLOctet4Type +{ + TwoBitType transferMode, + FiveBitType informationTransferRate +} +with { + variant (transferMode) "name as capitalized"; + variant (informationTransferRate) "name as capitalized"; +}; + + +type record LLOctet4_1Type +{ + SevenBitType rateMultiplier +} +with { + variant "name as 'LLOctet4-1Type'"; + variant (rateMultiplier) "name as capitalized"; +}; + + +type record LLOctet5Type +{ + TwoBitType layer1Identification, + FiveBitType userInfoLayer1Protocol +} +with { + variant (layer1Identification) "name as capitalized"; + variant (userInfoLayer1Protocol) "name as capitalized"; +}; + + +type record LLOctet5aType +{ + OneBitType synchronousAsynchronous, + OneBitType negotiation, + FiveBitType userRate +} +with { + variant (synchronousAsynchronous) "name as capitalized"; + variant (negotiation) "name as capitalized"; + variant (userRate) "name as capitalized"; +}; + + +type record LLOctet5bV110Type +{ + TwoBitType intermediateRate, + OneBitType nIConTX, + OneBitType nIConRX, + OneBitType flowControlOnTX, + OneBitType flowControlOnRX +} +with { + variant (intermediateRate) "name as capitalized"; + variant (nIConTX) "name as capitalized"; + variant (nIConRX) "name as capitalized"; + variant (flowControlOnTX) "name as capitalized"; + variant (flowControlOnRX) "name as capitalized"; +}; + + +type record LLOctet5bV120Type +{ + OneBitType rateAdaptionHeader, + OneBitType multipleFrameEstablishmentSupport, + OneBitType modeOfOperation, + OneBitType logicalLinkIdentifier, + OneBitType assignor, + OneBitType inbandOutbandNegotiation +} +with { + variant (rateAdaptionHeader) "name as capitalized"; + variant (multipleFrameEstablishmentSupport) "name as capitalized"; + variant (modeOfOperation) "name as capitalized"; + variant (logicalLinkIdentifier) "name as capitalized"; + variant (assignor) "name as capitalized"; + variant (inbandOutbandNegotiation) "name as capitalized"; +}; + + +type record LLOctet5cType +{ + TwoBitType numberOfStopBits, + TwoBitType numberOfDataBits, + ThreeBitType parity +} +with { + variant (numberOfStopBits) "name as capitalized"; + variant (numberOfDataBits) "name as capitalized"; + variant (parity) "name as capitalized"; +}; + + +type record LLOctet5dType +{ + OneBitType duplexMode, + SixBitType modemType +} +with { + variant (duplexMode) "name as capitalized"; + variant (modemType) "name as capitalized"; +}; + + +type record LLOctet6Type +{ + TwoBitType layer2Identification, + FiveBitType userInfoLayer2Protocol +} +with { + variant (layer2Identification) "name as capitalized"; + variant (userInfoLayer2Protocol) "name as capitalized"; +}; + + +type record LLOctet6aHDLCType +{ + TwoBitType mode +} +with { + variant (mode) "name as capitalized"; +}; + + +type record LLOctet6aUserSpecificType +{ + SevenBitType userSpecificLayer2Information +} +with { + variant (userSpecificLayer2Information) "name as capitalized"; +}; + + +type record LLOctet6bType +{ + SevenBitType windowSize +} +with { + variant (windowSize) "name as capitalized"; +}; + + +type record LLOctet7Type +{ + TwoBitType layer3Identification, + FiveBitType userInfoLayer3Protocol +} +with { + variant (layer3Identification) "name as capitalized"; + variant (userInfoLayer3Protocol) "name as capitalized"; +}; + + +type record LLOctet7aUserSpecificType +{ + SevenBitType optionalLayer3Information +} +with { + variant (optionalLayer3Information) "name as capitalized"; +}; + + +type record LLOctet7aX25Type +{ + TwoBitType mode +} +with { + variant (mode) "name as capitalized"; +}; + + +type record LLOctet7bX25Type +{ + FourBitType defaultPacketSize +} +with { + variant (defaultPacketSize) "name as capitalized"; +}; + + +type record LLOctet7cType +{ + SevenBitType packetWindowSize +} +with { + variant (packetWindowSize) "name as capitalized"; +}; + + +type record LLOctet7aTR9577Type +{ + FourBitType additionalLayer3Info +} +with { + variant (additionalLayer3Info) "name as capitalized"; +}; + + +type record LLOctet7bTR9577Type +{ + FourBitType additionalLayer3Info +} +with { + variant (additionalLayer3Info) "name as capitalized"; +}; + + +type record DispOctet3Type +{ + SevenBitType displayInformation +} +with { + variant (displayInformation) "name as capitalized"; +}; + + +/* Definition of the information elements */ + + +type record BearerCapabilityType +{ + BCOctet3Type bCoctet3, + BCOctet4Type bCoctet4, + BCOctet4_1Type bCoctet4_1 optional, + BCOctet5Type bCoctet5 optional, + BCOctet5aType bCoctet5a optional, + BCOctet5bV110Type bCoctet5bV110 optional, + BCOctet5bV120Type bCoctet5bV120 optional, + BCOctet5cType bCoctet5c optional, + BCOctet5dType bCoctet5d optional, + BCOctet6Type bCoctet6 optional, + BCOctet7Type bCoctet7 optional, + BCOctet7aType bCoctet7a optional, + BCOctet7bType bCoctet7b optional +} +with { + variant (bCoctet3) "name as capitalized"; + variant (bCoctet4) "name as capitalized"; + variant (bCoctet4_1) "name as 'BCoctet4-1'"; + variant (bCoctet5) "name as capitalized"; + variant (bCoctet5a) "name as capitalized"; + variant (bCoctet5bV110) "name as capitalized"; + variant (bCoctet5bV120) "name as capitalized"; + variant (bCoctet5c) "name as capitalized"; + variant (bCoctet5d) "name as capitalized"; + variant (bCoctet6) "name as capitalized"; + variant (bCoctet7) "name as capitalized"; + variant (bCoctet7a) "name as capitalized"; + variant (bCoctet7b) "name as capitalized"; +}; + + +type record HighLayerCompatibilityType +{ + HLOctet3Type hLOctet3, + HLOctet4Type hLOctet4, + HLOctet4aMaintenanceType hLOctet4aMaintenance optional, + HLOctet4aAudioType hLOctet4Audio optional +} +with { + variant (hLOctet3) "name as capitalized"; + variant (hLOctet4) "name as capitalized"; + variant (hLOctet4aMaintenance) "name as capitalized"; + variant (hLOctet4Audio) "name as capitalized"; +}; + + +type record LowLayerCompatibilityType +{ + LLOctet3Type lLOctet3, + LLOctet3aType lLOctet3a optional, + LLOctet4Type lLOctet4, + LLOctet4_1Type lLOctet4_1 optional, + LLOctet5Type lLOctet5 optional, + LLOctet5aType lLOctet5a optional, + LLOctet5bV110Type lLOctet5bV110 optional, + LLOctet5bV120Type lLOctet5bV120 optional, + LLOctet5cType lLOctet5c optional, + LLOctet5dType lLOctet5d optional, + LLOctet6Type lLOctet6 optional, + LLOctet6aHDLCType lLOctet6aHDLC optional, + LLOctet6aUserSpecificType lLOctet6aUserSpecific optional, + LLOctet6bType lLOctet6b optional, + LLOctet7Type lLOctet7, + LLOctet7aUserSpecificType lLOctet7aUserSpecific optional, + LLOctet7aX25Type lLOctet7aX25 optional, + LLOctet7bX25Type lLOctet7bX25 optional, + LLOctet7cType lLOctet7c optional, + LLOctet7aTR9577Type lLOctet7aTR9577 optional, + LLOctet7bTR9577Type lLOctet7bTR9577 optional +} +with { + variant (lLOctet3) "name as capitalized"; + variant (lLOctet3a) "name as capitalized"; + variant (lLOctet4) "name as capitalized"; + variant (lLOctet4_1) "name as 'LLOctet4-1'"; + variant (lLOctet5) "name as capitalized"; + variant (lLOctet5a) "name as capitalized"; + variant (lLOctet5bV110) "name as capitalized"; + variant (lLOctet5bV120) "name as capitalized"; + variant (lLOctet5c) "name as capitalized"; + variant (lLOctet5d) "name as capitalized"; + variant (lLOctet6) "name as capitalized"; + variant (lLOctet6aHDLC) "name as capitalized"; + variant (lLOctet6aUserSpecific) "name as capitalized"; + variant (lLOctet6b) "name as capitalized"; + variant (lLOctet7) "name as capitalized"; + variant (lLOctet7aUserSpecific) "name as capitalized"; + variant (lLOctet7aX25) "name as capitalized"; + variant (lLOctet7bX25) "name as capitalized"; + variant (lLOctet7c) "name as capitalized"; + variant (lLOctet7aTR9577) "name as capitalized"; + variant (lLOctet7bTR9577) "name as capitalized"; +}; + + +type record DisplayType +{ + DispOctet3Type dispOctet3 +} +with { + variant (dispOctet3) "name as capitalized"; +}; + + +/* Definition of progress indicator */ + + +type record ProgressOctet3Type +{ + TwoBitType codingStandard, + FourBitType location +} +with { + variant (codingStandard) "name as capitalized"; + variant (location) "name as capitalized"; +}; + + +type record ProgressOctet4Type +{ + SevenBitType progressDescription +} +with { + variant (progressDescription) "name as capitalized"; +}; + + +type record ProgressIndicatorType +{ + ProgressOctet3Type progressOctet3, + ProgressOctet4Type progressOctet4 +} +with { + variant (progressOctet3) "name as capitalized"; + variant (progressOctet4) "name as capitalized"; +}; + + +/* Definition of document structure */ + + +type record PSTN_transit +{ + record length(1 .. 2) of BearerCapabilityType bearerInfomationElement_list, + record length(0 .. 2) of HighLayerCompatibilityType highLayerCompatibility_list, + LowLayerCompatibilityType lowLayerCompatibility optional, + record of ProgressIndicatorType progressIndicator_list, + record of DisplayType display_list +} +with { + variant "name as 'PSTN-transit'"; + variant "element"; + variant (bearerInfomationElement_list) "untagged"; + variant (bearerInfomationElement_list[-]) "name as 'BearerInfomationElement'"; + variant (highLayerCompatibility_list) "untagged"; + variant (highLayerCompatibility_list[-]) "name as 'HighLayerCompatibility'"; + variant (lowLayerCompatibility) "name as capitalized"; + variant (progressIndicator_list) "untagged"; + variant (progressIndicator_list[-]) "name as 'ProgressIndicator'"; + variant (display_list) "untagged"; + variant (display_list[-]) "name as 'Display'"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'http://uri.etsi.org/ngn/params/xml/simservs/pstn'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_xcap.ttcn b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_xcap.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..230df4ed31db3008125236a22d1fd5132e0c4ffd --- /dev/null +++ b/ttcn/patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_xcap.ttcn @@ -0,0 +1,621 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: http_uri_etsi_org_ngn_params_xml_simservs_xcap.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - ACR_CB.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +// - CDIV.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +// - OIP-OIR.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +// - SupplementaryServices.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +// - TIP-TIR.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +// - cug.xsd +// /* xml version = "1.0" encoding = "UTF-8" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +// - simservs.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://uri.etsi.org/ngn/params/xml/simservs/xcap" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module http_uri_etsi_org_ngn_params_xml_simservs_xcap { + + +import from XSD all; + + +import from urn_ietf_params_xml_ns_common_policy all; + + +import from urn_oma_xml_xdm_common_policy all; + + +/* import common policy definitions */ + + +/* import OMA common policy extensions */ + + +/* incoming communication barring rule set based on the common policy rule set. */ + + +/* This is the incoming communication barring configuration */ +/* document. */ +/* add service specific elements here */ +/* service specific attributes can be defined here */ +type record Incoming_communication_barring +{ + XSD.Boolean active optional, + record of XSD.String attr optional, + Ruleset ruleset optional +} +with { + variant "name as 'incoming-communication-barring'"; + variant "element"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; + variant (ruleset) "namespace as 'urn:ietf:params:xml:ns:common-policy' prefix 'cp'"; +}; + + +/* outgoing communication barring rule set based on the common policy rule set. */ + + +/* This is the outgoing communication barring configuration */ +/* document. */ +/* add service specific elements here */ +/* service specific attributes can be defined here */ +type record Outgoing_communication_barring +{ + XSD.Boolean active optional, + record of XSD.String attr optional, + Ruleset ruleset optional +} +with { + variant "name as 'outgoing-communication-barring'"; + variant "element"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; + variant (ruleset) "namespace as 'urn:ietf:params:xml:ns:common-policy' prefix 'cp'"; +}; + + +/* communication barring specific extensions to IETF common policy actions */ + + +type Allow_action_type Allow +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +/* communication barring specific type declarations */ + + +/* */ + + +type XSD.Boolean Allow_action_type +with { + variant "name as 'allow-action-type'"; + //variant "text 'true' as '1'"; + //variant "text 'false' as '0'"; +}; + + +/* import common policy definitions */ + + +/* import OMA common policy extensions */ + + +/* communication diversion specific extensions to IETF common policy conditions. The +cp:conditionsType is expanded with the elements: ss:not-registered, ss:busy, ss:no-answer, ss:notreachable, +ss:media as optional elements */ + + +/* communication diversion rule set based on the common policy rule set. */ + + +/* This is the communication diversion configuration */ +/* document. */ +/* add service specific elements here */ +/* service specific attributes can be defined here */ +type record Communication_diversion +{ + XSD.Boolean active optional, + record of XSD.String attr optional, + Ruleset ruleset optional +} +with { + variant "name as 'communication-diversion'"; + variant "element"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; + variant (ruleset) "namespace as 'urn:ietf:params:xml:ns:common-policy' prefix 'cp'"; +}; + + +/* communication diversion specific extensions to IETF common policy actions */ + + +type Forward_to_type Forward_to +with { + variant "name as 'forward-to'"; + variant "element"; +}; + + +type enumerated Reveal_URIoptions_type +{ + false_, + not_reveal_GRUU, + true_ +} +with { + variant "text 'false_' as 'false'"; + variant "text 'not_reveal_GRUU' as 'not-reveal-GRUU'"; + variant "text 'true_' as 'true'"; + variant "name as 'reveal-URIoptions-type'"; +}; + + +/* communication diversion specific type declarations */ + + +type record Forward_to_type +{ + XSD.AnyURI target, + XSD.Boolean notify_caller optional, + Reveal_URIoptions_type reveal_identity_to_caller optional, + Reveal_URIoptions_type reveal_served_user_identity_to_caller optional, + XSD.Boolean notify_served_user optional, + XSD.Boolean notify_served_user_on_outbound_call optional, + Reveal_URIoptions_type reveal_identity_to_target optional, + NoReplyTimer noReplyTimer optional +} +with { + variant "name as 'forward-to-type'"; + variant (notify_caller) "name as 'notify-caller'"; + variant (notify_caller) "defaultForEmpty as 'true'"; + //variant (notify_caller) "text 'true' as '1'"; + //variant (notify_caller) "text 'false' as '0'"; + variant (reveal_identity_to_caller) "name as 'reveal-identity-to-caller'"; + variant (reveal_identity_to_caller) "defaultForEmpty as 'true'"; + variant (reveal_served_user_identity_to_caller) "name as 'reveal-served-user-identity-to-caller'"; + variant (reveal_served_user_identity_to_caller) "defaultForEmpty as 'true'"; + variant (notify_served_user) "name as 'notify-served-user'"; + variant (notify_served_user) "defaultForEmpty as 'false'"; + //variant (notify_served_user) "text 'true' as '1'"; + //variant (notify_served_user) "text 'false' as '0'"; + variant (notify_served_user_on_outbound_call) "name as 'notify-served-user-on-outbound-call'"; + variant (notify_served_user_on_outbound_call) "defaultForEmpty as 'false'"; + //variant (notify_served_user_on_outbound_call) "text 'true' as '1'"; + //variant (notify_served_user_on_outbound_call) "text 'false' as '0'"; + variant (reveal_identity_to_target) "name as 'reveal-identity-to-target'"; + variant (reveal_identity_to_target) "defaultForEmpty as 'true'"; + variant (noReplyTimer) "name as capitalized"; +}; + + +type XSD.PositiveInteger NoReplyTimer (5 .. 180) +with { + variant "element"; +}; + + +/* Originating Identity presentation Restriction */ +type record Originating_identity_presentation_restriction +{ + XSD.Boolean active optional, + record of XSD.String attr optional, + enumerated { + presentation_restricted, + presentation_not_restricted + } default_behaviour optional +} +with { + variant "name as 'originating--identity--presentation--restriction'"; + variant "element"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; + variant (default_behaviour) "name as 'default--behaviour'"; + variant (default_behaviour) "defaultForEmpty as 'presentation--restricted'"; + variant (default_behaviour) "text 'presentation_not_restricted' as 'presentation--not--restricted'"; + variant (default_behaviour) "text 'presentation_restricted' as 'presentation--restricted'"; +}; + + +/* Originating Identity Presentation */ +type SimservType Originating_identity_presentation +with { + variant "name as 'originating--identity--presentation'"; + variant "element"; +}; + + +/* Terminating Identity presentation Restriction */ +type record Terminating_identity_presentation_restriction +{ + XSD.Boolean active optional, + record of XSD.String attr optional, + enumerated { + presentation_restricted, + presentation_not_restricted + } default_behaviour optional +} +with { + variant "name as 'terminating-identity-presentation-restriction'"; + variant "element"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; + variant (default_behaviour) "name as 'default-behaviour'"; + variant (default_behaviour) "defaultForEmpty as 'presentation-restricted'"; + variant (default_behaviour) "text 'presentation_not_restricted' as 'presentation-not-restricted'"; + variant (default_behaviour) "text 'presentation_restricted' as 'presentation-restricted'"; +}; + + +/* Terminating Identity Presentation */ +type SimservType Terminating_identity_presentation +with { + variant "name as 'terminating-identity-presentation'"; + variant "element"; +}; + + +/* XML Schema Definition for the closed user group */ +/* parameter */ + + +/* Definition of simple types */ + + +type XSD.String TwobitType (pattern "[0-1][0-1]") +with { + variant "name as uncapitalized"; +}; + + +type XSD.HexBinary NetworkIdentityType length(1) +with { + variant "name as uncapitalized"; +}; + + +type XSD.HexBinary SixteenbitType length(2) +with { + variant "name as uncapitalized"; +}; + + +type XSD.Integer CugIndexType (0 .. 32767) +with { + variant "name as uncapitalized"; +}; + + +/* Definition of complex types */ + + +type record CugRequestType +{ + XSD.Boolean outgoingAccessRequest, + CugIndexType cugIndex +} +with { + variant "name as uncapitalized"; + //variant (outgoingAccessRequest) "text 'true' as '1'"; + //variant (outgoingAccessRequest) "text 'false' as '0'"; +}; + + +/* Definition of document structure */ + + +type record Cug +{ + XSD.Boolean active optional, + record of XSD.String attr optional, + CugRequestType cugCallOperation optional, + NetworkIdentityType networkIndicator optional, + SixteenbitType cugInterlockBinaryCode optional, + TwobitType cugCommunicationIndicator optional +} +with { + variant "name as uncapitalized"; + variant "element"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; +}; + + +/* The element "simservs" maps to the Common Parts of an NGN PSTN/ISDN Simulation services document */ + + +/* XML Schema for data manipulation of ETSI */ +/* NGN PSTN/ISDN Simulation Services */ +/* xs:group ref="ss:absServiceGroup" minOccurs="0" maxOccurs="unbounded" / */ +type record Simservs +{ + record of XSD.String attr optional, + record of AbsService_group absService_list, + record { + record of XSD.String elem_list + } extensions optional +} +with { + variant "name as uncapitalized"; + variant "element"; + variant (attr) "anyAttributes"; + variant (absService_list) "untagged"; + variant (extensions.elem_list) "untagged"; + variant (extensions.elem_list[-]) "anyElement except unqualified, 'http://uri.etsi.org/ngn/params/xml/simservs/xcap'"; +}; + + +type record SimservType +{ + XSD.Boolean active optional, + record of XSD.String attr optional +} +with { + variant "name as uncapitalized"; + variant (active) "defaultForEmpty as 'true'"; + variant (active) "attribute"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + variant (attr) "anyAttributes"; +}; + + +/* service specific IETF common policy condition elements */ + + +type Empty_element_type Anonymous +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type Presence_status_activity_type Presence_status +with { + variant "name as 'presence-status'"; + variant "element"; +}; + + +type Media_type1 Media +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type Empty_element_type Communication_diverted +with { + variant "name as 'communication-diverted'"; + variant "element"; +}; + + +type Empty_element_type Rule_deactivated +with { + variant "name as 'rule-deactivated'"; + variant "element"; +}; + + +type Empty_element_type Not_registered +with { + variant "name as 'not-registered'"; + variant "element"; +}; + + +type Empty_element_type Busy +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type Empty_element_type No_answer +with { + variant "name as 'no-answer'"; + variant "element"; +}; + + +type Empty_element_type Not_reachable +with { + variant "name as 'not-reachable'"; + variant "element"; +}; + + +type Empty_element_type Roaming +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +/* service specific type declarations */ + + +type XSD.String Media_type1 +with { + variant "name as 'media-type1'"; +}; + + +type XSD.String Presence_status_activity_type +with { + variant "name as 'presence-status-activity-type'"; +}; + + +type record Empty_element_type +{ + +} +with { + variant "name as 'empty-element-type'"; +}; + + +/* ETSI substitutionGroup workaround, because TTCN-3 does not support mapping of substitutionGroup */ + + +/* xs:group name="absServiceGroup"> + + + + */ + + +/* /xs:choice */ + + +/* /xs:group */ + + +type union AbsService_group +{ + SimservType absService, + /* This is the communication diversion configuration */ + /* document. */ + /* add service specific elements here */ + /* service specific attributes can be defined here */ + Communication_diversion communication_diversion, + Cug cug, + /* This is the incoming communication barring configuration */ + /* document. */ + /* add service specific elements here */ + /* service specific attributes can be defined here */ + Incoming_communication_barring incoming_communication_barring, + /* Originating Identity Presentation */ + Originating_identity_presentation originating_identity_presentation, + /* Originating Identity presentation Restriction */ + Originating_identity_presentation_restriction originating_identity_presentation_restriction, + /* This is the outgoing communication barring configuration */ + /* document. */ + /* add service specific elements here */ + /* service specific attributes can be defined here */ + Outgoing_communication_barring outgoing_communication_barring, + /* Terminating Identity Presentation */ + Terminating_identity_presentation terminating_identity_presentation, + /* Terminating Identity presentation Restriction */ + Terminating_identity_presentation_restriction terminating_identity_presentation_restriction +} +with { + variant "untagged"; + variant (absService) "form as qualified"; + variant (absService) "abstract"; + variant (communication_diversion) "name as 'communication-diversion'"; + variant (incoming_communication_barring) "name as 'incoming-communication-barring'"; + variant (originating_identity_presentation) "name as 'originating--identity--presentation'"; + variant (originating_identity_presentation_restriction) "name as 'originating--identity--presentation--restriction'"; + variant (outgoing_communication_barring) "name as 'outgoing-communication-barring'"; + variant (terminating_identity_presentation) "name as 'terminating-identity-presentation'"; + variant (terminating_identity_presentation_restriction) "name as 'terminating-identity-presentation-restriction'"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'http://uri.etsi.org/ngn/params/xml/simservs/xcap' prefix 'ss'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/http_www_opengis_net_gml.ttcn b/ttcn/patch_lib_sip_titan/http_www_opengis_net_gml.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..169c8c830fc35fd091f93590ba244d68f4862f22 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/http_www_opengis_net_gml.ttcn @@ -0,0 +1,1008 @@ +/******************************************************************************* +* Copyright (c) 2000-2018 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/6 R4A +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: http_www_opengis_net_gml.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Tue Jul 3 08:58:44 2018 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - basicTypes.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/gml" */ +// - gmlBase.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/gml" */ +// - measures.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/gml" */ +// - geometryBasic0d1d.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/gml" */ +// - geometryBasic2d.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/gml" */ +// - geometryPrimitives.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/gml" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module http_www_opengis_net_gml { + + +import from XSD all; + + +/* Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ + + +type enumerated SignType +{ + x, + x_1 +} +with { + variant "text 'x' as '-'"; + variant "text 'x_1' as '+'"; +}; + + +type record of XSD.Boolean BooleanList +with { + variant "name as uncapitalized"; + variant "list"; + //variant "text 'true' as '1'"; + //variant "text 'false' as '0'"; +}; + + +type record of XSD.Name NameList +with { + variant "list"; +}; + + +type record of XSD.Double DoubleList +with { + variant "name as uncapitalized"; + variant "list"; +}; + + +type record of XSD.Integer IntegerList +with { + variant "name as uncapitalized"; + variant "list"; +}; + + +type record MeasureType +{ + XSD.AnyURI uom, + XSD.Double base +} +with { + variant (uom) "attribute"; + variant (base) "untagged"; +}; + + +type record of XSD.NCName NCNameList +with { + variant "list"; +}; + + +/* Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ + + +type record AbstractGMLType +{ + Id id optional +} +with { + variant "abstract"; + variant (id) "attribute"; +}; + + +type XSD.ID Id +with { + variant "name as uncapitalized"; + variant "attribute"; +}; +/* + +type union Object_group +{ + XSD.AnyType object, + GML_group gML +} +with { + variant "untagged"; + variant (object) "name as '_Object'"; + variant (object) "form as qualified"; + variant (object) "abstract"; + variant (gML) "name as '_GML'"; +}; + + +type union GML_group +{ + AbstractGMLType gML, + Geometry_group geometry +} +with { + variant "untagged"; + variant (gML) "name as '_GML'"; + variant (gML) "form as qualified"; + variant (gML) "abstract"; + variant (geometry) "name as '_Geometry'"; +}; + +*/ +/* Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ + + +type MeasureType Measure +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type MeasureType LengthType; + + +type MeasureType Angle +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type MeasureType AngleType; + + +/* Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ +/* + +type record GeometryPropertyType +{ + Geometry_group geometry +} +with { + variant (geometry) "name as '_Geometry'"; +}; + + + +type record GeometryArrayPropertyType +{ + record of Geometry_group geometry_list +} +with { + variant (geometry_list) "untagged"; + variant (geometry_list[-]) "name as '_Geometry'"; +}; +*/ + +type record AbstractGeometryType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional +} +with { + variant "abstract"; + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type AbstractGeometryType AbstractGeometricPrimitiveType +with { + variant "abstract"; +}; + + +type PointType Point +with { + variant "name as 'Point'"; + variant "element"; +}; + + +type record PointType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + Pos pos +} +with { + variant "name as uncapitalized"; + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type PointPropertyType PointProperty +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record PointPropertyType +{ + Point point +} +with { + variant (point) "name as capitalized"; +}; + + +type AbstractGeometricPrimitiveType AbstractCurveType +with { + variant "abstract"; +}; + + +type CurvePropertyType CurveProperty +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record CurvePropertyType +{ + Curve_group curve +} +with { + variant (curve) "name as '_Curve'"; +}; + + +type LineStringType LineString +with { + variant "name as 'LinearRing'"; + variant "element"; +}; + + +type record LineStringType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + union { + record length(2 .. infinity) of union { + Pos pos, + PointProperty pointProperty + } choice_list, + PosList posList + } choice +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; + variant (choice) "untagged"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; +}; + + +type DirectPositionType Pos +with { + variant "name as 'pos'"; + variant "element"; +}; + + +type DoubleList DirectPositionType; + + +type DirectPositionListType PosList +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record DirectPositionListType +{ + XSD.PositiveInteger count optional, + DoubleList base +} +with { + variant (count) "attribute"; + variant (base) "untagged"; +}; + + +type EnvelopeType Envelope +with { + variant "element"; +}; + + +type record EnvelopeType +{ + NCNameList axisLabels optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + union { + record { + DirectPositionType lowerCorner, + DirectPositionType upperCorner + } sequence, + record length(2) of Pos pos_list + } choice +} +with { + variant (axisLabels) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; + variant (choice) "untagged"; + variant (choice.sequence) "untagged"; + variant (choice.pos_list) "untagged"; + variant (choice.pos_list[-]) "name as 'pos'"; +}; + +/* + +type union Geometry_group +{ + AbstractGeometryType geometry, + GeometricPrimitive_group geometricPrimitive, + Ring_group ring +} +with { + variant "untagged"; + variant (geometry) "name as '_Geometry'"; + variant (geometry) "form as qualified"; + variant (geometry) "abstract"; + variant (geometricPrimitive) "name as '_GeometricPrimitive'"; + variant (ring) "name as '_Ring'"; +}; + + +type union GeometricPrimitive_group +{ + AbstractGeometricPrimitiveType geometricPrimitive, + Curve_group curve, + Point point, + Solid_group solid, + Surface_group_1 surface +} +with { + variant "untagged"; + variant (geometricPrimitive) "name as '_GeometricPrimitive'"; + variant (geometricPrimitive) "form as qualified"; + variant (geometricPrimitive) "abstract"; + variant (curve) "name as '_Curve'"; + variant (point) "name as capitalized"; + variant (solid) "name as '_Solid'"; + variant (surface) "name as '_Surface'"; +}; + +*/ +type union Curve_group +{ + AbstractCurveType curve, + Curve curve_1, + LineString lineString +} +with { + variant "untagged"; + variant (curve) "name as '_Curve'"; + variant (curve) "form as qualified"; + variant (curve) "abstract"; + variant (curve_1) "name as 'Curve'"; + variant (lineString) "name as capitalized"; +}; + + +/* Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ + + +type AbstractGeometricPrimitiveType AbstractSurfaceType; + +/* +type SurfacePropertyType SurfaceProperty +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record SurfacePropertyType +{ + Surface_group_1 surface +} +with { + variant (surface) "name as '_Surface'"; +}; + +*/ + + +type PolygonType Polygon +with { + variant "element"; +}; + + +type record PolygonType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + Exterior exterior optional +} +with { + variant "name as 'Polygon'"; + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type AbstractGeometryType AbstractRingType +with { + variant "abstract"; +}; + + +type AbstractRingPropertyType Exterior +with { + variant "name as 'exterior'"; + variant "element"; +}; + + +type record AbstractRingPropertyType +{ + Ring_group ring +} +with { + variant "name as 'exterior'"; + variant (ring) "name as '_Ring'"; +}; + + +type LinearRingType LinearRing +with { + variant "name as 'LinearRing'"; + variant "element"; +}; + + +type record LinearRingType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + union { + record length(4 .. infinity) of union { + Pos pos, + PointProperty pointProperty + } choice_list, + PosList posList + } choice +} +with { + variant "name as 'LinearRing'"; + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; + variant (choice) "untagged"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; + variant (choice.choice_list[-].pos[-]) "name as 'pos'"; +}; + +/* +type union Surface_group_1 +{ + AbstractSurfaceType surface, + ArcBand arcBand, + Circle circle, + Ellipse ellipse, + Polygon polygon, + Surface_group surface_1 +} +with { + variant "untagged"; + variant (surface) "name as '_Surface'"; + variant (surface) "form as qualified"; + variant (surface) "abstract"; + variant (arcBand) "name as capitalized"; + variant (circle) "name as capitalized"; + variant (ellipse) "name as capitalized"; + variant (polygon) "name as capitalized"; + variant (surface_1) "name as 'Surface'"; +}; + +*/ +type union Ring_group +{ + AbstractRingType ring, + LinearRing linearRing +} +with { + variant "untagged"; + variant (ring) "name as '_Ring'"; + variant (ring) "form as qualified"; + variant (ring) "abstract"; + variant (linearRing) "name as capitalized"; +}; + + +const XSD.Integer c_defaultForEmpty_1 := 0; + + +const CurveInterpolationType c_defaultForEmpty_2 := linear; + + +const CurveInterpolationType c_defaultForEmpty_3 := circularArcCenterPointWithRadius; + + +const XSD.Integer c_defaultForEmpty_4 := 1; + + +const SurfaceInterpolationType c_defaultForEmpty_5 := planar; + + +/* Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ + + +type CurveType Curve +with { + variant "element"; +}; + + +type record CurveType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + Segments segments +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type record AbstractCurveSegmentType +{ + XSD.Integer numDerivativeInterior optional, + XSD.Integer numDerivativesAtEnd optional, + XSD.Integer numDerivativesAtStart optional +} +with { + variant "abstract"; + variant (numDerivativeInterior) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativeInterior) "attribute"; + variant (numDerivativesAtEnd) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativesAtEnd) "attribute"; + variant (numDerivativesAtStart) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativesAtStart) "attribute"; +}; + + +type CurveSegmentArrayPropertyType Segments +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record CurveSegmentArrayPropertyType +{ + record of CurveSegment_group curveSegment_list +} +with { + variant (curveSegment_list) "untagged"; + variant (curveSegment_list[-]) "name as '_CurveSegment'"; +}; + + +type LineStringSegmentType LineStringSegment +with { + variant "element"; +}; + + +type record LineStringSegmentType +{ + CurveInterpolationType interpolation (c_defaultForEmpty_2) optional, + XSD.Integer numDerivativeInterior optional, + XSD.Integer numDerivativesAtEnd optional, + XSD.Integer numDerivativesAtStart optional, + union { + record length(2 .. infinity) of union { + Pos pos, + PointProperty pointProperty + } choice_list, + PosList posList + } choice +} +with { + variant (interpolation) "defaultForEmpty as c_defaultForEmpty_2"; + variant (interpolation) "attribute"; + variant (numDerivativeInterior) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativeInterior) "attribute"; + variant (numDerivativesAtEnd) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativesAtEnd) "attribute"; + variant (numDerivativesAtStart) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativesAtStart) "attribute"; + variant (choice) "untagged"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; +}; + + +type record ArcByCenterPointType +{ + CurveInterpolationType interpolation (c_defaultForEmpty_3) optional, + XSD.Integer numArc (c_defaultForEmpty_4), + XSD.Integer numDerivativeInterior optional, + XSD.Integer numDerivativesAtEnd optional, + XSD.Integer numDerivativesAtStart optional, + union { + Pos pos, + PointProperty pointProperty + } choice, + LengthType radius, + AngleType startAngle optional, + AngleType endAngle optional +} +with { + variant (interpolation) "defaultForEmpty as c_defaultForEmpty_3"; + variant (interpolation) "attribute"; + variant (numArc) "defaultForEmpty as c_defaultForEmpty_4"; + variant (numArc) "attribute"; + variant (numDerivativeInterior) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativeInterior) "attribute"; + variant (numDerivativesAtEnd) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativesAtEnd) "attribute"; + variant (numDerivativesAtStart) "defaultForEmpty as c_defaultForEmpty_1"; + variant (numDerivativesAtStart) "attribute"; + variant (choice) "untagged"; +}; + + +type CircleByCenterPointType CircleByCenterPoint +with { + variant "element"; +}; + + +type ArcByCenterPointType CircleByCenterPointType; + + +type record SurfaceType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + Patches_group patches +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type record AbstractSurfacePatchType +{ + +} +with { + variant "abstract"; +}; + + +type record SurfacePatchArrayPropertyType +{ + record of record { + SurfacePatch_group surfacePatch + } sequence_list +} +with { + variant (sequence_list) "untagged"; + variant (sequence_list[-]) "untagged"; + variant (sequence_list[-].surfacePatch) "name as '_SurfacePatch'"; +}; + + +type PolygonPatchType PolygonPatch +with { + variant "element"; +}; + + +type record PolygonPatchType +{ + SurfaceInterpolationType interpolation (c_defaultForEmpty_5) optional, + Exterior exterior optional +} +with { + variant (interpolation) "defaultForEmpty as c_defaultForEmpty_5"; + variant (interpolation) "attribute"; +}; + + +type RectangleType Rectangle +with { + variant "element"; +}; + + +type record RectangleType +{ + SurfaceInterpolationType interpolation (c_defaultForEmpty_5) optional, + Exterior exterior +} +with { + variant (interpolation) "defaultForEmpty as c_defaultForEmpty_5"; + variant (interpolation) "attribute"; +}; + + +type PolyhedralSurfaceType PolyhedralSurface +with { + variant "element"; +}; + + +type record PolyhedralSurfaceType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type PolygonPatchArrayPropertyType PolygonPatches +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type SurfacePatchArrayPropertyType PolygonPatchArrayPropertyType; + + +type AbstractGeometricPrimitiveType AbstractSolidType; + +/* +type SolidType Solid +with { + variant "element"; +}; + + +type record SolidType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + SurfacePropertyType exterior optional +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + +*/ +type enumerated CurveInterpolationType +{ + circularArc3Points, + circularArcCenterPointWithRadius, + geodesic, + linear +}; + + +type enumerated SurfaceInterpolationType +{ + planar +}; + + +type union CurveSegment_group +{ + AbstractCurveSegmentType curveSegment, + ArcByCenterPoint_group arcByCenterPoint, + LineStringSegment lineStringSegment +} +with { + variant "untagged"; + variant (curveSegment) "name as '_CurveSegment'"; + variant (curveSegment) "form as qualified"; + variant (curveSegment) "abstract"; + variant (arcByCenterPoint) "name as capitalized"; + variant (lineStringSegment) "name as capitalized"; +}; + + +type union ArcByCenterPoint_group +{ + ArcByCenterPointType arcByCenterPoint, + CircleByCenterPoint circleByCenterPoint +} +with { + variant "untagged"; + variant (arcByCenterPoint) "name as capitalized"; + variant (arcByCenterPoint) "form as qualified"; + variant (circleByCenterPoint) "name as capitalized"; +}; + + +type union SurfacePatch_group +{ + AbstractSurfacePatchType surfacePatch, + PolygonPatch polygonPatch, + Rectangle rectangle +} +with { + variant "untagged"; + variant (surfacePatch) "name as '_SurfacePatch'"; + variant (surfacePatch) "form as qualified"; + variant (surfacePatch) "abstract"; + variant (polygonPatch) "name as capitalized"; + variant (rectangle) "name as capitalized"; +}; + + +type union Surface_group +{ + SurfaceType surface, + PolyhedralSurface polyhedralSurface +} +with { + variant "untagged"; + variant (surface) "name as capitalized"; + variant (surface) "form as qualified"; + variant (polyhedralSurface) "name as capitalized"; +}; + + +type union Patches_group +{ + SurfacePatchArrayPropertyType patches, + PolygonPatches polygonPatches +} +with { + variant "untagged"; + variant (patches) "form as qualified"; +}; + +/* +type union Solid_group +{ + AbstractSolidType solid, + Ellipsoid ellipsoid, + Prism prism, + Solid solid_1, + Sphere sphere +} +with { + variant "untagged"; + variant (solid) "name as '_Solid'"; + variant (solid) "form as qualified"; + variant (solid) "abstract"; + variant (ellipsoid) "name as capitalized"; + variant (prism) "name as capitalized"; + variant (solid_1) "name as 'Solid'"; + variant (sphere) "name as capitalized"; +}; +*/ + +} +with { + encode "XML"; + variant "namespace as 'http://www.opengis.net/gml' prefix 'gml'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/http_www_opengis_net_pidflo_1_0.ttcn b/ttcn/patch_lib_sip_titan/http_www_opengis_net_pidflo_1_0.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..dbdcb7d542eff17e90cac78e430783e1331df964 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/http_www_opengis_net_pidflo_1_0.ttcn @@ -0,0 +1,409 @@ +/******************************************************************************* +* Copyright (c) 2000-2018 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/6 R4A +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: http_www_opengis_net_pidflo_1_0.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Tue Jul 3 08:58:44 2018 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - GML-pidf-lo-shape.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "http://www.opengis.net/pidflo/1.0" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module http_www_opengis_net_pidflo_1_0 { + + +import from XSD all; + + +import from http_www_opengis_net_gml all; + + +/* This document defines geodetic shape types for PIDF-LO. + + Copyright (c) 2007,2009 Open Geospatial Consortium. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . */ + + +type CircleType Circle +with { + variant "name as 'Circle'"; + variant "element"; +}; + + +type record CircleType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + CenterGroup centerGroup, + LengthType radius +} +with { + variant "name as uncapitalized"; + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type EllipseType Ellipse +with { + variant "element"; +}; + + +type record EllipseType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + CenterGroup centerGroup, + LengthType semiMajorAxis, + LengthType semiMinorAxis, + AngleType orientation +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type ArcBandType ArcBand +with { + variant "element"; +}; + + +type record ArcBandType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + CenterGroup centerGroup, + LengthType innerRadius, + LengthType outerRadius, + AngleType startAngle, + AngleType openingAngle +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type PrismType Prism +with { + variant "element"; +}; + + +type record PrismType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + SurfacePropertyType base, + LengthType height +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type SphereType Sphere +with { + variant "element"; +}; + + +type record SphereType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + CenterGroup centerGroup, + LengthType radius +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type EllipsoidType Ellipsoid +with { + variant "element"; +}; + + +type record EllipsoidType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + CenterGroup centerGroup, + LengthType semiMajorAxis, + LengthType semiMinorAxis, + LengthType verticalAxis, + AngleType orientation +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type union CenterGroup +{ + Pos pos, + PointProperty pointProperty +} +with { + variant "untagged"; + variant (pos) "namespace as 'http://www.opengis.net/gml' prefix 'gml'"; + variant (pointProperty) "namespace as 'http://www.opengis.net/gml' prefix 'gml'"; +}; + + + + + +type union Object_group +{ + XSD.AnyType object, + GML_group gML +} +with { + variant "untagged"; + variant (object) "name as '_Object'"; + variant (object) "form as qualified"; + variant (object) "abstract"; + variant (gML) "name as '_GML'"; +}; + + +type union GML_group +{ + AbstractGMLType gML, + Geometry_group geometry +} +with { + variant "untagged"; + variant (gML) "name as '_GML'"; + variant (gML) "form as qualified"; + variant (gML) "abstract"; + variant (geometry) "name as '_Geometry'"; +}; + + +type record GeometryPropertyType +{ + Geometry_group geometry +} +with { + variant (geometry) "name as '_Geometry'"; +}; + + +type record GeometryArrayPropertyType +{ + record of Geometry_group geometry_list +} +with { + variant (geometry_list) "untagged"; + variant (geometry_list[-]) "name as '_Geometry'"; +}; + +type union Geometry_group +{ + AbstractGeometryType geometry, + GeometricPrimitive_group geometricPrimitive, + Ring_group ring +} +with { + variant "untagged"; + variant (geometry) "name as '_Geometry'"; + variant (geometry) "form as qualified"; + variant (geometry) "abstract"; + variant (geometricPrimitive) "name as '_GeometricPrimitive'"; + variant (ring) "name as '_Ring'"; +}; + + +type union GeometricPrimitive_group +{ + AbstractGeometricPrimitiveType geometricPrimitive, + Curve_group curve, + Point point, + Solid_group solid, + Surface_group_1 surface +} +with { + variant "untagged"; + variant (geometricPrimitive) "name as '_GeometricPrimitive'"; + variant (geometricPrimitive) "form as qualified"; + variant (geometricPrimitive) "abstract"; + variant (curve) "name as '_Curve'"; + variant (point) "name as capitalized"; + variant (solid) "name as '_Solid'"; + variant (surface) "name as '_Surface'"; +}; + +type SolidType Solid +with { + variant "element"; +}; + + +type record SolidType +{ + NCNameList axisLabels optional, + XSD.String gid optional, + Id id optional, + XSD.PositiveInteger srsDimension optional, + XSD.AnyURI srsName optional, + NCNameList uomLabels optional, + SurfacePropertyType exterior optional +} +with { + variant (axisLabels) "attribute"; + variant (gid) "attribute"; + variant (id) "attribute"; + variant (srsDimension) "attribute"; + variant (srsName) "attribute"; + variant (uomLabels) "attribute"; +}; + + +type union Solid_group +{ + AbstractSolidType solid, + Ellipsoid ellipsoid, + Prism prism, + Solid solid_1, + Sphere sphere +} +with { + variant "untagged"; + variant (solid) "name as '_Solid'"; + variant (solid) "form as qualified"; + variant (solid) "abstract"; + variant (ellipsoid) "name as capitalized"; + variant (prism) "name as capitalized"; + variant (solid_1) "name as 'Solid'"; + variant (sphere) "name as capitalized"; +}; + + +type SurfacePropertyType SurfaceProperty +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record SurfacePropertyType +{ + Surface_group_1 surface +} +with { + variant (surface) "name as '_Surface'"; +}; + + +type union Surface_group_1 +{ + AbstractSurfaceType surface, + ArcBand arcBand, + Circle circle, + Ellipse ellipse, + Polygon polygon, + Surface_group surface_1 +} +with { + variant "untagged"; + variant (surface) "name as '_Surface'"; + variant (surface) "form as qualified"; + variant (surface) "abstract"; + variant (arcBand) "name as capitalized"; + variant (circle) "name as capitalized"; + variant (ellipse) "name as capitalized"; + variant (polygon) "name as capitalized"; + variant (surface_1) "name as 'Surface'"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'http://www.opengis.net/pidflo/1.0' prefix 'gs'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/module.mk b/ttcn/patch_lib_sip_titan/module.mk new file mode 100644 index 0000000000000000000000000000000000000000..fd0780a061afafb968bb95ef15ce7f64161f89a4 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/module.mk @@ -0,0 +1,35 @@ +sources := \ + ttcn/LibSip_Library.ttcn \ + ttcn/LibSip_Interface.ttcn \ + ../patch_lib_sip_titan/LibSip_SDPTypes.ttcn \ + ../patch_lib_sip_titan/LibSip_XMLTypes.ttcn \ + ../patch_lib_sip_titan/LibSip_SimpleMsgSummaryTypes.ttcn \ + ../patch_lib_sip_titan/LibSip_SIPTypesAndValues.ttcn \ + ../patch_lib_sip_titan/LibSip_SMSFunctions.ttcn \ + ../patch_lib_sip_titan/LibSip_Common.ttcn \ + ../patch_lib_sip_titan/LibSip_SMSTemplates.ttcn \ + ../patch_lib_sip_titan/LibSip_EncdecDeclarations.ttcn \ + ../patch_lib_sip_titan/LibSip_SMSTypesAndValues.ttcn \ + ../patch_lib_sip_titan/LibSip_MessageBodyTypes.ttcn \ + ../patch_lib_sip_titan/LibSip_Steps.ttcn \ + ../patch_lib_sip_titan/LibSip_PIXITS.ttcn \ + ../patch_lib_sip_titan/LibSip_Templates.ttcn \ + ../patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_comm_div_info.ttcn \ + ../patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_mcid.ttcn \ + ../patch_lib_sip_titan/urn_3gpp_ns_cw_1_0.ttcn \ + ../patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_pstn.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_common_policy.ttcn \ + ../patch_lib_sip_titan/http_uri_etsi_org_ngn_params_xml_simservs_xcap.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_conference_info.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_reginfo.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_resource_lists.ttcn \ + ../patch_lib_sip_titan/urn_oma_xml_xdm_common_policy.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf_geopriv10_basicPolicy.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf_geopriv10.ttcn \ + ../patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf_geopriv10_civicAddr.ttcn \ + ../patch_lib_sip_titan/http_www_opengis_net_gml.ttcn \ + ../patch_lib_sip_titan/http_www_opengis_net_pidflo_1_0.ttcn \ + + +modules := ../../titan-test-system-framework/ttcn/LibXsd diff --git a/ttcn/patch_lib_sip_titan/urn_3gpp_ns_cw_1_0.ttcn b/ttcn/patch_lib_sip_titan/urn_3gpp_ns_cw_1_0.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..4b4458fbd225f976e2dd37e96f2ddac2a508e2a6 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/urn_3gpp_ns_cw_1_0.ttcn @@ -0,0 +1,79 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: urn_3gpp_ns_cw_1_0.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - cw.xsd +// /* xml version = "1.0" encoding = "UTF-8" */ +// /* targetnamespace = "urn:3gpp:ns:cw:1.0" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module urn_3gpp_ns_cw_1_0 { + + +import from XSD all; + + +type record TEmptyType +{ + +} +with { + variant "name as uncapitalized"; +}; + + +type record TCWtype +{ + record of XSD.String attr optional, + TEmptyType communication_waiting_indication optional, + record of XSD.String elem_list +} +with { + variant "name as uncapitalized"; + variant (attr) "anyAttributes except unqualified, 'urn:3gpp:ns:cw:1.0'"; + variant (communication_waiting_indication) "name as 'communication-waiting-indication'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:3gpp:ns:cw:1.0'"; +}; + + +type TCWtype Ims_cw +with { + variant "name as 'ims-cw'"; + variant "element"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'urn:3gpp:ns:cw:1.0' prefix 'cw10'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_common_policy.ttcn b/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_common_policy.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..3d7b018cea2ff06621f44db537292adb261623cf --- /dev/null +++ b/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_common_policy.ttcn @@ -0,0 +1,223 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: urn_ietf_params_xml_ns_common_policy.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - common-policy.xsd +// /* xml version = "1.0" */ +// /* targetnamespace = "urn:ietf:params:xml:ns:common-policy" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module urn_ietf_params_xml_ns_common_policy { + + +import from XSD all; + + +/* /ruleset */ + + +type record Ruleset +{ + record of RuleType rule_list +} +with { + variant "name as uncapitalized"; + variant "element"; + variant (rule_list) "untagged"; + variant (rule_list[-]) "name as 'rule'"; +}; + + +/* /ruleset/rule */ + + +type record RuleType +{ + XSD.ID id, + ConditionsType conditions optional, + ExtensibleType actions optional, + ExtensibleType transformations optional +} +with { + variant "name as uncapitalized"; + variant (id) "attribute"; +}; + + +/* //rule/conditions */ + + +type record ConditionsType +{ + record length(1 .. infinity) of union { + record length(0 .. 1) of IdentityType identity_list, + record length(1) of SphereType sphere_list, + record length(1) of ValidityType validity_list, + record length(1 .. infinity) of XSD.String elem_list + } choice_list +} +with { + variant "name as uncapitalized"; + variant (choice_list) "untagged"; + variant (choice_list[-]) "untagged"; + variant (choice_list[-].identity_list) "untagged"; + variant (choice_list[-].identity_list[-]) "name as 'identity'"; + variant (choice_list[-].sphere_list) "untagged"; + variant (choice_list[-].sphere_list[-]) "name as 'sphere'"; + variant (choice_list[-].validity_list) "untagged"; + variant (choice_list[-].validity_list[-]) "name as 'validity'"; + variant (choice_list[-].elem_list) "untagged"; + variant (choice_list[-].elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:common-policy'"; +}; + + +/* //conditions/identity */ + + +type record IdentityType +{ + record length(1 .. infinity) of union { + OneType one, + ManyType many, + XSD.String elem + } choice_list +} +with { + variant "name as uncapitalized"; + variant (choice_list) "untagged"; + variant (choice_list[-]) "untagged"; + variant (choice_list[-].elem) "anyElement except unqualified, 'urn:ietf:params:xml:ns:common-policy'"; +}; + + +/* //identity/one */ + + +type record OneType +{ + XSD.AnyURI id, + XSD.String elem optional +} +with { + variant "name as uncapitalized"; + variant (id) "attribute"; + variant (elem) "anyElement except unqualified, 'urn:ietf:params:xml:ns:common-policy'"; +}; + + +/* //identity/many */ + + +type record ManyType +{ + XSD.String domain optional, + record of union { + ExceptType except_, + record length(0 .. 1) of XSD.String elem_list + } choice_list +} +with { + variant "name as uncapitalized"; + variant (domain) "attribute"; + variant (choice_list) "untagged"; + variant (choice_list[-]) "untagged"; + variant (choice_list[-].except_) "name as 'except'"; + variant (choice_list[-].elem_list) "untagged"; + variant (choice_list[-].elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:common-policy'"; +}; + + +/* //many/except */ + + +type record ExceptType +{ + XSD.String domain optional, + XSD.AnyURI id optional +} +with { + variant "name as uncapitalized"; + variant (domain) "attribute"; + variant (id) "attribute"; +}; + + +/* //conditions/sphere */ + + +type record SphereType +{ + XSD.String value_ +} +with { + variant "name as uncapitalized"; + variant (value_) "name as 'value'"; + variant (value_) "attribute"; +}; + + +/* //conditions/validity */ + + +type record ValidityType +{ + record length(1 .. infinity) of record { + XSD.DateTime from_, + XSD.DateTime until + } sequence_list +} +with { + variant "name as uncapitalized"; + variant (sequence_list) "untagged"; + variant (sequence_list[-]) "untagged"; + variant (sequence_list[-].from_) "name as 'from'"; +}; + + +/* //rule/actions or //rule/transformations */ + + +type record ExtensibleType +{ + record of XSD.String elem_list +} +with { + variant "name as uncapitalized"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:common-policy'"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'urn:ietf:params:xml:ns:common-policy' prefix 'cp'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_conference_info.ttcn b/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_conference_info.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..bfa546577eea3d4d147f4ebca5c286ae662237f6 --- /dev/null +++ b/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_conference_info.ttcn @@ -0,0 +1,572 @@ +/******************************************************************************* +* Copyright (c) 2000-2016 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/5 R4D +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +*******************************************************************************/ +// +// File: urn_ietf_params_xml_ns_conference_info.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Fri Mar 4 09:23:30 2016 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - CONF.xsd +// /* xml version = "1.0" encoding = "UTF-8" */ +// /* targetnamespace = "urn:ietf:params:xml:ns:conference-info" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module urn_ietf_params_xml_ns_conference_info { + + +import from XSD all; + + +import from http_www_w3_org_XML_1998_namespace all; + + +/* This imports the xml:language definition */ + + +/* CONFERENCE ELEMENT */ + + +type Conference_type Conference_info +with { + variant "name as 'conference-info'"; + variant "element"; +}; + + +/* CONFERENCE TYPE */ + + +type record Conference_type +{ + XSD.AnyURI entity, + State_type state optional, + XSD.UnsignedInt version optional, + record of XSD.String attr optional, + Conference_description_type conference_description optional, + Host_type host_info optional, + Conference_state_type conference_state optional, + Users_type users optional, + Uris_type sidebars_by_ref optional, + Sidebars_by_val_type sidebars_by_val optional, + record of XSD.String elem_list +} +with { + variant "name as 'conference-type'"; + variant (entity) "attribute"; + variant (state) "defaultForEmpty as 'full'"; + variant (state) "attribute"; + variant (version) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (conference_description) "name as 'conference-description'"; + variant (host_info) "name as 'host-info'"; + variant (conference_state) "name as 'conference-state'"; + variant (sidebars_by_ref) "name as 'sidebars-by-ref'"; + variant (sidebars_by_val) "name as 'sidebars-by-val'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* STATE TYPE */ + + +type enumerated State_type +{ + deleted, + full, + partial +} +with { + variant "name as 'state-type'"; +}; + + +/* CONFERENCE DESCRIPTION TYPE */ + + +type record Conference_description_type +{ + record of XSD.String attr optional, + XSD.String display_text optional, + XSD.String subject optional, + XSD.String free_text optional, + Keywords_type keywords optional, + Uris_type conf_uris optional, + Uris_type service_uris optional, + XSD.UnsignedInt maximum_user_count optional, + Conference_media_type available_media optional, + record of XSD.String elem_list +} +with { + variant "name as 'conference-description-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (free_text) "name as 'free-text'"; + variant (conf_uris) "name as 'conf-uris'"; + variant (service_uris) "name as 'service-uris'"; + variant (maximum_user_count) "name as 'maximum-user-count'"; + variant (available_media) "name as 'available-media'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* HOST TYPE */ + + +type record Host_type +{ + record of XSD.String attr optional, + XSD.String display_text optional, + XSD.AnyURI web_page optional, + Uris_type uris optional, + record of XSD.String elem_list +} +with { + variant "name as 'host-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (web_page) "name as 'web-page'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* CONFERENCE STATE TYPE */ + + +type record Conference_state_type +{ + record of XSD.String attr optional, + XSD.UnsignedInt user_count optional, + XSD.Boolean active optional, + XSD.Boolean locked optional, + record of XSD.String elem_list +} +with { + variant "name as 'conference-state-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (user_count) "name as 'user-count'"; + //variant (active) "text 'true' as '1'"; + //variant (active) "text 'false' as '0'"; + //variant (locked) "text 'true' as '1'"; + //variant (locked) "text 'false' as '0'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* CONFERENCE MEDIA TYPE */ + + +type record Conference_media_type +{ + record of XSD.String attr optional, + record length(1 .. infinity) of Conference_medium_type entry_list +} +with { + variant "name as 'conference-media-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (entry_list) "untagged"; + variant (entry_list[-]) "name as 'entry'"; +}; + + +/* CONFERENCE MEDIUM TYPE */ + + +type record Conference_medium_type +{ + XSD.String label_, + record of XSD.String attr optional, + XSD.String display_text optional, + XSD.String type_, + Media_status_type status optional, + record of XSD.String elem_list +} +with { + variant "name as 'conference-medium-type'"; + variant (label_) "name as 'label'"; + variant (label_) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (type_) "name as 'type'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* URIs TYPE */ + + +type record Uris_type +{ + State_type state optional, + record of XSD.String attr optional, + record length(1 .. infinity) of Uri_type entry_list +} +with { + variant "name as 'uris-type'"; + variant (state) "defaultForEmpty as 'full'"; + variant (state) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (entry_list) "untagged"; + variant (entry_list[-]) "name as 'entry'"; +}; + + +/* URI TYPE */ + + +type record Uri_type +{ + record of XSD.String attr optional, + XSD.AnyURI uri, + XSD.String display_text optional, + XSD.String purpose optional, + Execution_type modified optional, + record of XSD.String elem_list +} +with { + variant "name as 'uri-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* KEYWORDS TYPE */ + + +type record of XSD.String Keywords_type +with { + variant "name as 'keywords-type'"; + variant "list"; +}; + + +/* USERS TYPE */ + + +type record Users_type +{ + State_type state optional, + record of XSD.String attr optional, + record of User_type user_list, + record of XSD.String elem_list +} +with { + variant "name as 'users-type'"; + variant (state) "defaultForEmpty as 'full'"; + variant (state) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (user_list) "untagged"; + variant (user_list[-]) "name as 'user'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* USER TYPE */ + + +type record User_type +{ + XSD.AnyURI entity optional, + State_type state optional, + record of XSD.String attr optional, + XSD.String display_text optional, + Uris_type associated_aors optional, + User_roles_type roles optional, + User_languages_type languages optional, + XSD.AnyURI cascaded_focus optional, + record of Endpoint_type endpoint_list, + record of XSD.String elem_list +} +with { + variant "name as 'user-type'"; + variant (entity) "attribute"; + variant (state) "defaultForEmpty as 'full'"; + variant (state) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (associated_aors) "name as 'associated-aors'"; + variant (cascaded_focus) "name as 'cascaded-focus'"; + variant (endpoint_list) "untagged"; + variant (endpoint_list[-]) "name as 'endpoint'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* USER ROLES TYPE */ + + +type record User_roles_type +{ + record of XSD.String attr optional, + record length(1 .. infinity) of XSD.String entry_list +} +with { + variant "name as 'user-roles-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (entry_list) "untagged"; + variant (entry_list[-]) "name as 'entry'"; +}; + + +/* USER LANGUAGES TYPE */ + + +type record of XSD.Language User_languages_type +with { + variant "name as 'user-languages-type'"; + variant "list"; +}; + + +/* ENDPOINT TYPE */ + + +type record Endpoint_type +{ + XSD.String entity optional, + State_type state optional, + record of XSD.String attr optional, + XSD.String display_text optional, + Execution_type referred optional, + Endpoint_status_type status optional, + Joining_type joining_method optional, + Execution_type joining_info optional, + Disconnection_type disconnection_method optional, + Execution_type disconnection_info optional, + record of Media_type media_list, + Call_type call_info optional, + record of XSD.String elem_list +} +with { + variant "name as 'endpoint-type'"; + variant (entity) "attribute"; + variant (state) "defaultForEmpty as 'full'"; + variant (state) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (joining_method) "name as 'joining-method'"; + variant (joining_info) "name as 'joining-info'"; + variant (disconnection_method) "name as 'disconnection-method'"; + variant (disconnection_info) "name as 'disconnection-info'"; + variant (media_list) "untagged"; + variant (media_list[-]) "name as 'media'"; + variant (call_info) "name as 'call-info'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* ENDPOINT STATUS TYPE */ + + +type enumerated Endpoint_status_type +{ + alerting, + connected, + dialing_in, + dialing_out, + disconnected, + disconnecting, + muted_via_focus, + on_hold, + pending +} +with { + variant "text 'dialing_in' as 'dialing-in'"; + variant "text 'dialing_out' as 'dialing-out'"; + variant "text 'muted_via_focus' as 'muted-via-focus'"; + variant "text 'on_hold' as 'on-hold'"; + variant "name as 'endpoint-status-type'"; +}; + + +/* JOINING TYPE */ + + +type enumerated Joining_type +{ + dialed_in, + dialed_out, + focus_owner +} +with { + variant "text 'dialed_in' as 'dialed-in'"; + variant "text 'dialed_out' as 'dialed-out'"; + variant "text 'focus_owner' as 'focus-owner'"; + variant "name as 'joining-type'"; +}; + + +/* DISCONNECTION TYPE */ + + +type enumerated Disconnection_type +{ + booted, + busy, + departed, + failed +} +with { + variant "name as 'disconnection-type'"; +}; + + +/* EXECUTION TYPE */ + + +type record Execution_type +{ + record of XSD.String attr optional, + XSD.DateTime when optional, + XSD.String reason optional, + XSD.AnyURI by optional +} +with { + variant "name as 'execution-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* CALL TYPE */ + + +type record Call_type +{ + record of XSD.String attr optional, + union { + Sip_dialog_id_type sip, + record of XSD.String elem_list + } choice +} +with { + variant "name as 'call-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (choice) "untagged"; + variant (choice.elem_list) "untagged"; + variant (choice.elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* SIP DIALOG ID TYPE */ + + +type record Sip_dialog_id_type +{ + record of XSD.String attr optional, + XSD.String display_text optional, + XSD.String call_id, + XSD.String from_tag, + XSD.String to_tag, + record of XSD.String elem_list +} +with { + variant "name as 'sip-dialog-id-type'"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (call_id) "name as 'call-id'"; + variant (from_tag) "name as 'from-tag'"; + variant (to_tag) "name as 'to-tag'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* MEDIA TYPE */ + + +type record Media_type +{ + XSD.String id, + record of XSD.String attr optional, + XSD.String display_text optional, + XSD.String type_ optional, + XSD.String label_ optional, + XSD.String src_id optional, + Media_status_type status optional, + record of XSD.String elem_list +} +with { + variant "name as 'media-type'"; + variant (id) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (display_text) "name as 'display-text'"; + variant (type_) "name as 'type'"; + variant (label_) "name as 'label'"; + variant (src_id) "name as 'src-id'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; +}; + + +/* MEDIA STATUS TYPE */ + + +type enumerated Media_status_type +{ + inactive, + recvonly, + sendonly, + sendrecv +} +with { + variant "name as 'media-status-type'"; +}; + + +/* SIDEBARS BY VAL TYPE */ + + +type record Sidebars_by_val_type +{ + State_type state optional, + record of XSD.String attr optional, + record of Conference_type entry_list +} +with { + variant "name as 'sidebars-by-val-type'"; + variant (state) "defaultForEmpty as 'full'"; + variant (state) "attribute"; + variant (attr) "anyAttributes except unqualified, 'urn:ietf:params:xml:ns:conference-info'"; + variant (entry_list) "untagged"; + variant (entry_list[-]) "name as 'entry'"; +}; + + +} +with { + encode "XML"; + variant "namespace as 'urn:ietf:params:xml:ns:conference-info' prefix 'tns'"; + variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; + variant "elementFormQualified"; +} diff --git a/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf.ttcn b/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..916fdca0cf96cb9ab5c0cf7ae745b32ee541012a --- /dev/null +++ b/ttcn/patch_lib_sip_titan/urn_ietf_params_xml_ns_pidf.ttcn @@ -0,0 +1,177 @@ +/******************************************************************************* +* Copyright (c) 2000-2018 Ericsson Telecom AB +* +* XSD to TTCN-3 Translator version: CRL 113 200/6 R4B +* +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v2.0 +* which accompanies this distribution, and is available at +* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +*******************************************************************************/ +// +// File: urn_ietf_params_xml_ns_pidf.ttcn +// Description: +// References: +// Rev: +// Prodnr: +// Updated: Tue Aug 7 08:36:53 2018 +// Contact: http://ttcn.ericsson.se +// +//////////////////////////////////////////////////////////////////////////////// +// Generated from file(s): +// - RFC3863_pidf.xsd +// /* xml version = "1.0" encoding = "UTF-8" */ +// /* targetnamespace = "urn:ietf:params:xml:ns:pidf" */ +//////////////////////////////////////////////////////////////////////////////// +// Modification header(s): +//----------------------------------------------------------------------------- +// Modified by: +// Modification date: +// Description: +// Modification contact: +//------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////// + + +module urn_ietf_params_xml_ns_pidf { + + +import from XSD all; + +import from urn_ietf_params_xml_ns_pidf_geopriv10 all; + +import from http_www_w3_org_XML_1998_namespace all; + + +const XSD.Boolean c_defaultForEmpty_1 := false; + + +/* This import brings in the XML language attribute xml:lang */ + + +type Presence_1 Presence +with { + variant "name as uncapitalized"; + variant "element"; +}; + + +type record Presence_1 +{ + XSD.AnyURI entity, + record of Tuple tuple_list, + record of Note note_list, + record of XSD.String elem_list +} +with { + variant "name as 'presence'"; + variant (entity) "attribute"; + variant (tuple_list) "untagged"; + variant (tuple_list[-]) "name as 'tuple'"; + variant (note_list) "untagged"; + variant (note_list[-]) "name as 'note'"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified"; // , 'urn:ietf:params:xml:ns:pidf' +}; + + +type record Tuple +{ + XSD.ID id, + Status status, + record of XSD.String elem_list, + Contact contact optional, + record of Note note_list, + XSD.DateTime timestamp_ optional +} +with { + variant "name as uncapitalized"; + variant (id) "attribute"; + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified"; // , 'urn:ietf:params:xml:ns:pidf' + variant (note_list) "untagged"; + variant (note_list[-]) "name as 'note'"; +}; + + +type record Status +{ + Basic basic optional, + Geopriv_1 geopriv, + record of XSD.String elem_list +} +with { + variant "name as uncapitalized"; + variant (geopriv) "namespace as 'urn:ietf:params:xml:ns:pidf:geopriv10'" + variant (elem_list) "untagged"; + variant (elem_list[-]) "anyElement except unqualified, 'urn:ietf:params:xml:ns:pidf'"; +}; + + +type enumerated Basic +{ + closed, + open +} +with { + variant "name as uncapitalized"; +}; + + +type record Contact +{ + Qvalue priority optional, + XSD.AnyURI base +} +with { + variant "name as uncapitalized"; + variant (priority) "attribute"; + variant (base) "untagged"; +}; + + +type record Note +{ + Lang lang optional, + XSD.String base +} +with { + variant "name as uncapitalized"; + variant (lang) "namespace as 'http://www.w3.org/XML/1998/namespace' prefix 'xml'"; + variant (lang) "attribute"; + variant (base) "untagged"; +}; + + +/* xs:pattern value="0(.[0-9]{0,3})?"/> + /etc/hostname \ + && DEBIAN_FRONTEND=noninteractive apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y \ + && DEBIAN_FRONTEND=noninteractive apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + autoconf \ + bison \ + build-essential \ + cmake \ + curl \ + dos2unix \ + doxygen \ + emacs \ + expect \ + flex \ + g++-9 \ + gcc-9 \ + git \ + gnutls-bin \ + graphviz \ + iputils-ping \ + libedit2 \ + libedit-dev \ + libffi-dev \ + libglib2.0-dev \ + libgcrypt-dev \ + libjsoncpp-dev \ + libncurses5-dev \ + libpcap-dev \ + libssl-dev \ + libtool-bin \ + libtool \ + libxml2-dev \ + libxml2-utils \ + libyaml-dev \ + lsof \ + ntp \ + openssh-server \ + pkg-config \ + python3-dev \ + python3-pip \ + python3-setuptools \ + sudo \ + sshpass \ + tcpdump \ + texlive-font-utils \ + texlive-latex-extra \ + tzdata \ + valgrind \ + xutils-dev \ + xsltproc \ + && DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y \ + && DEBIAN_FRONTEND=noninteractive apt-get autoclean \ + && pip3 install --upgrade setuptools pip \ + && useradd --create-home --shell /bin/bash etsi \ + && echo "etsi:etsi" | chpasswd \ + && adduser etsi sudo \ + && echo "" >> /etc/profile \ + && echo 'export HOME=/home/etsi' >> /etc/profile \ + && echo 'export LD_LIBRARY_PATH=${HOME}/lib:$LD_LIBRARY_PATH' >> /etc/profile \ + && echo 'export PATH=${HOME}/bin:$PATH' >> /etc/profile \ + && echo 'cd ${HOME}' >> /etc/profile \ + && echo ". ./devenv.bash" >> /etc/profile \ + && cd /home/etsi \ + && echo "" >> ./.profile \ + && echo 'export HOME=/home/etsi' >> ./.profile \ + && echo 'export LD_LIBRARY_PATH=${HOME}/lib:$LD_LIBRARY_PATH' >> ./.profile \ + && echo 'export PATH=${HOME}/bin:$PATH' >> ./.profile \ + && echo 'cd ${HOME}' >> ./.profile \ + && echo ". ./devenv.bash" >> ./.profile \ + && mkdir -p bin lib include tmp frameworks docs man dev \ + && chown -R etsi:etsi * + +EXPOSE 22 + +CMD ["/bin/bash"] + +# That's all Floks diff --git a/virtualization/docker-dev/README.md b/virtualization/docker-dev/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1bd104880b2d49c750e4c97a7d098bfdbd478bef --- /dev/null +++ b/virtualization/docker-dev/README.md @@ -0,0 +1,99 @@ +# HOWTO build docker images + +## General imformation + +Pre-requisites on your host machine: + +- Install [Docker](https://docs.docker.com/install/) + +#### From Windows host: + +- Install [Virtualbox](https://www.virtualbox.org/manual/ch01.html) +- Install any X Server. For example [VcXsrv](https://sourceforge.net/projects/vcxsrv/) + +#### From Mac host: + +- Install [Virtualbox](https://www.virtualbox.org/manual/ch01.html) +- Install [XQuartz](https://www.xquartz.org) + +#### From Linux host: + +- No other requirements + +## Build docker image + +For Windows host, rename ```build.cmd.a``` and ```run.cmd.a``` to ```build.cmd``` and ```run.cmd``` respectivelly. + +Special scrips ```build.sh``` (or ```build.cmd```) can be executed to automatically build all necessary images. + +There are several build stages: + +1. Build STF Ubuntu 18.04 image +2. Install Titan from Github +3. Install Eclipse and Titan Eclipse plugin into ~/frameworks/titan +4. Install asn1c into ~/frameworks/asn1c +5. Checkout STF569 sources from ETSI svn repository using default credentials +6. Build ASN.1 recoder library +7. Build certificate generation tool + +## Import and build ETSI AtsImsIot project + +### Run Docker image + +#### From Windows host: + +1. Authorize Docker container to interact with the XServer: +Go to the X Server installation directory and add the Docker container ip address to the file ```X0.hosts```: +``` +localhost +inet6:localhost +192.168.99.100 +``` + +Execute ```run.cmd``` or launch a command line window and run the command + +```docker run -it --net=host -e DISPLAY=192.168.99.1:0 AtsImsIot:latest``` + +NOTE: Modify the IP address in the command for the address of 'VirtualBox Hot-Only Network'. + +#### From Linux host: + +Execute ```run.sh``` or launch a command line window and run the command + +```sh +docker run -it --net=host -e DISPLAY=$DISPLAY \ +-v /tmp/.X11-unix:/tmp/.X11-unix AtsImsIot:latest +``` + +### Import eclipse project + +1. Whithin the docker container, on the linux command prompt type: + + ```eclipse -data ~/dev/Workspace``` + + Eclipse IDE shall be shown on the hosts Screen. + Possible problems: + - eclipse not found: check the PATH environment variable. It shall contain $HOME/bin path. Otherwise add it: + ```export PATH=$HOME/bin:$PATH``` + +2. Run "File -> Import" and import the ```~/dev/AtsImsIot/AtsImsIot.tpd``` file. + + This can take a time, be patient. + **Do not run build in eclipse**, we don't have enough time. + +### Build the project + +```cd ~/Workspace/AtsImsIot/bin``` + +```make``` + +Possible problems: + - Error in AbstractSocket build: Build it explicitly: + ```cd ~/Workspace/Abstract_Socket_CNL113384/bin_ssl && make``` + +### Execute tests +1. Launch eclipse: ```eclipse -data ~/dev/Workspace``` +2. Select configuration from the /etc/folder: + - AtsImsIot.cfg - Default ETSI AtsImsIot test suite. +3. Right-click on the configuration file and select **Run As -> TITAN Parallel launcher** + diff --git a/virtualization/docker-dev/build.sh b/virtualization/docker-dev/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..b5069aa51c2e5adba533355898de0d1d5894c29b --- /dev/null +++ b/virtualization/docker-dev/build.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Copyright ETSI 2020-2021 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +set -e +set -vx + +# Force removing stfubuntu docker image +if [ "$1" == "--force-stfubuntu" ]; then + if [ -n `docker images -q stfubuntu` ]; then + docker rmi --force `docker images -q stfubuntu` || exit 1 + fi +fi +# Check and build stfubuntu image +if [ -z `docker images -q stfubuntu` ]; then + docker build --no-cache --tag stfubuntu:20.04 -f Dockerfile.stfubuntu --force-rm . || exit 1 +fi + +docker build --no-cache --tag etsiforge/AtsImsIot --force-rm . || ( echo "Docker build failed: $?"; exit 1 ) + +docker images +docker inspect etsiforge/AtsImsIot:latest || ( echo "Docker inspect failed: $?"; exit 1 ) + +# That's all Floks +exit 0 diff --git a/virtualization/docker-dev/home/etc/init.d/10-titan.sh b/virtualization/docker-dev/home/etc/init.d/10-titan.sh new file mode 100755 index 0000000000000000000000000000000000000000..c7d2c4c6f367431d394fdf79c19a07913f68341b --- /dev/null +++ b/virtualization/docker-dev/home/etc/init.d/10-titan.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +#set -e +set -vx + +echo -e "*****************************\n* Install titan\n*****************************\n" +SRC_DIR=${HOME}/frameworks/titan/titan.core +export TTCN3_DIR=$HOME/frameworks/titan/Install + +[ -f /usr/bin/java ] && export JAVA_HOME=`readlink -f /usr/bin/java | sed "s:bin/java::"` +TITAN_REPO=`cat ${HOME}/etc/titan_repos.txt | grep 'titan\.core\.git' | head -n 1` +export PATH=$PATH:$TTCN3_DIR/bin + +mkdir -p "$SRC_DIR" +cd "$SRC_DIR/.." || exit 1 + +# Install titan core +git clone --progress "$TITAN_REPO" || exit 1 + +cd titan.core || exit 1 +cat >Makefile.personal <> $HOME/.bashrc +echo "export PATH=\$PATH:\$TTCN3_DIR/bin" >> $HOME/.bashrc + +# Install other repos +cd $SRC_DIR/.. || exit 1 +cat ${HOME}/etc/titan_repos.txt | grep -v -e '^\s*#' -e 'titan\.core' | while read REPO; do + [ -z $ $REPO ] && continue + WS=`echo $REPO | sed -e 's|.*/||g' -e 's|\.git||g'` + if git clone --progress "${REPO}" "${WS}"; then + [ -f "$WS/Makefile" ] && make -C "$WS" + fi +done + +cd $HOME diff --git a/virtualization/docker-dev/home/etc/init.d/30-osip.sh b/virtualization/docker-dev/home/etc/init.d/30-osip.sh new file mode 100755 index 0000000000000000000000000000000000000000..db8c15286251690788a8263eff90b32f286d2eae --- /dev/null +++ b/virtualization/docker-dev/home/etc/init.d/30-osip.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +#set -e +set -vx + +echo -e "*****************************\n* Install osip\n*****************************\n" +cd ${HOME}/frameworks +git clone https://git.savannah.gnu.org/git/osip.git ./osip +cd osip +./autogen.sh +./configure --prefix=/home/etsi +make && make install + +cd ${HOME} diff --git a/virtualization/docker-dev/home/etc/init.d/40-etsi_AtsImsIot.sh b/virtualization/docker-dev/home/etc/init.d/40-etsi_AtsImsIot.sh new file mode 100755 index 0000000000000000000000000000000000000000..d2d01d3ea09d0d68803969e18111b8ed7ec0e09d --- /dev/null +++ b/virtualization/docker-dev/home/etc/init.d/40-etsi_AtsImsIot.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +#set -e +set -vx + +echo -e "*****************************\n* Checkout TTF T012 sources\n*****************************\n" +mkdir -p ${HOME}/dev && cd ${HOME}/dev || exit 1 + +git clone --branch devel --recurse-submodules --single-branch https://forge.etsi.org/rep/int/vxlte/emergency-iop.git || exit 1 + +echo -e "*****************************\n* Set up environment\n*****************************\n" +cd /home/etsi/dev/emergency-iop/scripts || exit 1 +ln -sf /home/etsi/dev/emergency-iop/scripts/devenv.bash.ubuntu /home/etsi/devenv.bash || exit 1 +. /home/etsi/devenv.bash || exit 1 + +echo -e "*****************************\n* Apply patched \n*****************************\n" +cd /home/etsi/dev/emergency-iop || exit 1 +./install.sh || exit 1 + +echo -e "*****************************\n* Build test suites\n*****************************\n" +ATS_LIST="AtsLIS AtsECRF AtsESRP AtsPSAP AtsBCF" +for i in ${ATS_LIST} +do + export ATS=$i + make +done + +echo -e "*****************************\n* Init Eclipse Workspace\n*****************************\n" + +echo -e "*****************************\n* Setup a configuration file\n*****************************\n" +cd ./etc/AtsImsIot +ln -sf AtsImsIot.cfg_ AtsImsIot.cfg +cd - + +echo -e "*****************************\n* Change sudo in command line\n*****************************\n" +cd /home/etsi/dev/emergency-iop/scripts +export ATS=AtsLIS +#sed --in-place 's/sudo/echo "etsi" \| sudo -S/' ./run_all.bash + +cd /home/etsi/dev/emergency-iop + diff --git a/virtualization/docker-dev/home/etc/init.d/50-doxygen.sh b/virtualization/docker-dev/home/etc/init.d/50-doxygen.sh new file mode 100755 index 0000000000000000000000000000000000000000..a2eee0555d0c2dc65a17b0f8b7010514d61518c2 --- /dev/null +++ b/virtualization/docker-dev/home/etc/init.d/50-doxygen.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +#set -e +set -vx + +echo -e "*****************************\n* Build docs \n*****************************\n" +. /home/etsi/devenv.bash +cd ${HOME}/dev/emergency-iop/docs || exit 1 +doxygen ./o2.cfg || exit 1 + +# Generate PDF file +cd ${HOME}/dev/emergency-iop/docs/AtsImsIotDocs/latex +make && mv refman.pdf ${HOME}/docs/AtsImsIot_help.pdf + +cd ${HOME} + +exit 0 diff --git a/virtualization/docker-dev/home/etc/titan_repos.txt b/virtualization/docker-dev/home/etc/titan_repos.txt new file mode 100644 index 0000000000000000000000000000000000000000..8842f4e0283928a94ebbbd37aff6b25fe27c2279 --- /dev/null +++ b/virtualization/docker-dev/home/etc/titan_repos.txt @@ -0,0 +1,56 @@ +https://gitlab.eclipse.org/eclipse/titan/titan.core.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.Common_Components.Abstract_Socket.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.HTTPmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.LANL2asp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.PCAPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.PIPEasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SCTPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SIPmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SQLasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.TCPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.TELNETasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.UDPasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.COMMON.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DHCP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DHCPv6.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.DNS.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ICMP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ICMPv6.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.RTP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.RTSP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SMPP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SMTP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SNMP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.TCP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.UDP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.XMPP.git +https://gitlab.eclipse.org/eclipse/titan/titan.misc.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.LDAPasp_RFC4511.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.LDAPmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.Common_Components.Socket-API.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SSHCLIENTasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.STDINOUTmsg.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.SUNRPCasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.UNIX_DOMAIN_SOCKETasp.git +https://gitlab.eclipse.org/eclipse/titan/titan.TestPorts.IPL4asp.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.FrameRelay.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.H248_v2.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IMAP_4rev1.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ICAP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IKEv2.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IPsec.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.IUA.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.JSON_v07_2006.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.L2TP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.M3UA.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.MIME.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.MSRP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.PPP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.ProtoBuff.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.RADIUS_ProtocolModule_Generator.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.SRTP.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.WebSocket.git +https://gitlab.eclipse.org/eclipse/titan/titan.ProtocolModules.HTTP2.0.git +https://gitlab.eclipse.org/eclipse/titan/titan.Libraries.TCCUsefulFunctions.git diff --git a/virtualization/docker-dev/run.sh b/virtualization/docker-dev/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..babf174a0dad8b456522b4bd8854ca1ebf97cfa4 --- /dev/null +++ b/virtualization/docker-dev/run.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Copyright ETSI 2018-2020 +# See: https://forge.etsi.org/etsi-forge-copyright-statement.txt + +#set -e +set -vx + +docker run --interactive --tty --rm --publish 2222:22 --env DISPLAY=$DISPLAY --volume /tmp/.X11-unix:/tmp/.X11-unix --cap-add=NET_RAW --cap-add=NET_ADMIN etsiforge/AtsImsIot:latest + +# That's all Floks +exit 0 diff --git a/virtualization/docker/Dockerfile b/virtualization/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..f8ef5f50528af5dd10a7bb11450f3ab08b0a5393 --- /dev/null +++ b/virtualization/docker/Dockerfile @@ -0,0 +1,60 @@ +FROM alpine:latest + +# Install dependencies +RUN apk update && \ + apk add --no-cache autoconf automake sudo make git g++ diffutils expect openssl-dev libxml2-dev libxml2-utils libxslt-dev libtool ncurses-dev jsoncpp-dev readline-dev flex bison perl libexecinfo-dev bash libedit libedit-dev lksctp-tools lksctp-tools-dev libpcap-dev + +# Create user and sudouser +RUN \ + addgroup -g 1000 etsi && \ + adduser -S -D -u 1000 -G etsi -h /home/etsi -s /bin/bash etsi && \ + echo "etsi:etsi" | chpasswd && \ + echo "etsi ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers || exit 1 +USER etsi + +# Setup Hosts file at the boot time +RUN \ + echo 'sudo sh -c "cp /etc/hosts /etc/append && (echo \"127.0.1.1 $HOSTNAME\"; cat /etc/append) > /etc/hosts"' >> /home/etsi/.bashrc \ + echo 'sh' >> /home/etsi/.bashrc || exit 1 + +# Clone OSIP +WORKDIR /home/etsi +RUN \ + mkdir -p frameworks dev tmp && cd frameworks \ + && cd ${HOME}/frameworks \ + && git clone https://git.savannah.gnu.org/git/osip.git ./osip \ + && cd osip \ + && ./autogen.sh \ + && ./configure --prefix=/home/etsi \ + && make && make install \ + && cd - || exit 1 + +# Clone Titan +RUN git clone https://github.com/eclipse/titan.core.git || exit 1 +WORKDIR /home/etsi/frameworks/titan.core/ + +# Setup ENV variables +ENV TTCN3_DIR=/home/etsi/frameworks/titan.core/Install +ENV PATH=$TTCN3_DIR/bin:$PATH \ + LD_LIBRARY_PATH=$TTCN3_DIR/lib:$LD_LIBRARY_PATH + +# Set flags +RUN \ + echo "ALPINE_LINUX=yes" > Makefile.personal && \ + echo "TTCN3_DIR=$TTCN3_DIR" >> Makefile.personal && \ + echo "JNI=no" >> Makefile.personal && \ + echo "GUI=no" >> Makefile.personal && \ + echo "DEBUG=no" >> Makefile.personal || exit 1 + +# Build Titan +RUN \ + sed --in-place 's/LINUX_LIBS := -lxml2/LINUX_LIBS := -lxml2 -lpthread/g' ./core/Makefile && \ + make install && make clean || exit 1 + +WORKDIR /home/etsi/dev + +EXPOSE 443/tcp +EXPOSE 5060/udp +EXPOSE 5061/udp + +ENTRYPOINT /home/yann/dev/cise/virtualization/docker/docker-entrypoint.sh diff --git a/virtualization/docker/docker-entrypoint.sh b/virtualization/docker/docker-entrypoint.sh new file mode 100755 index 0000000000000000000000000000000000000000..590d1381c52f4244cb0269228be98d2f5c684489 --- /dev/null +++ b/virtualization/docker/docker-entrypoint.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + echo "No command specified. Available commands:" + for i in $(echo $commands | sed "s/,/ /g") + do + echo " $i" + done +} + +commands="help,build,clean,list,modulepar,rebuild,run,version" + +if [ $# == 0 ]; then + usage + exit 1 +fi + +if [ $# == 2 ]; then + if [ "$2" != "" ]; then + export ATS=Ats$2 + cli="${GEN_DIR}/bin/$ATS" + echo "cli: $cli" + fi +fi + + +case "$1" in + build) + cd ${GEN_DIR} && make + ;; + clean) + cd ${GEN_DIR} && make clean + ;; + list) + ${cli} -l + ;; + modulepar) + ${cli} -p + ;; + rebuild) + cd ${GEN_DIR} && rm -fr ./bin ./build ; make + ;; + run) + cd ${GEN_DIR}/scripts && ./run_all.bash + ;; + version) + compiler -v + ;; + *) + usage + exit 1 + ;; +esac + +unset ATS +exit 0 \ No newline at end of file diff --git a/virtualization/docker/docker-run.sh b/virtualization/docker/docker-run.sh new file mode 100755 index 0000000000000000000000000000000000000000..6a5d1e71ee2a8f4833d94b01eaf92317c268b27d --- /dev/null +++ b/virtualization/docker/docker-run.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -exo pipefail + +cd "$(dirname ${BASH_SOURCE})" + +docker run --rm -it \ + -w /home/yann/dev/AtsImsIot \ + -e GEN_DIR=/home/yann/dev/AtsImsIot \ + -p 0.0.0.0:443:443 \ + -p 0.0.0.0:5060:5060/udp \ + -p 0.0.0.0:5061:5061/udp \ + -u "$(id -u):$(id -g)" \ + -v "${PWD}/../..:/home/yann/dev/AtsImsIot" \ + --entrypoint /home/yann/dev/AtsImsIot/virtualization/docker/docker-entrypoint.sh \ + alpine-AtsImsIot:latest "$@" diff --git a/virtualization/vagrant/Vagrantfile b/virtualization/vagrant/Vagrantfile new file mode 100644 index 0000000000000000000000000000000000000000..86b03597a1ad00b02b0d0c17cae665e8bc792911 --- /dev/null +++ b/virtualization/vagrant/Vagrantfile @@ -0,0 +1,73 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://atlas.hashicorp.com/search. + config.vm.box = "bento/ubuntu-18.04" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + config.vm.boot_timeout = 900 + + # Use this hostname to force provisioner script to using SVN instead of external HDD + #config.vm.hostname = "vagrant-prov" + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + #config.vm.network "private_network", ip: "192.168.4.94" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + #config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + config.vm.provider "virtualbox" do |vb| + # Display the VirtualBox GUI when booting the machine + #vb.gui = true + vb.customize ["modifyvm", :id, "--monitorcount", "1"] + vb.customize ["modifyvm", :id, "--vram", "12"] + # Customize the amount of memory on the VM: + vb.memory = "4096" + end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies + # such as FTP and Heroku are also available. See the documentation at + # https://docs.vagrantup.com/v2/push/atlas.html for more information. + # config.push.define "atlas" do |push| + # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" + # end + + # Enable provisioning with a shell script. Additional provisioners such as + # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the + # documentation for more information about their specific syntax and use. + config.vm.provision "shell", path: "provisioner.bash", privileged: false +end diff --git a/virtualization/vagrant/provisioner.bash b/virtualization/vagrant/provisioner.bash new file mode 100755 index 0000000000000000000000000000000000000000..6c3010f45164920b0e9bbe2edfa81a9ec42a3ba3 --- /dev/null +++ b/virtualization/vagrant/provisioner.bash @@ -0,0 +1,132 @@ +#!/bin/bash +# Prepare environment for the build +#set -e # Exit with non 0 if any command fails +#set -vx + +# Update system +sudo DEBIAN_FRONTEND=noninteractive apt-get update +sudo DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y +sudo DEBIAN_FRONTEND=noninteractive apt-get install software-properties-common -y +sudo DEBIAN_FRONTEND=noninteractive apt-get update +sudo DEBIAN_FRONTEND=noninteractive apt-get --allow-unauthenticated install emacs openjdk-11-jre gcc-9 g++-9 git subversion lsof ntp gdb make cmake flex bison autoconf doxygen graphviz libedit2 libedit-dev libtool libncurses5-dev expect libssl-dev libgcrypt-dev libxml2-dev xutils-dev tcpdump libpcap-dev libwireshark-dev wget tree unzip sshpass kubuntu-desktop valgrind qt5-default qttools5-dev qtmultimedia5-dev libqt5svg5-dev vim tzdata dos2unix xsltproc -y +#sudo DEBIAN_FRONTEND=noninteractive apt --fix-broken install -y +sudo DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y +sudo DEBIAN_FRONTEND=noninteractive apt-get clean + +gcc --version +g++ --version +valgrind --version + +export HOME=/home/vagrant + +export PATH_DEV=${HOME}/dev +export HOME_FRAMEWORKS=${HOME}/frameworks +export HOME_LIB=${HOME}/lib +export HOME_BIN=${HOME}/bin +export HOME_ETC=${HOME}/etc +export HOME_INC=${HOME}/include +export HOME_TMP=${HOME}/tmp +export HOME_DOCS=${HOME}/docs +export PATH=${HOME_BIN}:${PATH} +export LD_LIBRARY_PATH=${HOME_LIB}:/usr/local/lib:${LD_LIBRARY_PATH} + +OLD_PWD=`pwd` +# Create directories +mkdir -p ${HOME_LIB} +if [ ! -d ${HOME_LIB} ] +then + exit -1 +fi +mkdir -p ${HOME_INC} +if [ ! -d ${HOME_INC} ] +then + exit -1 +fi +mkdir -p ${HOME_BIN} +if [ ! -d ${HOME_BIN} ] +then + exit -1 +fi +mkdir -p ${HOME_TMP} +if [ ! -d ${HOME_TMP} ] +then + exit -1 +fi +mkdir -p ${HOME_DOCS} +if [ ! -d ${HOME_DOCS} ] +then + exit -1 +fi +mkdir -p ${HOME_FRAMEWORKS} +if [ ! -d ${HOME_FRAMEWORKS} ] +then + exit -1 +fi +mkdir -p ${PATH_DEV} +if [ ! -d ${PATH_DEV} ] +then + exit -1 +fi + +cd /home/vagrant +echo "" >> /home/vagrant/.bashrc +echo "export LD_LIBRARY_PATH=/home/vagrant/dev/emergency-iop/lib:$LD_LIBRARY_PATH" >> /home/vagrant/.bashrc +echo "export PATH=/home/vagrant/bin:$PATH" >> /home/vagrant/.bashrc +echo ". ~/devenv.bash" >> /home/vagrant/.bashrc + +cd /home/vagrant/dev +git clone --recurse-submodules --branch=devel https://forge.etsi.org/rep/int/vxlte/emergency-iop.git +cd /home/vagrant/dev/emergency-iop +./install.sh + +# Install all frameworks + +# Install osip +cd ${HOME_FRAMEWORKS} +git clone git://git.savannah.gnu.org/osip.git ./osip +cd ./osip +./autogen.sh +./configure --prefix=/home/vagrant +make && make install + +# Install GoogleTest +cd ${HOME_FRAMEWORKS} +git clone https://github.com/google/googletest.git googletest +cd ${HOME_FRAMEWORKS}/googletest/ +cmake . +make CXX=g++ +sudo make install + +# Install latest LCOV +cd ${HOME_FRAMEWORKS} +mkdir -p ${HOME_FRAMEWORKS}/lcov +cd ${HOME_FRAMEWORKS}/lcov +wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.13.orig.tar.gz +tar xf lcov_1.13.orig.tar.gz +sudo make -C lcov-1.13/ install + +# Install lcov to coveralls conversion +sudo gem install coveralls-lcov + +lcov --version +coveralls-lcov -h + +# Build TITAN +cd /home/vagrant/dev/emergency-iop/scripts +./build_titan.bash +. /home/vagrant/devenv.bash + +# Build the AtsLIS +cd /home/vagrant/dev/emergency-iop +export ATS=AtsLIS +make + +# Change user in cfg files +cd ${HOME}/dev/emergency-iop/scripts +./update_user_name.sh emergency-iop + +cd ${OLD_PWD} + +sudo init 6 + +exit 0