This library tries to implement encoding and decoding for different telco 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.
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)
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.
Name | Spec | Encode | Decode | Production Tested | Notes |
---|---|---|---|---|---|
M3UA | IETF RFC 4666 September 2006 | X | X | ||
M2PA | IETF RFC 4165 September 2005 | X | X | ||
MTP3 | ITU-T Q.704 (07/96) July 1996 | X | X | ||
SCCP | ITU-T Q.713 (03/2001) | X | X | ||
L3 | 3GPP TS 24.007 v16.5.0 | X | X | ||
NAS EPS | 3GPP TS 24.301 v16.8.0 | / | / | Messages are de-/encoded, but missing parameters | |
NAS 5GS | 3GPP TS 24.501 v16.10.0 | / | / | Messages are de-/encoded, but missing parameters | |
SGSAP | 3GPP TS 29.118 v16.0.0 |
Name | Spec | Interfaces | Done |
---|---|---|---|
Base | IETF RFC 6733 | ||
S6 | 3GPP TS 29.272 v16.4.0 | S6a, S6d | |
S7 | 3GPP TS 29.272 v16.4.0 | S7a, S7d | |
S13 | 3GPP TS 29.272 v16.4.0 | S13, S13’ | |
SLh | 3GPP TS 29.173 v16.0.0 | SLh | |
Ro | 3GPP TS 32.299 v16.2.0 | ||
Rf | 3GPP TS 32.299 v16.2.0 | ||
Gxx | 3GPP TS 29.212 v16.4.0 | Gx | |
Sd | 3GPP TS 29.212 v16.4.0 | Gx | |
St | 3GPP TS 29.212 v16.4.0 | Gx | |
Rx | 3GPP TS 29.214 v16.6.0 | ||
Sy | 3GPP TS 29.219 v16.0.0 | Sy | |
PLMN-PDN | 3GPP TS 29.061 v16.4.0 | ||
S6mn | 3GPP TS 29.336 v16.3.0 | S6m, S6n | |
S6t | 3GPP TS 29.336 v16.3.0 | S6t | |
Cx | 3GPP TS 29.229 v16.2.0 | Cx | |
Dx | 3GPP TS 29.229 v16.2.0 | Dx |
Name | Spec | Note |
---|---|---|
MAP v1 | GSM 09.02 v4.9.1/ETS 300.599 01-60 | correct spec? |
MAP v2 | GSM 09.02 v4.19.1/ETS 300.599 09-60 | correct spec? |
MAP v3 | ||
MAP v4 | 3GPP TS 29.002 v16.3.0 | |
CAP v1 | GSM Phase 2+ R96 | |
CAP v2 | GSM 03.78/3GPP TS 01.441 v7.8.1 | |
CAP v3 | 3GPP TS 23.078 v4.11.1 | |
CAP v4 | 3GPP TS 23.078 v16.0.0 | |