Skip to content
/ ErlUMTS Public
forked from sebastiw/otc

Universal Mobile Telecommunications System codec for Erlang

License

Notifications You must be signed in to change notification settings

wmnsk/ErlUMTS

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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.

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, ..}]

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

NameSpecEncodeDecodeProduction Tested (Decode/Encode)Notes
M3UAIETF RFC 4666 September 2006XXD
M2PAIETF RFC 4165 September 2005XXD
MTP3ITU-T Q.704 (07/96) July 1996XXD
SCCPITU-T Q.713 (03/2001)XX
L33GPP TS 24.007 v16.5.0XX
NAS EPS3GPP TS 24.301 v16.8.0//Messages are de-/encoded, but missing parameters
NAS 5GS3GPP TS 24.501 v16.10.0//Messages are de-/encoded, but missing parameters
SGSAP3GPP TS 29.118 v16.0.0

Diameter interfaces

SpecInterfacesNotes
3GPP TS 29061Gi/Sgi
3GPP TS 29061Gmb
3GPP TS 29061SGmb
3GPP TS 29109Zh
3GPP TS 29109Zn
3GPP TS 29109Zpn
3GPP TS 29128T6a/T6b
3GPP TS 29140MM10
3GPP TS 29153Ns
3GPP TS 29154Nta
3GPP TS 29154Nt
3GPP TS 29172SLg
3GPP TS 29173SLh
3GPP TS 29209Gq
3GPP TS 29211Rx
3GPP TS 29212Gx
3GPP TS 29212Gxx
3GPP TS 29212S15
3GPP TS 29212Sd
3GPP TS 29212St
3GPP TS 29214Rx
3GPP TS 29215S9a
3GPP TS 29215S9a*
3GPP TS 29215S9
3GPP TS 29217Np
3GPP TS 29219Sy
3GPP TS 29229Cx
3GPP TS 29234Pr
3GPP TS 29234Wx
3GPP TS 29272S13/S13’
3GPP TS 29272S6a/S6d
3GPP TS 29272S7a/S7d
3GPP TS 29273S6b
3GPP TS 29273STa
3GPP TS 29273SWm
3GPP TS 29273SWx
3GPP TS 29283Diameter Data Management
3GPP TS 29329Sh
3GPP TS 29336S6m/S6n
3GPP TS 29336S6t
3GPP TS 29337T4
3GPP TS 29338S6c
3GPP TS 29338SGd/Gdd
3GPP TS 29344PC4a
3GPP TS 29345PC6/PC7
3GPP TS 29368Tsp
3GPP TS 29388V4
3GPP TS 29389V6
3GPP TS 29468MB2-C
ETSI ES 283 026Rq
ETSI ES 283 034e4Circular dependency/does not compile
ETSI ES 283 035e2Circular dependency/does not compile
ETSI ES 283 039-2GOCAP
ETSI TS 183 017Gq
ETSI TS 183 059-1e4
ETSI TS 183 060ReCircular dependency/does not compile
ETSI TS 183 066a4Circular dependency/does not compile
ETSI TS 183 071Rr Delegated
ETSI TS 183 071Rr Request

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

About

Universal Mobile Telecommunications System codec for Erlang

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Erlang 96.1%
  • Awk 3.9%