222 lines
6.8 KiB
Plaintext
222 lines
6.8 KiB
Plaintext
Iu / 3G testing of Osmo{MSC,SGSN,HNBGW} using TTCN-3
|
|
====================================================
|
|
:author: Harald Welte <laforge@gnumonks.org>
|
|
:copyright: 2019 by Harald Welte (License: CC-BY-SA)
|
|
:backend: slidy
|
|
:max-width: 45em
|
|
|
|
|
|
== Osmocom TTCN-3 Test Suites
|
|
|
|
* developed in 2017+2018
|
|
* compiled using Eclipse TITAN
|
|
** uses just a command-line compiler + Makefiles
|
|
** no IDE needed at all, don't let _Eclipse_ fool you
|
|
* containerized in Docker
|
|
* executed by Jenkins CI
|
|
|
|
== Test Suite Philosophy
|
|
|
|
* test one network element (our IUT)
|
|
* test external behavior (3GPP and non-3GPP)
|
|
* emulate entire environment from TTCN-3
|
|
* don't reuse Osmocom C-code protocol implementations in the tests
|
|
* test against independent TTCN-3 implementations!
|
|
|
|
== What to test?
|
|
|
|
* successful cases
|
|
* erroneous cases (no answer, NACK, ...)
|
|
** many difficult to reproduce with real phones/devices
|
|
* load / resource exhaustion
|
|
* spec compliance
|
|
* focus on functionality actually relevant to IUT
|
|
|
|
== Why TTCN-3 + TITAN
|
|
|
|
* TTCN-3 specifically designed for telecom protocol testing
|
|
* TITAN team released many telecom protocols in TTCN-3, such as
|
|
** BSSAP, L3 (RR/MM/CC), SMS (CP/RP/TP), SS, M3UA, SCCP, GTP, NS, BSSGP, ...
|
|
** shortens our test development cycle
|
|
** permits us to test against known working industry implementations
|
|
|
|
== SGSN_Tests.ttcn so far
|
|
|
|
* external interfaces
|
|
** Gb (emulates PCU side NS/BSSGP + MS)
|
|
** Gp (emulates GGSN)
|
|
** GSUP (emulates HLR)
|
|
** VTY
|
|
|
|
no 3G (IuCS) testing at all
|
|
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
rankdir=LR;
|
|
SGSN [label="SGSN\nosmo-sgsn",shape="box"];
|
|
ATS [label="ATS\nSGSN_Tests.ttcn"];
|
|
|
|
ATS -> SGSN [label="Gb"];
|
|
SGSN-> ATS [label="Gp (GTP)"];
|
|
ATS -> SGSN [label="VTY"];
|
|
}
|
|
----
|
|
|
|
== A vs. Iu
|
|
|
|
* In theory, almost identical
|
|
** both use one SCCP connection per subscriber / radio channel
|
|
** both encapsulate the same Layer3 (DTAP) towards MS/UE
|
|
** more or less a 1:1: mapping between BSSMAP and RANAP
|
|
*** e.g. COMPLETE LAYER3 INFO -> InitialUeMessage
|
|
*** e.g. ASSIGNMENT -> RabAssignment
|
|
*** e.g. CLEAR -> IuRelease procedure
|
|
* In practise, _things are complicated..._
|
|
|
|
== A interface
|
|
|
|
image::gsm_control_stack_2g_cs.svg[width="100%"]
|
|
|
|
== Iu-CS interface
|
|
|
|
image::gsm_control_stack_3g_cs.svg[width="100%"]
|
|
|
|
== What's so special about Iu?
|
|
|
|
* not specified in human-readable text/tables, but ASN.1
|
|
* uses rather advanced features of ASN.1 syntax (information object classes)
|
|
* uses rather exotic ancoding APER (Aligned Packed Encoding Rules)
|
|
* Ericsson didn't release any titan.ProtocolModule.* for Iu
|
|
|
|
== TTCN-3 and ASN.1
|
|
|
|
* both TTCN-3 and ASN.1 originate at ITU
|
|
** TTCN-3 spec covers "native" use of ASN.1 within TTCN-3
|
|
*** no code generation (e.g. .asn1 -> .ttcn)
|
|
*** asn syntax can be directly used from TTCN-3 sources
|
|
**** all types are imported into the TTCN3 namespace
|
|
|
|
== Name mangling of ASN.1 types in TTCN-3
|
|
|
|
* replace all hyphen with underscore
|
|
** e.g. RANAP-PDU -> RANAP_PDU
|
|
|
|
|
|
== Eclipse TITAN and ASN.1
|
|
|
|
* Eclipse TITAN can parse the RANAP ASN.1
|
|
** you simply add the *.asn files next to your *.ttcn files when compiling
|
|
* ASN.1 compiled directly to C++, no intermediate .ttcn code generated
|
|
** makes life a bit hard initially, while you still learn about the mapping of names/types/etc.
|
|
* TITAN only supports BER, no other encoding rules like APER
|
|
|
|
== BER - APER transcoding
|
|
|
|
* we need a transcoder that
|
|
** parses RANAP in APER and converts it to BER (Rx)
|
|
** parses RANAP in BER and converts it to APER (Tx)
|
|
* use which tool to do the job?
|
|
** asn1c (APER still not upstream; we don't want to run asn1c on ATS + IUT)
|
|
** erlang (we don't want to run an Erlang VM next to every TTCN-3 test)
|
|
** ffasn1c (proprietary, but sysmocom has a license and can share generated binary code)
|
|
|
|
== libfftranscode
|
|
|
|
* binary-only shared library generated by sysmocom, available from http://ftp.osmocom.org/binaries/libfftranscode/
|
|
** contact me if you have a valid use case for running tests on non-x86_64 / non-debian systems
|
|
* contains libffasn1c runtime code and ffasn1c-generated code for RANAP, RUA, HNBAP
|
|
* can be extended for other APER based protcols like S1AP (LTE) as needed
|
|
** contact me if you want to write TTCN3 tests for other protocols
|
|
|
|
== Writing RANAP templates
|
|
|
|
How to write RANAP templates without a ttcn source file?
|
|
|
|
Theory:
|
|
|
|
* use binary RANAP packets from pcap files
|
|
* feed them into the TITAN decoder
|
|
* look at the log output
|
|
* copy + paste + customize
|
|
|
|
== Problems
|
|
|
|
Problems:
|
|
|
|
RANAP_Selftests.ttcn:49: Dynamic test case error: While BER-decoding type '@RANAPMIN.RANAP-PDU': While decoding '@RANAPMIN.RANAP-PDU' type: Alternative 'initiatingMessage': While decoding '@RANAPMIN.InitiatingMessage' type: Component 'value_': While checking tags (expecting [2]): Tag mismatch: Received: [UNIVERSAL 16].
|
|
|
|
* somehow TITAN cannot parse the BER generate by ffasn1c :(
|
|
** this is where I gave up for ~6 months after the first attempt
|
|
** I re-visited this in early April 2018
|
|
** one direction (BER encode) could be fixed by hacking runtime library source
|
|
** other direction required fix in compiler
|
|
** new version of ffasn1c has been released -> works
|
|
|
|
== Integrating with existing test suites
|
|
|
|
* existing tests are written without planning for 3G
|
|
* a lot of what they test is in L3/DTAP and should work over A + IuCS
|
|
* how to reuse them with 3G?
|
|
|
|
== BSSAP_Emulation -> RAN_Emulation
|
|
|
|
image::bssap_ranap_rename.png[width="100%"]
|
|
|
|
|
|
== BSSAP_Emulation -> RAN_Emulation
|
|
|
|
* copy + paste + edit `BSSAP_CodecPort` -> `RANAP_CodecPort`
|
|
* modularize protocol support (build without MGCP/BSSAP)
|
|
* rename `f_bssap_*` to `f_ran_adapter_*`
|
|
* add config option `cfg.transport == RANAP_TRANSPORT_IuCS`
|
|
* connect lower end of `RAN_Emulation` to `RANAP_CodecPort`, not `BSSAP_CodecPort`
|
|
|
|
== How does this look to the test case
|
|
|
|
* whenever L3 PDUs (DTA) are sent/received: no change
|
|
* whenever BSSMAP is transceived: distinguish BSSMAP vs RANAP
|
|
* good abstraction using functions can help
|
|
|
|
image::bssap_ranap_conditional_altsteps.png[width="100%"]
|
|
|
|
== Abstracting the send side
|
|
|
|
image::cl3_or_initialue.png[width="100%"]
|
|
|
|
image::cl3_or_initialue2.png[width="100%"]
|
|
|
|
== Extending a 2G test case to 3G
|
|
|
|
image::msc_iu_testcase.png[width="100%"]
|
|
|
|
== OsmoSGSN test suite
|
|
|
|
* MSC was easy: IuCS is very much like A.
|
|
* as opposed to the A interface (MSC) Gb doesn't use SCCP transport
|
|
* no similarity between 2G (Gb) and 3G (IuPS) protocol stack
|
|
|
|
== Gb interface
|
|
|
|
image::gsm_control_stack_2g_ps.svg[width="100%"]
|
|
|
|
== Iu-PS interface
|
|
|
|
image::gsm_control_stack_3g_ps.svg[width="100%"]
|
|
|
|
== OsmoSGSN test suite
|
|
|
|
* no concept of "subscriber connection" in 2G / Gb
|
|
* 3G IuPS very much like IuCS: SCCP connection per subscriber
|
|
* less common infrastructure that can be shared between 2G and 3G tests
|
|
|
|
== Further Reading
|
|
|
|
* http://git.osmocom.org/osmo-ttcn3-hacks/
|
|
* http://git.osmocom.org/docker-playground/
|
|
* http://osmocom.org/projects/cellular-infrastructure/wiki/Titan_TTCN3_Notes
|
|
|
|
== EOF
|
|
|
|
End of File
|