summaryrefslogtreecommitdiff
path: root/2019/osmodevcon2019-iu_3g_testing/osmodevcon2019-iu_3g_testing.adoc
diff options
context:
space:
mode:
Diffstat (limited to '2019/osmodevcon2019-iu_3g_testing/osmodevcon2019-iu_3g_testing.adoc')
-rw-r--r--2019/osmodevcon2019-iu_3g_testing/osmodevcon2019-iu_3g_testing.adoc221
1 files changed, 221 insertions, 0 deletions
diff --git a/2019/osmodevcon2019-iu_3g_testing/osmodevcon2019-iu_3g_testing.adoc b/2019/osmodevcon2019-iu_3g_testing/osmodevcon2019-iu_3g_testing.adoc
new file mode 100644
index 0000000..9a2bde6
--- /dev/null
+++ b/2019/osmodevcon2019-iu_3g_testing/osmodevcon2019-iu_3g_testing.adoc
@@ -0,0 +1,221 @@
+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
personal git repositories of Harald Welte. Your mileage may vary