Skip to content

sebastiw/otc

Repository files navigation

Erlang/OTC - Open Telecom Codec

This library tries to implement encoding and decoding for different (3GPP) telecom protocols. The aim is to support the newest release of each spec, if not stated otherwise.

Encoded format is a binary, and decoded format is a map.

If a field or message is not supported, the library should not crash but instead return some error-tuple or atom.

Decoding should preferably be strict, and follow the rules from the specification. Encoding on the other hand, should be lenient, but if format is incorrect, then log a warning. The idea behind this is that the user knows best what to send, but might need guidance.

Usage

otc can be called with both `decode/2`, `decode/3`, as well as `decapsulate/2`, `decapsulate/3` functions. The differens is that decapsulate will crash on errors while decode returns an error-tuple.

`decode/1` and `decapsulate/1` assumes SCTP packets.

In successful cases `decode` will return an ok-tuple containing either (only) a list of headers if the binary was fully decoded, or both a list of decoded headers, and a binary containing the parts it was not able to decode.

1> otc:decode(m2pa, UserBinary).
{ok, {[#{protocol := m2pa, ..}, #{protocol := mtp3, ..}, #{protocol := sccp, ..}], <<SCCPPayload>>}}

2> otc:decode(m2pa, UserBinary, #{stop_after => mtp3}).
{ok, {[#{protocol := m2pa, ..}, #{protocol := mtp3, ..}], <<MTP3Payload>>}}

3> otc:decode(m2pa, LinkBinary).
{ok, [#{protocol := m2pa, ..}]}

4> otc:decapsulate(m2pa, UserBinary).
{[#{protocol := m2pa, ..}, #{protocol := mtp3, ..}, #{protocol := sccp, ..}], <<SCCPPayload>>}

5> otc:decapsulate(m2pa, UserBinary, #{stop_after => mtp3}).
{[#{protocol := m2pa, ..}, #{protocol := mtp3, ..}], <<MTP3Payload>>}

6> otc:decapsulate(m2pa, LinkBinary).
[#{protocol := m2pa, ..}]

7> otc:decode(SctpBinary).
{ok, [#{protocol := sctp, ..}]}

For encoding there is only one function encode/1, but it can take multiple different types of inputs.

11> otc:encode(#{protocol => m2pa, ..}).
<<M2PABinary>>

12> otc:encode([#{protocol => m2pa, ..}, #{protocol => mtp3, ..}]).
<<M2PABinary>>

13> otc:encode({[#{protocol => m2pa, ..}], <<M2PAPayload>>}).
<<M2PABinary>>

Examples are given with m2pa codec, but could be used with any of the supported protocols. See [tests](test/otc_tests.erl)

Linguistics

decode - function that converts from binary format to an Erlang map

decapsulate - as decode, but crashes on errors.

parse - function that converts from UMTS magic number to Erlang atom

encode - function that converts from Erlang map to binary format

compose - function that converts from Erlang atom to UMTS magic number

*_codec - modules used as helpers, does not comply with the pkt-style codecs.

Codecs

NameSpecDecodeEncodeProduction Tested (Decode/Encode)Notes
SCTPIETF RFC 2960 October 2000XX
M3UAIETF RFC 4666 September 2006XXDE
M2PAIETF RFC 4165 September 2005XXDE
MTP3ITU-T Q.704 (07/96) July 1996XXDE
SCCPITU-T Q.713 (03/2001)XXDE
L33GPP TS 24.007 v16.5.0XX
NAS EPS3GPP TS 24.301 v16.8.0XXParameters might be binary decoded (i.e. passthrough)
NAS 5GS3GPP TS 24.501 v16.10.0XXParameters might be binary decoded (i.e. passthrough)
SGSAP3GPP TS 29.118 v17.0.0XXParameters might be binary decoded (i.e. passthrough)
GTPv1-C3GPP TS 29.060 v17.3.0XXParameters might be binary decoded (i.e. passthrough)
GTPv2-C3GPP TS 29.274 v17.7.0XXParameters might be binary decoded (i.e. passthrough)

Diameter interfaces

InterfacesSpecNotes
Gi/Sgi3GPP TS 29061
Gmb3GPP TS 29061
SGmb3GPP TS 29061
Zh3GPP TS 29109
Zn3GPP TS 29109
Zpn3GPP TS 29109
T6a/T6b3GPP TS 29128
MM103GPP TS 29140
Ns3GPP TS 29153
Nta3GPP TS 29154
Nt3GPP TS 29154
SLg3GPP TS 29172
SLh3GPP TS 29173
Gq3GPP TS 29209
Rx3GPP TS 29211
Gx3GPP TS 29212
Gxx3GPP TS 29212
S153GPP TS 29212
Sd3GPP TS 29212
St3GPP TS 29212
Rx3GPP TS 29214
S9a3GPP TS 29215
S9a*3GPP TS 29215
S93GPP TS 29215
Np3GPP TS 29217
Sy3GPP TS 29219
Cx3GPP TS 29229
Pr3GPP TS 29234
Wx3GPP TS 29234
S13/S13’3GPP TS 29272
S6a/S6d3GPP TS 29272
S7a/S7d3GPP TS 29272
S6b3GPP TS 29273
STa3GPP TS 29273
SWm3GPP TS 29273
SWx3GPP TS 29273
Diameter Data Management3GPP TS 29283
Sh3GPP TS 29329
S6m/S6n3GPP TS 29336
S6t3GPP TS 29336
T43GPP TS 29337
S6c3GPP TS 29338
SGd/Gdd3GPP TS 29338
PC4a3GPP TS 29344
PC6/PC73GPP TS 29345
Tsp3GPP TS 29368
V43GPP TS 29388
V63GPP TS 29389
MB2-C3GPP TS 29468
RqETSI ES 283 026
e4ETSI ES 283 034Circular dependency/does not compile
e2ETSI ES 283 035Circular dependency/does not compile
GOCAPETSI ES 283 039-2
GqETSI TS 183 017
e4ETSI TS 183 059-1
ReETSI TS 183 060Circular dependency/does not compile
a4ETSI TS 183 066Circular dependency/does not compile
Rr DelegatedETSI TS 183 071
Rr RequestETSI TS 183 071

ASN.1

NameSpecNote
MAP v1GSM 09.02 v4.9.1/ETS 300.599 01-60correct spec?
MAP v2GSM 09.02 v4.19.1/ETS 300.599 09-60correct spec?
MAP v3
MAP v43GPP TS 29.002 v16.3.0
CAP v1GSM Phase 2+ R96
CAP v2GSM 03.78/3GPP TS 01.441 v7.8.1
CAP v33GPP TS 23.078 v4.11.1
CAP v43GPP TS 23.078 v16.0.0