fix offsets in parsing IAM and REL messages
diff --git a/src/isup_codec.erl b/src/isup_codec.erl
index f9f0b46..175b7cc 100644
--- a/src/isup_codec.erl
+++ b/src/isup_codec.erl
@@ -134,7 +134,6 @@
% Table C-16 Initial address
parse_isup_msgt(?ISUP_MSGT_IAM, Bin) ->
<<CINat:8, FwCallInd:16/big, CallingCat:8, TransmReq:8, VarAndOpt/binary>> = Bin,
- %<<CINat:8, FwCallInd:16/big, CallingCat:8, TransmReq:8, PtrVar:8, PtrOpt:8, VarAndOpt/binary>> = Bin,
FixedOpts = [{conn_ind_nature, CINat}, {fw_call_ind, FwCallInd}, {calling_cat, CallingCat},
{transm_medium_req, TransmReq}],
<<PtrVar:8, PtrOpt:8, _/binary>> = VarAndOpt,
@@ -143,18 +142,28 @@
CalledParty = binary:part(VarAndOpt, PtrVar+1, CalledPartyLen),
VarOpts = [parse_isup_opt(?ISUP_PAR_CALLED_P_NUM, CalledPartyLen, CalledParty)],
% Optional part
- Remain = binary:part(VarAndOpt, 1 + PtrOpt, byte_size(VarAndOpt)-(1+PtrOpt)),
- Opts = parse_isup_opts(Remain),
+ case PtrOpt of
+ 0 ->
+ Opts = [];
+ _ ->
+ Remain = binary:part(VarAndOpt, 1 + PtrOpt, byte_size(VarAndOpt)-(1+PtrOpt)),
+ Opts = parse_isup_opts(Remain)
+ end,
FixedOpts ++ VarOpts ++ Opts;
% Table C-17 Release
parse_isup_msgt(?ISUP_MSGT_REL, Bin) ->
<<PtrVar:8, PtrOpt:8, VarAndOpt/binary>> = Bin,
% V: Cause indicators
- CauseIndLen = binary:at(VarAndOpt, PtrVar),
- CauseInd = binary:part(VarAndOpt, PtrVar+1, CauseIndLen),
- VarOpts = {?ISUP_PAR_CAUSE_IND, {CauseIndLen, CauseInd}},
- Remain = binary:part(VarAndOpt, 1 + PtrOpt, byte_size(VarAndOpt)-(1+PtrOpt)),
- Opts = parse_isup_opts(Remain),
+ CauseIndLen = binary:at(VarAndOpt, PtrVar-2),
+ CauseInd = binary:part(VarAndOpt, PtrVar-1, CauseIndLen),
+ VarOpts = [{?ISUP_PAR_CAUSE_IND, {CauseIndLen, CauseInd}}],
+ case PtrOpt of
+ 0 ->
+ Opts = [];
+ _ ->
+ Remain = binary:part(VarAndOpt, 1 + PtrOpt, byte_size(VarAndOpt)-(1+PtrOpt)),
+ Opts = parse_isup_opts(Remain)
+ end,
VarOpts ++ Opts;
% Table C-19 Subsequent address
parse_isup_msgt(?ISUP_MSGT_SAM, Bin) ->