ISUP: Fix parsing of options + add support for CFN (confusion) message
diff --git a/src/isup_codec.erl b/src/isup_codec.erl
index aafa507..1e0efe8 100644
--- a/src/isup_codec.erl
+++ b/src/isup_codec.erl
@@ -162,11 +162,14 @@
end,
FixedOpts ++ VarOpts ++ Opts;
% Table C-17 Release
-parse_isup_msgt(?ISUP_MSGT_REL, Bin) ->
- <<PtrVar:8, PtrOpt:8, VarAndOpt/binary>> = Bin,
+% Table 26/Q.763: Confusion
+parse_isup_msgt(M, VarAndOpt) when
+ M == ?ISUP_MSGT_REL;
+ M == ?ISUP_MSGT_CFN ->
+ <<PtrVar:8, PtrOpt:8, _/binary>> = VarAndOpt,
% V: Cause indicators
- CauseIndLen = binary:at(VarAndOpt, PtrVar-2),
- CauseInd = binary:part(VarAndOpt, PtrVar-1, CauseIndLen),
+ CauseIndLen = binary:at(VarAndOpt, PtrVar),
+ CauseInd = binary:part(VarAndOpt, PtrVar+1, CauseIndLen),
VarOpts = [{?ISUP_PAR_CAUSE_IND, {CauseIndLen, CauseInd}}],
case PtrOpt of
0 ->
@@ -177,8 +180,8 @@
end,
VarOpts ++ Opts;
% Table C-19 Subsequent address
-parse_isup_msgt(?ISUP_MSGT_SAM, Bin) ->
- <<PtrVar:8, PtrOpt:8, VarAndOpt/binary>> = Bin,
+parse_isup_msgt(?ISUP_MSGT_SAM, VarAndOpt) ->
+ <<PtrVar:8, PtrOpt:8, _/binary>> = VarAndOpt,
% V: Subsequent number
SubseqNumLen = binary:at(VarAndOpt, PtrVar),
SubsetNum = binary:part(VarAndOpt, PtrVar+1, SubseqNumLen),
@@ -371,7 +374,9 @@
end,
<<FixedBin/binary, PtrVar:8, PtrOpt:8, CalledPartyLen:8, CalledParty/binary, OptBin/binary>>;
% Table C-17 Release
-encode_isup_msgt(?ISUP_MSGT_REL, #isup_msg{parameters = Params}) ->
+encode_isup_msgt(Msgt, #isup_msg{parameters = Params}) when
+ Msgt == ?ISUP_MSGT_REL;
+ Msgt == ?ISUP_MSGT_CFN ->
PtrVar = 2, % one byte behind the PtrOpt
% V: Cause indicators
CauseInd = encode_isup_par(?ISUP_PAR_CAUSE_IND,