summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2012-01-31 20:54:24 +0100
committerHarald Welte <laforge@gnumonks.org>2012-01-31 20:54:24 +0100
commit12f95d393501cbe91c15c536b2d4c6dcf0b15fec (patch)
tree49539767356868e8486f9f86465c5bf45bd97a79
parent250b36f2d87a10c9ab6e97a2c2eea8d762a8ac57 (diff)
TSM: use default QoS values if not provided in TR-* prim
According to Q.771, it is a User option if QoS paramters are passed down. We simply use default paramters if none have been provided.
-rw-r--r--TCAP/src/ITU/tcap_tsm_fsm.erl36
1 files changed, 28 insertions, 8 deletions
diff --git a/TCAP/src/ITU/tcap_tsm_fsm.erl b/TCAP/src/ITU/tcap_tsm_fsm.erl
index 27bb5b4..729b38e 100644
--- a/TCAP/src/ITU/tcap_tsm_fsm.erl
+++ b/TCAP/src/ITU/tcap_tsm_fsm.erl
@@ -124,7 +124,7 @@ idle({'BEGIN', transaction, BeginParms}, State)
%% Assemble TR-portion of BEGIN message
io:format("Trying to encode ~p~n", [Begin]),
{ok, TPDU} = 'TR':encode('TCMessage', {'begin', Begin}),
- {SequenceControl, ReturnOption} = BeginParms#'TR-BEGIN'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(BeginParms),
SccpParms = #'N-UNITDATA'{calledAddress = BeginParms#'TR-BEGIN'.destAddress,
callingAddress = BeginParms#'TR-BEGIN'.origAddress,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -158,7 +158,7 @@ initiation_received({'CONTINUE', transaction, ContParms}, State)
dialoguePortion = DialoguePortion, components = ComponentPortion},
%% Assemble TR-portion of CONTINUE message
{ok, TPDU} = 'TR':encode('TCMessage', {continue, Continue}),
- {SequenceControl, ReturnOption} = ContParms#'TR-CONTINUE'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(ContParms),
SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address,
callingAddress = NewState#state.local_address,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -181,7 +181,7 @@ initiation_received({'END', transaction, EndParms}, State)
End = #'End'{dialoguePortion = DialoguePortion, components = ComponentPortion},
%% Assemble TR-portion of END message
{ok, TPDU} = 'TR':encode('TCMessage', {'end', End}),
- {SequenceControl, ReturnOption} = EndParms#'TR-END'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(EndParms),
SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address,
callingAddress = State#state.local_address,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -198,7 +198,7 @@ initiation_received({'ABORT', transaction, AbortParms}, State)
Abort = #'Abort'{reason = {'u-abortCause', Cause}},
%% Assemble TR-portion of ABORT message
{ok, TPDU} = 'TR':encode('TCMessage', {abort, Abort}),
- {SequenceControl, ReturnOption} = AbortParms#'TR-U-ABORT'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(AbortParms),
SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address,
callingAddress = State#state.local_address,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -305,16 +305,21 @@ active({'CONTINUE', received, SccpParms}, State)
gen_fsm:send_event(resolve_dha(State), {'TR', 'CONTINUE', indication, TrParms}),
{next_state, active, State};
+
%% Continue from TR-User
active({'CONTINUE', transaction, ContParms}, State)
when is_record(ContParms, 'TR-CONTINUE') ->
TrUserData = process_undefined(ContParms#'TR-CONTINUE'.userData),
DialoguePortion = TrUserData#'TR-user-data'.dialoguePortion,
ComponentPortion = TrUserData#'TR-user-data'.componentPortion,
- Continue = #'Continue'{dialoguePortion = DialoguePortion, components = ComponentPortion},
+ Otid = State#state.localTID,
+ Dtid = State#state.remoteTID,
+ io:format("OTID ~p, DTID ~p~n", [Otid, Dtid]),
+ Continue = #'Continue'{otid = <<Otid:32/big>>, dtid = <<Dtid:32/big>>,
+ dialoguePortion = DialoguePortion, components = ComponentPortion},
%% Assemble TR-portion of CONTINUE message
{ok, TPDU} = 'TR':encode('TCMessage', {continue, Continue}),
- {SequenceControl, ReturnOption} = ContParms#'TR-CONTINUE'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(ContParms),
SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address,
callingAddress = State#state.local_address,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -352,7 +357,7 @@ active({'END', transaction, EndParms}, State)
End = #'End'{dialoguePortion = DialoguePortion, components = ComponentPortion},
%% Assemble TR-portion of END message
{ok, TPDU} = 'TR':encode('TCMessage', {'end', End}),
- {SequenceControl, ReturnOption} = EndParms#'TR-END'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(EndParms),
SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address,
callingAddress = State#state.local_address,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -400,7 +405,7 @@ active({'ABORT', transaction, AbortParms}, State)
Abort = #'Abort'{reason = {'u-abortCause', Cause}},
%% Assemble TR-portion of ABORT message
{ok, TPDU} = 'TR':encode('TCMessage', {abort, Abort}),
- {SequenceControl, ReturnOption} = AbortParms#'TR-U-ABORT'.qos,
+ {SequenceControl, ReturnOption} = qos_from_tr_prim(AbortParms),
SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address,
callingAddress = State#state.local_address,
sequenceControl = SequenceControl, returnOption = ReturnOption,
@@ -452,3 +457,18 @@ resolve_dha(DlgId) when is_integer(DlgId) ->
DHA;
resolve_dha(#state{localTID = TID}) ->
resolve_dha(TID).
+
+% QoS from TR-* primitive to {SequenceControl, ReturnOpt}
+qos_from_tr_qos(undefined) ->
+ {false, true};
+qos_from_tr_qos({Seq, Ret}) ->
+ {Seq, Ret}.
+
+qos_from_tr_prim(#'TR-CONTINUE'{qos=Qos}) ->
+ qos_from_tr_qos(Qos);
+qos_from_tr_prim(#'TR-BEGIN'{qos=Qos}) ->
+ qos_from_tr_qos(Qos);
+qos_from_tr_prim(#'TR-END'{qos=Qos}) ->
+ qos_from_tr_qos(Qos);
+qos_from_tr_prim(#'TR-U-ABORT'{qos=Qos}) ->
+ qos_from_tr_qos(Qos).