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}) ->