SCCP: Add support for UDTS encoding (and proper decoding)
diff --git a/src/sccp_codec.erl b/src/sccp_codec.erl
index 2cb8267..aee72c6 100644
--- a/src/sccp_codec.erl
+++ b/src/sccp_codec.erl
@@ -182,7 +182,18 @@
[{protocol_class, ProtoClass},{called_party_addr, CalledPartyDec},
{calling_party_addr, CallingPartyDec},{user_data, UserData}];
parse_sccp_msgt(?SCCP_MSGT_UDTS, DataBin) ->
- parse_sccp_msgt(?SCCP_MSGT_UDT, DataBin);
+ <<_:8, ReturnCause:8, CalledPartyPtr:8, CallingPartyPtr:8, DataPtr:8, Remain/binary >> = DataBin,
+ % variable part
+ CalledPartyLen = binary:at(Remain, CalledPartyPtr-3),
+ CalledParty = binary:part(Remain, CalledPartyPtr-3+1, CalledPartyLen),
+ CalledPartyDec = parse_sccp_addr(CalledParty),
+ CallingPartyLen = binary:at(Remain, CallingPartyPtr-2),
+ CallingParty = binary:part(Remain, CallingPartyPtr-2+1, CallingPartyLen),
+ CallingPartyDec = parse_sccp_addr(CallingParty),
+ DataLen = binary:at(Remain, DataPtr-1),
+ UserData = binary:part(Remain, DataPtr-1+1, DataLen),
+ [{return_cause, ReturnCause},{called_party_addr, CalledPartyDec},
+ {calling_party_addr, CallingPartyDec},{user_data, UserData}];
parse_sccp_msgt(?SCCP_MSGT_ED, DataBin) ->
<<_:8, DstLocalRef:24/big, DataPtr:8, Remain/binary>> = DataBin,
DataLen = binary:at(Remain, DataPtr-1),
@@ -352,8 +363,24 @@
CallingPartyLen:8, CallingPartyEnc/binary,
UserDataLen:8, UserData/binary>>,
<<?SCCP_MSGT_UDT:8, ProtoClass:8, CalledPartyPtr:8, CallingPartyPtr:8, DataPtr:8, Remain/binary>>;
-%encode_sccp_msgt(?SCCP_MSGT_UDTS, Params) ->
- % FIXME !!!
+encode_sccp_msgt(?SCCP_MSGT_UDTS, Params) ->
+ ReturnCause = proplists:get_value(return_cause, Params),
+ CalledParty = proplists:get_value(called_party_addr, Params),
+ CalledPartyEnc = encode_sccp_addr(CalledParty),
+ CalledPartyLen = byte_size(CalledPartyEnc),
+ CallingParty = proplists:get_value(calling_party_addr, Params),
+ CallingPartyEnc = encode_sccp_addr(CallingParty),
+ CallingPartyLen = byte_size(CallingPartyEnc),
+ UserData = proplists:get_value(user_data, Params),
+ UserDataLen = byte_size(UserData),
+ % variable part
+ CalledPartyPtr = 3,
+ CallingPartyPtr = 2 + (1 + CalledPartyLen),
+ DataPtr = 1 + (1 + CalledPartyLen) + (1 + CallingPartyLen),
+ Remain = <<CalledPartyLen:8, CalledPartyEnc/binary,
+ CallingPartyLen:8, CallingPartyEnc/binary,
+ UserDataLen:8, UserData/binary>>,
+ <<?SCCP_MSGT_UDTS:8, ReturnCause:8, CalledPartyPtr:8, CallingPartyPtr:8, DataPtr:8, Remain/binary>>;
encode_sccp_msgt(?SCCP_MSGT_ED, Params) ->
DstLocalRef = proplists:get_value(dst_local_ref, Params),
UserData = proplists:get_value(user_data, Params),