Iu / 3G testing of Osmo{MSC,SGSN,HNBGW} using TTCN-3 ==================================================== :author: Harald Welte :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