SCCP codec: Add encoding routines for more message types
diff --git a/src/sccp_codec.erl b/src/sccp_codec.erl
index 4b7be6a..da3d56b 100644
--- a/src/sccp_codec.erl
+++ b/src/sccp_codec.erl
@@ -163,20 +163,88 @@
DstLocalRef = proplists:get_value(dst_local_ref, Params),
ProtoClass = proplists:get_value(protocol_class, Params),
OptBin = encode_sccp_opts(Params, []),
- <<?SCCP_MSGT_CC:8, DstLocalRef:24, SrcLocalRef:24, ProtoClass:8, OptBin/binary >>;
+ <<?SCCP_MSGT_CC:8, DstLocalRef:24, SrcLocalRef:24, ProtoClass:8, OptBin/binary>>;
encode_sccp_msgt(?SCCP_MSGT_CREF, Params) ->
DstLocalRef = proplists:get_value(dst_local_ref, Params),
RefusalCause = proplists:get_value(refusal_cause, Params),
- % FIXME
- Remain = <<>>,
- <<?SCCP_MSGT_CREF:8, DstLocalRef:24, RefusalCause:8, Remain/binary >>;
+ OptBin = encode_sccp_opts(Params, []),
+ <<?SCCP_MSGT_CREF:8, DstLocalRef:24, RefusalCause:8, OptBin/binary>>;
encode_sccp_msgt(?SCCP_MSGT_RLSD, Params) ->
SrcLocalRef = proplists:get_value(src_local_ref, Params),
DstLocalRef = proplists:get_value(dst_local_ref, Params),
ReleaseCause = proplists:get_value(release_cause, Params),
- % FIXME
- Remain = <<>>,
- <<?SCCP_MSGT_RLSD:8, DstLocalRef:24, SrcLocalRef:24, ReleaseCause:8, Remain/binary >>.
+ OptBin = encode_sccp_opts(Params, []),
+ <<?SCCP_MSGT_RLSD:8, DstLocalRef:24, SrcLocalRef:24, ReleaseCause:8, OptBin/binary>>;
+encode_sccp_msgt(?SCCP_MSGT_RLC, Params) ->
+ SrcLocalRef = proplists:get_value(src_local_ref, Params),
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ <<?SCCP_MSGT_RLC:8, DstLocalRef:24, SrcLocalRef:24>>;
+encode_sccp_msgt(?SCCP_MSGT_DT1, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ SegmReass = proplists:get_value(segm_reass, Params),
+ UserData = proplists:get_value(user_data, Params),
+ UserDataLen = byte_size(UserData),
+ <<?SCCP_MSGT_DT1:8, DstLocalRef:24, SegmReass:8, 1:8, UserDataLen:8, UserData/binary>>;
+encode_sccp_msgt(?SCCP_MSGT_DT2, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ SeqSegm = proplists:get_value(seq_segm, Params),
+ UserData = proplists:get_value(user_data, Params),
+ UserDataLen = byte_size(UserData),
+ <<?SCCP_MSGT_DT2:8, DstLocalRef:24, SeqSegm:16, 1:8, UserDataLen:8, UserData/binary>>;
+encode_sccp_msgt(?SCCP_MSGT_AK, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ RxSeqnr = proplists:get_value(rx_seqnr, Params),
+ Credit = proplists:get_value(credit, Params),
+ <<?SCCP_MSGT_AK:8, DstLocalRef:24, RxSeqnr:8, Credit:8>>;
+encode_sccp_msgt(?SCCP_MSGT_UDT, Params) ->
+ ProtoClass = proplists:get_value(protocol_class, Params),
+ CalledParty = proplists:get_value(called_party_addr, Params),
+ CalledPartyLen = byte_size(CalledParty),
+ CallingParty = proplists:get_value(calling_party_addr, Params),
+ CallingPartyLen = byte_size(CallingParty),
+ 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, CalledParty/binary,
+ CallingPartyLen:8, CallingParty/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_ED, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ UserData = proplists:get_value(user_data, Params),
+ UserDataLen = byte_size(UserData),
+ DataPtr = 1,
+ <<?SCCP_MSGT_ED:8, DstLocalRef:24, DataPtr:8, UserDataLen:8, UserData/binary>>;
+encode_sccp_msgt(?SCCP_MSGT_EA, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ <<?SCCP_MSGT_EA:8, DstLocalRef:24>>;
+encode_sccp_msgt(?SCCP_MSGT_RSR, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ SrcLocalRef = proplists:get_value(src_local_ref, Params),
+ ResetCause = proplists:get_value(reset_cause, Params),
+ <<?SCCP_MSGT_RSR:8, DstLocalRef:24, SrcLocalRef:24, ResetCause:8>>;
+encode_sccp_msgt(?SCCP_MSGT_RSC, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ SrcLocalRef = proplists:get_value(src_local_ref, Params),
+ <<?SCCP_MSGT_RSC:8, DstLocalRef:24, SrcLocalRef:24>>;
+encode_sccp_msgt(?SCCP_MSGT_ERR, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ ErrCause = proplists:get_value(error_cause, Params),
+ <<?SCCP_MSGT_ERR:8, DstLocalRef:24, ErrCause:8>>;
+encode_sccp_msgt(?SCCP_MSGT_IT, Params) ->
+ DstLocalRef = proplists:get_value(dst_local_ref, Params),
+ SrcLocalRef = proplists:get_value(src_local_ref, Params),
+ ProtoClass = proplists:get_value(protocol_class, Params),
+ SegmSeq = proplists:get_value(segm_seq, Params),
+ Credit = proplists:get_value(credit, Params),
+ <<?SCCP_MSGT_IT:8, DstLocalRef:24, SrcLocalRef:24, ProtoClass:8, SegmSeq:16, Credit:8>>.
+% FIXME: XUDT/XUDTS, LUDT/LUDTS
+
% encode one sccp message data structure into the on-wire format
encode_sccp_msg(#sccp_msg{msg_type = MsgType, parameters = Params}) ->